MangroveOffer
MangroveOfferβ
It contains the mandatory interface expected by Mangrove (IOfferLogic is IMaker) and enforces additional functions implementations (via IOfferLogic).
Naming scheme:
f() public: can be used, as is, in all descendants of this contract
_f() internal: descendant of this contract should provide a public wrapper for this function, with necessary guards.
__f__() virtual internal: descendant of this contract should override this function to specialize it to the needs of the strat.
MGVβ
contract IMangrove MGV
The Mangrove deployment that is allowed to call this for trade execution and posthook.
NO_ROUTERβ
contract AbstractRouter NO_ROUTER
constant for no router
REPOST_SUCCESSβ
bytes32 REPOST_SUCCESS
The offer was successfully reposted.
NEW_OFFER_SUCCESSβ
bytes32 NEW_OFFER_SUCCESS
New offer successfully created.
COMPLETE_FILLβ
bytes32 COMPLETE_FILL
The offer was completely filled.
Mgvβ
event Mgv(contract IMangrove mgv)
The Mangrove deployment that is allowed to call this for trade execution and posthook.
By emitting this event, an indexer will be able to create a mapping from this contract address to the used Mangrove address.
Parametersβ
| Name | Type | Description |
|---|---|---|
| mgv | contract IMangrove | The Mangrove deployment. |
receiveβ
receive() external payable virtual
Mandatory function to allow this to receive native tokens from Mangrove after a call to MGV.withdraw(...,deprovision:true)
override this function if this contract needs to handle local accounting of user funds.
constructorβ
constructor(contract IMangrove mgv) internal
MangroveOffer's constructor
Parametersβ
| Name | Type | Description |
|---|---|---|
| mgv | contract IMangrove | The Mangrove deployment that is allowed to call this for trade execution and posthook. |
routerβ
function router() public view returns (contract AbstractRouter)
Contract's router getter.
if contract has a no router, function returns NO_ROUTER.
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| [0] | contract AbstractRouter | the router. |
makerExecuteβ
function makerExecute(struct MgvLib.SingleOrder order) external returns (bytes32 ret)
makerExecute is the callback function to execute all offers that were posted on Mangrove by this contract.
_it may not be overriden although it can be customized using __lastLook__, __put__ and __get__ hooks.
NB #1: if makerExecute reverts, the offer will be considered to be refusing the trade.
NB #2: makerExecute may return a bytes32 word to pass information to posthook w/o using storage reads/writes.
NB #3: Reneging on trade will have the following effects:
- Offer is removed from the Offer List
- Offer bounty will be withdrawn from offer provision and sent to the offer taker. The remaining provision will be credited to
thiscontract's account on Mangrove_
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | a data structure that recapitulates the taker order and the offer as it was posted on mangrove |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| ret | bytes32 | a bytes32 word to pass information (if needed) to the posthook |
makerPosthookβ
function makerPosthook(struct MgvLib.SingleOrder order, struct MgvLib.OrderResult result) external
makerPosthook is the callback function that is called by Mangrove after the offer execution.
reverting during its execution will not renege on trade. Revert reason (casted to 32 bytes) is then logged by Mangrove in event PosthookFail.
It cannot be overridden but can be customized via the hooks __posthookSuccess__, __posthookFallback__ and __handleResidualProvision__ (see below).
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | a data structure that recapitulates the taker order and the offer as it was posted on mangrove |
| result | struct MgvLib.OrderResult | a data structure that gathers information about trade execution |
logRepostStatusβ
function logRepostStatus(struct MgvLib.SingleOrder order, bytes32 makerData, bytes32 repostStatus) internal
takes care of status for reposting residual offer in case of a partial fill and logging of potential issues.
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | a recap of the taker order |
| makerData | bytes32 | generated during makerExecute so as to log it if necessary |
| repostStatus | bytes32 | from the posthook that handles residual reposting |
setRouterβ
function setRouter(contract AbstractRouter router_) public virtual
sets a new router to pull outbound tokens from contract's reserve to this and push inbound tokens to reserve.
new router needs to be approved by this to push funds to reserve (see activate function). It also needs to be approved by reserve to pull from it.
Parametersβ
| Name | Type | Description |
|---|---|---|
| router_ | contract AbstractRouter | the new router contract that this contract should use. Use NO_ROUTER for no router. |
approveβ
function approve(contract IERC20 token, address spender, uint256 amount) public returns (bool)
Approves a spender to transfer a certain amount of tokens on behalf of this.
admin may use this function to revoke specific approvals of this that are set after a call to activate.
Parametersβ
| Name | Type | Description |
|---|---|---|
| token | contract IERC20 | the ERC20 token contract |
| spender | address | the approved spender |
| amount | uint256 | the spending amount |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| [0] | bool | result of token approval. |
activateβ
function activate(contract IERC20[] tokens) external
performs the required approvals so as to allow this to interact with Mangrove on a set of assets.
Parametersβ
| Name | Type | Description |
|---|---|---|
| tokens | contract IERC20[] | the ERC20 this will approve to be able to trade on Mangrove's corresponding markets. |
checkListβ
function checkList(contract IERC20[] tokens) external view
verifies that Mangrove is allowed to pull tokens from this contract.
throws with a reason if something (e.g. an approval) is missing.
Parametersβ
| Name | Type | Description |
|---|---|---|
| tokens | contract IERC20[] | the list of tokens that are traded by this contract |
activateβ
function __activate__(contract IERC20 token) internal virtual
override conservatively to define strat-specific additional activation steps.
Parametersβ
| Name | Type | Description |
|---|---|---|
| token | contract IERC20 | the ERC20 one wishes this contract to trade on. |
checkListβ
function __checkList__(contract IERC20 token) internal view virtual
verifies that Mangrove is allowed to pull tokens from this contract and other strat specific verifications.
Parametersβ
| Name | Type | Description |
|---|---|---|
| token | contract IERC20 | a token that is traded by this contract |
withdrawFromMangroveβ
function withdrawFromMangrove(uint256 amount, address payable receiver) public
withdraws native tokens from this balance on Mangrove.
Since a call is made to the receiver, this function is subject to reentrancy.
Parametersβ
| Name | Type | Description |
|---|---|---|
| amount | uint256 | the amount of WEI one wishes to withdraw. |
| receiver | address payable | the address of the receiver of the funds. |
putβ
function __put__(uint256 amount, struct MgvLib.SingleOrder order) internal virtual returns (uint256 missingPut)
Hook that implements where the inbound token, which are brought by the Offer Taker, should go during Taker Order's execution.
if the last nested call to __put__ returns a non zero value, trade execution will revert
Parametersβ
| Name | Type | Description |
|---|---|---|
| amount | uint256 | of inbound tokens that are on this contract's balance and still need to be deposited somewhere |
| order | struct MgvLib.SingleOrder | is a recall of the taker order that is at the origin of the current trade. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| missingPut | uint256 | (<=amount) is the amount of inbound tokens whose deposit location has not been decided (possibly because of a failure) during this function execution |
getβ
function __get__(uint256 amount, struct MgvLib.SingleOrder order) internal virtual returns (uint256 missingGet)
Hook that implements where the outbound token, which are promised to the taker, should be fetched from, during Taker Order's execution.
if the last nested call to __get__ returns a non zero value, trade execution will revert
Parametersβ
| Name | Type | Description |
|---|---|---|
| amount | uint256 | of outbound tokens that still needs to be brought to the balance of this contract when entering this function |
| order | struct MgvLib.SingleOrder | is a recall of the taker order that is at the origin of the current trade. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| missingGet | uint256 | (<=amount), which is the amount of outbound tokens still need to be fetched at the end of this function |
lastLookβ
function __lastLook__(struct MgvLib.SingleOrder order) internal virtual returns (bytes32 data)
Hook that implements a last look check during Taker Order's execution.
_lastLook should revert if trade is to be reneged on. If not, returned bytes32 are passed to makerPosthook in the makerData field._
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | is a recall of the taker order that is at the origin of the current trade. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| data | bytes32 | is a message that will be passed to posthook provided makerExecute does not revert. |
posthookFallbackβ
function __posthookFallback__(struct MgvLib.SingleOrder order, struct MgvLib.OrderResult result) internal virtual returns (bytes32 data)
Post-hook that implements fallback behavior when Taker Order's execution failed unexpectedly.
result.mgvData is Mangrove's verdict about trade success
result.makerData either contains the first 32 bytes of revert reason if makerExecute reverted or the returned bytes32.
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | is a recall of the taker order that is at the origin of the current trade. |
| result | struct MgvLib.OrderResult | contains information about trade. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| data | bytes32 | contains verdict and reason about the executed trade. |
residualValuesβ
function __residualValues__(struct MgvLib.SingleOrder order) internal virtual returns (uint256 newGives, Tick newTick)
Given the current taker order that (partially) consumes an offer, this hook is used to declare how much order.olKey.outbound_tkn the offer gives after it is reposted, while also allowing adjustment to the tick.
default is to require the original amount of tokens minus those that have been sent to the taker during trade execution and keep the tick.
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | is a recall of the taker order that is being treated. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| newGives | uint256 | the new volume of outbound_tkn the offer will give if fully taken. |
| newTick | Tick | the new tick of the reposted offer. |
handleResidualProvisionβ
function __handleResidualProvision__(struct MgvLib.SingleOrder order) internal virtual
Hook that defines what needs to be done to the part of an offer provision that was added to the balance of this on Mangrove after an offer has failed.
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | is a recall of the taker order that failed |
posthookSuccessβ
function __posthookSuccess__(struct MgvLib.SingleOrder order, bytes32 makerData) internal virtual returns (bytes32 data)
Post-hook that implements default behavior when Taker Order's execution succeeded.
Parametersβ
| Name | Type | Description |
|---|---|---|
| order | struct MgvLib.SingleOrder | is a recall of the taker order that is at the origin of the current trade. |
| makerData | bytes32 | is the returned value of the __lastLook__ hook, triggered during trade execution. The special value "lastLook/retract" should be treated as an instruction not to repost the offer on the list. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| data | bytes32 | can be: COMPLETE_FILL when offer was completely filled returned data of _updateOffer signalling the status of the reposting attempt. |
_updateOfferβ
function _updateOffer(struct IOfferLogic.OfferArgs args, uint256 offerId) internal virtual returns (bytes32)
Updates the offer specified by offerId on Mangrove with the parameters in args.
Parametersβ
| Name | Type | Description |
|---|---|---|
| args | struct IOfferLogic.OfferArgs | A memory struct containing the offer parameters to update. |
| offerId | uint256 | An unsigned integer representing the identifier of the offer to be updated. |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| [0] | bytes32 | status a bytes32 value representing either REPOST_SUCCESS if the update is successful, or an error message if an error occurs and OfferArgs.noRevert is true. If OfferArgs.noRevert is false, the function reverts with the error message as the reason. |
_provisionOfβ
function _provisionOf(struct OLKey olKey, uint256 offerId) internal view returns (uint256 provision)
computes the provision that can be redeemed if deprovisioning a certain offer
Parametersβ
| Name | Type | Description |
|---|---|---|
| olKey | struct OLKey | the offer list key. |
| offerId | uint256 | the id of the offer |
Return Valuesβ
| Name | Type | Description |
|---|---|---|
| provision | uint256 | the provision that can be redeemed |