PMM RFQ Smart Contract

Contract Address

0xbbbbbBB520d69a9775E85b458C58c648259FAD5F

The address is the same on all supported networks

Contract Description and Functions for takers

Bebop smart contract enables settlement (token transfers) between users and market makers.

Different functions for swap are used depending on the number of tokens and the number of makers participating in the trade. Quote response in API has the field onchainOrderType which indicates the type of the order: SingleOrder, MultiOrder or AggregateOrder

SingleOrder

SingleOrder - One-to-One trade with one maker

/// @notice Struct for one-to-one trade with one maker
struct Single {
    uint256 expiry;
    address taker_address;
    address maker_address;
    uint256 maker_nonce;
    address taker_token;
    address maker_token;
    uint256 taker_amount;
    uint256 maker_amount;
    address receiver;
    uint256 packed_commands;
    uint256 flags; // `hashSingleOrder` doesn't use this field for SingleOrder hash
}
/// @param order Single order struct
/// @param makerSignature Maker's signature for SingleOrder
/// @param filledTakerAmount Partially filled taker amount, 0 for full fill
function swapSingle(
    Order.Single calldata order,
    Signature.MakerSignature calldata makerSignature,
    uint256 filledTakerAmount
) external payable;

Another function for SingleOrder is not returned from our API, however it can be used as an optimization for specific cases:

/// Using current contract's balance of taker_token as partial fill amount
/// @param order Single order struct
/// @param makerSignature Maker's signature for SingleOrder
function swapSingleFromContract(
    Order.Single calldata order,
    Signature.MakerSignature calldata makerSignature
) external payable;

MultiOrder

MultiOrder - Many-to-One or One-to-Many trade with one maker

/// @notice Struct for many-to-one or one-to-many trade with one maker
/// Also this struct is used as maker order which is part of AggregateOrder
struct Multi {
    uint256 expiry;
    address taker_address;
    address maker_address;
    uint256 maker_nonce;
    address[] taker_tokens;
    address[] maker_tokens;
    uint256[] taker_amounts;
    uint256[] maker_amounts;
    address receiver;
    bytes commands;
    uint256 flags; // `hashMultiOrder` doesn't use this field for MultiOrder hash
}
/// @param order Multi order struct
/// @param makerSignature Maker's signature for MultiOrder
/// @param filledTakerAmount Partially filled taker amount, 0 for full fill. Many-to-one doesnt support partial fill
function swapMulti(
    Order.Multi calldata order,
    Signature.MakerSignature calldata makerSignature,
    uint256 filledTakerAmount
) external payable;

AggregateOrder

AggregateOrder - any trade with multiple makers

/// @notice Struct for any trade with multiple makers
struct Aggregate {
    uint256 expiry;
    address taker_address;
    address[] maker_addresses;
    uint256[] maker_nonces;
    address[][] taker_tokens;
    address[][] maker_tokens;
    uint256[][] taker_amounts;
    uint256[][] maker_amounts;
    address receiver;
    bytes commands;
    uint256 flags; // `hashAggregateOrder` doesn't use this field for AggregateOrder hash
}
/// @param order Aggregate order struct
/// @param makersSignatures Makers signatures for MultiOrder (MultiOrder can be contructed as part of current AggregateOrder)
/// @param filledTakerAmount Partially filled taker amount, 0 for full fill. Many-to-one doesnt support partial fill
function swapAggregate(
    Order.Aggregate calldata order,
    Signature.MakerSignature[] calldata makersSignatures,
    uint256 filledTakerAmount
) external payable;

Errors

Error
Hex

OrderInvalidSigner

0x7212c4e5

InvalidEIP712Signature

0xbe109cb3

InvalidEIP1271Signature

0x5d52cbe3

InvalidETHSIGNSignature

0x23b425da

InvalidSignatureType

0x60cd402d

InvalidSignatureLength

0x4be6321b

InvalidSignatureValueS

0x1a5bf8ec

InvalidSignatureValueV

0xf5d7a23b

ZeroNonce

0x150b14ee

InvalidNonce

0x756688fe

OrderExpired

0xc56873ba

OrdersLengthsMismatch

0x79b39097

TokensLengthsMismatch

0xd13482e8

CommandsLengthsMismatch

0x518b8015

InvalidPermit2Commands

0xfefbfd16

InvalidCommand

0x12f269e5

InvalidCommandsLength

0x0386f034

InvalidFlags

0x89702c9b

PartialFillNotSupported

0x7d617bb3

UpdatedMakerAmountsTooLow

0x711dbe4a

ZeroMakerAmount

0xb2f300d0

MakerAmountsLengthsMismatch

0x9143869a

NotEnoughNativeToken

0xf6ed5e01

WrongWrappedTokenAddress

0x1ede9e1a

FailedToSendNativeToken

0xd1a4579f

InvalidSender

0xddb5de5e

ManyToManyNotSupported

0xffc7ec8d

InvalidPendingTransfersLength

0xc37a5663

InvalidPermit2TransfersLength

0xd224c1c8

PartnerAlreadyRegistered

0xd6fc122c

PartnerFeeTooHigh

0x53ac0400

NullBeneficiary

0xcf260806

Last updated