Skip to content

Commit 766b046

Browse files
committed
requested changes
1 parent 007acec commit 766b046

File tree

2 files changed

+83
-130
lines changed

2 files changed

+83
-130
lines changed

sentry/src/routes/channel.rs

Lines changed: 74 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
//! `/v5/channel` routes
22
//!
33
4+
use axum::{extract::Path, Extension, Json};
5+
use futures::future::try_join_all;
6+
use serde::{Deserialize, Serialize};
7+
use slog::{error, Logger};
8+
use std::{any::Any, collections::HashMap, sync::Arc};
9+
10+
use adapter::{client::Locked, Adapter, Dummy, util::{get_balance_leaf, get_signable_state_root}};
11+
use primitives::{
12+
balances::{Balances, CheckedState, UncheckedState},
13+
merkle_tree::MerkleTree,
14+
sentry::{
15+
channel_list::{ChannelListQuery, ChannelListResponse},
16+
AccountingResponse, AllSpendersQuery, AllSpendersResponse, ChannelPayRequest, GetLeafResponse, LastApproved,
17+
LastApprovedQuery, LastApprovedResponse, SpenderResponse, SuccessResponse,
18+
},
19+
spender::{Spendable, Spender},
20+
validator::NewState,
21+
Address, ChainOf, Channel, ChannelId, Deposit, UnifiedNum,
22+
};
23+
424
use crate::{
525
application::Qs,
626
db::{
@@ -13,32 +33,9 @@ use crate::{
1333
DbPool,
1434
},
1535
response::ResponseError,
16-
routes::campaign::fetch_campaign_ids_for_channel,
36+
routes::{campaign::fetch_campaign_ids_for_channel, routers::LeafFor},
1737
Application, Auth,
1838
};
19-
use adapter::{
20-
client::Locked,
21-
util::{get_balance_leaf, get_signable_state_root},
22-
Adapter, Dummy,
23-
};
24-
use axum::{extract::Path, Extension, Json};
25-
use futures::future::try_join_all;
26-
use primitives::{
27-
balances::{Balances, CheckedState, UncheckedState},
28-
merkle_tree::MerkleTree,
29-
sentry::{
30-
channel_list::{ChannelListQuery, ChannelListResponse},
31-
AccountingResponse, AllSpendersQuery, AllSpendersResponse, ChannelPayRequest,
32-
GetLeafResponse, LastApproved, LastApprovedQuery, LastApprovedResponse, SpenderResponse,
33-
SuccessResponse,
34-
},
35-
spender::{Spendable, Spender},
36-
validator::NewState,
37-
Address, ChainOf, Channel, ChannelId, Deposit, UnifiedNum,
38-
};
39-
use serde::{Deserialize, Serialize};
40-
use slog::{error, Logger};
41-
use std::{any::Any, collections::HashMap, sync::Arc};
4239

4340
/// Request body for Channel deposit when using the Dummy adapter.
4441
///
@@ -502,9 +499,10 @@ pub async fn channel_payout<C: Locked + 'static>(
502499
Ok(Json(SuccessResponse { success: true }))
503500
}
504501

505-
pub async fn get_spender_leaf<C: Locked + 'static>(
502+
pub async fn get_leaf<C: Locked + 'static>(
506503
Extension(app): Extension<Arc<Application<C>>>,
507504
Extension(channel_context): Extension<ChainOf<Channel>>,
505+
Extension(leaf_for): Extension<LeafFor>,
508506
Path(params): Path<(ChannelId, Address)>,
509507
) -> Result<Json<GetLeafResponse>, ResponseError> {
510508
let channel = channel_context.context;
@@ -524,66 +522,40 @@ pub async fn get_spender_leaf<C: Locked + 'static>(
524522
.await?
525523
.ok_or_else(|| ResponseError::BadRequest("No NewState message for spender".to_string()))?;
526524

527-
let spender = params.1;
528-
let amount = new_state
529-
.msg
530-
.balances
531-
.spenders
532-
.get(&spender)
533-
.ok_or_else(|| ResponseError::BadRequest("No balance entry for spender!".to_string()))?;
534-
let element = get_balance_leaf(
535-
true,
536-
&spender,
537-
&amount.to_precision(channel_context.token.precision.get()),
538-
)
539-
.map_err(|err| ResponseError::BadRequest(err.to_string()))?;
540-
541-
let merkle_tree =
542-
MerkleTree::new(&[element]).map_err(|err| ResponseError::BadRequest(err.to_string()))?;
543-
544-
let signable_state_root = get_signable_state_root(&*channel.id(), &merkle_tree.root());
525+
let addr = params.1;
545526

546-
let res = hex::encode(signable_state_root);
547-
548-
Ok(Json(GetLeafResponse { merkle_proof: res }))
549-
}
527+
let element = match leaf_for {
528+
LeafFor::Spender => {
529+
let amount = new_state
530+
.msg
531+
.balances
532+
.spenders
533+
.get(&addr)
534+
.ok_or_else(|| ResponseError::BadRequest("No balance entry for spender!".to_string()))?;
550535

551-
pub async fn get_earner_leaf<C: Locked + 'static>(
552-
Extension(app): Extension<Arc<Application<C>>>,
553-
Extension(channel_context): Extension<ChainOf<Channel>>,
554-
Path(params): Path<(ChannelId, Address)>,
555-
) -> Result<Json<GetLeafResponse>, ResponseError> {
556-
let channel = channel_context.context;
536+
get_balance_leaf(
537+
true,
538+
&addr,
539+
&amount.to_precision(channel_context.token.precision.get()),
540+
)
541+
.map_err(|err| ResponseError::BadRequest(err.to_string()))?
542+
},
543+
LeafFor::Earner => {
544+
let amount = new_state
545+
.msg
546+
.balances
547+
.earners
548+
.get(&addr)
549+
.ok_or_else(|| ResponseError::BadRequest("No balance entry for spender!".to_string()))?;
557550

558-
let approve_state = match latest_approve_state(&app.pool, &channel).await? {
559-
Some(approve_state) => approve_state,
560-
None => {
561-
return Err(ResponseError::BadRequest(
562-
"No ApproveState message for earner".to_string(),
563-
))
551+
get_balance_leaf(
552+
false,
553+
&addr,
554+
&amount.to_precision(channel_context.token.precision.get()),
555+
)
556+
.map_err(|err| ResponseError::BadRequest(err.to_string()))?
564557
}
565558
};
566-
567-
let state_root = approve_state.msg.state_root.clone();
568-
569-
let new_state = latest_new_state(&app.pool, &channel, &state_root)
570-
.await?
571-
.ok_or_else(|| ResponseError::BadRequest("No NewState message for earner".to_string()))?;
572-
573-
let earner = params.1;
574-
let amount = new_state
575-
.msg
576-
.balances
577-
.earners
578-
.get(&earner)
579-
.ok_or_else(|| ResponseError::BadRequest("No balance entry for earner!".to_string()))?;
580-
let element = get_balance_leaf(
581-
false,
582-
&earner,
583-
&amount.to_precision(channel_context.token.precision.get()),
584-
)
585-
.map_err(|err| ResponseError::BadRequest(err.to_string()))?;
586-
587559
let merkle_tree =
588560
MerkleTree::new(&[element]).map_err(|err| ResponseError::BadRequest(err.to_string()))?;
589561

@@ -765,17 +737,11 @@ pub mod validator_message {
765737

766738
#[cfg(test)]
767739
mod test {
768-
use super::*;
769-
use crate::{
770-
db::{
771-
insert_campaign, insert_channel, validator_message::insert_validator_message,
772-
CampaignRemaining,
773-
},
774-
test_util::setup_dummy_app,
775-
};
740+
use std::str::FromStr;
776741
use adapter::{
777742
ethereum::test_util::{GANACHE_INFO_1, GANACHE_INFO_1337},
778743
primitives::Deposit as AdapterDeposit,
744+
prelude::Unlocked,
779745
};
780746
use primitives::{
781747
balances::UncheckedState,
@@ -785,9 +751,16 @@ mod test {
785751
PUBLISHER, PUBLISHER_2,
786752
},
787753
validator::{ApproveState, MessageTypes, NewState},
788-
BigNum, ChainId, Deposit, ToETHChecksum, UnifiedMap, ValidatorId,
754+
BigNum, ChainId, Deposit, UnifiedMap, ValidatorId,
755+
};
756+
use super::*;
757+
use crate::{
758+
db::{
759+
insert_campaign, insert_channel, validator_message::insert_validator_message,
760+
CampaignRemaining,
761+
},
762+
test_util::setup_dummy_app,
789763
};
790-
use std::str::FromStr;
791764

792765
#[tokio::test]
793766
async fn create_and_fetch_spendable() {
@@ -1539,17 +1512,16 @@ mod test {
15391512
.expect("should insert channel");
15401513

15411514
// Setting up the validator messages
1542-
let state_root = balances
1543-
.encode(channel.id(), channel_context.token.precision.get())
1544-
.expect("should encode");
1515+
let state_root = "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc".to_string();
1516+
let signature = app.adapter.clone().unlock().expect("should unlock").sign(&state_root.clone()).expect("should sign");
15451517
let new_state: NewState<UncheckedState> = NewState {
15461518
state_root: state_root.clone(),
1547-
signature: IDS[&*LEADER].to_checksum(),
1519+
signature: signature.clone(),
15481520
balances: balances.into_unchecked(),
15491521
};
15501522
let approve_state = ApproveState {
15511523
state_root,
1552-
signature: IDS[&*FOLLOWER].to_checksum(),
1524+
signature,
15531525
is_healthy: true,
15541526
};
15551527

@@ -1570,48 +1542,23 @@ mod test {
15701542
.await
15711543
.expect("Should insert NewState msg");
15721544

1573-
// generate proofs
1574-
let spender_proof = {
1575-
let element = get_balance_leaf(
1576-
true,
1577-
&*ADVERTISER,
1578-
&UnifiedNum::from_u64(2_000).to_precision(channel_context.token.precision.get()),
1579-
)
1580-
.expect("should get");
1581-
1582-
let merkle_tree = MerkleTree::new(&[element]).expect("Should build MerkleTree");
1583-
1584-
let signable_state_root = get_signable_state_root(&*channel.id(), &merkle_tree.root());
1585-
1586-
hex::encode(signable_state_root)
1587-
};
1588-
1589-
let earner_proof = {
1590-
let element = get_balance_leaf(
1591-
false,
1592-
&*PUBLISHER,
1593-
&UnifiedNum::from_u64(2_000).to_precision(channel_context.token.precision.get()),
1594-
)
1595-
.expect("should get balance leaf");
1596-
1597-
let merkle_tree = MerkleTree::new(&[element]).expect("Should build MerkleTree");
1598-
1599-
let signable_state_root = get_signable_state_root(&*channel.id(), &merkle_tree.root());
1600-
1601-
hex::encode(signable_state_root)
1602-
};
1545+
// hardcoded proofs
1546+
let spender_proof = "8ea7760ca2dbbe00673372afbf8b05048717ce8a305f1f853afac8c244182e0c".to_string();
1547+
let earner_proof = "dc94141cb41550df047ba3a965ce36d98eb6098eb952ca3cb6fd9682e5810b51".to_string();
16031548

16041549
// call functions
1605-
let spender_leaf = get_spender_leaf(
1550+
let spender_leaf = get_leaf(
16061551
app.clone(),
16071552
channel_context.clone(),
1553+
Extension(LeafFor::Spender),
16081554
Path((channel.id(), *ADVERTISER)),
16091555
)
16101556
.await
16111557
.expect("should get spender leaf");
1612-
let earner_leaf = get_earner_leaf(
1558+
let earner_leaf = get_leaf(
16131559
app.clone(),
16141560
channel_context.clone(),
1561+
Extension(LeafFor::Earner),
16151562
Path((channel.id(), *PUBLISHER)),
16161563
)
16171564
.await

sentry/src/routes/routers.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use crate::{
3939
campaign,
4040
channel::{
4141
add_spender_leaf, channel_dummy_deposit, channel_list, channel_payout,
42-
get_accounting_for_channel, get_all_spender_limits, get_earner_leaf, get_spender_leaf,
42+
get_accounting_for_channel, get_all_spender_limits, get_leaf,
4343
get_spender_limits, last_approved,
4444
validator_message::{create_validator_messages, list_validator_messages},
4545
},
@@ -67,6 +67,12 @@ async fn if_dummy_adapter<C: Locked + 'static, B>(
6767
}
6868
}
6969

70+
#[derive(Clone)]
71+
pub enum LeafFor {
72+
Earner,
73+
Spender
74+
}
75+
7076
/// `/v5/channel` router
7177
pub fn channels_router<C: Locked + 'static>() -> Router {
7278
let spender_routes = Router::new()
@@ -81,8 +87,8 @@ pub fn channels_router<C: Locked + 'static>() -> Router {
8187
);
8288

8389
let get_leaf_routes = Router::new()
84-
.route("/spender/:addr", get(get_spender_leaf::<C>))
85-
.route("/earner/:addr", get(get_earner_leaf::<C>));
90+
.route("/spender/:addr", get(get_leaf::<C>)).route_layer(Extension(LeafFor::Spender))
91+
.route("/earner/:addr", get(get_leaf::<C>)).route_layer(Extension(LeafFor::Earner));
8692

8793
let channel_routes = Router::new()
8894
.route(

0 commit comments

Comments
 (0)