RewardToken

Git Source

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

amount

uint256

of tokens to mint to treasury

approve

function approve(address spender, uint256 amount) external returns (bool);

Parameters

Name
Type
Description

spender

address

to approve

amount

uint256

to approve

_approve

function _approve(address owner, address spender, uint256 amount) internal;

Parameters

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

sender

address

Address whose tokens are being transferred.

InvalidReceiver

Indicates a failure with the token receiver. Used in transfers.

error InvalidReceiver(address receiver);

Parameters

Name
Type
Description

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

Name
Type
Description

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;
}