diff --git a/Cargo.lock b/Cargo.lock index 79f7582..45f8c0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,8 +371,8 @@ dependencies = [ [[package]] name = "elys-bindings" -version = "0.5.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.5.0#5385d600c93d1c8dd155fa82301b11750421845d" +version = "0.6.0" +source = "git+https://github.com/elys-network/bindings?tag=v0.6.0#6540c0037ad36175e7a77fdfd05b60586480218e" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -381,8 +381,8 @@ dependencies = [ [[package]] name = "elys-bindings-test" -version = "0.5.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.5.0#5385d600c93d1c8dd155fa82301b11750421845d" +version = "0.6.0" +source = "git+https://github.com/elys-network/bindings?tag=v0.6.0#6540c0037ad36175e7a77fdfd05b60586480218e" dependencies = [ "anyhow", "cosmwasm-schema", @@ -723,9 +723,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", diff --git a/Cargo.toml b/Cargo.toml index 47987d4..d544fa3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trade_shield_contract" -version = "0.8.0" +version = "0.9.0" edition = "2021" [lib] @@ -14,13 +14,13 @@ thiserror = "1" schemars = "0.8.1" cosmwasm-schema = "1.1.4" cw-utils = "0.13" -elys-bindings = { version = "0.5.0", git = "https://github.com/elys-network/bindings", tag = "v0.5.0" } +elys-bindings = { version = "0.6.0", git = "https://github.com/elys-network/bindings", tag = "v0.6.0" } [dev-dependencies] cw-multi-test = "0.13.4" serde_json = "1.0.107" -elys-bindings = { version = "0.5.0", git = "https://github.com/elys-network/bindings", tag = "v0.5.0", features = [ +elys-bindings = { version = "0.6.0", git = "https://github.com/elys-network/bindings", tag = "v0.6.0", features = [ "testing", ] } -elys-bindings-test = { version = "0.5.0", git = "https://github.com/elys-network/bindings", tag = "v0.5.0" } +elys-bindings-test = { version = "0.6.0", git = "https://github.com/elys-network/bindings", tag = "v0.6.0" } diff --git a/src/action/execute/claim_rewards_request.rs b/src/action/execute/claim_rewards_request.rs new file mode 100644 index 0000000..578214b --- /dev/null +++ b/src/action/execute/claim_rewards_request.rs @@ -0,0 +1,19 @@ +use super::*; +use elys_bindings::types::EarnType; + +pub fn claim_rewards_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + withdraw_type: EarnType, +) -> Result, ContractError> { + let msg = ElysMsg::withdraw_rewards( + env.contract.address.into_string(), + info.sender.into_string(), + withdraw_type, + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/claim_validator_commission_request.rs b/src/action/execute/claim_validator_commission_request.rs new file mode 100644 index 0000000..0a9ba57 --- /dev/null +++ b/src/action/execute/claim_validator_commission_request.rs @@ -0,0 +1,18 @@ +use super::*; +// delegator_address, validator_address, denom +pub fn claim_validator_commission_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + validator_address: String, +) -> Result, ContractError> { + let msg = ElysMsg::withdraw_validator_commissions( + env.contract.address.into_string(), + info.sender.into_string(), + validator_address, + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/close_margin_position.rs b/src/action/execute/close_margin_position.rs index 82d2403..b1692b0 100644 --- a/src/action/execute/close_margin_position.rs +++ b/src/action/execute/close_margin_position.rs @@ -5,7 +5,7 @@ pub fn close_margin_position( env: Env, id: u64, ) -> Result, ContractError> { - let msg = ElysMsg::margin_broker_close_position(info.sender, id, env.contract.address); + let msg = ElysMsg::margin_broker_close_position(env.contract.address, id, info.sender); let resp = Response::new().add_message(CosmosMsg::Custom(msg)); diff --git a/src/action/execute/eden_cancel_vest_request.rs b/src/action/execute/eden_cancel_vest_request.rs new file mode 100644 index 0000000..8abdbaa --- /dev/null +++ b/src/action/execute/eden_cancel_vest_request.rs @@ -0,0 +1,20 @@ +use super::*; +use cosmwasm_std::Int128; + +pub fn eden_cancel_vest_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + amount: u64, +) -> Result, ContractError> { + let msg = ElysMsg::eden_cancel_vesting( + env.contract.address.into_string(), + info.sender.into_string(), + Int128::from(amount), + "ueden".to_string(), + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/eden_vest_request.rs b/src/action/execute/eden_vest_request.rs new file mode 100644 index 0000000..a76190c --- /dev/null +++ b/src/action/execute/eden_vest_request.rs @@ -0,0 +1,20 @@ +use super::*; +use cosmwasm_std::Int128; + +pub fn eden_vest_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + amount: u64, +) -> Result, ContractError> { + let msg: ElysMsg = ElysMsg::eden_vesting( + env.contract.address.into_string(), + info.sender.into_string(), + Int128::from(amount), + "ueden".to_string(), + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/elys_cancel_unstake_request.rs b/src/action/execute/elys_cancel_unstake_request.rs new file mode 100644 index 0000000..7281c95 --- /dev/null +++ b/src/action/execute/elys_cancel_unstake_request.rs @@ -0,0 +1,23 @@ +use super::*; +use cosmwasm_std::Coin; + +pub fn elys_cancel_unstake_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + validator_address: String, + amount: Coin, + creation_height: i64, +) -> Result, ContractError> { + let msg = ElysMsg::cancel_unbonding( + env.contract.address.into_string(), + info.sender.into_string(), + validator_address, + amount, + creation_height, + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/elys_redelegation_request.rs b/src/action/execute/elys_redelegation_request.rs new file mode 100644 index 0000000..36e980d --- /dev/null +++ b/src/action/execute/elys_redelegation_request.rs @@ -0,0 +1,27 @@ +use super::*; +use cosmwasm_std::Coin; + +pub fn elys_redelegation_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + // the amount to be staked in base denomination. + validator_src_address: String, + // The asset to be staked + validator_dst_address: String, + // The validator Address is required only if the staked asset is + // uelys. + amount: Coin +) -> Result, ContractError> { + let msg = ElysMsg::begin_redelegate( + env.contract.address.into_string(), + info.sender.into_string(), + validator_src_address, + validator_dst_address, + amount, + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/stake_request.rs b/src/action/execute/stake_request.rs new file mode 100644 index 0000000..e4472bb --- /dev/null +++ b/src/action/execute/stake_request.rs @@ -0,0 +1,35 @@ +use super::*; +use cosmwasm_std::Int128; + +pub fn stake_request( + env: Env, + info: MessageInfo, + deps: DepsMut, + // the amount to be staked in base denomination. + amount: u64, + // The asset to be staked + asset: String, + // The validator Address is required only if the staked asset is + // uelys. + validator_address: Option +) -> Result, ContractError> { + let querier = ElysQuerier::new(&deps.querier); + let address = info.sender.into_string(); + let balance = querier.get_balance(address.to_owned(), asset.to_owned())?; + let token_amount: u128 = balance.amount.into(); + if token_amount < amount as u128 { + return Err(ContractError::InsufficientBalanceError { balance: balance.amount.into(), amount: amount }); + } + + let msg = ElysMsg::stake_token( + env.contract.address.into_string(), + address, + Int128::from(amount), + asset, + validator_address, + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/execute/unstake_request.rs b/src/action/execute/unstake_request.rs new file mode 100644 index 0000000..f2d1589 --- /dev/null +++ b/src/action/execute/unstake_request.rs @@ -0,0 +1,27 @@ +use super::*; +use cosmwasm_std::Int128; + +pub fn unstake_request( + env: Env, + info: MessageInfo, + _deps: DepsMut, + // the amount to be staked in base denomination. + amount: u64, + // The asset to be staked + asset: String, + // The validator Address is required only if the staked asset is + // uelys. + validator_address: Option +) -> Result, ContractError> { + let msg = ElysMsg::unstake_token( + env.contract.address.into_string(), + info.sender.into_string(), + Int128::from(amount), + asset, + validator_address, + ); + + let resp = Response::new().add_message(msg); + + Ok(resp) +} \ No newline at end of file diff --git a/src/action/mod.rs b/src/action/mod.rs index 822e415..e428304 100644 --- a/src/action/mod.rs +++ b/src/action/mod.rs @@ -39,6 +39,17 @@ pub mod execute { mod close_margin_position; mod create_margin_order; mod create_spot_order; + + mod stake_request; + mod unstake_request; + + mod claim_rewards_request; + mod claim_validator_commission_request; + mod eden_cancel_vest_request; + mod eden_vest_request; + mod elys_cancel_unstake_request; + mod elys_redelegation_request; + use super::*; pub use cancel_margin_order::cancel_margin_order; @@ -48,6 +59,15 @@ pub mod execute { pub use close_margin_position::close_margin_position; pub use create_margin_order::create_margin_order; pub use create_spot_order::create_spot_order; + + pub use stake_request::stake_request; + pub use unstake_request::unstake_request; + pub use claim_rewards_request::claim_rewards_request; + pub use claim_validator_commission_request::claim_validator_commission_request; + pub use eden_cancel_vest_request::eden_cancel_vest_request; + pub use eden_vest_request::eden_vest_request; + pub use elys_cancel_unstake_request::elys_cancel_unstake_request; + pub use elys_redelegation_request::elys_redelegation_request; } pub mod reply { diff --git a/src/entry_point/execute.rs b/src/entry_point/execute.rs index ab7a50f..d86b95c 100644 --- a/src/entry_point/execute.rs +++ b/src/entry_point/execute.rs @@ -60,5 +60,14 @@ pub fn execute( order_type, } => cancel_margin_orders(info, deps, order_ids, owner_address, order_type), CloseMarginPosition { id } => close_margin_position(info, env, id), + + StakeRequest { amount, asset, validator_address } => stake_request(env, info, deps, amount, asset, validator_address), + UnstakeRequest { amount, asset, validator_address } => unstake_request(env, info, deps, amount, asset, validator_address), + ElysRedelegateRequest { validator_src_address, validator_dst_address, amount} => elys_redelegation_request(env, info, deps, validator_src_address, validator_dst_address, amount), + ElysCancelUnstakeRequest { validator_address, amount, creation_height } => elys_cancel_unstake_request(env, info, deps, validator_address, amount, creation_height), + EdenVestRequest { amount} => eden_vest_request(env, info, deps, amount), + EdenCancelVestRequest { amount } => eden_cancel_vest_request(env, info, deps, amount), + ClaimRewardsRequest { withdraw_type } => claim_rewards_request(env, info, deps, withdraw_type), + ClaimValidatorCommissionRequest { validator_address } => claim_validator_commission_request(env, info, deps, validator_address), } } diff --git a/src/error.rs b/src/error.rs index b5c7094..b330ee0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -32,4 +32,6 @@ pub enum ContractError { Leverage, #[error("cannot cancel order: {order_id}, status: {status:?}")] CancelStatusError { order_id: u64, status: Status }, + #[error("{balance} is smaller than {amount}")] + InsufficientBalanceError {balance: u128, amount: u64}, } diff --git a/src/msg/execute_msg.rs b/src/msg/execute_msg.rs index 6a16b37..3482a80 100644 --- a/src/msg/execute_msg.rs +++ b/src/msg/execute_msg.rs @@ -1,6 +1,7 @@ use crate::types::{MarginOrderType, MarginPosition, OrderPrice, SpotOrderType}; use cosmwasm_schema::cw_serde; -use cosmwasm_std::Decimal; +use cosmwasm_std::{Decimal, Coin}; +use elys_bindings::types::EarnType; #[cw_serde] pub enum ExecuteMsg { @@ -40,4 +41,38 @@ pub enum ExecuteMsg { CloseMarginPosition { id: u64, }, + StakeRequest { + amount: u64, + asset: String, + validator_address: Option, + }, + UnstakeRequest { + amount: u64, + asset: String, + validator_address: Option, + }, + ElysRedelegateRequest { + validator_src_address: String, + validator_dst_address: String, + amount: Coin, + }, + ElysCancelUnstakeRequest { + validator_address: String, + // amount is always less than or equal to unbonding delegation entry balance + amount: Coin, + // creation_height is the height which the unbonding took place. + creation_height: i64, + }, + EdenVestRequest { + amount: u64, + }, + EdenCancelVestRequest { + amount: u64, + }, + ClaimRewardsRequest { + withdraw_type: EarnType, + }, + ClaimValidatorCommissionRequest { + validator_address: String, + } }