# aTokens (TBD)

aTokens are yield-generating tokens that are minted and burned upon [`deposit`](https://phantazm.gitbook.io/phantazm-1/lendingpool#deposit) and [`withdraw`](https://phantazm.gitbook.io/phantazm-1/lendingpool#withdraw). The aToken's value is pegged to the value of the corresponding deposited asset at a 1:1 ratio, and can be safely stored, transferred or traded. All interest collected by the aTokens reserves are distributed to aTokens holders directly by continuously increasing their wallet balance.

{% hint style="warning" %}
For all minting and burning actions, see [`Deposit()`](https://phantazm.gitbook.io/phantazm-1/lendingpool#deposit) and [`Withdraw()`](https://phantazm.gitbook.io/phantazm-1/lendingpool#withdraw) methods in the `LendingPool` contract.
{% endhint %}

## EIP20 Methods

All standard EIP20 methods are implemented, such as `balanceOf()`, `transfer()`, `transferFrom()`, `approve()`, `totalSupply()`, etc.

{% hint style="info" %}
`balanceOf()` will always return the most up to date balance of the user, which includes their principal balance + the interest generated by the principal balance.
{% endhint %}

## EIP2612 Methods

### permit()

**`function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)`**

Allows a user to permit another account (or contract) to use their funds using a signed message. This enables gas-less transactions and single approval/transfer transactions.

| Parameter  | Type    | Description                                                                            |
| ---------- | ------- | -------------------------------------------------------------------------------------- |
| `owner`    | address | The owner of the funds                                                                 |
| `spender`  | address | The spender for the funds                                                              |
| `value`    | uint256 | The amount the `spender` is permitted to use                                           |
| `deadline` | uint256 | The deadline timestamp that the permit is valid. Use `type(uint).max` for no deadline. |
| `v`        | uint8   | Signature parameter                                                                    |
| `r`        | bytes32 | Signature parameter                                                                    |
| `s`        | bytes32 | Signature parameter                                                                    |

### \_nonces()

**`function _nonces(address owner) public`**

Returns the next valid nonce to submit when calling `permit()`

## Methods

### UNDERLYING\_ASSET\_ADDRESS()

**`function UNDERLYING_ASSET_ADDRESS()`**

Returns the underlying asset of the aToken.

### RESERVE\_TREASURY\_ADDRESS()

**`function RESERVE_TREASURY_ADDRESS()`**

Returns the address of the aTokens reserve treasury.

### POOL()

**`function POOL()`**

Returns the address of the associated [`LendingPool`](https://phantazm.gitbook.io/phantazm-1/the-core-protocol/lendingpool) for the aToken.

### scaledBalanceOf\*\*()\*\*

**`function scaledBalanceOf(address user)`**

Returns the scaled balance of `user` as a `uint256`.

The scaled balance is the balance of the underlying asset of the user (amount deposited), divided by the current liquidity index at the moment of the update.

I.e. $$scaledBalance = amount Deposited / currentLiquidityIndex$$

This essentially 'marks' when a user has deposited in the reserve pool, and can be used to calculate the users current compounded aToken balance.

Example:

* User A deposits 1000 DAI at the liquidity index of 1.1
* User B deposits another amount into the same pool
* The liquidity index is now 1.2.
* Therefore to calculate User A's current compounded aToken balance, the reverse operation should be performed: $$aTokenBalance = scaledBalance \* currentLiquidityIndex$$

### getScaledUserBalanceAndSupply\*\*()\*\*

**`function getScaledUserBalanceAndSupply(address user)`**

Returns the scaled balance of `user`and the principal total supply.

#### Return values

| Type    | Description            |
| ------- | ---------------------- |
| uint256 | scaled balance of user |
| uint256 | principal total supply |

### scaledTotalSupply\*\*()\*\*

**`function scaledTotalSupply()`**

Returns the scaled total supply of the aToken as `uint256`.

The scaled total supply is the sum of all the updated stored balances, divided by the reserve index at the moment of the update.

**`function isTransferAllowed(address user, uint256 amount)`**

Returns `true` if a transfer is allowed.

Specifically, a transfer will fail if the resulting Health Factor of `user` will end up being below 1.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://phantazm.gitbook.io/phantazm-1/the-core-protocol/atokens.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
