> For the complete documentation index, see [llms.txt](https://phantazm.gitbook.io/phantazm-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://phantazm.gitbook.io/phantazm-1/the-core-protocol/atokens.md).

# aTokens (TBD)

aTokens are yield-generating tokens that are minted and burned upon [`deposit`](/phantazm-1/the-core-protocol/lendingpool.md#deposit) and [`withdraw`](/phantazm-1/the-core-protocol/lendingpool.md#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()`](/phantazm-1/the-core-protocol/lendingpool.md#deposit) and [`Withdraw()`](/phantazm-1/the-core-protocol/lendingpool.md#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`](/phantazm-1/the-core-protocol/lendingpool.md) 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.
