Skip to content

Commit 49f1a38

Browse files
committed
Merge branch 'aip-61-adex-v5' into issue-392-get-all-spenders-info
2 parents 10d8e41 + 71af607 commit 49f1a38

20 files changed

+245
-597
lines changed

docs/config/dev.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ validators_whitelist = []
3232

3333
[[token_address_whitelist]]
3434
# DAI
35-
address = '0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359'
35+
address = '0x73967c6a0904aa032c103b4104747e88c566b1a2'
3636
# 1 * 10^-10 = 0.0_000_000_001
3737
min_token_units_for_deposit = '100000000'
3838
min_validator_fee = '100000000'

primitives/src/sentry/accounting.rs renamed to primitives/src/balances.rs

Lines changed: 33 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
11
use std::{convert::TryFrom, marker::PhantomData};
22

3-
use crate::{balances_map::UnifiedMap, channel_v5::Channel, Address, UnifiedNum};
4-
use chrono::{DateTime, Utc};
5-
use serde::{Deserialize, Deserializer, Serialize};
3+
use crate::{Address, UnifiedMap, UnifiedNum};
4+
use serde::{de::DeserializeOwned, Deserialize, Serialize};
65
use thiserror::Error;
76

8-
#[derive(Serialize, Debug, Clone, PartialEq, Eq)]
9-
#[serde(rename_all = "camelCase")]
10-
pub struct Accounting<S: BalancesState> {
11-
pub channel: Channel,
12-
#[serde(flatten)]
13-
pub balances: Balances<S>,
14-
pub updated: Option<DateTime<Utc>>,
15-
pub created: DateTime<Utc>,
16-
}
17-
187
#[derive(Serialize, Debug, Clone, PartialEq, Eq, Default)]
198
#[serde(rename_all = "camelCase")]
20-
pub struct Balances<S> {
9+
pub struct Balances<S: BalancesState> {
2110
pub earners: UnifiedMap,
2211
pub spenders: UnifiedMap,
23-
#[serde(skip_serializing, skip_deserializing)]
2412
state: PhantomData<S>,
2513
}
2614

@@ -82,6 +70,14 @@ impl<S: BalancesState> Balances<S> {
8270
.entry(earner)
8371
.or_insert_with(UnifiedNum::default);
8472
}
73+
74+
pub fn into_unchecked(self) -> Balances<UncheckedState> {
75+
Balances {
76+
earners: self.earners,
77+
spenders: self.spenders,
78+
state: PhantomData::default(),
79+
}
80+
}
8581
}
8682

8783
#[derive(Debug, Error)]
@@ -103,15 +99,25 @@ pub enum Error {
10399
},
104100
}
105101

106-
pub trait BalancesState {}
102+
pub trait BalancesState: std::fmt::Debug + Eq + Clone + Serialize + DeserializeOwned {
103+
fn from_unchecked(balances: Balances<UncheckedState>) -> Result<Balances<Self>, Error>;
104+
}
107105

108-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
106+
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
109107
pub struct CheckedState;
110-
impl BalancesState for CheckedState {}
108+
impl BalancesState for CheckedState {
109+
fn from_unchecked(balances: Balances<UncheckedState>) -> Result<Balances<Self>, Error> {
110+
balances.check()
111+
}
112+
}
111113

112-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
114+
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
113115
pub struct UncheckedState;
114-
impl BalancesState for UncheckedState {}
116+
impl BalancesState for UncheckedState {
117+
fn from_unchecked(balances: Balances<Self>) -> Result<Balances<Self>, Error> {
118+
Ok(balances)
119+
}
120+
}
115121

116122
impl TryFrom<Balances<UncheckedState>> for Balances<CheckedState> {
117123
type Error = Error;
@@ -123,82 +129,30 @@ impl TryFrom<Balances<UncheckedState>> for Balances<CheckedState> {
123129

124130
/// This modules implements the needed non-generic structs that help with Deserialization of the `Balances<S>`
125131
mod de {
126-
use super::*;
127-
128-
#[derive(Deserialize)]
129-
struct DeserializeAccounting {
130-
pub channel: Channel,
131-
#[serde(flatten)]
132-
pub balances: DeserializeBalances,
133-
pub created: DateTime<Utc>,
134-
pub updated: Option<DateTime<Utc>>,
135-
}
132+
use serde::Deserializer;
136133

137-
impl<'de> Deserialize<'de> for Accounting<UncheckedState> {
138-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
139-
where
140-
D: Deserializer<'de>,
141-
{
142-
let de_acc = DeserializeAccounting::deserialize(deserializer)?;
143-
144-
Ok(Self {
145-
channel: de_acc.channel,
146-
balances: Balances::<UncheckedState>::try_from(de_acc.balances)
147-
.map_err(serde::de::Error::custom)?,
148-
created: de_acc.created,
149-
updated: de_acc.updated,
150-
})
151-
}
152-
}
153-
154-
impl<'de> Deserialize<'de> for Accounting<CheckedState> {
155-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
156-
where
157-
D: Deserializer<'de>,
158-
{
159-
let unchecked_acc = Accounting::<UncheckedState>::deserialize(deserializer)?;
160-
161-
Ok(Self {
162-
channel: unchecked_acc.channel,
163-
balances: unchecked_acc
164-
.balances
165-
.check()
166-
.map_err(serde::de::Error::custom)?,
167-
created: unchecked_acc.created,
168-
updated: unchecked_acc.updated,
169-
})
170-
}
171-
}
134+
use super::*;
172135

173136
#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
174137
struct DeserializeBalances {
175138
pub earners: UnifiedMap,
176139
pub spenders: UnifiedMap,
177140
}
178141

179-
impl<'de> Deserialize<'de> for Balances<CheckedState> {
180-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
181-
where
182-
D: Deserializer<'de>,
183-
{
184-
let unchecked_balances = Balances::<UncheckedState>::deserialize(deserializer)?;
185-
186-
unchecked_balances.check().map_err(serde::de::Error::custom)
187-
}
188-
}
189-
190-
impl<'de> Deserialize<'de> for Balances<UncheckedState> {
142+
impl<'de, S: BalancesState> Deserialize<'de> for Balances<S> {
191143
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
192144
where
193145
D: Deserializer<'de>,
194146
{
195147
let deser_balances = DeserializeBalances::deserialize(deserializer)?;
196148

197-
Ok(Balances {
149+
let unchecked_balances = Balances {
198150
earners: deser_balances.earners,
199151
spenders: deser_balances.spenders,
200152
state: PhantomData::<UncheckedState>::default(),
201-
})
153+
};
154+
155+
S::from_unchecked(unchecked_balances).map_err(serde::de::Error::custom)
202156
}
203157
}
204158

primitives/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pub use self::{
66
ad_slot::AdSlot,
77
ad_unit::AdUnit,
88
address::Address,
9+
balances::Balances,
910
balances_map::{BalancesMap, UnifiedMap},
1011
big_num::BigNum,
1112
campaign::{Campaign, CampaignId},
@@ -22,6 +23,7 @@ mod ad_unit;
2223
pub mod adapter;
2324
pub mod address;
2425
pub mod analytics;
26+
pub mod balances;
2527
pub mod balances_map;
2628
pub mod big_num;
2729
pub mod campaign;

primitives/src/sentry.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
11
use crate::{
2+
balances::BalancesState,
3+
channel_v5::Channel as ChannelV5,
24
spender::Spender,
35
validator::{ApproveState, Heartbeat, MessageTypes, NewState, Type as MessageType},
4-
Address, BigNum, Channel, ChannelId, ValidatorId, IPFS,
6+
Address, Balances, BigNum, Channel, ChannelId, ValidatorId, IPFS,
57
};
68
use chrono::{DateTime, Utc};
79
use serde::{Deserialize, Serialize};
810
use std::{collections::HashMap, fmt, hash::Hash};
911

10-
pub mod accounting;
12+
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
13+
#[serde(rename_all = "camelCase")]
14+
pub struct Accounting<S: BalancesState> {
15+
pub channel: ChannelV5,
16+
#[serde(flatten, bound = "S: BalancesState")]
17+
pub balances: Balances<S>,
18+
pub updated: Option<DateTime<Utc>>,
19+
pub created: DateTime<Utc>,
20+
}
1121

1222
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
1323
#[serde(rename_all = "camelCase")]
14-
pub struct LastApproved {
24+
pub struct LastApproved<S: BalancesState> {
1525
/// NewState can be None if the channel is brand new
16-
pub new_state: Option<MessageResponse<NewState>>,
26+
#[serde(bound = "S: BalancesState")]
27+
pub new_state: Option<MessageResponse<NewState<S>>>,
1728
/// ApproveState can be None if the channel is brand new
1829
pub approve_state: Option<MessageResponse<ApproveState>>,
1930
}
@@ -54,7 +65,7 @@ pub mod message {
5465
}
5566

5667
impl<T: Type> TryFrom<MessageTypes> for Message<T> {
57-
type Error = MessageTypeError<T>;
68+
type Error = MessageError<T>;
5869

5970
fn try_from(value: MessageTypes) -> Result<Self, Self::Error> {
6071
<T as TryFrom<MessageTypes>>::try_from(value).map(Self)
@@ -82,8 +93,7 @@ pub mod message {
8293
"type":"ApproveState",
8394
"stateRoot":"4739522efc1e81499541621759dadb331eaf08829d6a3851b4b654dfaddc9935",
8495
"signature":"0x00128a39b715e87475666c3220fc0400bf34a84d24f77571d2b4e1e88b141d52305438156e526ff4fe96b7a13e707ab2f6f3ca00bd928dabc7f516b56cfe6fd61c",
85-
"isHealthy":true,
86-
"exhausted":false
96+
"isHealthy":true
8797
},
8898
"received":"2021-01-05T14:00:48.549Z"
8999
});
@@ -97,7 +107,6 @@ pub mod message {
97107
state_root: "4739522efc1e81499541621759dadb331eaf08829d6a3851b4b654dfaddc9935".to_string(),
98108
signature: "0x00128a39b715e87475666c3220fc0400bf34a84d24f77571d2b4e1e88b141d52305438156e526ff4fe96b7a13e707ab2f6f3ca00bd928dabc7f516b56cfe6fd61c".to_string(),
99109
is_healthy: true,
100-
exhausted: false,
101110
}),
102111
};
103112

@@ -185,8 +194,9 @@ pub struct ChannelListResponse {
185194

186195
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
187196
#[serde(rename_all = "camelCase")]
188-
pub struct LastApprovedResponse {
189-
pub last_approved: Option<LastApproved>,
197+
pub struct LastApprovedResponse<S: BalancesState> {
198+
#[serde(bound = "S: BalancesState")]
199+
pub last_approved: Option<LastApproved<S>>,
190200
/// None -> withHeartbeat=true wasn't passed
191201
/// Some(vec![]) (empty vec) or Some(heartbeats) - withHeartbeat=true was passed
192202
#[serde(default, skip_serializing_if = "Option::is_none")]

primitives/src/util/tests/prep_db.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ lazy_static! {
4343
addresses
4444
};
4545

46-
// These are the real Addresses of these stablecoins, however, they are only used for testing!
46+
// These are the Goerli testnet Addresses of these stablecoins
4747
pub static ref TOKENS: HashMap<String, Address> = {
4848
let mut tokens = HashMap::new();
4949

50-
tokens.insert("DAI".into(), "0x6b175474e89094c44da98b954eedeac495271d0f".parse::<Address>().expect("Should parse"));
51-
tokens.insert("USDT".into(), "0xdac17f958d2ee523a2206206994597c13d831ec7".parse::<Address>().expect("failed to parse id"));
52-
tokens.insert("USDC".into(), "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48".parse::<Address>().expect("failed to parse id"));
50+
tokens.insert("DAI".into(), "0x73967c6a0904aa032c103b4104747e88c566b1a2".parse::<Address>().expect("Should parse"));
51+
tokens.insert("USDT".into(), "0x509ee0d083ddf8ac028f2a56731412edd63223b9".parse::<Address>().expect("failed to parse id"));
52+
tokens.insert("USDC".into(), "0x44dcfcead37be45206af6079648988b29284b2c6".parse::<Address>().expect("failed to parse id"));
5353
tokens
5454
};
5555

0 commit comments

Comments
 (0)