Skip to content

Commit 567b63a

Browse files
authored
bugfix twitter verification, add assertion a6, refactoring a2&a3 (#1307)
* bugfix: twitter verification, add a6 * bugfix retweet verification * refactoring assertion a2&a3
1 parent 3887243 commit 567b63a

File tree

20 files changed

+6470
-119
lines changed

20 files changed

+6470
-119
lines changed

pallets/vc-management/src/assertion.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ pub type ParameterString = BoundedVec<u8, MaxStringLength>;
3030
#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq, TypeInfo, MaxEncodedLen)]
3131
pub enum Assertion {
3232
A1,
33-
A2(ParameterString, ParameterString), // (guild_id, user_id)
34-
A3(ParameterString, ParameterString), // (guild_id, user_id)
35-
A4(Balance), // (minimum_amount)
36-
A5(ParameterString, ParameterString), // (twitter_account, tweet_id)
33+
A2(ParameterString), // (guild_id)
34+
A3(ParameterString, ParameterString, ParameterString), // (guild_id, channel_id, role_id)
35+
A4(Balance), // (minimum_amount)
36+
A5(ParameterString, ParameterString), /* (twitter_account, tweet_id), -
37+
* TODO: unsupported,
38+
* until Twitter new API policy is
39+
* published */
3740
A6,
3841
A7(Balance), // (minimum_amount)
3942
A8,

pallets/vc-management/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,13 @@ pub mod pallet {
112112
// see https://github.com/litentry/litentry-parachain/issues/1275
113113
HttpRequestFailed { reason: ErrorString },
114114
RequestVCHandlingFailed,
115+
ParseError,
115116
Assertion1Failed,
116117
Assertion2Failed,
117118
Assertion3Failed,
118119
Assertion4Failed,
119120
Assertion5Failed,
121+
Assertion6Failed,
120122
Assertion7Failed,
121123
Assertion8Failed,
122124
Assertion10Failed,
@@ -215,11 +217,13 @@ pub mod pallet {
215217
Self::deposit_event(Event::HttpRequestFailed { reason: s }),
216218
VCMPError::RequestVCHandlingFailed =>
217219
Self::deposit_event(Event::RequestVCHandlingFailed),
220+
VCMPError::ParseError => Self::deposit_event(Event::ParseError),
218221
VCMPError::Assertion1Failed => Self::deposit_event(Event::Assertion1Failed),
219222
VCMPError::Assertion2Failed => Self::deposit_event(Event::Assertion2Failed),
220223
VCMPError::Assertion3Failed => Self::deposit_event(Event::Assertion3Failed),
221224
VCMPError::Assertion4Failed => Self::deposit_event(Event::Assertion4Failed),
222225
VCMPError::Assertion5Failed => Self::deposit_event(Event::Assertion5Failed),
226+
VCMPError::Assertion6Failed => Self::deposit_event(Event::Assertion6Failed),
223227
VCMPError::Assertion7Failed => Self::deposit_event(Event::Assertion7Failed),
224228
VCMPError::Assertion8Failed => Self::deposit_event(Event::Assertion8Failed),
225229
VCMPError::Assertion10Failed => Self::deposit_event(Event::Assertion10Failed),

primitives/core/src/error.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,17 @@ impl frame_support::traits::PalletError for IMPError {
5555
#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq, TypeInfo, MaxEncodedLen)]
5656
pub enum VCMPError {
5757
HttpRequestFailed(ErrorString),
58-
5958
// Indirect call handling errors when importing parachain blocks
6059
RequestVCHandlingFailed,
61-
60+
// UTF8Error
61+
ParseError,
6262
// Assertion
6363
Assertion1Failed,
6464
Assertion2Failed,
6565
Assertion3Failed,
6666
Assertion4Failed,
6767
Assertion5Failed,
68+
Assertion6Failed,
6869
Assertion7Failed,
6970
Assertion8Failed,
7071
Assertion10Failed,

tee-worker/litentry/core/assertion-build/src/a2.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::Result;
2424
use itp_stf_primitives::types::ShardIdentifier;
2525
use itp_types::AccountId;
2626
use lc_credentials::Credential;
27-
use lc_data_providers::discord_litentry::DiscordLitentryClient;
27+
use lc_data_providers::{discord_litentry::DiscordLitentryClient, vec_to_string};
2828
use litentry_primitives::{
2929
Assertion, Identity, ParameterString, ParentchainBlockNumber, Web2Network,
3030
};
@@ -35,55 +35,54 @@ use std::vec::Vec;
3535
pub fn build(
3636
identities: Vec<Identity>,
3737
guild_id: ParameterString,
38-
handler: ParameterString,
3938
shard: &ShardIdentifier,
4039
who: &AccountId,
4140
bn: ParentchainBlockNumber,
4241
) -> Result<Credential> {
4342
let mut discord_cnt: i32 = 0;
4443
let mut has_joined: bool = false;
4544

45+
let guild_id_s = vec_to_string(guild_id.to_vec()).map_err(|_| VCMPError::ParseError)?;
46+
4647
let mut client = DiscordLitentryClient::new();
4748
for identity in identities {
48-
if let Identity::Web2 { network, address: _addr } = identity {
49+
if let Identity::Web2 { network, address } = identity {
4950
if matches!(network, Web2Network::Discord) {
5051
discord_cnt += 1;
51-
if let Ok(response) = client.check_join(guild_id.to_vec(), handler.to_vec()) {
52+
if let Ok(response) = client.check_join(guild_id.to_vec(), address.to_vec()) {
5253
if response.data {
5354
has_joined = true;
54-
break
55+
56+
//Assign role "ID-Hubber" to each discord account
57+
if let Ok(response) =
58+
client.assign_id_hubber(guild_id.to_vec(), address.to_vec())
59+
{
60+
if !response.data {
61+
error!(
62+
"assign_id_hubber {} {}",
63+
response.message, response.msg_code
64+
);
65+
}
66+
}
5567
}
5668
}
5769
}
5870
}
5971
}
6072

6173
match Credential::generate_unsigned_credential(
62-
&Assertion::A2(guild_id.clone(), handler.clone()),
74+
&Assertion::A2(guild_id),
6375
who,
6476
&shard.clone(),
6577
bn,
6678
) {
6779
Ok(mut credential_unsigned) => {
6880
if discord_cnt > 0 && has_joined {
6981
credential_unsigned.credential_subject.values.push(true);
70-
71-
//Assign Role "ID-Hubber" to User
72-
match client.assign_id_hubber(guild_id.to_vec(), handler.to_vec()) {
73-
Ok(response) => {
74-
//check response
75-
if !response.data {
76-
error!("assign_id_hubber {} {}", response.message, response.msg_code);
77-
}
78-
},
79-
Err(e) => {
80-
error!("assign_id_hubber failed {:?}", e);
81-
return Err(VCMPError::Assertion2Failed)
82-
},
83-
}
8482
} else {
8583
credential_unsigned.credential_subject.values.push(false);
8684
}
85+
credential_unsigned.add_assertion_a2(guild_id_s);
8786
return Ok(credential_unsigned)
8887
},
8988
Err(e) => {
@@ -110,19 +109,20 @@ mod tests {
110109
.write()
111110
.unwrap()
112111
.set_discord_litentry_url("http://localhost:9527".to_string());
113-
let guildid: u64 = 919848390156767232;
114-
let guild_id_vec: Vec<u8> = format!("{}", guildid).as_bytes().to_vec();
112+
let guild_id_u: u64 = 919848390156767232;
113+
let guild_id_vec: Vec<u8> = format!("{}", guild_id_u).as_bytes().to_vec();
114+
115115
let handler_vec: Vec<u8> = "againstwar%234779".to_string().as_bytes().to_vec();
116116
let identities = vec![Identity::Web2 {
117117
network: Web2Network::Discord,
118118
address: IdentityString::truncate_from(handler_vec.clone()),
119119
}];
120+
120121
let guild_id = BoundedVec::try_from(guild_id_vec).unwrap();
121-
let handler = BoundedVec::try_from(handler_vec).unwrap();
122122
let who = AccountId::from([0; 32]);
123123
let shard = ShardIdentifier::default();
124124

125-
let _ = build(identities, guild_id, handler, &shard, &who, 1);
125+
let _ = build(identities, guild_id, &shard, &who, 1);
126126
log::info!("assertion2 test");
127127
}
128128
}

tee-worker/litentry/core/assertion-build/src/a3.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::Result;
2424
use itp_stf_primitives::types::ShardIdentifier;
2525
use itp_types::AccountId;
2626
use lc_credentials::Credential;
27-
use lc_data_providers::discord_litentry::DiscordLitentryClient;
27+
use lc_data_providers::{discord_litentry::DiscordLitentryClient, vec_to_string};
2828
use litentry_primitives::{
2929
Assertion, Identity, ParameterString, ParentchainBlockNumber, Web2Network,
3030
};
@@ -35,18 +35,28 @@ use std::vec::Vec;
3535
pub fn build(
3636
identities: Vec<Identity>,
3737
guild_id: ParameterString,
38-
handler: ParameterString,
38+
channel_id: ParameterString,
39+
role_id: ParameterString,
3940
shard: &ShardIdentifier,
4041
who: &AccountId,
4142
bn: ParentchainBlockNumber,
4243
) -> Result<Credential> {
4344
let mut has_commented: bool = false;
4445

46+
let guild_id_s = vec_to_string(guild_id.to_vec()).map_err(|_| VCMPError::ParseError)?;
47+
let channel_id_s = vec_to_string(channel_id.to_vec()).map_err(|_| VCMPError::ParseError)?;
48+
let role_id_s = vec_to_string(role_id.to_vec()).map_err(|_| VCMPError::ParseError)?;
49+
4550
let mut client = DiscordLitentryClient::new();
4651
for identity in identities {
47-
if let Identity::Web2 { network, address: _addr } = identity {
52+
if let Identity::Web2 { network, address } = identity {
4853
if matches!(network, Web2Network::Discord) {
49-
if let Ok(response) = client.check_id_hubber(guild_id.to_vec(), handler.to_vec()) {
54+
if let Ok(response) = client.check_id_hubber(
55+
guild_id.to_vec(),
56+
channel_id.to_vec(),
57+
role_id.to_vec(),
58+
address.to_vec(),
59+
) {
5060
if response.data {
5161
has_commented = true;
5262
break
@@ -57,7 +67,7 @@ pub fn build(
5767
}
5868

5969
match Credential::generate_unsigned_credential(
60-
&Assertion::A3(guild_id, handler),
70+
&Assertion::A3(guild_id, channel_id, role_id),
6171
who,
6272
&shard.clone(),
6373
bn,
@@ -68,6 +78,7 @@ pub fn build(
6878
} else {
6979
credential_unsigned.credential_subject.values.push(false);
7080
}
81+
credential_unsigned.add_assertion_a3(guild_id_s, channel_id_s, role_id_s);
7182
Ok(credential_unsigned)
7283
},
7384
Err(e) => {
@@ -94,19 +105,27 @@ mod tests {
94105
.write()
95106
.unwrap()
96107
.set_discord_litentry_url("http://localhost:9527".to_string());
97-
let guildid: u64 = 919848390156767232;
98-
let guild_id_vec: Vec<u8> = format!("{}", guildid).as_bytes().to_vec();
99-
let handler_vec: Vec<u8> = "ericzhang.eth#0114".to_string().as_bytes().to_vec();
108+
let guild_id_u: u64 = 919848390156767232;
109+
let channel_id_u: u64 = 919848392035794945;
110+
let role_id_u: u64 = 1034083718425493544;
111+
112+
let guild_id_vec: Vec<u8> = format!("{}", guild_id_u).as_bytes().to_vec();
113+
let channel_id_vec: Vec<u8> = format!("{}", channel_id_u).as_bytes().to_vec();
114+
let role_id_vec: Vec<u8> = format!("{}", role_id_u).as_bytes().to_vec();
115+
116+
let handler_vec: Vec<u8> = "againstwar%234779".to_string().as_bytes().to_vec();
100117
let identities = vec![Identity::Web2 {
101118
network: Web2Network::Discord,
102119
address: IdentityString::truncate_from(handler_vec.clone()),
103120
}];
121+
104122
let guild_id = BoundedVec::try_from(guild_id_vec).unwrap();
105-
let handler = BoundedVec::try_from(handler_vec).unwrap();
123+
let channel_id = BoundedVec::try_from(channel_id_vec).unwrap();
124+
let role_id = BoundedVec::try_from(role_id_vec).unwrap();
106125
let who = AccountId::from([0; 32]);
107126
let shard = ShardIdentifier::default();
108127

109-
let _ = build(identities, guild_id, handler, &shard, &who, 1);
128+
let _ = build(identities, guild_id, channel_id, role_id, &shard, &who, 1);
110129
log::info!("assertion3 test");
111130
}
112131
}

tee-worker/litentry/core/assertion-build/src/a6.rs

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam
2020
#[cfg(all(not(feature = "std"), feature = "sgx"))]
2121
extern crate sgx_tstd as std;
2222

23-
use crate::Error;
23+
use crate::Result;
24+
use itp_stf_primitives::types::ShardIdentifier;
25+
use itp_types::AccountId;
26+
use lc_credentials::Credential;
2427
use lc_data_providers::twitter_official::TwitterOfficialClient;
25-
use litentry_primitives::{Identity, Web2Network};
28+
use litentry_primitives::{Assertion, Identity, ParentchainBlockNumber, Web2Network};
29+
use log::*;
30+
use parachain_core_primitives::VCMPError;
2631
use std::vec::Vec;
2732

2833
/// Following ranges:
@@ -32,39 +37,73 @@ use std::vec::Vec;
3237
/// * 1,000+ followers
3338
/// * 10,000+ followers
3439
/// * 100,000+ followers
35-
pub fn build(identities: Vec<Identity>) -> Result<(), Error> {
40+
pub fn build(
41+
identities: Vec<Identity>,
42+
shard: &ShardIdentifier,
43+
who: &AccountId,
44+
bn: ParentchainBlockNumber,
45+
) -> Result<Credential> {
3646
let mut client = TwitterOfficialClient::new();
3747
let mut sum: u32 = 0;
48+
3849
for identity in identities {
3950
if let Identity::Web2 { network, address } = identity {
4051
if matches!(network, Web2Network::Twitter) {
41-
let twitter_id = address.to_vec();
42-
match client.query_user(twitter_id) {
43-
Ok(user) => sum += user.public_metrics.followers_count,
44-
Err(e) => log::warn!("Assertion6 request error:{:?}", e),
52+
let twitter_handler = address.to_vec();
53+
match client.query_user(twitter_handler) {
54+
Ok(user) =>
55+
if let Some(metrics) = user.public_metrics {
56+
sum += metrics.followers_count;
57+
},
58+
Err(e) => {
59+
log::warn!("Assertion6 request error:{:?}", e);
60+
return Err(VCMPError::Assertion6Failed)
61+
},
4562
}
4663
}
4764
}
4865
}
66+
67+
info!("sum followers: {}", sum);
68+
let min: u64;
69+
let max: u64;
70+
4971
match sum {
5072
0 | 1 => {
51-
log::warn!("level 0");
73+
min = 0;
74+
max = 1;
5275
},
5376
2..=100 => {
54-
log::warn!("level 1");
77+
min = 1;
78+
max = 100;
5579
},
5680
101..=1000 => {
57-
log::warn!("level 2");
81+
min = 100;
82+
max = 1000;
5883
},
5984
1001..=10000 => {
60-
log::warn!("level 3");
85+
min = 1000;
86+
max = 10000;
6187
},
6288
10001..=100000 => {
63-
log::warn!("level 4");
89+
min = 10000;
90+
max = 100000;
6491
},
6592
100001..=u32::MAX => {
66-
log::warn!("level 5");
93+
min = 100000;
94+
max = u64::MAX;
95+
},
96+
}
97+
98+
match Credential::generate_unsigned_credential(&Assertion::A6, who, &shard.clone(), bn) {
99+
Ok(mut credential_unsigned) => {
100+
credential_unsigned.add_assertion_a6(min, max);
101+
credential_unsigned.credential_subject.values.push(true);
102+
return Ok(credential_unsigned)
103+
},
104+
Err(e) => {
105+
error!("Generate unsigned credential failed {:?}", e);
67106
},
68107
}
69-
Ok(())
108+
Err(VCMPError::Assertion6Failed)
70109
}

0 commit comments

Comments
 (0)