Skip to content

Commit 7222e27

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 6d98906 commit 7222e27

7 files changed

Lines changed: 83 additions & 49 deletions

File tree

Cargo.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

runtime/src/rpc.rs

Lines changed: 60 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ pub trait ReplacePallet {
791791
/// Get all replace requests made by the given vault
792792
async fn get_old_vault_replace_requests(
793793
&self,
794-
account_id: AccountId,
794+
maybe_account_id: Option<AccountId>,
795795
) -> Result<Vec<(H256, InterBtcReplaceRequest)>, Error>;
796796

797797
/// Get the time difference in number of blocks between when a replace
@@ -886,22 +886,35 @@ impl ReplacePallet for InterBtcParachain {
886886
/// Get all replace requests made by the given vault
887887
async fn get_old_vault_replace_requests(
888888
&self,
889-
account_id: AccountId,
889+
maybe_account_id: Option<AccountId>,
890890
) -> Result<Vec<(H256, InterBtcReplaceRequest)>, Error> {
891891
let head = self.get_finalized_block_hash().await?;
892-
let result: Vec<H256> = self
893-
.api
894-
.rpc()
895-
.request("replace_getOldVaultReplaceRequests", rpc_params![account_id, head])
896-
.await?;
897-
join_all(
898-
result
899-
.into_iter()
900-
.map(|key| async move { self.get_replace_request(key).await.map(|value| (key, value)) }),
901-
)
902-
.await
903-
.into_iter()
904-
.collect()
892+
if let Some(account_id) = maybe_account_id {
893+
let result: Vec<H256> = self
894+
.api
895+
.rpc()
896+
.request("replace_getOldVaultReplaceRequests", rpc_params![account_id, head])
897+
.await?;
898+
join_all(
899+
result
900+
.into_iter()
901+
.map(|key| async move { self.get_replace_request(key).await.map(|value| (key, value)) }),
902+
)
903+
.await
904+
.into_iter()
905+
.collect()
906+
} else {
907+
let key_addr = metadata::storage().replace().replace_requests_root();
908+
let mut iter = self.api.storage().iter(key_addr, DEFAULT_PAGE_SIZE, head).await?;
909+
let mut replace_requests = Vec::new();
910+
while let Some((replace_id, request)) = iter.next().await? {
911+
let key_hash = replace_id.0.as_slice();
912+
// last bytes are the raw key
913+
let key = &key_hash[key_hash.len() - 32..];
914+
replace_requests.push((H256::from_slice(key), request));
915+
}
916+
Ok(replace_requests)
917+
}
905918
}
906919

907920
async fn get_replace_period(&self) -> Result<u32, Error> {
@@ -1184,10 +1197,11 @@ pub trait RedeemPallet {
11841197

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

1187-
/// Get all redeem requests requested of the given vault
1188-
async fn get_vault_redeem_requests(
1200+
/// Get all redeem requests, if the account is specified
1201+
/// only return those for that Vault
1202+
async fn get_redeem_requests(
11891203
&self,
1190-
account_id: AccountId,
1204+
maybe_account_id: Option<AccountId>,
11911205
) -> Result<Vec<(H256, InterBtcRedeemRequest)>, Error>;
11921206

11931207
async fn get_redeem_period(&self) -> Result<BlockNumber, Error>;
@@ -1229,24 +1243,37 @@ impl RedeemPallet for InterBtcParachain {
12291243
.await
12301244
}
12311245

1232-
async fn get_vault_redeem_requests(
1246+
async fn get_redeem_requests(
12331247
&self,
1234-
account_id: AccountId,
1248+
maybe_account_id: Option<AccountId>,
12351249
) -> Result<Vec<(H256, InterBtcRedeemRequest)>, Error> {
12361250
let head = self.get_finalized_block_hash().await?;
1237-
let result: Vec<H256> = self
1238-
.api
1239-
.rpc()
1240-
.request("redeem_getVaultRedeemRequests", rpc_params![account_id, head])
1241-
.await?;
1242-
join_all(
1243-
result
1244-
.into_iter()
1245-
.map(|key| async move { self.get_redeem_request(key).await.map(|value| (key, value)) }),
1246-
)
1247-
.await
1248-
.into_iter()
1249-
.collect()
1251+
if let Some(account_id) = maybe_account_id {
1252+
let result: Vec<H256> = self
1253+
.api
1254+
.rpc()
1255+
.request("redeem_getVaultRedeemRequests", rpc_params![account_id, head])
1256+
.await?;
1257+
join_all(
1258+
result
1259+
.into_iter()
1260+
.map(|key| async move { self.get_redeem_request(key).await.map(|value| (key, value)) }),
1261+
)
1262+
.await
1263+
.into_iter()
1264+
.collect()
1265+
} else {
1266+
let key_addr = metadata::storage().redeem().redeem_requests_root();
1267+
let mut iter = self.api.storage().iter(key_addr, DEFAULT_PAGE_SIZE, head).await?;
1268+
let mut redeem_requests = Vec::new();
1269+
while let Some((redeem_id, request)) = iter.next().await? {
1270+
let key_hash = redeem_id.0.as_slice();
1271+
// last bytes are the raw key
1272+
let key = &key_hash[key_hash.len() - 32..];
1273+
redeem_requests.push((H256::from_slice(key), request));
1274+
}
1275+
Ok(redeem_requests)
1276+
}
12501277
}
12511278

12521279
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
@@ -429,14 +429,15 @@ pub async fn execute_open_requests(
429429
num_confirmations: u32,
430430
payment_margin: Duration,
431431
auto_rbf: bool,
432+
no_execute_all: bool,
432433
) -> Result<(), ServiceError<Error>> {
433434
let parachain_rpc = &parachain_rpc;
434435
let vault_id = parachain_rpc.get_account_id().clone();
435436

436437
// get all redeem and replace requests
437438
let (redeem_requests, replace_requests) = try_join!(
438-
parachain_rpc.get_vault_redeem_requests(vault_id.clone()),
439-
parachain_rpc.get_old_vault_replace_requests(vault_id.clone()),
439+
parachain_rpc.get_redeem_requests(no_execute_all.then_some(vault_id.clone())),
440+
parachain_rpc.get_old_vault_replace_requests(no_execute_all.then_some(vault_id.clone())),
440441
)?;
441442

442443
let open_redeems = redeem_requests
@@ -667,7 +668,7 @@ mod tests {
667668
async fn execute_redeem(&self, redeem_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
668669
async fn cancel_redeem(&self, redeem_id: H256, reimburse: bool) -> Result<(), RuntimeError>;
669670
async fn get_redeem_request(&self, redeem_id: H256) -> Result<InterBtcRedeemRequest, RuntimeError>;
670-
async fn get_vault_redeem_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcRedeemRequest)>, RuntimeError>;
671+
async fn get_redeem_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcRedeemRequest)>, RuntimeError>;
671672
async fn get_redeem_period(&self) -> Result<BlockNumber, RuntimeError>;
672673
}
673674

@@ -679,7 +680,7 @@ mod tests {
679680
async fn execute_replace(&self, replace_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
680681
async fn cancel_replace(&self, replace_id: H256) -> Result<(), RuntimeError>;
681682
async fn get_new_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
682-
async fn get_old_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
683+
async fn get_old_vault_replace_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
683684
async fn get_replace_period(&self) -> Result<u32, RuntimeError>;
684685
async fn get_replace_request(&self, replace_id: H256) -> Result<InterBtcReplaceRequest, RuntimeError>;
685686
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
@@ -224,8 +224,8 @@ impl PerCurrencyMetrics {
224224
let vault_id = &vault.vault_id;
225225
// update fee surplus
226226
if let Ok((redeem_requests, replace_requests)) = try_join!(
227-
parachain_rpc.get_vault_redeem_requests(vault_id.account_id.clone()),
228-
parachain_rpc.get_old_vault_replace_requests(vault_id.account_id.clone())
227+
parachain_rpc.get_redeem_requests(Some(vault_id.account_id.clone())),
228+
parachain_rpc.get_old_vault_replace_requests(Some(vault_id.account_id.clone()))
229229
) {
230230
let redeems = redeem_requests
231231
.iter()
@@ -612,7 +612,7 @@ pub async fn poll_metrics<P: CollateralBalancesPallet + RedeemPallet + IssuePall
612612
publish_native_currency_balance(parachain_rpc).await?;
613613
publish_issue_count(parachain_rpc, vault_id_manager).await;
614614
if let Ok(redeems) = parachain_rpc
615-
.get_vault_redeem_requests(parachain_rpc.get_account_id().clone())
615+
.get_redeem_requests(Some(parachain_rpc.get_account_id().clone()))
616616
.await
617617
{
618618
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
@@ -329,7 +329,7 @@ mod tests {
329329
async fn execute_replace(&self, replace_id: H256, merkle_proof: &[u8], raw_tx: &[u8]) -> Result<(), RuntimeError>;
330330
async fn cancel_replace(&self, replace_id: H256) -> Result<(), RuntimeError>;
331331
async fn get_new_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
332-
async fn get_old_vault_replace_requests(&self, account_id: AccountId) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
332+
async fn get_old_vault_replace_requests(&self, maybe_account_id: Option<AccountId>) -> Result<Vec<(H256, InterBtcReplaceRequest)>, RuntimeError>;
333333
async fn get_replace_period(&self) -> Result<u32, RuntimeError>;
334334
async fn get_replace_request(&self, replace_id: H256) -> Result<InterBtcReplaceRequest, RuntimeError>;
335335
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,
@@ -568,6 +573,7 @@ impl VaultService {
568573
num_confirmations,
569574
self.config.payment_margin_minutes,
570575
self.config.auto_rbf,
576+
self.config.no_execute_all,
571577
);
572578

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

0 commit comments

Comments
 (0)