Skip to main content

Maker contract

info

A maker contract is a smart contract that is bound to an offer posted on Mangrove. It is the contract that is called by Mangrove should the offer be matched during a taker order. The offer logic is the part of the maker contract that executes as a consequence of a call by Mangrove. The offer logic is split into trade execution and trade posthook.

Trade Execution​

The logic associated with an offer must be implemented in the makerExecute callback function. (See data structures for SingleOrder type).

function makerExecute(MgvLib.SingleOrder calldata order)
external returns (bytes32 makerData);

Inputs​

  • order is a data structure containing a recap of the taker order and Mangrove's current configuration state. The protocol guarantees that order.gives/order.wants will match the price of the offer that is being executed up to a small precision.

Outputs​

  • makerData is an arbitrary bytes32 that will be passed to makerPosthoook in the makerData field.
Security concerns

Your contract should ensure that only Mangrove can call makerExecute to avoid unwanted state change.

How to succeed

To successfully execute, the logic must not revert during the call to makerExecute and have at least wants outbound tokens available for Mangrove to transfer by the end of the function's execution.

How to renege on trade

The proper way to renege on an offer is to make the execution of makerExecute throw with a reason that can be cast to a bytes32. Having a balance of outbound tokens that is lower than order.wants will also make trade fail, but with a higher incurred gas cost and thus a higher bounty.

Better fail early!

The bounty taken from the offer maker's provision is proportional to the gas consumed by makerExecute. To minimize costs, try to fail as early as possible.

Mangrove is guarded against reentrancy during makerExecute

The offer list for the outbound / inbound token pair is temporarily locked during calls to makerExecute. Its offers cannot be modified in any way. The offer logic must use makerPosthook to repost/update its offers, since the offer list will unlocked by then.

Trade posthook​

The logic associated with an offer may include a makerPosthook callback function. Its intended use is to update offers in the offer list containing the offer that was just executed.

function makerPosthook(
MgvLib.SingleOrder calldata order,
MgvLib.OrderResult calldata result
) external;

Inputs​

  • order same as in makerExecute.
  • result A struct containing:
    • the return value of makerExecute
    • additional data sent by Mangrove, more info available here.

Outputs​

None.

Security concerns

Your contract should ensure that only Mangrove can call makerPosthook to avoid unwanted state change.

Gas management

MakerPosthook is given the executed offer's gasreq minus the gas used by makerExecute.

Updating offers during posthook

During the execution of a posthook, the executed offer's list is unlocked. This feature can be used to repost an offer (even the one that was just executed), possibly at a different price.

Reverting

Reverting during makerPosthook does not renege on trade, which is settled at the end of makerExecute.