Mangrove
Developper
Developper
  • Welcome
  • Protocol
    • Introduction
    • Technical References
      • Overview
      • Ticks, ratios, and prices
      • Offer-list
        • Views on offers
      • Market-order
        • Delegation
      • Creating & Updating offers
        • Maker contract
        • Offer provisions
        • Gas requirement
        • Public data structures
        • Executing offers
      • Cleaning offers
      • Governance-parameters
        • Global variables
        • Local variables
        • Data structures and views
      • Periphery Contracts
        • MgvReader
        • MgvOracle
      • Literate Source Code
    • Background
      • Taking available liquidity
      • Making liquidity available
      • Reneging on offers
  • Strat Lib
    • What is the Strat Library?
    • Getting-started
      • Set Up Your Local Environment
      • Post a Smart Offer
    • Guides
      • Unlocking liquidity
      • Reposting an offer in the posthook
      • Using last look to renege trades
      • Determining gas requirements
      • Creating a Direct contract
      • Deploying your contract
      • Testing a maker contract
      • Safe offer logic guidelines
      • Approvals
    • Technical references
      • Principal hooks
      • Liquidity routing
      • API preferences
        • Core
          • SRC
            • IMangrove
        • Strats
          • SRC
            • Strategies
              • MangroveOffer
              • MangroveOrder
              • Integrations
                • AaveV3Borrower
                • AaveV3BorrowerImplementation
                • AaveV3BorrowerStorage
                • AaveV3Lender
                • CompoundModule
              • Interfaces
                • IForwarder
                • ILiquidityProvider
                • IOfferLogic
                • IOrderLogic
              • Offer_forwarder
                • Abstract
                  • Forwarder
              • Offer_maker
                • Abstract
                  • Direct
                • Market_making
                  • Kandel
                    • AaveKandel
                    • AaveKandelSeeder
                    • KandelSeeder
                    • Abstract
                      • AbstractKandelSeeder
                      • CoreKandel
                      • DirectWithBidsAndAsksDistribution
                      • GeometricKandel
                      • HasIndexedBidsAndAsks
                      • KandelLib
                      • TradesBaseQuotePair
              • Routeurs
                • SimpleRouter
                • Abstract
                  • AbstractRouter
                • Integrations
                  • AavePooledRouter
                  • HasAaveBalanceMemoizer
              • Utils
                • AccessControlled
              • Vendor
                • AAVE
                  • V3
                    • Contracts
                      • Dependencies
                        • Oppenzeppelin
                          • Contracts
                            • IERC20
                      • Interfaces
                        • IAToken
                        • IAaveIncentivesController
                        • IAaveOracle
                        • ICreditDelegationToken
                        • IInitializableAToken
                        • IPool
                        • IPoolAddressesProvider
                        • IPriceOracleGetter
                        • IScaledBalanceToken
                      • Protocol
                        • Libraries
                          • Configurations
                            • ReserveConfiguration
                          • Helpers
                            • Errors
                          • Types
                            • DataTypes
                    • Periphery
                      • Contracts
                        • MISC
                          • Interfaces
                            • IEACAggregatorProxy
                        • Rewards
                          • Interfaces
                            • IRewardsController
                            • IRewardsDistributor
                            • ITransferStrategyBase
                          • Libraries
                            • RewardsDataTypes
                • Compound
                  • CarefulMath
                  • Exponential
                  • ExponentialNoError
                  • ICompound
    • Background
      • Building Blocks
        • MangroveOffer
        • Direct
        • Forwarder
  • Vaults
    • Understanding vaults
      • Oracles
    • Managing a vault (CLI)
      • Deploying an oracle
      • Creating a vault
      • Monitoring the vault
      • Setting the vault position
      • Setting the fee data
      • Rebalancing
      • Adding or removing liquidity
    • Custom interactions
      • Oracles
      • Vault Factory
      • Managing a vault
        • Setting the position
        • Rebalancing
        • Setting a manager
        • Setting fee
  • Keeper Bots
    • Keeper Bots
    • Guides
      • Using borrowed funds for cleaning
    • Backgroud
      • The role of cleaning bots in Mangrove
      • The role of gas price updater bots in Mangrove
  • Adresses
    • Deployment Addresses
  • Quick Links
    • Glossary
    • Website
    • Whitepaper
Powered by GitBook
On this page
  • Useful routers​
  • Liquidity flows​
  • Gatekeeping​
  1. Strat Lib
  2. Technical references

Liquidity routing

PreviousPrincipal hooksNextAPI preferences

Last updated 28 days ago

Work in progress

This page is currently being updated - thank you for your understanding.

Maker contracts can be set to utilize a in order to manage and tokens reserves of . Routers' interface are constrained by the AbstractRouter contract and use to customize the public functions described below.

Modifiers

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.

Useful routers

SimpleRouter

The provides a (simple) router instance. We illustrate the usage of the main router functions through it.

SmartRouter

The is an implementation, and must not be called directly. It delegates pull and push logic implementation to arbitrary contracts that implement the . It implements SimpleRouter as its default route.

When requested to do so, the deploys a RouterProxy. It is created specifically for the caller, and will forward all the push/pull calls to the SmartRouter, which forward those to the corresponding routing logic (ex: AaveLogic).

Thefore, the push/pull functions are delegated from the Proxy > SmartRouter > RoutingLogic. The Proxy contract basically works like an intelligent router.

src/strategies/routers/abstract/AbstractRouter.sol

///@notice pushes assets from calling's maker contract to a reserve
///@param token is the asset the maker is pushing
///@param reserveId determines the location of the reserve (router implementation dependent).
///@param amount is the amount of asset that should be transferred from the calling maker contract
///@return pushed fraction of `amount` that was successfully pushed to reserve.
function push(IERC20 token, address reserveId, uint amount) external onlyBound returns (uint pushed) {
  • Input:

    • token is the asset the maker contract wishes to push

    • reserveId is the address of the offer owner whose funds are being pushed

    • amount is the amount of asset that should be transferred from the calling maker contract

  • Output: fraction of amount that was successfully pushed to offer owner's reserveId.

  • 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 to reserveId. Returns 0 if transfer failed, returns amount otherwise.

src/strategies/routers/abstract/AbstractRouter.sol

///@notice pulls liquidity from the reserve and sends it to the calling maker contract.
///@param token is the ERC20 managing the pulled asset
///@param reserveId identifies the fund owner (router implementation dependent).
///@param amount of `token` the maker contract wishes to pull from its reserve
///@param strict when the calling maker contract accepts to receive more funds from reserve than required (this may happen for gas optimization)
///@return pulled the amount that was successfully pulled.
function pull(IERC20 token, address reserveId, uint amount, bool strict) external onlyBound returns (uint pulled) {
  • Input:

    • token is the asset the maker contract wishes to pull

    • reserveId is the address of the offer owner where the funds need to be pulled from

    • amount is the amount of asset that should be transferred from reserveId to the calling maker contract

    • strict is used when the calling maker contract accepts to receive more funds from reserve than required (this may happen for gas optimization)

  • Output: fraction of amount that was successfully pulled to msg.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 reserveId to msg.sender. Returns 0 if transfer failed, returns amount otherwise.

src/strategies/routers/abstract/AbstractRouter.sol

///@notice pulls liquidity from the reserve and sends it to the calling maker contract.
///@param token is the ERC20 managing the pulled asset
///@param reserveId identifies the fund owner (router implementation dependent).
///@param amount of `token` the maker contract wishes to pull from its reserve
///@param strict when the calling maker contract accepts to receive more funds from reserve than required (this may happen for gas optimization)
///@return pulled the amount that was successfully pulled.
function pull(IERC20 token, address reserveId, uint amount, bool strict) external onlyBound returns (uint pulled) {

src/strategies/routers/abstract/AbstractRouter.sol

///@notice performs necessary approval to activate router function on a particular asset
///@param token the asset one wishes to use the router for
function activate(IERC20 token) external boundOrAdmin {
  • 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 transferring token in deposit calls.

  • SimpleRouter behavior: SimpleRouter does not need to approve any contract, and activate is a no-op in that context.

src/strategies/routers/abstract/AbstractRouter.sol

///@notice allows a makerContract to verify it is ready to use `this` router for a particular reserve
///@dev `checkList` returns normally if all needed approval are strictly positive. It reverts otherwise with a reason.
///@param token is the asset (and possibly its overlyings) whose approval must be checked
///@param reserveId of the tokens that are being pulled
function checkList(IERC20 token, address reserveId) external view {
  • Usage: verifies that the router has performed and received all the necessary approvals to route token liquidity for offer owner's reserveId. The function throws with a reason when the first missing approval is detected.

  • SimpleRouter behavior: it verifies that reserveId has approved the router for token transfer. Does not throw if offer owner's reserveId is the router itself.

Plug and play routing

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.

Liquidity flows

Routers receive requests from approved (see ). Request can be either to manage inbound (offer taker's payment) or outbound cash flow.

Push request

Pull request

Gatekeeping

Binding a router to a maker contract

Function approves makerContract as a user of the router. The function can be called to revoke the approval.

Router activation

Router checklist

Note that maker contracts' view offerGasreq returns the sum of the offer logic's raw (without taking router into account) and the router specific gasreq

​
maker contracts
gatekeeping
​
See entire file on GitHub
​
See entire file on GitHub
​
​
See entire file on GitHub
unbind
​
See entire file on GitHub
​
See entire file on GitHub
gasreq
router
outbound
inbound
offer owners
hooks
​
​
SimpleRouter contract
​
SmartRouter contract
AbstractRoutingLogic interface
ProxyFactory