Skip to content

Commit a99af2f

Browse files
committed
feat(tap-core): changes eip712 and address components to alloy library
changes from using ethers-rs to using alloy which allows user defined domain separator. BREAKING CHANGE: receipts, RAVs, and eip712-signed-message now use alloy primitive address Signed-off-by: Bryan Cole <[email protected]>
1 parent d6d567e commit a99af2f

21 files changed

+437
-178
lines changed

tap_core/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ ethers-core = "2.0.0"
1717
ethers-contract = "2.0.0"
1818
ethers-contract-derive = "2.0.0"
1919
anyhow = "1"
20+
alloy-sol-types = { version = "0.3.1", features = ["eip712-serde"]}
21+
alloy-primitives = { version = "0.3.1", features = ["serde"]}
2022

2123
strum = "0.24.1"
2224
strum_macros = "0.24.3"

tap_core/src/adapters/escrow_adapter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Copyright 2023-, Semiotic AI, Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
use alloy_primitives::Address;
45
use async_trait::async_trait;
5-
use ethereum_types::Address;
66

77
/// `EscrowAdapter` defines a trait for adapters to handle escrow related operations.
88
///

tap_core/src/adapters/receipt_checks_adapter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
use crate::{eip_712_signed_message::EIP712SignedMessage, tap_receipt::Receipt};
5+
use alloy_primitives::Address;
56
use async_trait::async_trait;
6-
use ethereum_types::Address;
77

88
/// `ReceiptChecksAdapter` defines a trait for adapters to handle checks related to TAP receipts.
99
///
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright 2023-, Semiotic AI, Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
use std::{collections::HashMap, sync::Arc};
5+
6+
use alloy_primitives::Address;
7+
use async_trait::async_trait;
8+
use tokio::sync::RwLock;
9+
10+
use crate::adapters::collateral_adapter::CollateralAdapter;
11+
12+
pub struct CollateralAdapterMock {
13+
gateway_collateral_storage: Arc<RwLock<HashMap<Address, u128>>>,
14+
}
15+
16+
use thiserror::Error;
17+
#[derive(Debug, Error)]
18+
pub enum AdpaterErrorMock {
19+
#[error("something went wrong: {error}")]
20+
AdapterError { error: String },
21+
}
22+
23+
impl CollateralAdapterMock {
24+
pub fn new(gateway_collateral_storage: Arc<RwLock<HashMap<Address, u128>>>) -> Self {
25+
CollateralAdapterMock {
26+
gateway_collateral_storage,
27+
}
28+
}
29+
pub async fn collateral(&self, gateway_id: Address) -> Result<u128, AdpaterErrorMock> {
30+
let gateway_collateral_storage = self.gateway_collateral_storage.read().await;
31+
if let Some(collateral) = gateway_collateral_storage.get(&gateway_id) {
32+
return Ok(*collateral);
33+
}
34+
Err(AdpaterErrorMock::AdapterError {
35+
error: "No collateral exists for provided gateway ID.".to_owned(),
36+
})
37+
}
38+
39+
pub async fn increase_collateral(&mut self, gateway_id: Address, value: u128) {
40+
let mut gateway_collateral_storage = self.gateway_collateral_storage.write().await;
41+
42+
if let Some(current_value) = gateway_collateral_storage.get(&gateway_id) {
43+
let mut gateway_collateral_storage = self.gateway_collateral_storage.write().await;
44+
gateway_collateral_storage.insert(gateway_id, current_value + value);
45+
} else {
46+
gateway_collateral_storage.insert(gateway_id, value);
47+
}
48+
}
49+
50+
pub async fn reduce_collateral(
51+
&self,
52+
gateway_id: Address,
53+
value: u128,
54+
) -> Result<(), AdpaterErrorMock> {
55+
let mut gateway_collateral_storage = self.gateway_collateral_storage.write().await;
56+
57+
if let Some(current_value) = gateway_collateral_storage.get(&gateway_id) {
58+
let checked_new_value = current_value.checked_sub(value);
59+
if let Some(new_value) = checked_new_value {
60+
gateway_collateral_storage.insert(gateway_id, new_value);
61+
return Ok(());
62+
}
63+
}
64+
Err(AdpaterErrorMock::AdapterError {
65+
error: "Provided value is greater than existing collateral.".to_owned(),
66+
})
67+
}
68+
}
69+
70+
#[async_trait]
71+
impl CollateralAdapter for CollateralAdapterMock {
72+
type AdapterError = AdpaterErrorMock;
73+
async fn get_available_collateral(
74+
&self,
75+
gateway_id: Address,
76+
) -> Result<u128, Self::AdapterError> {
77+
self.collateral(gateway_id).await
78+
}
79+
async fn subtract_collateral(
80+
&self,
81+
gateway_id: Address,
82+
value: u128,
83+
) -> Result<(), Self::AdapterError> {
84+
self.reduce_collateral(gateway_id, value).await
85+
}
86+
}

tap_core/src/adapters/test/escrow_adapter_mock.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
use std::{collections::HashMap, sync::Arc};
55

6+
use alloy_primitives::Address;
67
use async_trait::async_trait;
7-
use ethereum_types::Address;
88
use tokio::sync::RwLock;
99

1010
use crate::adapters::escrow_adapter::EscrowAdapter;

tap_core/src/adapters/test/escrow_adapter_test.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@ mod escrow_adapter_unit_test {
2121
.phrase("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about")
2222
.build()
2323
.unwrap();
24-
let gateway_id = wallet.address();
24+
let gateway_id: [u8; 20] = wallet.address().into();
25+
let gateway_id = gateway_id.into();
2526

2627
let invalid_wallet: LocalWallet = MnemonicBuilder::<English>::default()
2728
.phrase(
2829
"wrong century settle satisfy market forest title connect ten push alley depend",
2930
)
3031
.build()
3132
.unwrap();
32-
let invalid_gateway_id = invalid_wallet.address();
33+
let invalid_gateway_id: [u8; 20] = invalid_wallet.address().into();
34+
let invalid_gateway_id = invalid_gateway_id.into();
3335

3436
let initial_value = 500u128;
3537

tap_core/src/adapters/test/rav_storage_adapter_test.rs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
mod rav_storage_adapter_unit_test {
66
use std::{str::FromStr, sync::Arc};
77

8-
use ethereum_types::Address;
8+
use alloy_primitives::Address;
9+
use alloy_sol_types::{eip712_domain, Eip712Domain};
910
use ethers::signers::coins_bip39::English;
1011
use ethers::signers::{LocalWallet, MnemonicBuilder};
1112
use rstest::*;
@@ -19,9 +20,19 @@ mod rav_storage_adapter_unit_test {
1920
receipt_aggregate_voucher::ReceiptAggregateVoucher, tap_receipt::Receipt,
2021
};
2122

23+
#[fixture]
24+
fn domain_separator() -> Eip712Domain {
25+
eip712_domain! {
26+
name: "TAP",
27+
version: "1",
28+
chain_id: 1,
29+
verifying_contract: Address::from([0x11u8; 20]),
30+
}
31+
}
32+
2233
#[rstest]
2334
#[tokio::test]
24-
async fn rav_storage_adapter_test() {
35+
async fn rav_storage_adapter_test(domain_separator: Eip712Domain) {
2536
let rav_storage = Arc::new(RwLock::new(None));
2637
let rav_storage_adapter = RAVStorageAdapterMock::new(rav_storage);
2738

@@ -30,20 +41,28 @@ mod rav_storage_adapter_unit_test {
3041
.build()
3142
.unwrap();
3243

33-
let allocation_id =
34-
Address::from_str("0xabababababababababababababababababababab").unwrap();
44+
let allocation_id: [u8; 20] =
45+
Address::from_str("0xabababababababababababababababababababab")
46+
.unwrap()
47+
.into();
48+
let allocation_id = allocation_id.into();
3549

3650
// Create receipts
3751
let mut receipts = Vec::new();
3852
for value in 50..60 {
3953
receipts.push(
40-
EIP712SignedMessage::new(Receipt::new(allocation_id, value).unwrap(), &wallet)
41-
.await
42-
.unwrap(),
54+
EIP712SignedMessage::new(
55+
&domain_separator,
56+
Receipt::new(allocation_id, value).unwrap(),
57+
&wallet,
58+
)
59+
.await
60+
.unwrap(),
4361
);
4462
}
4563

4664
let signed_rav = EIP712SignedMessage::new(
65+
&domain_separator,
4766
ReceiptAggregateVoucher::aggregate_receipts(allocation_id, &receipts, None).unwrap(),
4867
&wallet,
4968
)
@@ -65,13 +84,18 @@ mod rav_storage_adapter_unit_test {
6584
let mut receipts = Vec::new();
6685
for value in 60..70 {
6786
receipts.push(
68-
EIP712SignedMessage::new(Receipt::new(allocation_id, value).unwrap(), &wallet)
69-
.await
70-
.unwrap(),
87+
EIP712SignedMessage::new(
88+
&domain_separator,
89+
Receipt::new(allocation_id, value).unwrap(),
90+
&wallet,
91+
)
92+
.await
93+
.unwrap(),
7194
);
7295
}
7396

7497
let signed_rav = EIP712SignedMessage::new(
98+
&domain_separator,
7599
ReceiptAggregateVoucher::aggregate_receipts(allocation_id, &receipts, None).unwrap(),
76100
&wallet,
77101
)

tap_core/src/adapters/test/receipt_checks_adapter_mock.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use std::{
66
sync::Arc,
77
};
88

9+
use alloy_primitives::Address;
910
use async_trait::async_trait;
10-
use ethereum_types::Address;
1111
use thiserror::Error;
1212
use tokio::sync::RwLock;
1313

tap_core/src/adapters/test/receipt_checks_adapter_test.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ mod receipt_checks_adapter_unit_test {
99
sync::Arc,
1010
};
1111

12-
use ethereum_types::Address;
12+
use alloy_primitives::Address;
13+
use alloy_sol_types::{eip712_domain, Eip712Domain};
1314
use ethers::signers::{coins_bip39::English, LocalWallet, MnemonicBuilder};
1415
use futures::{stream, StreamExt};
1516
use rstest::*;
@@ -24,9 +25,19 @@ mod receipt_checks_adapter_unit_test {
2425
tap_receipt::{get_full_list_of_checks, Receipt, ReceivedReceipt},
2526
};
2627

28+
#[fixture]
29+
fn domain_separator() -> Eip712Domain {
30+
eip712_domain! {
31+
name: "TAP",
32+
version: "1",
33+
chain_id: 1,
34+
verifying_contract: Address::from([0x11u8; 20]),
35+
}
36+
}
37+
2738
#[rstest]
2839
#[tokio::test]
29-
async fn receipt_checks_adapter_test() {
40+
async fn receipt_checks_adapter_test(domain_separator: Eip712Domain) {
3041
let gateway_ids = [
3142
Address::from_str("0xfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfb").unwrap(),
3243
Address::from_str("0xfafafafafafafafafafafafafafafafafafafafa").unwrap(),
@@ -50,11 +61,13 @@ mod receipt_checks_adapter_unit_test {
5061
let receipts: HashMap<u64, ReceivedReceipt> = stream::iter(0..10)
5162
.then(|id| {
5263
let wallet = wallet.clone();
64+
let domain_separator = &domain_separator;
5365
async move {
5466
(
5567
id,
5668
ReceivedReceipt::new(
5769
EIP712SignedMessage::new(
70+
domain_separator,
5871
Receipt::new(allocation_ids[0], value).unwrap(),
5972
&wallet,
6073
)
@@ -84,9 +97,13 @@ mod receipt_checks_adapter_unit_test {
8497
let new_receipt = (
8598
10u64,
8699
ReceivedReceipt::new(
87-
EIP712SignedMessage::new(Receipt::new(allocation_ids[0], value).unwrap(), &wallet)
88-
.await
89-
.unwrap(),
100+
EIP712SignedMessage::new(
101+
&domain_separator,
102+
Receipt::new(allocation_ids[0], value).unwrap(),
103+
&wallet,
104+
)
105+
.await
106+
.unwrap(),
90107
10u64,
91108
&get_full_list_of_checks(),
92109
),

tap_core/src/adapters/test/receipt_storage_adapter_test.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ mod receipt_storage_adapter_unit_test {
77
use std::str::FromStr;
88
use std::sync::Arc;
99

10-
use ethereum_types::Address;
10+
use alloy_primitives::Address;
11+
use alloy_sol_types::{eip712_domain, Eip712Domain};
1112
use ethers::signers::coins_bip39::English;
1213
use ethers::signers::{LocalWallet, MnemonicBuilder};
1314
use rstest::*;
@@ -22,9 +23,19 @@ mod receipt_storage_adapter_unit_test {
2223
tap_receipt::Receipt, tap_receipt::ReceivedReceipt,
2324
};
2425

26+
#[fixture]
27+
fn domain_separator() -> Eip712Domain {
28+
eip712_domain! {
29+
name: "TAP",
30+
version: "1",
31+
chain_id: 1,
32+
verifying_contract: Address::from([0x11u8; 20]),
33+
}
34+
}
35+
2536
#[rstest]
2637
#[tokio::test]
27-
async fn receipt_adapter_test() {
38+
async fn receipt_adapter_test(domain_separator: Eip712Domain) {
2839
let receipt_storage = Arc::new(RwLock::new(HashMap::new()));
2940
let mut receipt_adapter = ReceiptStorageAdapterMock::new(receipt_storage);
3041

@@ -40,9 +51,13 @@ mod receipt_storage_adapter_unit_test {
4051
let query_id = 10u64;
4152
let value = 100u128;
4253
let received_receipt = ReceivedReceipt::new(
43-
EIP712SignedMessage::new(Receipt::new(allocation_id, value).unwrap(), &wallet)
44-
.await
45-
.unwrap(),
54+
EIP712SignedMessage::new(
55+
&domain_separator,
56+
Receipt::new(allocation_id, value).unwrap(),
57+
&wallet,
58+
)
59+
.await
60+
.unwrap(),
4661
query_id,
4762
&get_full_list_of_checks(),
4863
);
@@ -82,7 +97,7 @@ mod receipt_storage_adapter_unit_test {
8297

8398
#[rstest]
8499
#[tokio::test]
85-
async fn multi_receipt_adapter_test() {
100+
async fn multi_receipt_adapter_test(domain_separator: Eip712Domain) {
86101
let receipt_storage = Arc::new(RwLock::new(HashMap::new()));
87102
let mut receipt_adapter = ReceiptStorageAdapterMock::new(receipt_storage);
88103

@@ -98,9 +113,13 @@ mod receipt_storage_adapter_unit_test {
98113
let mut received_receipts = Vec::new();
99114
for (query_id, value) in (50..60).enumerate() {
100115
received_receipts.push(ReceivedReceipt::new(
101-
EIP712SignedMessage::new(Receipt::new(allocation_id, value).unwrap(), &wallet)
102-
.await
103-
.unwrap(),
116+
EIP712SignedMessage::new(
117+
&domain_separator,
118+
Receipt::new(allocation_id, value).unwrap(),
119+
&wallet,
120+
)
121+
.await
122+
.unwrap(),
104123
query_id as u64,
105124
&get_full_list_of_checks(),
106125
));

0 commit comments

Comments
 (0)