Zero interest stablecoin for ARB and Staked ARB

ARBUSD is the public good algorithmic stablecoin for the Arbitrum ecosystem.

Architecture

  1. Reactor manages collateral, and controls the supply of ARBUSD. It lends out Staked ARB on AAVE. It uses ExchangeToken to track rewards ownership, and will distribute rewards if asked.
  2. ARBUSD is a simple ERC20 asset with flashloan functionality.
  3. ExchangeToken is an asset that represents ARB yield claimable in a cToken-like form. It is minted when ARBUSD is created, and represents the owner's rewards share.
  4. ExchangeLens is a non-transferrable contract implementing balanceOf as a convenience view of the claimable yield from ExchangeToken.

Code

The code lives at Github.

pkg contains the contract code. audits contains the audits. paper contains the reference paper.

Deployment

Reactor
TBD
ARBUSD
TBD
ExchangeToken
TBD
ExchangeLens
TBD
Website This website lives at ..eth

ABI

Reactor

function borrow(uint256 _amount, address _recipient) external returns (uint256 debtNft);
function repay(uint256 _debtNft, uint256 _amount) external;
function liquidate(uint256 _debtNft, address _recipient) external returns (uint256 arbReceived);

event Borrowed(address indexed borrower, uint256 indexed amount, address indexed recipient);
event Repaid(address indexed repayer, uint256 indexed debtNft, uint256 indexed amount);
event Liquidated(address indexed liquidator, uint256 indexed debtNft, address indexed recipient);

ARBUSD & ExchangeToken (ERC3156)

function maxFlashLoan(address token) external view returns (uint256);
function flashFee(address token,uint256 amount) external view returns (uint256);
function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) external returns (bool);

ARBUSD & ExchangeToken (ERC20)

function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);

ARBUSD & ExchangeToken (ERC20 Permit)

function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);