Skip to content

Commit 51c28e8

Browse files
committed
feat: add opt-out config to execute all redeem and replace requests
Signed-off-by: Gregory Hill <gregorydhill@outlook.com>
1 parent e0ce3fe commit 51c28e8

File tree

6 files changed

+78
-44
lines changed

6 files changed

+78
-44
lines changed

runtime/src/rpc.rs

Lines changed: 60 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,7 @@ pub trait ReplacePallet {
939939
/// Get all replace requests made by the given vault
940940
async fn get_old_vault_replace_requests(
941941
&self,
942-
account_id: AccountId,
942+
maybe_account_id: Option<AccountId>,
943943
) -> Result<Vec<(H256, InterBtcReplaceRequest)>, Error>;
944944

945945
/// Get the time difference in number of blocks between when a replace
@@ -1035,22 +1035,35 @@ impl ReplacePallet for InterBtcParachain {
10351035
/// Get all replace requests made by the given vault
10361036
async fn get_old_vault_replace_requests(
10371037
&self,
1038-
account_id: AccountId,
1038+
maybe_account_id: Option<AccountId>,
10391039
) -> Result<Vec<(H256, InterBtcReplaceRequest)>, Error> {
10401040
let head = self.get_finalized_block_hash().await?;
1041-
let result: Vec<H256> = self
1042-
.api
1043-
.rpc()
1044-
.request("replace_getOldVaultReplaceRequests", rpc_params![account_id, head])
1045-
.await?;
1046-
join_all(
1047-
result
1048-
.into_iter()
1049-
.map(|key| async move { self.get_replace_request(key).await.map(|value| (key, value)) }),
1050-
)
1051-
.await
1052-
.into_iter()
1053-
.collect()
1041+
if let Some(account_id) = maybe_account_id {
1042+
let result: Vec<H256> = self
1043+
.api
1044+
.rpc()
1045+
.request("replace_getOldVaultReplaceRequests", rpc_params![account_id, head])
1046+
.await?;
1047+
join_all(
1048+
result
1049+
.into_iter()
1050+
.map(|key| async move { self.get_replace_request(key).await.map(|value| (key, value)) }),
1051+
)
1052+
.await
1053+
.into_iter()
1054+
.collect()
1055+
} else {
1056+
let key_addr = metadata::storage().replace().replace_requests_root();
1057+
let mut iter = self.api.storage().iter(key_addr, DEFAULT_PAGE_SIZE, head).await?;
1058+
let mut replace_requests = Vec::new();
1059+
while let Some((replace_id, request)) = iter.next().await? {
1060+
let key_hash = replace_id.0.as_slice();
1061+
// last bytes are the raw key
1062+
let key = &key_hash[key_hash.len() - 32..];
1063+
replace_requests.push((H256::from_slice(key), request));
1064+
}
1065+
Ok(replace_requests)
1066+
}
10541067
}
10551068

10561069
async fn get_replace_period(&self) -> Result<u32, Error> {
@@ -1340,10 +1353,11 @@ pub trait RedeemPallet {
13401353

13411354
async fn get_redeem_request(&self, redeem_id: H256) -> Result<InterBtcRedeemRequest, Error>;
13421355

1343-
/// Get all redeem requests requested of the given vault
1344-
async fn get_vault_redeem_requests(
1356+
/// Get all redeem requests, if the account is specified
1357+
/// only return those for that Vault
1358+
async fn get_redeem_requests(
13451359
&self,
1346-
account_id: AccountId,
1360+
maybe_account_id: Option<AccountId>,
13471361
) -> Result<Vec<(H256, InterBtcRedeemRequest)>, Error>;
13481362

13491363
async fn get_redeem_period(&self) -> Result<BlockNumber, Error>;
@@ -1386,24 +1400,37 @@ impl RedeemPallet for InterBtcParachain {
13861400
.await
13871401
}
13881402

1389-
async fn get_vault_redeem_requests(
1403+
async fn get_redeem_requests(
13901404
&self,
1391-
account_id: AccountId,
1405+
maybe_account_id: Option<AccountId>,
13921406
) -> Result<Vec<(H256, InterBtcRedeemRequest)>, Error> {
13931407
let head = self.get_finalized_block_hash().await?;
1394-
let result: Vec<H256> = self
1395-
.api
1396-
.rpc()
1397-
.request("redeem_getVaultRedeemRequests", rpc_params![account_id, head])
1398-
.await?;
1399-
join_all(
1400-
result
1401-
.into_iter()
1402-
.map(|key| async move { self.get_redeem_request(key).await.map(|value| (key, value)) }),
1403-
)
1404-
.await
1405-
.into_iter()
1406-
.collect()
1408+
if let Some(account_id) = maybe_account_id {
1409+
let result: Vec<H256> = self
1410+
.api
1411+
.rpc()
1412+
.request("redeem_getVaultRedeemRequests", rpc_params![account_id, head])
1413+
.await?;
1414+
join_all(
1415+
result
1416+
.into_iter()
1417+
.map(|key| async move { self.get_redeem_request(key).await.map(|value| (key, value)) }),
1418+
)
1419+
.await
1420+
.into_iter()
1421+
.collect()
1422+
} else {
1423+
let key_addr = metadata::storage().redeem().redeem_requests_root();
1424+
let mut iter = self.api.storage().iter(key_addr, DEFAULT_PAGE_SIZE, head).await?;
1425+
let mut redeem_requests = Vec::new();
1426+
while let Some((redeem_id, request)) = iter.next().await? {
1427+
let key_hash = redeem_id.0.as_slice();
1428+
// last bytes are the raw key
1429+
let key = &key_hash[key_hash.len() - 32..];
1430+
redeem_requests.push((H256::from_slice(key), request));
1431+
}
1432+
Ok(redeem_requests)
1433+
}
14071434
}
14081435

14091436
async fn get_redeem_period(&self) -> Result<BlockNumber, Error> {

vault/src/cancellation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ mod tests {
358358
async fn execute_replace(&self, replace_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
359359
async fn cancel_replace(&self, replace_id: H256) -> Result<(), RuntimeError>;
360360
async fn get_new_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
361-
async fn get_old_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
361+
async fn get_old_vault_replace_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
362362
async fn get_replace_period(&self) -> Result<u32, RuntimeError>;
363363
async fn get_replace_request(&self, replace_id: H256) -> Result<InterBtcReplaceRequest, RuntimeError>;
364364
async fn get_replace_dust_amount(&self) -> Result<u128, RuntimeError>;

vault/src/execution.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -471,14 +471,15 @@ pub async fn execute_open_requests(
471471
num_confirmations: u32,
472472
payment_margin: Duration,
473473
auto_rbf: bool,
474+
no_execute_all: bool,
474475
) -> Result<(), ServiceError<Error>> {
475476
let parachain_rpc = &parachain_rpc;
476477
let vault_id = parachain_rpc.get_account_id().clone();
477478

478479
// get all redeem and replace requests
479480
let (redeem_requests, replace_requests) = try_join!(
480-
parachain_rpc.get_vault_redeem_requests(vault_id.clone()),
481-
parachain_rpc.get_old_vault_replace_requests(vault_id.clone()),
481+
parachain_rpc.get_redeem_requests(no_execute_all.then_some(vault_id.clone())),
482+
parachain_rpc.get_old_vault_replace_requests(no_execute_all.then_some(vault_id.clone())),
482483
)?;
483484

484485
let open_redeems = redeem_requests
@@ -722,7 +723,7 @@ mod tests {
722723
async fn execute_redeem(&self, redeem_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
723724
async fn cancel_redeem(&self, redeem_id: H256, reimburse: bool) -> Result<(), RuntimeError>;
724725
async fn get_redeem_request(&self, redeem_id: H256) -> Result<InterBtcRedeemRequest, RuntimeError>;
725-
async fn get_vault_redeem_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcRedeemRequest)>, RuntimeError>;
726+
async fn get_redeem_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcRedeemRequest)>, RuntimeError>;
726727
async fn get_redeem_period(&self) -> Result<BlockNumber, RuntimeError>;
727728
}
728729

@@ -734,7 +735,7 @@ mod tests {
734735
async fn execute_replace(&self, replace_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
735736
async fn cancel_replace(&self, replace_id: H256) -> Result<(), RuntimeError>;
736737
async fn get_new_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
737-
async fn get_old_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
738+
async fn get_old_vault_replace_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
738739
async fn get_replace_period(&self) -> Result<u32, RuntimeError>;
739740
async fn get_replace_request(&self, replace_id: H256) -> Result<InterBtcReplaceRequest, RuntimeError>;
740741
async fn get_replace_dust_amount(&self) -> Result<u128, RuntimeError>;

vault/src/metrics.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,8 @@ impl PerCurrencyMetrics {
220220
let vault_id = &vault.vault_id;
221221
// update fee surplus
222222
if let Ok((redeem_requests, replace_requests)) = try_join!(
223-
parachain_rpc.get_vault_redeem_requests(vault_id.account_id.clone()),
224-
parachain_rpc.get_old_vault_replace_requests(vault_id.account_id.clone())
223+
parachain_rpc.get_redeem_requests(Some(vault_id.account_id.clone())),
224+
parachain_rpc.get_old_vault_replace_requests(Some(vault_id.account_id.clone()))
225225
) {
226226
let redeems = redeem_requests
227227
.iter()
@@ -608,7 +608,7 @@ pub async fn poll_metrics<P: CollateralBalancesPallet + RedeemPallet + IssuePall
608608
publish_native_currency_balance(parachain_rpc).await?;
609609
publish_issue_count(parachain_rpc, vault_id_manager).await;
610610
if let Ok(redeems) = parachain_rpc
611-
.get_vault_redeem_requests(parachain_rpc.get_account_id().clone())
611+
.get_redeem_requests(Some(parachain_rpc.get_account_id().clone()))
612612
.await
613613
{
614614
publish_redeem_count(vault_id_manager, &redeems).await;
@@ -720,7 +720,7 @@ mod tests {
720720
async fn execute_redeem(&self, redeem_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
721721
async fn cancel_redeem(&self, redeem_id: H256, reimburse: bool) -> Result<(), RuntimeError>;
722722
async fn get_redeem_request(&self, redeem_id: H256) -> Result<InterBtcRedeemRequest, RuntimeError>;
723-
async fn get_vault_redeem_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcRedeemRequest)>, RuntimeError>;
723+
async fn get_redeem_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcRedeemRequest)>, RuntimeError>;
724724
async fn get_redeem_period(&self) -> Result<BlockNumber, RuntimeError>;
725725
}
726726

@@ -759,7 +759,7 @@ mod tests {
759759
async fn execute_replace(&self, replace_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
760760
async fn cancel_replace(&self, replace_id: H256) -> Result<(), RuntimeError>;
761761
async fn get_new_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
762-
async fn get_old_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
762+
async fn get_old_vault_replace_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
763763
async fn get_replace_period(&self) -> Result<u32, RuntimeError>;
764764
async fn get_replace_request(&self, replace_id: H256) -> Result<InterBtcReplaceRequest, RuntimeError>;
765765
async fn get_replace_dust_amount(&self) -> Result<u128, RuntimeError>;

vault/src/replace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ mod tests {
331331
async fn execute_replace(&self, replace_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
332332
async fn cancel_replace(&self, replace_id: H256) -> Result<(), RuntimeError>;
333333
async fn get_new_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
334-
async fn get_old_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
334+
async fn get_old_vault_replace_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
335335
async fn get_replace_period(&self) -> Result<u32, RuntimeError>;
336336
async fn get_replace_request(&self, replace_id: H256) -> Result<InterBtcReplaceRequest, RuntimeError>;
337337
async fn get_replace_dust_amount(&self) -> Result<u128, RuntimeError>;

vault/src/system.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ pub struct VaultServiceConfig {
6969
#[clap(long)]
7070
pub no_issue_execution: bool,
7171

72+
/// Don't try to execute **all** redeem and replace requests,
73+
/// the Vault will still submit proofs for their own
74+
#[clap(long)]
75+
pub no_execute_all: bool,
76+
7277
/// Don't run the RPC API.
7378
#[clap(long)]
7479
pub no_api: bool,
@@ -632,6 +637,7 @@ impl VaultService {
632637
num_confirmations,
633638
self.config.payment_margin_minutes,
634639
self.config.auto_rbf,
640+
self.config.no_execute_all,
635641
);
636642

637643
let shutdown_clone = self.shutdown.clone();

0 commit comments

Comments
 (0)