Skip to content

Commit 68638d1

Browse files
authored
Merge pull request #1216 from interlay/nakul/backport_1
fix: only award redeem premium upto the secure threshold
2 parents b5e8e7e + b290b6b commit 68638d1

File tree

27 files changed

+1921
-1434
lines changed

27 files changed

+1921
-1434
lines changed

crates/fee/src/lib.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,24 @@ impl<T: Config> Pallet<T> {
437437
///
438438
/// * `amount` - amount in collateral (at current exchange rate)
439439
pub fn get_premium_redeem_fee(amount: &Amount<T>) -> Result<Amount<T>, DispatchError> {
440-
amount.checked_rounded_mul(&<PremiumRedeemFee<T>>::get(), Rounding::NearestPrefUp)
440+
amount.checked_rounded_mul(&<PremiumRedeemFee<T>>::get(), Rounding::Down)
441441
}
442442

443+
/// Get the premium redeem reward rate.
444+
///
445+
/// # Returns
446+
/// Returns the premium redeem reward rate.
447+
pub fn premium_redeem_reward_rate() -> UnsignedFixedPoint<T> {
448+
<PremiumRedeemFee<T>>::get()
449+
}
450+
451+
/// Get the fee share that users need to pay to redeem tokens.
452+
///
453+
/// # Returns
454+
/// Returns the redeem fee.
455+
pub fn get_redeem_fee_value() -> UnsignedFixedPoint<T> {
456+
<RedeemFee<T>>::get()
457+
}
443458
/// Calculate punishment fee for a Vault that fails to execute a redeem
444459
/// request before the expiry.
445460
///

crates/fee/src/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use scale_info::TypeInfo;
55

66
pub(crate) type BalanceOf<T> = <T as currency::Config>::Balance;
77

8-
pub(crate) type UnsignedFixedPoint<T> = <T as currency::Config>::UnsignedFixedPoint;
8+
pub type UnsignedFixedPoint<T> = <T as currency::Config>::UnsignedFixedPoint;
99

1010
pub(crate) type DefaultVaultId<T> = VaultId<<T as frame_system::Config>::AccountId, CurrencyId<T>>;
1111

crates/issue/src/ext.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub(crate) mod vault_registry {
9494
}
9595

9696
pub fn ensure_not_banned<T: crate::Config>(vault_id: &DefaultVaultId<T>) -> DispatchResult {
97-
<vault_registry::Pallet<T>>::_ensure_not_banned(vault_id)
97+
<vault_registry::Pallet<T>>::ensure_not_banned(vault_id)
9898
}
9999

100100
pub fn decrease_to_be_issued_tokens<T: crate::Config>(

crates/redeem/rpc/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkad
1111
sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" }
1212
sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" }
1313
redeem-rpc-runtime-api = { path = "runtime-api" }
14+
15+
[dependencies.oracle-rpc-runtime-api]
16+
path = '../../oracle/rpc/runtime-api'

crates/redeem/rpc/runtime-api/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ frame-support = { git = "https://github.com/paritytech/substrate", branch = "pol
1010
sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31", default-features = false }
1111
sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31", default-features = false }
1212

13+
[dependencies.oracle-rpc-runtime-api]
14+
default-features = false
15+
path = '../../../oracle/rpc/runtime-api'
16+
1317
[features]
1418
default = ["std"]
1519
std = [

crates/redeem/rpc/runtime-api/src/lib.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
#![cfg_attr(not(feature = "std"), no_std)]
44

55
use codec::Codec;
6+
use frame_support::dispatch::DispatchError;
7+
use oracle_rpc_runtime_api::BalanceWrapper;
68
use sp_std::vec::Vec;
79

810
sp_api::decl_runtime_apis! {
9-
pub trait RedeemApi<AccountId, H256, RedeemRequest> where
11+
pub trait RedeemApi<VaultId, Balance, AccountId, H256, RedeemRequest> where
12+
VaultId: Codec,
13+
Balance: Codec,
1014
AccountId: Codec,
1115
H256: Codec,
1216
RedeemRequest: Codec,
@@ -16,5 +20,8 @@ sp_api::decl_runtime_apis! {
1620

1721
/// Get all redeem requests for a particular vault
1822
fn get_vault_redeem_requests(vault_id: AccountId) -> Vec<H256>;
23+
24+
/// Get all vaults below the premium redeem threshold, ordered in descending order of this amount
25+
fn get_premium_redeem_vaults() -> Result<Vec<(VaultId, BalanceWrapper<Balance>)>, DispatchError>;
1926
}
2027
}

crates/redeem/rpc/src/lib.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,36 @@ use jsonrpsee::{
66
proc_macros::rpc,
77
types::error::{CallError, ErrorCode, ErrorObject},
88
};
9+
use oracle_rpc_runtime_api::BalanceWrapper;
910
use sp_api::ProvideRuntimeApi;
1011
use sp_blockchain::HeaderBackend;
11-
use sp_runtime::traits::Block as BlockT;
12+
use sp_runtime::{
13+
traits::{Block as BlockT, MaybeDisplay, MaybeFromStr},
14+
DispatchError,
15+
};
1216
use std::sync::Arc;
1317

1418
pub use redeem_rpc_runtime_api::RedeemApi as RedeemRuntimeApi;
1519

20+
fn handle_response<T, E: std::fmt::Debug>(result: Result<Result<T, DispatchError>, E>, msg: String) -> RpcResult<T> {
21+
result
22+
.map_err(|err| internal_err(format!("Runtime error: {:?}: {:?}", msg, err)))?
23+
.map_err(|err| internal_err(format!("Execution error: {:?}: {:?}", msg, err)))
24+
}
25+
1626
#[rpc(client, server)]
17-
pub trait RedeemApi<BlockHash, AccountId, H256, RedeemRequest> {
27+
pub trait RedeemApi<BlockHash, VaultId, Balance, AccountId, H256, RedeemRequest>
28+
where
29+
Balance: Codec + MaybeDisplay + MaybeFromStr,
30+
{
1831
#[method(name = "redeem_getRedeemRequests")]
1932
fn get_redeem_requests(&self, account_id: AccountId, at: Option<BlockHash>) -> RpcResult<Vec<H256>>;
2033

2134
#[method(name = "redeem_getVaultRedeemRequests")]
2235
fn get_vault_redeem_requests(&self, vault_id: AccountId, at: Option<BlockHash>) -> RpcResult<Vec<H256>>;
36+
37+
#[method(name = "redeem_getPremiumRedeemVaults", aliases = ["vaultRegistry_getPremiumRedeemVaults"])]
38+
fn get_premium_redeem_vaults(&self, at: Option<BlockHash>) -> RpcResult<Vec<(VaultId, BalanceWrapper<Balance>)>>;
2339
}
2440

2541
fn internal_err<T: ToString>(message: T) -> JsonRpseeError {
@@ -47,12 +63,14 @@ impl<C, B> Redeem<C, B> {
4763
}
4864

4965
#[async_trait]
50-
impl<C, Block, AccountId, H256, RedeemRequest> RedeemApiServer<<Block as BlockT>::Hash, AccountId, H256, RedeemRequest>
51-
for Redeem<C, Block>
66+
impl<C, Block, VaultId, Balance, AccountId, H256, RedeemRequest>
67+
RedeemApiServer<<Block as BlockT>::Hash, VaultId, Balance, AccountId, H256, RedeemRequest> for Redeem<C, Block>
5268
where
5369
Block: BlockT,
5470
C: Send + Sync + 'static + ProvideRuntimeApi<Block> + HeaderBackend<Block>,
55-
C::Api: RedeemRuntimeApi<Block, AccountId, H256, RedeemRequest>,
71+
C::Api: RedeemRuntimeApi<Block, VaultId, Balance, AccountId, H256, RedeemRequest>,
72+
VaultId: Codec,
73+
Balance: Codec + MaybeDisplay + MaybeFromStr,
5674
AccountId: Codec,
5775
H256: Codec,
5876
RedeemRequest: Codec,
@@ -76,4 +94,17 @@ where
7694
api.get_vault_redeem_requests(at, vault_id)
7795
.map_err(|e| internal_err(format!("Unable to fetch redeem requests: {:?}", e)))
7896
}
97+
98+
fn get_premium_redeem_vaults(
99+
&self,
100+
at: Option<<Block as BlockT>::Hash>,
101+
) -> RpcResult<Vec<(VaultId, BalanceWrapper<Balance>)>> {
102+
let api = self.client.runtime_api();
103+
let at = at.unwrap_or_else(|| self.client.info().best_hash);
104+
105+
handle_response(
106+
api.get_premium_redeem_vaults(at),
107+
"Unable to find a vault below the premium redeem threshold".into(),
108+
)
109+
}
79110
}

crates/redeem/src/benchmarking.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ use vault_registry::{
1818
// Pallets
1919
use crate::Pallet as Redeem;
2020
use btc_relay::Pallet as BtcRelay;
21-
use oracle::Pallet as Oracle;
21+
use oracle::{OracleKey, Pallet as Oracle};
2222
use security::Pallet as Security;
23+
use sp_runtime::FixedPointNumber;
2324
use vault_registry::Pallet as VaultRegistry;
24-
2525
type UnsignedFixedPoint<T> = <T as currency::Config>::UnsignedFixedPoint;
2626

2727
fn collateral<T: crate::Config>(amount: u32) -> Amount<T> {
@@ -158,6 +158,13 @@ pub mod benchmarks {
158158

159159
#[extrinsic_call]
160160
_(RawOrigin::Signed(caller), amount, btc_address, vault_id.clone());
161+
let redeem_vault_request = Redeem::<T>::get_redeem_requests_for_vault(vault_id.account_id.clone());
162+
let redeem_request_hash = redeem_vault_request
163+
.first()
164+
.cloned()
165+
.unwrap_or_else(|| panic!("No redeem request found"));
166+
let redeem_struct = RedeemRequests::<T>::get(redeem_request_hash).unwrap();
167+
assert!(redeem_struct.premium > 0);
161168
}
162169

163170
#[benchmark]

0 commit comments

Comments
 (0)