Skip to content

Commit 10d8e41

Browse files
committed
merged branch for #391, fixed compiler errors and refactored
1 parent e5b35a0 commit 10d8e41

File tree

2 files changed

+73
-67
lines changed

2 files changed

+73
-67
lines changed

primitives/src/sentry.rs

+6
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,12 @@ pub struct SpenderResponse {
204204
pub spender: Spender,
205205
}
206206

207+
#[derive(Serialize, Deserialize, Debug)]
208+
#[serde(rename_all = "camelCase")]
209+
pub struct AllSpendersResponse {
210+
pub spenders: HashMap<Address, Spender>,
211+
}
212+
207213
#[derive(Serialize, Deserialize, Debug)]
208214
pub struct ValidatorMessage {
209215
pub from: ValidatorId,

sentry/src/routes/channel.rs

+67-67
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ use hyper::{Body, Request, Response};
1414
use primitives::{
1515
adapter::Adapter,
1616
channel_v5::Channel as ChannelV5,
17-
config::TokenInfo,
17+
config::{Config, TokenInfo},
1818
sentry::{
1919
channel_list::{ChannelListQuery, LastApprovedQuery},
20-
LastApproved, LastApprovedResponse, SpenderResponse, SuccessResponse,
20+
AllSpendersResponse, LastApproved, LastApprovedResponse, MessageResponse, SpenderResponse,
21+
SuccessResponse,
2122
},
2223
spender::{Deposit, Spendable, Spender, SpenderLeaf},
23-
validator::MessageTypes,
24+
validator::{MessageTypes, NewState},
2425
Address, Channel, ChannelId, UnifiedNum,
2526
};
2627
use slog::error;
@@ -298,38 +299,18 @@ pub async fn get_spender_limits<A: Adapter + 'static>(
298299
.expect("Request should have Channel")
299300
.to_owned();
300301

301-
let channel_id = channel.id();
302302
let spender = Address::from_str(&route_params.index(1))?;
303303

304-
let latest_spendable = fetch_spendable(app.pool.clone(), &spender, &channel_id).await?;
305-
let token_info = app
306-
.config
307-
.token_address_whitelist
308-
.get(&channel.token)
309-
.ok_or_else(|| ResponseError::FailedValidation("Unsupported Channel Token".to_string()))?;
310-
311-
let latest_spendable = match latest_spendable {
312-
Some(spendable) => spendable,
313-
None => {
314-
create_spendable_document(
315-
&app.adapter,
316-
token_info,
317-
app.pool.clone(),
318-
&channel,
319-
spender,
320-
)
321-
.await?
322-
}
323-
};
324-
325-
let approve_state = match latest_approve_state_v5(&app.pool, &channel).await? {
326-
Some(approve_state) => approve_state,
327-
None => return spender_response_without_leaf(latest_spendable.deposit.total),
328-
};
329-
330-
let state_root = approve_state.msg.state_root.clone();
304+
let latest_spendable = get_latest_spendable(
305+
app.pool.clone(),
306+
&app.config,
307+
&app.adapter,
308+
&spender,
309+
&channel,
310+
)
311+
.await?;
331312

332-
let new_state = match latest_new_state_v5(&app.pool, &channel, &state_root).await? {
313+
let new_state = match get_corresponding_new_state(&app.pool, &channel).await {
333314
Some(new_state) => new_state,
334315
None => return spender_response_without_leaf(latest_spendable.deposit.total),
335316
};
@@ -351,6 +332,29 @@ pub async fn get_spender_limits<A: Adapter + 'static>(
351332
Ok(success_response(serde_json::to_string(&res)?))
352333
}
353334

335+
async fn get_latest_spendable(
336+
pool: DbPool,
337+
config: &Config,
338+
adapter: &impl Adapter,
339+
spender: &Address,
340+
channel: &ChannelV5,
341+
) -> Result<Spendable, ResponseError> {
342+
let latest_spendable = fetch_spendable(pool.clone(), spender, &channel.id()).await?;
343+
let token_info = config
344+
.token_address_whitelist
345+
.get(&channel.token)
346+
.ok_or_else(|| ResponseError::FailedValidation("Unsupported Channel Token".to_string()))?;
347+
348+
let latest_spendable = match latest_spendable {
349+
Some(spendable) => spendable,
350+
None => {
351+
create_spendable_document(adapter, token_info, pool.clone(), channel, *spender).await?
352+
}
353+
};
354+
355+
Ok(latest_spendable)
356+
}
357+
354358
pub async fn get_all_spender_limits<A: Adapter + 'static>(
355359
req: Request<Body>,
356360
app: &Application<A>,
@@ -361,66 +365,62 @@ pub async fn get_all_spender_limits<A: Adapter + 'static>(
361365
.expect("Request should have Channel")
362366
.to_owned();
363367

364-
let new_state = get_corresponding_new_state(&app.pool, &channel).await.ok_or_else(|| ResponseError::NotFound)?;
368+
let new_state = get_corresponding_new_state(&app.pool, &channel)
369+
.await
370+
.ok_or(ResponseError::NotFound)?;
365371

366-
let mut all_spender_limits: HashMap<Address, SpenderResponse> = HashMap::new();
372+
let mut all_spender_limits: HashMap<Address, Spender> = HashMap::new();
367373

368374
// Using for loop to avoid async closures
369-
for (spender, balance) in new_state.msg.balances.iter() {
370-
let latest_spendable = fetch_spendable(app.pool.clone(), &spender, &channel.id()).await.expect("todo: fix");
371-
372-
let latest_spendable = match latest_spendable {
373-
Some(spendable) => spendable,
374-
None => create_spendable_document(&app.adapter, app.pool.clone(), &channel, &spender).await.expect("todo"),
375-
};
376-
377-
let total_deposited = latest_spendable.deposit.total.checked_add(&latest_spendable.deposit.still_on_create2).ok_or_else(|| ResponseError::BadRequest("Total Deposited is too large".to_string())).expect("todo");
375+
for (spender_addr, balance) in new_state.msg.balances.spenders.iter() {
376+
let latest_spendable = get_latest_spendable(
377+
app.pool.clone(),
378+
&app.config,
379+
&app.adapter,
380+
spender_addr,
381+
&channel,
382+
)
383+
.await?;
378384

379-
// TODO: Maybe throw error if None?
385+
let total_deposited = latest_spendable.deposit.total;
380386
let spender_leaf = get_spender_leaf_for_spender(balance, &total_deposited);
381387

382-
let spender_response = SpenderResponse {
383-
total_deposited: Some(total_deposited),
388+
let spender_info = Spender {
389+
total_deposited,
384390
spender_leaf,
385391
};
386392

387-
all_spender_limits.insert(spender.clone(), spender_response);
393+
all_spender_limits.insert(*spender_addr, spender_info);
388394
}
389395

390-
// Format and return output
391-
392396
let res = AllSpendersResponse {
393-
spenders: Some(all_spender_limits),
397+
spenders: all_spender_limits,
394398
};
395399

396400
Ok(success_response(serde_json::to_string(&res)?))
397401
}
398402

399-
async fn get_corresponding_new_state(pool: &DbPool, channel: &ChannelV5) -> Option<MessageResponse<NewState>> {
400-
// Get all spenders for this channel
401-
let approve_state = match latest_approve_state_v5(&pool, &channel).await {
402-
Ok(Some(approve_state)) => approve_state,
403-
_ => return None,
403+
async fn get_corresponding_new_state(
404+
pool: &DbPool,
405+
channel: &ChannelV5,
406+
) -> Option<MessageResponse<NewState>> {
407+
let approve_state = match latest_approve_state_v5(pool, channel).await.ok()? {
408+
Some(approve_state) => approve_state,
409+
None => return None,
404410
};
405411

406412
let state_root = approve_state.msg.state_root.clone();
407413

408-
let new_state = match latest_new_state_v5(&pool, &channel, &state_root).await {
409-
Ok(Some(new_state)) => Some(new_state),
410-
_ => None,
411-
};
414+
let new_state = latest_new_state_v5(pool, channel, &state_root).await.ok()?;
412415

413416
new_state
414417
}
415418

416-
// TODO pass UnifiedNum instead
417-
fn get_spender_leaf_for_spender(spender_balance: &BigNum, total_deposited: &UnifiedNum) -> Option<SpenderLeaf> {
418-
let spender_balance = match spender_balance.to_u64() {
419-
Some(balance) => UnifiedNum::from_u64(balance),
420-
None => return None,
421-
};
422-
423-
let total_spent = match total_deposited.checked_sub(&spender_balance) {
419+
fn get_spender_leaf_for_spender(
420+
spender_balance: &UnifiedNum,
421+
total_deposited: &UnifiedNum,
422+
) -> Option<SpenderLeaf> {
423+
let total_spent = match total_deposited.checked_sub(spender_balance) {
424424
Some(spent) => spent,
425425
None => return None,
426426
};

0 commit comments

Comments
 (0)