transfer & mint

Overview

updateInterestRates was covered in the common functions section

transfer

IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount);

This transfers the asset to be supplied from user to the corresponding AToken contract

  • from: msg.sender

  • to: aTokenAddress (aDAI, aWETH...)

User' supplied assets are held on their respective AToken contracts; DAI held on aDAI.

Use of safeTransferFrom

SafeERC20 is a helper to make safe the interaction with someone else’s ERC20 token, in your contracts. What the helper does for you is:

  1. check the boolean return values of ERC20 operations and revert the transaction if they fail,

  2. at the same time allowing you to support some non-standard ERC20 tokens that don’t have boolean return values.

It additionally provides helpers to increase or decrease an allowance, to mitigate an attack 118 possible with vanilla approve.

For more: https://forum.openzeppelin.com/t/making-sure-i-understand-how-safeerc20-works/2940

mint

  • minting of ATokens corresponding the supplied asset

bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint(msg.sender, params.onBehalfOf, params.amount, reserveCache.nextLiquidityIndex);
  • mint calls _mintScaled

  • _mintScaled mints tokens in-line with the current liquidity index, as seen by amountScaled

  • amountToMint: amountScaledcast as uint128

  • balanceIncrease: interest accrued from user's last recorded index and current index

  • _userState[onBehalfOf].additionalData is updated with the latest index.

balanceIncrease is calculated as part of the mint event emission.

On super.BalanceOf and _userState[onBehalfOf].additionalData

  • super.BalanceOf calls balanceOf declared in IncentivizedERC20.sol

  • Inheritance: ScaledBalanceTokenBase > MintableIncentivizedERC20 > IncentivizedERC20

  • notice the irregular definition of balanceOf, it calls out a mapping _userState

  • _userState is mapping of user addresses to UserState structs

  • Each UserState struct stores a user's balance with a wildcard field of additionalData

additionalData in the context of Atokens

  • used to store the index of the user's last "index-sensitive" action: --> last supply/withdrawal/borrow/repayment

Returns

mint returns the bool value of (scaledBalance == 0)

  • scaledBalance is the amount of balance a user has of a specific asset pre-dating this supply action

  • (scaledBalance == 0) will return true only if this supply action is the user's very first supply action - specific to said asset.

  • The return bool value is useful to us as explained in the next section.

Visual Aid

Last updated