diff --git a/state-chain/pallets/cf-lp/src/lib.rs b/state-chain/pallets/cf-lp/src/lib.rs index 09b38d10c9..9a2bb4788a 100644 --- a/state-chain/pallets/cf-lp/src/lib.rs +++ b/state-chain/pallets/cf-lp/src/lib.rs @@ -284,6 +284,19 @@ pub mod pallet { impl LpBalanceApi for Pallet { type AccountId = ::AccountId; + fn ensure_has_refund_address_for_pair( + who: &Self::AccountId, + base_asset: Asset, + pair_asset: Asset, + ) -> DispatchResult { + ensure!( + LiquidityRefundAddress::::contains_key(who, ForeignChain::from(base_asset)) && + LiquidityRefundAddress::::contains_key(who, ForeignChain::from(pair_asset)), + Error::::NoLiquidityRefundAddressRegistered + ); + Ok(()) + } + fn try_credit_account( account_id: &Self::AccountId, asset: Asset, diff --git a/state-chain/pallets/cf-pools/src/lib.rs b/state-chain/pallets/cf-pools/src/lib.rs index 7a2ecbd525..9ba37b0af3 100644 --- a/state-chain/pallets/cf-pools/src/lib.rs +++ b/state-chain/pallets/cf-pools/src/lib.rs @@ -659,6 +659,7 @@ pub mod pallet { Error::::UpdatingRangeOrdersDisabled ); let lp = T::AccountRoleRegistry::ensure_liquidity_provider(origin)?; + T::LpBalance::ensure_has_refund_address_for_pair(&lp, base_asset, pair_asset)?; Self::try_mutate_enabled_pool(base_asset, pair_asset, |asset_pair, pool| { let tick_range = match ( pool.range_orders @@ -742,6 +743,7 @@ pub mod pallet { Error::::UpdatingRangeOrdersDisabled ); let lp = T::AccountRoleRegistry::ensure_liquidity_provider(origin)?; + T::LpBalance::ensure_has_refund_address_for_pair(&lp, base_asset, pair_asset)?; Self::try_mutate_enabled_pool(base_asset, pair_asset, |asset_pair, pool| { let tick_range = match ( pool.range_orders @@ -814,6 +816,7 @@ pub mod pallet { Error::::UpdatingLimitOrdersDisabled ); let lp = T::AccountRoleRegistry::ensure_liquidity_provider(origin)?; + T::LpBalance::ensure_has_refund_address_for_pair(&lp, sell_asset, buy_asset)?; Self::try_mutate_enabled_pool(sell_asset, buy_asset, |asset_pair, pool| { let tick = match ( pool.limit_orders[asset_pair.base_side] @@ -889,6 +892,7 @@ pub mod pallet { Error::::UpdatingLimitOrdersDisabled ); let lp = T::AccountRoleRegistry::ensure_liquidity_provider(origin)?; + T::LpBalance::ensure_has_refund_address_for_pair(&lp, sell_asset, buy_asset)?; Self::try_mutate_enabled_pool(sell_asset, buy_asset, |asset_pair, pool| { let tick = match ( pool.limit_orders[asset_pair.base_side] diff --git a/state-chain/traits/src/liquidity.rs b/state-chain/traits/src/liquidity.rs index 759228fb0c..360e70383a 100644 --- a/state-chain/traits/src/liquidity.rs +++ b/state-chain/traits/src/liquidity.rs @@ -22,6 +22,12 @@ pub trait SwapDepositHandler { pub trait LpBalanceApi { type AccountId; + fn ensure_has_refund_address_for_pair( + who: &Self::AccountId, + base_asset: Asset, + pair_asset: Asset, + ) -> DispatchResult; + /// Attempt to credit the account with the given asset and amount. fn try_credit_account( who: &Self::AccountId, @@ -67,6 +73,15 @@ impl SwappingApi for T { impl LpBalanceApi for T { type AccountId = T::AccountId; + fn ensure_has_refund_address_for_pair( + _who: &Self::AccountId, + _base_asset: Asset, + _pair_asset: Asset, + ) -> DispatchResult { + // TODO + Ok(()) + } + fn try_credit_account( _who: &Self::AccountId, _asset: Asset,