Routers
Maker contracts can be set to utilize a router in order to manage outbound and inbound tokens reserves of offer owners. Routers' interface are constrained by the AbstractRouter
contract and use hooks to customize the public functions described below.
Function modifier onlyMakers
requires that only an approved maker contract can call this functions. Modifier onlyAdmin
requires function caller to be the admin of the router. Modifier makerOrAdmin
is a disjunction of both the above requirements.
SimpleRouter
The SimpleRouter
contract provides a (simple) router instance. We illustrate usage of the main router functions through it.
Liquidity flowsβ
Routers receive requests from approved maker contracts (see gatekeeping). Request can be either to manage inbound (offer taker's payment) or outbound cash flow.
Push requestβ
function push(IERC20 token, address reserve, uint amount) external onlyMakers returns (uint pushed);
- Input:
token
is the asset the maker contract wishes to pushreserve
of the offer owner whose funds are being pushedamount
is the amount of asset that should be transferred from the calling maker contract
- Output: fraction of
amount
that was successfullypushed
to offer owner'sreserve
. - Usage: transfer funds from the maker contracts to an offer owner's reserve. For instance if the reserve is an account on a lender, the router will have a custom
push
that will take care of calling the proper deposit function. - SimpleRouter behavior: transfer funds from
msg.sender
toreserve
. Returns 0 if transfer failed, returnsamount
otherwise.
Pull requestβ
function pull(IERC20 token, address reserve, uint amount, bool strict) external onlyMakers returns (uint pulled);
- Input:
token
is the asset the maker contract wishes to pullreserve
of the offer owner where the funds need to be pulled fromamount
is the amount of asset that should be transferred fromreserve
to the calling maker contract
- Output: fraction of
amount
that was successfullypulled
tomsg.sender
. - Usage: transfer funds from an offer owner's reserve to the calling maker contracts. For instance if the reserve is an account on a lender, the router will have a custom
pull
that will take care of calling the proper redeem function. - SimpleRouter behavior: transfer funds from
reserve
tomsg.sender
. Returns 0 if transfer failed, returnsamount
otherwise.
Gatekeepingβ
Binding a router to a maker contractβ
function bind(address maker) public onlyAdmin;
Function approves maker
as a user of the router. The unbind
function can be called to revoke the approval.
Router activationβ
function activate(IERC20 token) external makersOrAdmin;
- Usage: performs all router centric approvals that are necessary to route
token
liquidity. For instance a router using a lender might need to approve the lender for transferringtoken
in deposit calls. - SimpleRouter behavior: SimpleRouter does not need to approve any contract, and
activate
is a no-op in that context.
Router checklistβ
function checkList(IERC20 token, address reserve) external view;
- Usage: verifies that the router has performed and received all the necessary approvals to route
token
liquidity for offer owner'sreserve
. The function throws with a reason when the first missing approval is detected. - SimpleRouter behavior: it verifies that
reserve
has approved the router fortoken
transfer. Does not throw if offer owner'sreserve
is the router itself.
Since routers are autonomous smart contracts, it is possible to modify an offer logic without redeploying the corresponding maker contracts. The setRouter
function of all library based maker contracts can be used to set a new router. By setting a new router for the maker contract, you are indirectly modifying the offer logic of the contract. However the gas requirement of the offer logic is impacted by the router's design. To cope with this, routers provide the routerGaseq()
function that returns the amount of gas that is necessary to cover a call to pull
and push
.
Note that maker contracts' view offerGasreq
returns the sum of the offer logic's raw gasreq
(without taking router into account) and the router specific gasreq