alkahest_rs/
utils.rs

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}