API References
Overview​
There are currently four endpoints involved in a tx relay transaction:
/tx-relay/v1/swap/price
/tx-relay/v1/swap/quote
/tx-relay/v1/swap/submit
/tx-relay/v1/swap/status/:trade-hash
Tx Relay API is supported on Mainnet and Polygon
Network | Endpoint |
---|---|
Ethereum (Mainnet) | https://api.0x.org/ |
Polygon | https://polygon.api.0x.org/ |
Signed Orders are Settled by 0x Protocol Smart Contracts​
Once signed orders hit the blockchain, they are settled by 0x Protocol smart contracts:
- For meta-transaction orders, they are settled by the contract
MetaTransactionsFeature
and filled by theexecteMetaTransaction
function, available here. - For meta-transaction v2 orders (currently in development in tx relay API), they are settled by the contract
MetaTransactionsFeatureV2
and filled by theexecuteMetaTransactionV2
function, available here. - For otc order (currently in development in tx relay API), they are settled by the contract
OtcOrdersFeature
and filled by thefillTakerSignedOtcOrderForEth
orfillTakerSignedOtcOrder
functions, available here.
Technical Appendix​
Presenting EIP-712 Signatures for signTypedData
​
If you are integrating with Metamask or another user facing wallet that shows the users the details of what they are signing, then you will most likely want to use the EIP-712 signing strategy. In order to do so, you will need the following:
domain
types
primaryType
message
The message will be MetaTransactionData
(in the future MetaTransactionDataV2
) that is returned at the time of /quote
. However, you will also need the other fields.
The Domain will change per chain, but the name
and version
fields are consistent. Example:
const domain = {
"chainId": 1,
"verifyingContract": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
"name": "ZeroEx",
"version": "1.0.0"
};
For types
and primaryTypes
, it will depend on the message format.
For
MetaTransactionData
const primaryType = "MetaTransactionData";
const types = {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "version",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"MetaTransactionData": [
{
"type": "address",
"name": "signer"
},
{
"type": "address",
"name": "sender"
},
{
"type": "uint256",
"name": "minGasPrice"
},
{
"type": "uint256",
"name": "maxGasPrice"
},
{
"type": "uint256",
"name": "expirationTimeSeconds"
},
{
"type": "uint256",
"name": "salt"
},
{
"type": "bytes",
"name": "callData"
},
{
"type": "uint256",
"name": "value"
},
{
"type": "address",
"name": "feeToken"
},
{
"type": "uint256",
"name": "feeAmount"
}
]
};For
MetaTransactionDataV2
const primaryType = "MetaTransactionDataV2";
const types = {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "version",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"MetaTransactionDataV2": [
{
"type": "address",
"name": "signer"
},
{
"type": "address",
"name": "sender"
},
{
"type": "uint256",
"name": "expirationTimeSeconds"
},
{
"type": "uint256",
"name": "salt"
},
{
"type": "bytes",
"name": "callData"
},
{
"type": "address",
"name": "feeToken"
},
{
"type": "MetaTransactionFeeData[]",
"name": "fees"
}
],
"MetaTransactionFeeData": [
{
"type": "address",
"name": "recipient"
},
{
"type": "uint256",
"name": "amount"
}
]
};For
OtcOrder
const primaryType = "OtcOrder";
const types = {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "version",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"OtcOrder": [
{
"type": "address",
"name": "makerToken"
},
{
"type": "address",
"name": "takerToken"
},
{
"type": "uint128",
"name": "makerAmount"
},
{
"type": "uint128",
"name": "takerAmount"
},
{
"type": "address",
"name": "maker"
},
{
"type": "address",
"name": "taker"
},
{
"type": "address",
"name": "txOrigin"
},
{
"type": "uint256",
"name": "expiryAndNonce"
}
]
};
Computing a trade hash​
You could / should verify that the hash we provide in our request matches the meta-transaction provided.
For the trade.hash
field:
- If it's a meta-transaction, verify that the
meta-transaction
hashes to thetrade.hash
:getMetaTransactionHash
link - If it's a meta-transaction v2, verify that the
meta-transaction v2
hashes to thetrade.hash
:getMetaTransactionV2Hash
link - It it's an otc, verify that
otc
hashes to thetrade.hash
:getOtcOrderHash
link
If you need to call these functions on the 0x smart contracts to validate your code, you may need:
- The ABI: https://github.com/0xProject/protocol/blob/development/packages/contract-artifacts/artifacts/IZeroEx.json
- The Contract address (depends on the chain): https://docs.0x.org/introduction/0x-cheat-sheet#exchange-proxy-addresses