RewardToken
Inherits: ContextUpgradeable, AccessControlDefaultAdminRulesUpgradeable, IERC20Errors, IERC20Metadata
The supply-side reward accounting portion of the protocol. A lender's balance is measured in two parts: a static balance and a dynamic "supply factor". Their true balance is the product of the two values. The dynamic portion is then able to be used to distribute interest accrued to the lender.
State Variables
ION
bytes32 public constant ION = keccak256("ION");
RewardTokenStorageLocation
bytes32 private constant RewardTokenStorageLocation = 0xdb3a0d63a7808d7d0422c40bb62354f42bff7602a547c329c1453dbcbeef4900;
EIP712_REVISION
bytes private constant EIP712_REVISION = bytes("1");
EIP712_DOMAIN
bytes32 private constant EIP712_DOMAIN =
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
PERMIT_TYPEHASH
bytes32 public constant PERMIT_TYPEHASH =
keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
Functions
_getRewardTokenStorage
function _getRewardTokenStorage() private pure returns (RewardTokenStorage storage $);
_initialize
function _initialize(
address _underlying,
address _treasury,
uint8 decimals_,
string memory name_,
string memory symbol_
)
internal
onlyInitializing;
_burn
function _burn(address user, address receiverOfUnderlying, uint256 amount) internal returns (uint256);
Parameters
user
address
to burn tokens from
receiverOfUnderlying
address
to send underlying tokens to
amount
uint256
to burn
_burnNormalized
function _burnNormalized(address account, uint256 amount) private;
Parameters
account
address
to decrease balance of
amount
uint256
of normalized tokens to burn
_mint
function _mint(address user, address senderOfUnderlying, uint256 amount) internal returns (uint256);
Parameters
user
address
to mint tokens to
senderOfUnderlying
address
address to transfer underlying tokens from
amount
uint256
of reward tokens to mint
_mintNormalized
function _mintNormalized(address account, uint256 amount) private;
Parameters
account
address
to increase balance of
amount
uint256
of normalized tokens to mint
_mintToTreasury
This function does not perform any rounding checks.
function _mintToTreasury(uint256 amount) internal;
Parameters
amount
uint256
of tokens to mint to treasury
approve
function approve(address spender, uint256 amount) external returns (bool);
Parameters
spender
address
to approve
amount
uint256
to approve
_approve
function _approve(address owner, address spender, uint256 amount) internal;
Parameters
owner
address
of tokens
spender
address
of tokens
amount
uint256
to approve
_spendAllowance
Spends allowance
function _spendAllowance(address owner, address spender, uint256 amount) private;
transfer
Can only be called by owner of the tokens
function transfer(address to, uint256 amount) public returns (bool);
Parameters
to
address
transfer to
amount
uint256
to transfer
transferFrom
For use with approve()
function transferFrom(address from, address to, uint256 amount) public returns (bool);
Parameters
from
address
to transfer from
to
address
to transfer to
amount
uint256
to transfer
_transfer
function _transfer(address from, address to, uint256 amount) private;
permit
implements the permit function as for https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
)
public
virtual;
Parameters
owner
address
The owner of the funds
spender
address
The spender
value
uint256
The amount
deadline
uint256
The deadline timestamp, type(uint256).max for max deadline
v
uint8
Signature param
r
bytes32
Signature param
s
bytes32
Signature param
allowance
Returns current allowance
function allowance(address owner, address spender) public view returns (uint256);
Parameters
owner
address
of tokens
spender
address
of tokens
nonces
function nonces(address owner) public view returns (uint256);
_useNonce
Consumes a nonce. Returns the current value and increments nonce.
function _useNonce(address owner) internal virtual returns (uint256);
_setSupplyFactor
function _setSupplyFactor(uint256 newSupplyFactor) internal;
updateTreasury
Updates the treasury address
function updateTreasury(address newTreasury) external onlyRole(ION);
Parameters
newTreasury
address
address of new treasury
underlying
Address of underlying asset
function underlying() public view returns (IERC20);
decimals
Decimals of the position asset
function decimals() public view returns (uint8);
balanceOf
Current claim of the underlying token inclusive of interest to be accrued.
function balanceOf(address user) public view returns (uint256);
Parameters
user
address
to get balance of
balanceOfUnaccrued
Current claim of the underlying token without accounting for interest to be accrued.
function balanceOfUnaccrued(address user) public view returns (uint256);
normalizedBalanceOf
Accounting is done in normalized balances
function normalizedBalanceOf(address user) external view returns (uint256);
Parameters
user
address
to get normalized balance of
name
Name of the position asset
function name() public view returns (string memory);
symbol
Symbol of the position asset
function symbol() public view returns (string memory);
treasury
Current treasury address
function treasury() public view returns (address);
totalSupplyUnaccrued
Total claim of the underlying asset belonging to lenders not inclusive of the new interest to be accrued.
function totalSupplyUnaccrued() public view returns (uint256);
totalSupply
Total claim of the underlying asset belonging to lender inclusive of the new interest to be accrued.
function totalSupply() public view returns (uint256);
normalizedTotalSupplyUnaccrued
function normalizedTotalSupplyUnaccrued() public view returns (uint256);
normalizedTotalSupply
Normalized total supply.
function normalizedTotalSupply() public view returns (uint256);
supplyFactorUnaccrued
function supplyFactorUnaccrued() public view returns (uint256);
supplyFactor
Current supply factor
function supplyFactor() public view returns (uint256);
calculateRewardAndDebtDistribution
function calculateRewardAndDebtDistribution()
public
view
virtual
returns (
uint256 totalSupplyFactorIncrease,
uint256 totalTreasuryMintAmount,
uint104[] memory rateIncreases,
uint256 totalDebtIncrease,
uint48[] memory timestampIncreases
);
Events
MintToTreasury
event MintToTreasury(address indexed treasury, uint256 amount, uint256 supplyFactor);
TreasuryUpdate
event TreasuryUpdate(address treasury);
Errors
InvalidBurnAmount
Cannot burn amount whose normalized value is less than zero.
error InvalidBurnAmount();
InvalidMintAmount
Cannot mint amount whose normalized value is less than zero.
error InvalidMintAmount();
InvalidUnderlyingAddress
error InvalidUnderlyingAddress();
InvalidTreasuryAddress
error InvalidTreasuryAddress();
InvalidSender
Indicates a failure with the token sender
. Used in transfers.
error InvalidSender(address sender);
Parameters
sender
address
Address whose tokens are being transferred.
InvalidReceiver
Indicates a failure with the token receiver
. Used in transfers.
error InvalidReceiver(address receiver);
Parameters
receiver
address
Address to which tokens are being transferred.
SelfTransfer
Cannot transfer the token to address self
error SelfTransfer(address self);
ERC2612ExpiredSignature
Signature cannot be submitted after deadline
has passed. Designed to mitigate replay attacks.
error ERC2612ExpiredSignature(uint256 deadline);
ERC2612InvalidSigner
signer
does not match the owner
of the tokens. owner
did not approve.
error ERC2612InvalidSigner(address signer, address owner);
InsufficientBalance
Indicates an error related to the current balance
of a sender
. Used in transfers.
error InsufficientBalance(address account, uint256 balance, uint256 needed);
Parameters
account
address
Address whose token balance is insufficient.
balance
uint256
Current balance for the interacting account.
needed
uint256
Minimum amount required to perform a transfer.
Structs
RewardTokenStorage
struct RewardTokenStorage {
IERC20 underlying;
uint8 decimals;
string name;
string symbol;
address treasury;
uint256 normalizedTotalSupply;
uint256 supplyFactor;
mapping(address account => uint256) _normalizedBalances;
mapping(address account => mapping(address spender => uint256)) _allowances;
mapping(address account => uint256) nonces;
}