Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 20 additions & 19 deletions crates/driver/src/domain/liquidity/zeroex.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
use {
crate::domain::{eth, liquidity},
alloy::primitives::{Address, B256},
anyhow::anyhow,
contracts::alloy::IZeroex,
ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy},
primitive_types::{H160, H256, U256},
primitive_types::U256,
std::sync::Arc,
};

Expand All @@ -25,24 +26,24 @@ pub struct LimitOrder {

#[derive(Clone, Debug)]
pub struct Order {
pub maker: H160,
pub taker: H160,
pub sender: H160,
pub maker_token: H160,
pub taker_token: H160,
pub maker: Address,
pub taker: Address,
pub sender: Address,
pub maker_token: Address,
pub taker_token: Address,
pub amounts: Amounts,
pub taker_token_fee_amount: u128,
pub fee_recipient: H160,
pub pool: H256,
pub fee_recipient: Address,
pub pool: B256,
pub expiry: u64,
pub salt: U256,
pub signature: ZeroExSignature,
}

#[derive(Clone, Debug)]
pub struct ZeroExSignature {
pub r: H256,
pub s: H256,
pub r: B256,
pub s: B256,
pub v: u8,
pub signature_type: u8,
}
Expand All @@ -51,24 +52,24 @@ impl LimitOrder {
pub fn to_interaction(&self, input: &liquidity::MaxInput) -> anyhow::Result<eth::Interaction> {
let method = self.zeroex.fillOrKillLimitOrder(
IZeroex::LibNativeOrder::LimitOrder {
makerToken: self.order.maker_token.into_alloy(),
takerToken: self.order.taker_token.into_alloy(),
makerToken: self.order.maker_token,
takerToken: self.order.taker_token,
makerAmount: self.order.amounts.maker,
takerAmount: self.order.amounts.taker,
takerTokenFeeAmount: self.order.taker_token_fee_amount,
maker: self.order.maker.into_alloy(),
taker: self.order.taker.into_alloy(),
sender: self.order.sender.into_alloy(),
feeRecipient: self.order.fee_recipient.into_alloy(),
pool: self.order.pool.into_alloy(),
maker: self.order.maker,
taker: self.order.taker,
sender: self.order.sender,
feeRecipient: self.order.fee_recipient,
pool: self.order.pool,
expiry: self.order.expiry,
salt: self.order.salt.into_alloy(),
},
IZeroex::LibSignature::Signature {
signatureType: self.order.signature.signature_type,
v: self.order.signature.v,
r: self.order.signature.r.into_alloy(),
s: self.order.signature.s.into_alloy(),
r: self.order.signature.r,
s: self.order.signature.s,
},
input
.0
Expand Down
8 changes: 4 additions & 4 deletions crates/driver/src/infra/solver/dto/auction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ pub fn new(
liquidity::Kind::Swapr(pool) => pool.base.reserves.iter().map(|r| r.token).collect(),
liquidity::Kind::ZeroEx(limit_order) => {
vec![
limit_order.order.maker_token.into(),
limit_order.order.taker_token.into(),
limit_order.order.maker_token.into_legacy().into(),
limit_order.order.taker_token.into_legacy().into(),
]
}
})
Expand Down Expand Up @@ -309,8 +309,8 @@ pub fn new(
address: limit_order.zeroex.address().into_legacy(),
gas_estimate: liquidity.gas.into(),
hash: Default::default(),
maker_token: limit_order.order.maker_token,
taker_token: limit_order.order.taker_token,
maker_token: limit_order.order.maker_token.into_legacy(),
taker_token: limit_order.order.taker_token.into_legacy(),
maker_amount: limit_order.fillable.maker.into(),
taker_amount: limit_order.fillable.taker.into(),
taker_token_fee_amount: limit_order.order.taker_token_fee_amount.into(),
Expand Down
60 changes: 22 additions & 38 deletions crates/e2e/src/api/zeroex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ use {
crate::setup::TestAccount,
alloy::primitives::{Address, B256, U256},
chrono::{DateTime, NaiveDateTime, Utc},
ethcontract::common::abi::{Token, encode},
ethrpc::alloy::conversions::IntoLegacy,
ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy},
hex_literal::hex,
model::DomainSeparator,
shared::zeroex_api::{self, Order, OrderMetadata, OrderRecord, ZeroExSignature},
std::{net::SocketAddr, sync::LazyLock},
std::net::SocketAddr,
warp::{Filter, Reply},
web3::{signing, types::H160},
};

pub struct ZeroExApi {
Expand Down Expand Up @@ -75,22 +73,22 @@ impl Eip712TypedZeroExOrder {
pub fn to_order_record(
&self,
chain_id: u64,
verifying_contract: H160,
verifying_contract: Address,
signer: TestAccount,
) -> OrderRecord {
OrderRecord::new(
Order {
chain_id,
expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64,
fee_recipient: self.fee_recipient.into_legacy(),
maker: self.maker.into_legacy(),
maker_token: self.maker_token.into_legacy(),
fee_recipient: self.fee_recipient,
maker: self.maker,
maker_token: self.maker_token,
maker_amount: self.maker_amount,
pool: self.pool.into_legacy(),
pool: self.pool,
salt: self.salt.into_legacy(),
sender: self.sender.into_legacy(),
taker: self.taker.into_legacy(),
taker_token: self.taker_token.into_legacy(),
sender: self.sender,
taker: self.taker,
taker_token: self.taker_token,
taker_amount: self.taker_amount,
taker_token_fee_amount: self.taker_token_fee_amount,
verifying_contract,
Expand All @@ -116,8 +114,8 @@ impl Eip712TypedZeroExOrder {
) -> ZeroExSignature {
let signature = signer.sign_typed_data(domain_separator, &hash);
ZeroExSignature {
r: signature.r,
s: signature.s,
r: signature.r.into_alloy(),
s: signature.s.into_alloy(),
v: signature.v,
// See <https://github.com/0xProject/protocol/blob/%400x/protocol-utils%4011.24.2/packages/protocol-utils/src/signature_utils.ts#L13>
signature_type: 2,
Expand All @@ -140,37 +138,23 @@ impl Eip712TypedZeroExOrder {
hash_data[320..352].copy_from_slice(self.pool.as_slice());
hash_data[376..384].copy_from_slice(&self.expiry.to_be_bytes());
hash_data[384..416].copy_from_slice(&self.salt.to_be_bytes::<32>());
signing::keccak256(&hash_data)
alloy::primitives::keccak256(hash_data).into()
}
}

struct ZeroExDomainSeparator([u8; 32]);

impl ZeroExDomainSeparator {
// See <https://github.com/0xProject/protocol/blob/%400x/contracts-zero-ex%400.49.0/contracts/zero-ex/contracts/src/fixins/FixinEIP712.sol>
pub fn new(chain_id: u64, contract_addr: H160) -> Self {
/// The EIP-712 domain name used for computing the domain separator.
static DOMAIN_NAME: LazyLock<[u8; 32]> = LazyLock::new(|| signing::keccak256(b"ZeroEx"));

/// The EIP-712 domain version used for computing the domain separator.
static DOMAIN_VERSION: LazyLock<[u8; 32]> = LazyLock::new(|| signing::keccak256(b"1.0.0"));

/// The EIP-712 domain type used computing the domain separator.
static DOMAIN_TYPE_HASH: LazyLock<[u8; 32]> = LazyLock::new(|| {
signing::keccak256(
b"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)",
)
});

let abi_encode_string = encode(&[
Token::FixedBytes((*DOMAIN_TYPE_HASH).into()),
Token::FixedBytes((*DOMAIN_NAME).into()),
Token::FixedBytes((*DOMAIN_VERSION).into()),
Token::Uint(chain_id.into()),
Token::Address(contract_addr),
]);

Self(signing::keccak256(abi_encode_string.as_slice()))
pub fn new(chain_id: u64, contract_addr: Address) -> Self {
let domain = alloy::sol_types::eip712_domain! {
name: "ZeroEx",
version: "1.0.0",
chain_id: chain_id,
verifying_contract: contract_addr,
};

Self(domain.separator().into())
}

pub fn to_domain_separator(&self) -> DomainSeparator {
Expand Down
72 changes: 36 additions & 36 deletions crates/e2e/tests/e2e/liquidity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use {
},
chrono::{NaiveDateTime, Utc},
contracts::alloy::{ERC20, IZeroex},
driver::domain::eth::H160,
e2e::{
api::zeroex::{Eip712TypedZeroExOrder, ZeroExApi},
assert_approximately_eq,
Expand Down Expand Up @@ -175,9 +174,9 @@ async fn zero_ex_liquidity(web3: Web3) {
let zeroex_liquidity_orders = create_zeroex_liquidity_orders(
order.clone(),
zeroex_maker.clone(),
zeroex.address().into_legacy(),
*zeroex.address(),
chain_id,
onchain.contracts().weth.address().into_legacy(),
*onchain.contracts().weth.address(),
);
let zeroex_api_port = ZeroExApi::new(zeroex_liquidity_orders.to_vec()).run().await;

Expand Down Expand Up @@ -281,7 +280,7 @@ async fn zero_ex_liquidity(web3: Web3) {
expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64,
salt: alloy::primitives::U256::from(Utc::now().timestamp()),
}
.to_order_record(chain_id, zeroex.address().into_legacy(), zeroex_maker);
.to_order_record(chain_id, *zeroex.address(), zeroex_maker);
fill_or_kill_zeroex_limit_order(&zeroex, &zeroex_order, solver.account().clone())
.await
.unwrap();
Expand All @@ -301,9 +300,9 @@ async fn zero_ex_liquidity(web3: Web3) {
fn create_zeroex_liquidity_orders(
order_creation: OrderCreation,
zeroex_maker: TestAccount,
zeroex_addr: H160,
zeroex_addr: Address,
chain_id: u64,
weth_address: H160,
weth_address: Address,
) -> [shared::zeroex_api::OrderRecord; 3] {
let typed_order = Eip712TypedZeroExOrder {
maker_token: order_creation.buy_token.into_alloy(),
Expand All @@ -319,13 +318,13 @@ fn create_zeroex_liquidity_orders(
// Makes it possible for anyone to fill the order
taker: Default::default(),
sender: Default::default(),
fee_recipient: zeroex_addr.into_alloy(),
fee_recipient: zeroex_addr,
pool: Default::default(),
expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64,
salt: alloy::primitives::U256::from(Utc::now().timestamp()),
};
let usdt_weth_order = Eip712TypedZeroExOrder {
maker_token: weth_address.into_alloy(),
maker_token: weth_address,
taker_token: order_creation.buy_token.into_alloy(),
// the value comes from the `--amount-to-estimate-prices-with` config to provide
// sufficient liquidity
Expand All @@ -336,13 +335,13 @@ fn create_zeroex_liquidity_orders(
maker: zeroex_maker.address(),
taker: Default::default(),
sender: Default::default(),
fee_recipient: zeroex_addr.into_alloy(),
fee_recipient: zeroex_addr,
pool: Default::default(),
expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64,
salt: alloy::primitives::U256::from(Utc::now().timestamp()),
};
let usdc_weth_order = Eip712TypedZeroExOrder {
maker_token: weth_address.into_alloy(),
maker_token: weth_address,
taker_token: order_creation.sell_token.into_alloy(),
// the value comes from the `--amount-to-estimate-prices-with` config to provide
// sufficient liquidity
Expand All @@ -353,7 +352,7 @@ fn create_zeroex_liquidity_orders(
maker: zeroex_maker.address(),
taker: Default::default(),
sender: Default::default(),
fee_recipient: zeroex_addr.into_alloy(),
fee_recipient: zeroex_addr,
pool: Default::default(),
expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64,
salt: alloy::primitives::U256::from(Utc::now().timestamp()),
Expand All @@ -375,24 +374,24 @@ async fn get_zeroex_order_amounts(
Ok(zeroex
.getLimitOrderRelevantState(
IZeroex::LibNativeOrder::LimitOrder {
makerToken: zeroex_order.order().maker_token.into_alloy(),
takerToken: zeroex_order.order().taker_token.into_alloy(),
makerToken: zeroex_order.order().maker_token,
takerToken: zeroex_order.order().taker_token,
makerAmount: zeroex_order.order().maker_amount,
takerAmount: zeroex_order.order().taker_amount,
takerTokenFeeAmount: zeroex_order.order().taker_token_fee_amount,
maker: zeroex_order.order().maker.into_alloy(),
taker: zeroex_order.order().taker.into_alloy(),
sender: zeroex_order.order().sender.into_alloy(),
feeRecipient: zeroex_order.order().fee_recipient.into_alloy(),
pool: zeroex_order.order().pool.into_alloy(),
maker: zeroex_order.order().maker,
taker: zeroex_order.order().taker,
sender: zeroex_order.order().sender,
feeRecipient: zeroex_order.order().fee_recipient,
pool: zeroex_order.order().pool,
expiry: zeroex_order.order().expiry,
salt: zeroex_order.order().salt.into_alloy(),
},
IZeroex::LibSignature::Signature {
signatureType: zeroex_order.order().signature.signature_type,
v: zeroex_order.order().signature.v,
r: zeroex_order.order().signature.r.into_alloy(),
s: zeroex_order.order().signature.s.into_alloy(),
r: zeroex_order.order().signature.r,
s: zeroex_order.order().signature.s,
},
)
.call()
Expand All @@ -408,27 +407,28 @@ async fn fill_or_kill_zeroex_limit_order(
zeroex_order: &shared::zeroex_api::OrderRecord,
from_account: Account,
) -> anyhow::Result<H256> {
let order = zeroex_order.order();
let tx_hash = zeroex
.fillOrKillLimitOrder(
IZeroex::LibNativeOrder::LimitOrder {
makerToken: zeroex_order.order().maker_token.into_alloy(),
takerToken: zeroex_order.order().taker_token.into_alloy(),
makerAmount: zeroex_order.order().maker_amount,
takerAmount: zeroex_order.order().taker_amount,
takerTokenFeeAmount: zeroex_order.order().taker_token_fee_amount,
maker: zeroex_order.order().maker.into_alloy(),
taker: zeroex_order.order().taker.into_alloy(),
sender: zeroex_order.order().sender.into_alloy(),
feeRecipient: zeroex_order.order().fee_recipient.into_alloy(),
pool: zeroex_order.order().pool.into_alloy(),
expiry: zeroex_order.order().expiry,
salt: zeroex_order.order().salt.into_alloy(),
makerToken: order.maker_token,
takerToken: order.taker_token,
makerAmount: order.maker_amount,
takerAmount: order.taker_amount,
takerTokenFeeAmount: order.taker_token_fee_amount,
maker: order.maker,
taker: order.taker,
sender: order.sender,
feeRecipient: order.fee_recipient,
pool: order.pool,
expiry: order.expiry,
salt: order.salt.into_alloy(),
},
IZeroex::LibSignature::Signature {
signatureType: zeroex_order.order().signature.signature_type,
v: zeroex_order.order().signature.v,
r: zeroex_order.order().signature.r.into_alloy(),
s: zeroex_order.order().signature.s.into_alloy(),
signatureType: order.signature.signature_type,
v: order.signature.v,
r: order.signature.r,
s: order.signature.s,
},
zeroex_order.order().taker_amount,
)
Expand Down
Loading
Loading