fleupold / milkman

A smart contract system which allows smart contracts, including Gnosis Safes, to route their order flow through the CoW protocol with market orders.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Milkman

Tests License: LGPL-3.0

Fulfills all of your smart contract's CoW needs. 🐮

A simple way for smart contracts to sell their tokens via the CoW Protocol, reaping the benefits of MEV protection even when tx.origin is malicious (e.g., a liquidator bot in a borrow/lend protocol).

How to use

To swap via Milkman, call milkman.requestSwapExactTokensForTokens, passing in the following parameters:

  • amountIn: an amount of tokens to sell
  • fromToken: ERC20 you're swapping out of
  • toToken: ERC20 you're swapping into
  • to: the intended receiver of the bought tokens
  • priceChecker: the address of a price checker, or address(0) for none; explained below
  • priceCheckerData: encoded data to pass to the price checker; explained below

After you submit a swap request, it should be picked up and executed within 1-2 minutes.

See docs/EXAMPLES for examples.

Price checkers

After token have been sent to Milkman, it functions like a 'conditional signer', only releasing those tokens to CoW protocol under certain conditions. Anyone can generate an off-chain order for an on-chain swap request, but Milkman will only sign off on orders that pass its checks.

Many of these checks are baked into Milkman itself, such as ensuring that the off-chain order is a sell order (not a buy order). However, an important one is not: validating that the bot-supplied minOut approximates the true value of the tokens that a user is swapping. Users who don't want to trust the CoW off-chain system can use price checkers. Price checkers verify that a minOut is in-line with some on-chain price feed. For example, one price checker could verify that minOut is at least 90% of what they could get from selling the tokens via SushiSwap.

The only requirement for a price checker is that it needs to be compatible with the IPriceChecker interface. Anyone can create a new one, and new ones don't need to be whitelisted.

Developing new price checkers

To be valid, price checkers need to implement the following function:

function checkPrice(
        uint256 _amountIn,
        address _fromToken,
        address _toToken,
        uint256 _minOut,
        bytes calldata _data
    ) external view returns (bool);

The process of building one is straightforward. Examples can be found in the pricecheckers folder.

About

A smart contract system which allows smart contracts, including Gnosis Safes, to route their order flow through the CoW protocol with market orders.

License:GNU Lesser General Public License v3.0


Languages

Language:Python 59.2%Language:Solidity 40.8%Language:JavaScript 0.1%