1use alloy::{
2 network::{EthereumWallet, TxSigner},
3 node_bindings::AnvilInstance,
4 primitives::{Address, PrimitiveSignature},
5 providers::{ProviderBuilder, WsConnect},
6 signers::local::PrivateKeySigner,
7};
8
9use crate::{
10 AddressConfig, AlkahestClient,
11 clients::{
12 arbiters::ArbitersAddresses, attestation::AttestationAddresses, erc20::Erc20Addresses,
13 erc721::Erc721Addresses, erc1155::Erc1155Addresses,
14 string_obligation::StringObligationAddresses, token_bundle::TokenBundleAddresses,
15 },
16 contracts::{
17 AttestationBarterUtils, AttestationEscrowObligation, AttestationEscrowObligation2,
18 ERC20EscrowObligation, ERC20PaymentObligation, ERC721EscrowObligation,
19 ERC721PaymentObligation, ERC1155EscrowObligation, ERC1155PaymentObligation,
20 SpecificAttestationArbiter, StringObligation, TokenBundleBarterUtils, TrivialArbiter,
21 TrustedOracleArbiter, TrustedPartyArbiter,
22 erc20_barter_cross_token::ERC20BarterCrossToken,
23 erc721_barter_cross_token::ERC721BarterCrossToken,
24 erc1155_barter_cross_token::ERC1155BarterCrossToken,
25 token_bundle::{TokenBundleEscrowObligation, TokenBundlePaymentObligation},
26 },
27 fixtures::{EAS, MockERC20Permit, MockERC721, MockERC1155, SchemaRegistry},
28 types::{PublicProvider, WalletProvider},
29};
30
31pub async fn get_wallet_provider<T: TxSigner<PrimitiveSignature> + Sync + Send + 'static>(
32 private_key: T,
33 rpc_url: impl ToString,
34) -> eyre::Result<WalletProvider> {
35 let wallet = EthereumWallet::from(private_key);
36 let ws = WsConnect::new(rpc_url.to_string());
37
38 let provider = ProviderBuilder::new().wallet(wallet).on_ws(ws).await?;
39
40 Ok(provider)
41}
42
43pub async fn get_public_provider(rpc_url: impl ToString) -> eyre::Result<PublicProvider> {
44 let ws = WsConnect::new(rpc_url.to_string());
45
46 let provider = ProviderBuilder::new().on_ws(ws).await?;
47
48 Ok(provider)
49}
50
51pub async fn setup_test_environment() -> eyre::Result<TestContext> {
52 let anvil = alloy::node_bindings::Anvil::new().try_spawn()?;
53
54 let god: PrivateKeySigner = anvil.keys()[0].clone().into();
55 let god_wallet = EthereumWallet::from(god.clone());
56
57 let ws = WsConnect::new(anvil.ws_endpoint_url());
58 let god_provider = ProviderBuilder::new().wallet(god_wallet).on_ws(ws).await?;
59 let god_provider_ = god_provider.clone();
60
61 let schema_registry = SchemaRegistry::deploy(&god_provider).await?;
62 let eas = EAS::deploy(&god_provider, schema_registry.address().clone()).await?;
63
64 let mock_erc20_a =
65 MockERC20Permit::deploy(&god_provider, "Mock Erc20".into(), "TK1".into()).await?;
66 let mock_erc20_b =
67 MockERC20Permit::deploy(&god_provider, "Mock Erc20".into(), "TK2".into()).await?;
68 let mock_erc721_a = MockERC721::deploy(&god_provider).await?;
69 let mock_erc721_b = MockERC721::deploy(&god_provider).await?;
70 let mock_erc1155_a = MockERC1155::deploy(&god_provider).await?;
71 let mock_erc1155_b = MockERC1155::deploy(&god_provider).await?;
72
73 let specific_attestation_arbiter = SpecificAttestationArbiter::deploy(&god_provider).await?;
74 let trivial_arbiter = TrivialArbiter::deploy(&god_provider).await?;
75 let trusted_oracle_arbiter = TrustedOracleArbiter::deploy(&god_provider).await?;
76 let trusted_party_arbiter = TrustedPartyArbiter::deploy(&god_provider).await?;
77
78 macro_rules! deploy_obligation {
79 ($name:ident) => {
80 $name::deploy(
81 &god_provider,
82 eas.address().clone(),
83 schema_registry.address().clone(),
84 )
85 .await?
86 };
87 }
88
89 let attestation_escrow_obligation = deploy_obligation!(AttestationEscrowObligation);
90 let attestation_escrow_obligation_2 = deploy_obligation!(AttestationEscrowObligation2);
91 let bundle_escrow_obligation = deploy_obligation!(TokenBundleEscrowObligation);
92 let bundle_payment_obligation = deploy_obligation!(TokenBundlePaymentObligation);
93 let erc20_escrow_obligation = deploy_obligation!(ERC20EscrowObligation);
94 let erc20_payment_obligation = deploy_obligation!(ERC20PaymentObligation);
95 let erc721_escrow_obligation = deploy_obligation!(ERC721EscrowObligation);
96 let erc721_payment_obligation = deploy_obligation!(ERC721PaymentObligation);
97 let erc1155_escrow_obligation = deploy_obligation!(ERC1155EscrowObligation);
98 let erc1155_payment_obligation = deploy_obligation!(ERC1155PaymentObligation);
99 let string_obligation = deploy_obligation!(StringObligation);
100
101 macro_rules! deploy_cross_token {
102 ($name:ident) => {
103 $name::deploy(
104 &god_provider,
105 eas.address().clone(),
106 erc20_escrow_obligation.address().clone(),
107 erc20_payment_obligation.address().clone(),
108 erc721_escrow_obligation.address().clone(),
109 erc721_payment_obligation.address().clone(),
110 erc1155_escrow_obligation.address().clone(),
111 erc1155_payment_obligation.address().clone(),
112 bundle_escrow_obligation.address().clone(),
113 bundle_payment_obligation.address().clone(),
114 )
115 .await?
116 };
117 }
118
119 let attestation_barter_utils = AttestationBarterUtils::deploy(
120 &god_provider,
121 eas.address().clone(),
122 schema_registry.address().clone(),
123 attestation_escrow_obligation_2.address().clone(),
124 )
125 .await?;
126 let bundle_barter_utils = TokenBundleBarterUtils::deploy(
127 &god_provider,
128 eas.address().clone(),
129 bundle_escrow_obligation.address().clone(),
130 bundle_payment_obligation.address().clone(),
131 )
132 .await?;
133 let erc20_barter_utils = deploy_cross_token!(ERC20BarterCrossToken);
134 let erc721_barter_utils = deploy_cross_token!(ERC721BarterCrossToken);
135 let erc1155_barter_utils = deploy_cross_token!(ERC1155BarterCrossToken);
136
137 let alice: PrivateKeySigner = anvil.keys()[1].clone().into();
138 let bob: PrivateKeySigner = anvil.keys()[2].clone().into();
139
140 let addresses = AddressConfig {
141 arbiters_addresses: Some(ArbitersAddresses {
142 specific_attestation_arbiter: specific_attestation_arbiter.address().clone(),
143 trivial_arbiter: trivial_arbiter.address().clone(),
144 trusted_oracle_arbiter: trusted_oracle_arbiter.address().clone(),
145 trusted_party_arbiter: trusted_party_arbiter.address().clone(),
146 }),
147 string_obligation_addresses: Some(StringObligationAddresses {
148 eas: eas.address().clone(),
149 obligation: string_obligation.address().clone(),
150 }),
151 erc20_addresses: Some(Erc20Addresses {
152 eas: eas.address().clone(),
153 barter_utils: erc20_barter_utils.address().clone(),
154 escrow_obligation: erc20_escrow_obligation.address().clone(),
155 payment_obligation: erc20_payment_obligation.address().clone(),
156 }),
157 erc721_addresses: Some(Erc721Addresses {
158 eas: eas.address().clone(),
159 barter_utils: erc721_barter_utils.address().clone(),
160 escrow_obligation: erc721_escrow_obligation.address().clone(),
161 payment_obligation: erc721_payment_obligation.address().clone(),
162 }),
163 erc1155_addresses: Some(Erc1155Addresses {
164 eas: eas.address().clone(),
165 barter_utils: erc1155_barter_utils.address().clone(),
166 escrow_obligation: erc1155_escrow_obligation.address().clone(),
167 payment_obligation: erc1155_payment_obligation.address().clone(),
168 }),
169 token_bundle_addresses: Some(TokenBundleAddresses {
170 eas: eas.address().clone(),
171 barter_utils: bundle_barter_utils.address().clone(),
172 escrow_obligation: bundle_escrow_obligation.address().clone(),
173 payment_obligation: bundle_payment_obligation.address().clone(),
174 }),
175 attestation_addresses: Some(AttestationAddresses {
176 eas: eas.address().clone(),
177 eas_schema_registry: schema_registry.address().clone(),
178 barter_utils: attestation_barter_utils.address().clone(),
179 escrow_obligation: attestation_escrow_obligation.address().clone(),
180 escrow_obligation_2: attestation_escrow_obligation_2.address().clone(),
181 }),
182 };
183
184 let alice_client = AlkahestClient::new(
185 alice.clone(),
186 anvil.ws_endpoint_url(),
187 Some(addresses.clone()),
188 )
189 .await?;
190 let bob_client = AlkahestClient::new(
191 bob.clone(),
192 anvil.ws_endpoint_url(),
193 Some(addresses.clone()),
194 )
195 .await?;
196
197 Ok(TestContext {
198 anvil,
199 alice,
200 bob,
201 god,
202 god_provider: god_provider_,
203 alice_client,
204 bob_client,
205 addresses,
206 mock_addresses: MockAddresses {
207 erc20_a: mock_erc20_a.address().clone(),
208 erc20_b: mock_erc20_b.address().clone(),
209 erc721_a: mock_erc721_a.address().clone(),
210 erc721_b: mock_erc721_b.address().clone(),
211 erc1155_a: mock_erc1155_a.address().clone(),
212 erc1155_b: mock_erc1155_b.address().clone(),
213 },
214 })
215}
216
217pub struct TestContext {
218 pub anvil: AnvilInstance,
219 pub alice: PrivateKeySigner,
220 pub bob: PrivateKeySigner,
221 pub god: PrivateKeySigner,
222 pub god_provider: WalletProvider,
223 pub alice_client: AlkahestClient,
224 pub bob_client: AlkahestClient,
225 pub addresses: AddressConfig,
226 pub mock_addresses: MockAddresses,
227}
228
229pub struct MockAddresses {
230 pub erc20_a: Address,
231 pub erc20_b: Address,
232 pub erc721_a: Address,
233 pub erc721_b: Address,
234 pub erc1155_a: Address,
235 pub erc1155_b: Address,
236}