Skip to content

Commit ae8a953

Browse files
feat: get proofs for tokens
1 parent 1fae0a2 commit ae8a953

File tree

11 files changed

+261
-7
lines changed

11 files changed

+261
-7
lines changed

packages/dapi-grpc/protos/platform/v0/platform.proto

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,10 +446,27 @@ message GetProofsRequest {
446446
oneof request_type { ContestedResourceVoteStatusRequest contested_resource_vote_status_request = 1; }
447447
}
448448

449+
message IdentityTokenBalanceRequest {
450+
bytes token_id = 1;
451+
bytes identity_id = 2;
452+
}
453+
454+
message IdentityTokenInfoRequest {
455+
bytes token_id = 1;
456+
bytes identity_id = 2;
457+
}
458+
459+
message TokenStatusRequest {
460+
bytes token_id = 1;
461+
}
462+
449463
repeated IdentityRequest identities = 1; // List of identity requests
450464
repeated ContractRequest contracts = 2; // List of contract requests
451465
repeated DocumentRequest documents = 3; // List of document requests
452466
repeated VoteStatusRequest votes = 4;
467+
repeated IdentityTokenBalanceRequest identity_token_balances = 5;
468+
repeated IdentityTokenInfoRequest identity_token_infos = 6;
469+
repeated TokenStatusRequest token_statuses = 7;
453470
}
454471

455472
oneof version { GetProofsRequestV0 v0 = 1; }

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0_methods.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use platform_value::Identifier;
22
use crate::balances::credits::TokenAmount;
33
use crate::data_contract::associated_token::token_configuration::TokenConfiguration;
4-
use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0;
54
use crate::prelude::IdentityNonce;
65
use crate::ProtocolError;
76
use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction;

packages/rs-drive-abci/src/query/proofs/v0/mod.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ use crate::platform_types::platform::Platform;
44
use crate::platform_types::platform_state::PlatformState;
55
use crate::query::QueryValidationResult;
66
use dapi_grpc::platform::v0::get_proofs_request::get_proofs_request_v0::vote_status_request::RequestType;
7+
use dapi_grpc::platform::v0::get_proofs_request::get_proofs_request_v0::{
8+
IdentityTokenBalanceRequest, IdentityTokenInfoRequest, TokenStatusRequest,
9+
};
710
use dapi_grpc::platform::v0::get_proofs_request::GetProofsRequestV0;
811
use dapi_grpc::platform::v0::get_proofs_response::{get_proofs_response_v0, GetProofsResponseV0};
912
use dpp::check_validation_result_with_data;
@@ -13,6 +16,9 @@ use dpp::validation::ValidationResult;
1316
use dpp::version::PlatformVersion;
1417
use dpp::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll;
1518
use drive::drive::identity::{IdentityDriveQuery, IdentityProveRequestType};
19+
use drive::query::identity_token_balance_drive_query::IdentityTokenBalanceDriveQuery;
20+
use drive::query::identity_token_info_drive_query::IdentityTokenInfoDriveQuery;
21+
use drive::query::token_status_drive_query::TokenStatusDriveQuery;
1622
use drive::query::{IdentityBasedVoteDriveQuery, SingleDocumentDriveQuery};
1723

1824
impl<C> Platform<C> {
@@ -23,6 +29,9 @@ impl<C> Platform<C> {
2329
contracts,
2430
documents,
2531
votes,
32+
identity_token_balances,
33+
identity_token_infos,
34+
token_statuses,
2635
}: GetProofsRequestV0,
2736
platform_state: &PlatformState,
2837
platform_version: &PlatformVersion,
@@ -145,11 +154,72 @@ impl<C> Platform<C> {
145154
})
146155
.collect::<Result<Vec<IdentityBasedVoteDriveQuery>, QueryError>>());
147156

157+
let token_balance_queries = check_validation_result_with_data!(identity_token_balances
158+
.into_iter()
159+
.map(|identity_token_balance_request| {
160+
let IdentityTokenBalanceRequest {
161+
token_id,
162+
identity_id,
163+
} = identity_token_balance_request;
164+
Ok(IdentityTokenBalanceDriveQuery {
165+
identity_id: Identifier::try_from(identity_id).map_err(|_| {
166+
QueryError::InvalidArgument(
167+
"identity_id must be a valid identifier (32 bytes long)".to_string(),
168+
)
169+
})?,
170+
token_id: Identifier::try_from(token_id).map_err(|_| {
171+
QueryError::InvalidArgument(
172+
"token_id must be a valid identifier (32 bytes long)".to_string(),
173+
)
174+
})?,
175+
})
176+
})
177+
.collect::<Result<Vec<IdentityTokenBalanceDriveQuery>, QueryError>>());
178+
179+
let token_info_queries = check_validation_result_with_data!(identity_token_infos
180+
.into_iter()
181+
.map(|identity_token_info_request| {
182+
let IdentityTokenInfoRequest {
183+
token_id,
184+
identity_id,
185+
} = identity_token_info_request;
186+
Ok(IdentityTokenInfoDriveQuery {
187+
identity_id: Identifier::try_from(identity_id).map_err(|_| {
188+
QueryError::InvalidArgument(
189+
"identity_id must be a valid identifier (32 bytes long)".to_string(),
190+
)
191+
})?,
192+
token_id: Identifier::try_from(token_id).map_err(|_| {
193+
QueryError::InvalidArgument(
194+
"token_id must be a valid identifier (32 bytes long)".to_string(),
195+
)
196+
})?,
197+
})
198+
})
199+
.collect::<Result<Vec<IdentityTokenInfoDriveQuery>, QueryError>>());
200+
201+
let token_status_queries = check_validation_result_with_data!(token_statuses
202+
.into_iter()
203+
.map(|token_status_request| {
204+
let TokenStatusRequest { token_id } = token_status_request;
205+
Ok(TokenStatusDriveQuery {
206+
token_id: Identifier::try_from(token_id).map_err(|_| {
207+
QueryError::InvalidArgument(
208+
"token_id must be a valid identifier (32 bytes long)".to_string(),
209+
)
210+
})?,
211+
})
212+
})
213+
.collect::<Result<Vec<TokenStatusDriveQuery>, QueryError>>());
214+
148215
let proof = self.drive.prove_multiple_state_transition_results(
149216
&identity_requests,
150217
&contract_ids,
151218
&document_queries,
152219
&vote_queries,
220+
&token_balance_queries,
221+
&token_info_queries,
222+
&token_status_queries,
153223
None,
154224
platform_version,
155225
)?;
@@ -190,6 +260,9 @@ mod tests {
190260
contracts: vec![],
191261
documents: vec![],
192262
votes: vec![],
263+
identity_token_balances: vec![],
264+
identity_token_infos: vec![],
265+
token_statuses: vec![],
193266
};
194267

195268
let result = platform
@@ -213,6 +286,9 @@ mod tests {
213286
contracts: vec![],
214287
documents: vec![],
215288
votes: vec![],
289+
identity_token_balances: vec![],
290+
identity_token_infos: vec![],
291+
token_statuses: vec![],
216292
};
217293

218294
let result = platform
@@ -239,6 +315,9 @@ mod tests {
239315
}],
240316
documents: vec![],
241317
votes: vec![],
318+
identity_token_balances: vec![],
319+
identity_token_infos: vec![],
320+
token_statuses: vec![],
242321
};
243322

244323
let result = platform
@@ -263,6 +342,9 @@ mod tests {
263342
document_contested_status: 0,
264343
}],
265344
votes: vec![],
345+
identity_token_balances: vec![],
346+
identity_token_infos: vec![],
347+
token_statuses: vec![],
266348
};
267349

268350
let result = platform
@@ -287,6 +369,9 @@ mod tests {
287369
document_contested_status: 0,
288370
}],
289371
votes: vec![],
372+
identity_token_balances: vec![],
373+
identity_token_infos: vec![],
374+
token_statuses: vec![],
290375
};
291376

292377
let result = platform
@@ -311,6 +396,9 @@ mod tests {
311396
document_contested_status: 0,
312397
}],
313398
votes: vec![],
399+
identity_token_balances: vec![],
400+
identity_token_infos: vec![],
401+
token_statuses: vec![],
314402
};
315403

316404
let validation_result = platform
@@ -363,6 +451,9 @@ mod tests {
363451
},
364452
)),
365453
}],
454+
identity_token_balances: vec![],
455+
identity_token_infos: vec![],
456+
token_statuses: vec![],
366457
};
367458

368459
let validation_result = platform
@@ -395,6 +486,9 @@ mod tests {
395486
document_contested_status: 0,
396487
}],
397488
votes: vec![],
489+
identity_token_balances: vec![],
490+
identity_token_infos: vec![],
491+
token_statuses: vec![],
398492
};
399493

400494
let validation_result = platform

packages/rs-drive-abci/tests/strategy_tests/token_tests.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ mod tests {
1212
use dpp::state_transition::StateTransition;
1313
use dpp::tests::json_document::json_document_to_created_contract;
1414
use dpp::tokens::token_event::TokenEvent;
15-
use drive::query::PathQuery;
1615
use drive_abci::config::{
1716
ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformConfig, PlatformTestConfig,
1817
ValidatorSetConfig,
@@ -68,7 +67,7 @@ mod tests {
6867
.collect();
6968

7069
let contract = created_contract.data_contract_mut();
71-
let mut token_configuration = contract
70+
let token_configuration = contract
7271
.token_configuration_mut(0)
7372
.expect("expected to get token configuration");
7473
token_configuration.set_minting_allow_choosing_destination(true);
@@ -216,7 +215,7 @@ mod tests {
216215
.collect();
217216

218217
let contract = created_contract.data_contract_mut();
219-
let mut token_configuration = contract
218+
let token_configuration = contract
220219
.token_configuration_mut(0)
221220
.expect("expected to get token configuration");
222221
token_configuration.set_minting_allow_choosing_destination(true);

packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed(
113113
contracts: vec![],
114114
documents: vec![],
115115
votes: vec![],
116+
identity_token_balances: vec![],
117+
identity_token_infos: vec![],
118+
token_statuses: vec![],
116119
};
117120

118121
if let Some(action) = action {

packages/rs-drive/src/prove/prove_multiple_state_transition_results/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ use crate::error::drive::DriveError;
44
use crate::error::Error;
55
use crate::query::{IdentityBasedVoteDriveQuery, SingleDocumentDriveQuery};
66

7+
use crate::query::identity_token_balance_drive_query::IdentityTokenBalanceDriveQuery;
8+
use crate::query::identity_token_info_drive_query::IdentityTokenInfoDriveQuery;
9+
use crate::query::token_status_drive_query::TokenStatusDriveQuery;
710
use dpp::version::PlatformVersion;
811
use grovedb::TransactionArg;
912

@@ -21,6 +24,14 @@ impl Drive {
2124
/// if the contract is historical.
2225
/// - `document_queries`: A list of [SingleDocumentDriveQuery]. These specify the documents
2326
/// to be proven.
27+
/// - `vote_queries`: A list of [IdentityBasedVoteDriveQuery]. These would be to figure out the
28+
/// result of votes based on identities making them.
29+
/// - `token_balance_queries`: A slice of [IdentityTokenBalanceDriveQuery] objects specifying
30+
/// token balance queries for identities.
31+
/// - `token_info_queries`: A slice of [IdentityTokenInfoDriveQuery] objects specifying
32+
/// token information queries for identities.
33+
/// - `token_status_queries`: A slice of [TokenStatusDriveQuery] objects specifying token
34+
/// status queries.
2435
/// - `transaction`: An optional grovedb transaction
2536
/// - `drive_version`: A reference to the [DriveVersion] object that specifies the version of
2637
/// the function to call.
@@ -34,6 +45,9 @@ impl Drive {
3445
contract_ids: &[([u8; 32], Option<bool>)], //bool represents if it is historical
3546
document_queries: &[SingleDocumentDriveQuery],
3647
vote_queries: &[IdentityBasedVoteDriveQuery],
48+
token_balance_queries: &[IdentityTokenBalanceDriveQuery],
49+
token_info_queries: &[IdentityTokenInfoDriveQuery],
50+
token_status_queries: &[TokenStatusDriveQuery],
3751
transaction: TransactionArg,
3852
platform_version: &PlatformVersion,
3953
) -> Result<Vec<u8>, Error> {
@@ -48,6 +62,9 @@ impl Drive {
4862
contract_ids,
4963
document_queries,
5064
vote_queries,
65+
token_balance_queries,
66+
token_info_queries,
67+
token_status_queries,
5168
transaction,
5269
platform_version,
5370
),

packages/rs-drive/src/prove/prove_multiple_state_transition_results/v0/mod.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ use crate::drive::Drive;
33
use crate::error::Error;
44
use crate::query::{IdentityBasedVoteDriveQuery, SingleDocumentDriveQuery};
55

6+
use crate::query::identity_token_balance_drive_query::IdentityTokenBalanceDriveQuery;
7+
use crate::query::identity_token_info_drive_query::IdentityTokenInfoDriveQuery;
8+
use crate::query::token_status_drive_query::TokenStatusDriveQuery;
69
use dpp::version::PlatformVersion;
710
use grovedb::{PathQuery, TransactionArg};
811
use itertools::{Either, Itertools};
@@ -18,6 +21,12 @@ impl Drive {
1821
/// to be proven.
1922
/// - `vote_queries`: A list of [IdentityBasedVoteDriveQuery]. These would be to figure out the
2023
/// result of votes based on identities making them.
24+
/// - `token_balance_queries`: A slice of [IdentityTokenBalanceDriveQuery] objects specifying
25+
/// token balance queries for identities.
26+
/// - `token_info_queries`: A slice of [IdentityTokenInfoDriveQuery] objects specifying
27+
/// token information queries for identities.
28+
/// - `token_status_queries`: A slice of [TokenStatusDriveQuery] objects specifying token
29+
/// status queries.
2130
/// - `transaction`: An optional grovedb transaction
2231
/// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of
2332
/// the function to call.
@@ -32,6 +41,9 @@ impl Drive {
3241
contract_ids: &[([u8; 32], Option<bool>)], //bool is history
3342
document_queries: &[SingleDocumentDriveQuery],
3443
vote_queries: &[IdentityBasedVoteDriveQuery],
44+
token_balance_queries: &[IdentityTokenBalanceDriveQuery],
45+
token_info_queries: &[IdentityTokenInfoDriveQuery],
46+
token_status_queries: &[TokenStatusDriveQuery],
3547
transaction: TransactionArg,
3648
platform_version: &PlatformVersion,
3749
) -> Result<Vec<u8>, Error> {
@@ -108,6 +120,44 @@ impl Drive {
108120
}));
109121
}
110122

123+
if !token_balance_queries.is_empty() {
124+
path_queries.extend(
125+
token_balance_queries
126+
.iter()
127+
.filter_map(|token_balance_query| {
128+
// The path query construction can only fail if the serialization fails.
129+
// Because the serialization will pretty much never fail, we can do this.
130+
let mut path_query = token_balance_query.construct_path_query();
131+
path_query.query.limit = None;
132+
Some(path_query)
133+
}),
134+
);
135+
}
136+
137+
if !token_info_queries.is_empty() {
138+
path_queries.extend(token_info_queries.iter().filter_map(|token_info_query| {
139+
// The path query construction can only fail if the serialization fails.
140+
// Because the serialization will pretty much never fail, we can do this.
141+
let mut path_query = token_info_query.construct_path_query();
142+
path_query.query.limit = None;
143+
Some(path_query)
144+
}));
145+
}
146+
147+
if !token_status_queries.is_empty() {
148+
path_queries.extend(
149+
token_status_queries
150+
.iter()
151+
.filter_map(|token_status_query| {
152+
// The path query construction can only fail if the serialization fails.
153+
// Because the serialization will pretty much never fail, we can do this.
154+
let mut path_query = token_status_query.construct_path_query();
155+
path_query.query.limit = None;
156+
Some(path_query)
157+
}),
158+
);
159+
}
160+
111161
let path_query = PathQuery::merge(
112162
path_queries.iter().collect(),
113163
&platform_version.drive.grove_version,

0 commit comments

Comments
 (0)