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 makerstructSingle{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}
Another function for SingleOrder is not returned from our API, however it can be used as an optimization for specific cases:
MultiOrder
MultiOrder - Many-to-One or One-to-Many trade with one maker
/// @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;
/// 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;
/// @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;
/// @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;