diff --git a/contracts/liquidity_book/lb_pair/src/state.rs b/contracts/liquidity_book/lb_pair/src/state.rs index ffc56e06..f1c4160a 100644 --- a/contracts/liquidity_book/lb_pair/src/state.rs +++ b/contracts/liquidity_book/lb_pair/src/state.rs @@ -8,8 +8,14 @@ use math::tree_math::TreeUint24; //? use oracle_helper::Oracle; //? use types::Bytes32; //? -use shade_protocol::lb_libraries::viewing_keys::ViewingKey; -use shade_protocol::lb_libraries::{math, oracle_helper, pair_parameter_helper, tokens, types}; +use shade_protocol::lb_libraries::{ + math, + oracle_helper, + pair_parameter_helper, + tokens, + types, + viewing_keys::ViewingKey, +}; use tokens::TokenType; //? pub const CONFIG: Item = Item::new("config"); diff --git a/contracts/liquidity_book/lb_pair/src/unittest/handle_test.rs b/contracts/liquidity_book/lb_pair/src/unittest/handle_test.rs index 39c50328..7a7cfa41 100644 --- a/contracts/liquidity_book/lb_pair/src/unittest/handle_test.rs +++ b/contracts/liquidity_book/lb_pair/src/unittest/handle_test.rs @@ -5,10 +5,14 @@ use cosmwasm_std::{Uint128, Uint256}; use shade_multi_test::interfaces::{lb_pair, lb_token, snip20}; use shade_protocol::contract_interfaces::liquidity_book::lb_token::QueryAnswer; -use crate::test_helper::{init_addrs, remove_liquidity_parameters_helper}; use crate::unittest::test_helper::{ - assert_approx_eq_rel, init_lb_pair, liquidity_parameters_helper, - lp_tokens_tempate_for_100_sscrts, mint_increase_allowance_helper, + assert_approx_eq_rel, + init_addrs, + init_lb_pair, + liquidity_parameters_helper, + lp_tokens_tempate_for_100_sscrts, + mint_increase_allowance_helper, + remove_liquidity_parameters_helper, }; /*********************************************** @@ -28,7 +32,7 @@ fn test_init() -> Result<(), anyhow::Error> { let lb_token_info = lb_pair::lb_token_query(&app, &lb_pair_contract_info.clone().into())?; - let contract_info_lb_token = lb_token::contract_info_query(&app, &lb_token_info)?; + let contract_info_lb_token = lb_token::query_contract_info(&app, &lb_token_info)?; match contract_info_lb_token { QueryAnswer::TokenContractInfo { curators, .. } => { @@ -112,7 +116,7 @@ fn test_add_liquidity() -> Result<(), anyhow::Error> { let mut i = 0; for id in log_shares_array { - let liquidity = lb_token::id_balance_query(&app, &lb_token_info, id.0.to_string())?; + let liquidity = lb_token::query_id_balance(&app, &lb_token_info, id.0.to_string())?; match liquidity { shade_protocol::liquidity_book::lb_token::QueryAnswer::IdTotalBalance { amount } => { @@ -240,7 +244,7 @@ fn test_remove_liquidity() -> Result<(), anyhow::Error> { let mut i = 0; for (id, amt) in remove_liq_log { - let liquidity = lb_token::id_balance_query(&app, &lb_token_info, id.to_string())?; + let liquidity = lb_token::query_id_balance(&app, &lb_token_info, id.to_string())?; match liquidity { shade_protocol::liquidity_book::lb_token::QueryAnswer::IdTotalBalance { amount } => { diff --git a/contracts/liquidity_book/lb_pair/src/unittest/test_helper.rs b/contracts/liquidity_book/lb_pair/src/unittest/test_helper.rs index 39225b43..a9ed1caa 100644 --- a/contracts/liquidity_book/lb_pair/src/unittest/test_helper.rs +++ b/contracts/liquidity_book/lb_pair/src/unittest/test_helper.rs @@ -2,12 +2,20 @@ use core::result::Result::Ok; use std::{any::Any, str::FromStr}; use cosmwasm_std::{ - Addr, BlockInfo, ContractInfo, StdError, StdResult, Timestamp, Uint128, Uint256, + Addr, + BlockInfo, + ContractInfo, + StdError, + StdResult, + Timestamp, + Uint128, + Uint256, }; use serde::de::Error; use shade_multi_test::{ interfaces::{ - lb_pair, snip20, + lb_pair, + snip20, utils::{DeployedContracts, SupportedContracts}, }, multi::lb_token::LbToken, @@ -33,27 +41,35 @@ impl Addrs { pub fn admin(&self) -> Addr { self.addrs[0].clone() } + pub fn user1(&self) -> Addr { self.addrs[1].clone() } + pub fn user2(&self) -> Addr { self.addrs[2].clone() } + pub fn user3(&self) -> Addr { self.addrs[3].clone() } + pub fn all(&self) -> Vec { self.addrs.clone() } + pub fn a_hash(&self) -> String { self.hashes[0].clone() } + pub fn b_hash(&self) -> String { self.hashes[1].clone() } + pub fn c_hash(&self) -> String { self.hashes[2].clone() } + pub fn _d_hash(&self) -> String { self.hashes[3].clone() } @@ -160,6 +176,7 @@ pub fn init_lb_pair() -> Result<(App, Contract, DeployedContracts), anyhow::Erro "viewing_key".to_string(), String::new(), String::new(), + addrs.admin(), )?; Ok((app, lb_pair, deployed_contracts)) diff --git a/contracts/liquidity_book/lb_token/src/contract.rs b/contracts/liquidity_book/lb_token/src/contract.rs index 0339a4fa..a183e332 100644 --- a/contracts/liquidity_book/lb_token/src/contract.rs +++ b/contracts/liquidity_book/lb_token/src/contract.rs @@ -27,36 +27,38 @@ use secret_toolkit::{ viewing_key::{ViewingKey, ViewingKeyStore}, }; -use crate::state::{ - balances_r, blockinfo_r, contr_conf_r, get_receiver_hash, - permissions::{list_owner_permission_keys, may_load_any_permission}, - tkn_info_r, tkn_tot_supply_r, - txhistory::{get_txs, may_get_current_owner}, - PREFIX_REVOKED_PERMITS, -}; use crate::{ receiver::Snip1155ReceiveMsg, state::{ - balances_w, blockinfo_w, contr_conf_w, - permissions::{new_permission, update_permission}, - set_receiver_hash, tkn_info_w, tkn_tot_supply_w, - txhistory::{append_new_owner, store_burn, store_mint, store_transfer}, - RESPONSE_BLOCK_SIZE, + balances_r, balances_w, blockinfo_r, blockinfo_w, contr_conf_r, contr_conf_w, + get_receiver_hash, + permissions::{ + list_owner_permission_keys, may_load_any_permission, new_permission, update_permission, + }, + set_receiver_hash, tkn_info_r, tkn_info_w, tkn_tot_supply_r, tkn_tot_supply_w, + txhistory::{ + append_new_owner, get_txs, may_get_current_owner, store_burn, store_mint, + store_transfer, + }, + PREFIX_REVOKED_PERMITS, RESPONSE_BLOCK_SIZE, }, }; use secret_toolkit::permit::{validate, Permit, TokenPermissions}; -use shade_protocol::lb_libraries::lb_token::{ - expiration::Expiration, - metadata::Metadata, - permissions::{Permission, PermissionKey}, - state_structs::{ - ContractConfig, CurateTokenId, OwnerBalance, StoredTokenInfo, TknConfig, TokenAmount, - TokenInfoMsg, +use shade_protocol::{ + lb_libraries::lb_token::{ + expiration::Expiration, + metadata::Metadata, + permissions::{Permission, PermissionKey}, + state_structs::{ + ContractConfig, CurateTokenId, OwnerBalance, StoredTokenInfo, TknConfig, TokenAmount, + TokenInfoMsg, + }, + }, + liquidity_book::lb_token::{ + ExecuteAnswer, ExecuteMsg, InstantiateMsg, ResponseStatus::Success, SendAction, + TransferAction, }, -}; -use shade_protocol::liquidity_book::lb_token::{ - ExecuteAnswer, ExecuteMsg, InstantiateMsg, ResponseStatus::Success, SendAction, TransferAction, }; ///////////////////////////////////////////////////////////////////////////////// // Init @@ -410,8 +412,8 @@ fn try_burn_tokens( if token_info_op.is_none() { return Err(StdError::generic_err( - "token_id does not exist. Cannot burn non-existent `token_ids`. Use `curate_token_ids` to create tokens on new `token_ids`" - )); + "token_id does not exist. Cannot burn non-existent `token_ids`. Use `curate_token_ids` to create tokens on new `token_ids`", + )); } let token_info = token_info_op.clone().unwrap(); @@ -475,7 +477,7 @@ fn try_change_metadata( return Err(StdError::generic_err(format!( "token_id {} does not exist", token_id - ))) + ))); } Some(i) => i.token_config.flatten(), }; @@ -499,7 +501,7 @@ fn try_change_metadata( return Err(StdError::generic_err(format!( "unable to change the metadata for token_id {}", token_id - ))) + ))); } true => { let mut tkn_info = tkn_info_op.unwrap(); @@ -1080,9 +1082,9 @@ fn exec_curate_token_id( if initial_token.token_info.token_config.flatten().is_nft { if initial_token.balances.len() > 1 { return Err(StdError::generic_err(format!( - "token_id {} is an NFT; there can only be one NFT. Balances should only have one address", - initial_token.token_info.token_id - ))); + "token_id {} is an NFT; there can only be one NFT. Balances should only have one address", + initial_token.token_info.token_id + ))); } else if initial_token.balances[0].amount != Uint256::from(1_u64) { return Err(StdError::generic_err(format!( "token_id {} is an NFT; there can only be one NFT. Balances.amount must == 1", @@ -1229,14 +1231,14 @@ fn impl_transfer( return Err(StdError::generic_err(format!( "Allowance has expired: {}", perm.trfer_allowance_exp - ))) + ))); } // not enough allowance to transfer amount Some(perm) if perm.trfer_allowance_perm < amount => { return Err(StdError::generic_err(format!( "Insufficient transfer allowance: {}", perm.trfer_allowance_perm - ))) + ))); } // success, so need to reduce allowance Some(mut perm) if perm.trfer_allowance_perm >= amount => { @@ -1263,7 +1265,7 @@ fn impl_transfer( true => { return Err(StdError::generic_err( "These tokens do not exist or you have no permission to transfer", - )) + )); } false => (), } @@ -1383,7 +1385,7 @@ fn exec_change_balance( Err(_e) => { return Err(StdError::generic_err( "total supply exceeds max allowed of 2^128", - )) + )); } }; tkn_tot_supply_w(storage).save(token_info.token_id.as_bytes(), &new_amount)?; @@ -1499,7 +1501,9 @@ fn permit_queries(deps: Deps, permit: Permit, query: QueryWithPermit) -> Result< if account != owner.as_str() && account != allowed_address.as_str() { return Err(StdError::generic_err(format!( "Cannot query permission. Requires permit for either owner {:?} or viewer||spender {:?}, got permit for {:?}", - owner.as_str(), allowed_address.as_str(), account.as_str() + owner.as_str(), + allowed_address.as_str(), + account.as_str() ))); } @@ -1662,7 +1666,7 @@ fn query_token_id_private_info(deps: Deps, viewer: &Addr, token_id: String) -> S None => { return Err(StdError::generic_err( "you do have have permission to view private token info", - )) + )); } Some(perm) => { let block: BlockInfo = @@ -1715,7 +1719,7 @@ fn query_balance(deps: Deps, owner: &Addr, viewer: &Addr, token_id: String) -> S None => { return Err(StdError::generic_err( "you do have have permission to view balance", - )) + )); } Some(perm) => { let block: BlockInfo = diff --git a/contracts/liquidity_book/lb_token/src/unittest/handletests.rs b/contracts/liquidity_book/lb_token/src/unittest/handletests.rs index 54d0dd18..7acc56db 100755 --- a/contracts/liquidity_book/lb_token/src/unittest/handletests.rs +++ b/contracts/liquidity_book/lb_token/src/unittest/handletests.rs @@ -9,8 +9,10 @@ use super::super::{ // state::{expiration::*, metadata::*, permissions::*, state_structs::*}, }; -use shade_protocol::lb_libraries::lb_token::{expiration::*, permissions::*, state_structs::*}; -use shade_protocol::liquidity_book::lb_token::*; +use shade_protocol::{ + lb_libraries::lb_token::{expiration::*, permissions::*, state_structs::*}, + liquidity_book::lb_token::*, +}; use cosmwasm_std::{from_binary, testing::*, to_binary, Addr, Response, StdResult, Uint256}; use secret_toolkit::{crypto::sha_256, permit::RevokedPermits}; @@ -871,8 +873,10 @@ fn test_transfer() -> StdResult<()> { // cannot transfer if not owner info.sender = addr2.clone(); let result = execute(deps.as_mut(), mock_env(), info.clone(), msg); - assert!(extract_error_msg(&result) - .contains("These tokens do not exist or you have no permission to transfer")); + assert!( + extract_error_msg(&result) + .contains("These tokens do not exist or you have no permission to transfer") + ); // transfer NFT "tkn2"; amount != 1 info.sender = addr2.clone(); @@ -1125,8 +1129,10 @@ fn test_batch_transfer_and_send_errors() -> StdResult<()> { }; let info = mock_info("addr0", &[]); let result = execute(deps.as_mut(), mock_env(), info, msg_batch_trans); - assert!(extract_error_msg(&result) - .contains("These tokens do not exist or you have no permission to transfer")); + assert!( + extract_error_msg(&result) + .contains("These tokens do not exist or you have no permission to transfer") + ); Ok(()) } @@ -1164,8 +1170,10 @@ fn test_transfer_permissions_fungible() -> StdResult<()> { padding: None, }; let mut result = execute(deps.as_mut(), mock_env(), info.clone(), msg_trnsf_0.clone()); - assert!(extract_error_msg(&result) - .contains("These tokens do not exist or you have no permission to transfer")); + assert!( + extract_error_msg(&result) + .contains("These tokens do not exist or you have no permission to transfer") + ); // cannot transfer with insufficient allowance info.sender = addr0.clone(); @@ -1325,8 +1333,10 @@ fn test_transfer_permissions_nft() -> StdResult<()> { info.clone(), msg1_trnsf_0.clone(), ); - assert!(extract_error_msg(&result) - .contains("These tokens do not exist or you have no permission to transfer")); + assert!( + extract_error_msg(&result) + .contains("These tokens do not exist or you have no permission to transfer") + ); assert_eq!( chk_bal(&deps.storage, "2", &addr2).unwrap(), Uint256::from(1u128) @@ -1437,8 +1447,10 @@ fn test_transfer_permissions_nft() -> StdResult<()> { padding: None, }; result = execute(deps.as_mut(), mock_env(), info, msg); - assert!(extract_error_msg(&result) - .contains("These tokens do not exist or you have no permission to transfer")); + assert!( + extract_error_msg(&result) + .contains("These tokens do not exist or you have no permission to transfer") + ); assert_eq!(chk_bal(&deps.storage, "2a", &addr1), None); assert_eq!( chk_bal(&deps.storage, "2a", &addr0).unwrap(), @@ -1471,23 +1483,18 @@ fn test_revoke_permission_sanity() -> StdResult<()> { let mut info = mock_info("addr0", &[]); execute(deps.as_mut(), mock_env(), info.clone(), msg0_perm_b)?; - let vks = generate_viewing_keys( - &mut deps, - mock_env(), - info.clone(), - vec![addr.a(), addr.b()], - )?; + let vks = generate_viewing_keys(&mut deps, mock_env(), info.clone(), vec![ + addr.a(), + addr.b(), + ])?; - let q_answer = from_binary::(&query( - deps.as_ref(), - mock_env(), - QueryMsg::Permission { + let q_answer = + from_binary::(&query(deps.as_ref(), mock_env(), QueryMsg::Permission { owner: addr.a(), allowed_address: addr.b(), key: vks.a(), token_id: "0".to_string(), - }, - )?)?; + })?)?; match q_answer { QueryAnswer::Permission(perm) => { assert_eq!(perm.unwrap().trfer_allowance_perm, Uint256::from(10u128)) @@ -1504,16 +1511,13 @@ fn test_revoke_permission_sanity() -> StdResult<()> { }; info.sender = addr.b(); execute(deps.as_mut(), mock_env(), info, msg_revoke)?; - let q_answer = from_binary::(&query( - deps.as_ref(), - mock_env(), - QueryMsg::Permission { + let q_answer = + from_binary::(&query(deps.as_ref(), mock_env(), QueryMsg::Permission { owner: addr.a(), allowed_address: addr.b(), key: vks.a(), token_id: "0".to_string(), - }, - )?)?; + })?)?; match q_answer { QueryAnswer::Permission(perm) => { assert_eq!(perm.unwrap().trfer_allowance_perm, Uint256::from(0u128)) diff --git a/contracts/liquidity_book/router/src/contract.rs b/contracts/liquidity_book/router/src/contract.rs index 942c8a9d..9fae0dab 100644 --- a/contracts/liquidity_book/router/src/contract.rs +++ b/contracts/liquidity_book/router/src/contract.rs @@ -21,7 +21,6 @@ use cosmwasm_std::{ StdError, StdResult, Uint128, - Uint256, }; use shade_protocol::{utils::liquidity_book::tokens::TokenType, Contract}; use shadeswap_shared::{ diff --git a/packages/multi_test/src/interfaces/router.rs b/packages/multi_test/src/interfaces/router.rs index c543e5a9..c3f5e861 100644 --- a/packages/multi_test/src/interfaces/router.rs +++ b/packages/multi_test/src/interfaces/router.rs @@ -2,13 +2,11 @@ use crate::{ interfaces::utils::{DeployedContracts, SupportedContracts}, multi::{admin::init_admin_auth, router::Router}, }; -use ::router::contract::{execute, instantiate, query, reply}; use anyhow::Error; use shade_protocol::{ - c_std::{to_binary, Addr, Binary, Coin, ContractInfo, Empty, StdError, StdResult, Uint128}, - contract_interfaces::snip20, + c_std::{to_binary, Addr, Coin, ContractInfo, StdError, StdResult, Uint128}, liquidity_book::lb_pair::SwapResult, - multi_test::{App, ContractWrapper}, + multi_test::App, utils::{asset::Contract, ExecuteCallback, InstantiateCallback, MultiTestable, Query}, }; @@ -90,14 +88,14 @@ pub fn register_snip20_token( router: &ContractInfo, snip20_token: &ContractInfo, ) -> Result<(), anyhow::Error> { - match (router::ExecuteMsg::RegisterSNIP20Token { + let res = router::ExecuteMsg::RegisterSNIP20Token { token_addr: snip20_token.address.to_string(), token_code_hash: snip20_token.code_hash.to_string(), oracle_key: None, padding: None, } - .test_exec(&router, chain, Addr::unchecked(sender), &[])) - { + .test_exec(&router, chain, Addr::unchecked(sender), &[]); + match res { Ok(_) => Ok::<(), Error>(()), Err(e) => return Err(e), }; diff --git a/packages/shade_protocol/src/contract_interfaces/liquidity_book/lb_pair.rs b/packages/shade_protocol/src/contract_interfaces/liquidity_book/lb_pair.rs index 1a435625..cc197240 100644 --- a/packages/shade_protocol/src/contract_interfaces/liquidity_book/lb_pair.rs +++ b/packages/shade_protocol/src/contract_interfaces/liquidity_book/lb_pair.rs @@ -1,12 +1,17 @@ -use crate::utils::liquidity_book::tokens::{SwapTokenAmount, TokenAmount, TokenType}; use crate::{ snip20::Snip20ReceiveMsg, utils::{ - liquidity_book::types::{Bytes32, ContractInstantiationInfo, StaticFeeParameters}, - ExecuteCallback, InstantiateCallback, Query, + liquidity_book::{ + tokens::{SwapTokenAmount, TokenAmount, TokenType}, + types::{Bytes32, ContractInstantiationInfo, StaticFeeParameters}, + }, + ExecuteCallback, + InstantiateCallback, + Query, }, Contract, }; + use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{Addr, ContractInfo, Decimal256, Uint128, Uint256}; diff --git a/packages/shade_protocol/src/contract_interfaces/liquidity_book/snip20.rs b/packages/shade_protocol/src/contract_interfaces/liquidity_book/snip20.rs deleted file mode 100644 index 224fc0a3..00000000 --- a/packages/shade_protocol/src/contract_interfaces/liquidity_book/snip20.rs +++ /dev/null @@ -1,350 +0,0 @@ -use super::{batch, manager::AllowanceResponse, ExecuteMsg, QueryAnswer, QueryMsg}; -use crate::{ - c_std::{Addr, Binary, CosmosMsg, QuerierWrapper, StdError, StdResult, Uint128}, - utils::{asset::Contract, ExecuteCallback, Query}, -}; -use cosmwasm_schema::cw_serde; -use cosmwasm_std::Coin; - -#[cw_serde] -pub struct Snip20Asset { - pub contract: Contract, - pub token_info: TokenInfo, - pub token_config: Option, -} - -pub fn fetch_snip20(contract: &Contract, querier: &QuerierWrapper) -> StdResult { - Ok(Snip20Asset { - contract: contract.clone(), - token_info: token_info(querier, contract)?, - token_config: Some(token_config(querier, contract)?), - }) -} - -/// Returns a StdResult used to execute Send -#[allow(clippy::too_many_arguments)] -pub fn send_msg( - recipient: Addr, - amount: Uint128, - msg: Option, - memo: Option, - padding: Option, - contract: &Contract, -) -> StdResult { - Ok(ExecuteMsg::Send { - recipient: recipient.to_string(), - recipient_code_hash: None, - amount, - msg, - memo, - padding, - } - .to_cosmos_msg(contract, vec![])?) -} - -/// Returns a StdResult used to execute Redeem -pub fn redeem_msg( - amount: Uint128, - denom: Option, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::Redeem { - amount, - denom, - padding, - } - .to_cosmos_msg(contract, vec![]) -} - -/// Returns a StdResult used to execute Deposit -pub fn deposit_msg( - amount: Uint128, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::Deposit { padding }.to_cosmos_msg( - contract, - vec![Coin { - denom: "uscrt".to_string(), - amount, - }], - ) -} - -/// Returns a StdResult used to execute Mint -pub fn mint_msg( - recipient: Addr, - amount: Uint128, - memo: Option, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::Mint { - recipient: recipient.to_string(), - amount, - memo, - padding, - } - .to_cosmos_msg(contract, vec![]) -} - -/// Returns a StdResult used to execute Burn -pub fn burn_msg( - amount: Uint128, - memo: Option, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::Burn { - amount, - memo, - padding, - } - .to_cosmos_msg(contract, vec![]) -} - -/// Returns a StdResult used to execute RegisterReceive -pub fn register_receive( - register_hash: String, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::RegisterReceive { - code_hash: register_hash, - padding, - } - .to_cosmos_msg(contract, vec![]) -} - -pub fn set_viewing_key_msg( - viewing_key: String, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::SetViewingKey { - key: viewing_key, - padding, - } - .to_cosmos_msg(contract, vec![]) -} - -pub fn batch_send_msg( - actions: Vec, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::BatchSend { actions, padding }.to_cosmos_msg(contract, vec![]) -} - -pub fn batch_send_from_msg( - actions: Vec, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::BatchSendFrom { actions, padding }.to_cosmos_msg(contract, vec![]) -} - -/// TokenInfo response -#[cw_serde] -pub struct TokenInfo { - pub name: String, - pub symbol: String, - pub decimals: u8, - #[serde(skip_serializing_if = "Option::is_none")] - pub total_supply: Option, -} -/// Returns a StdResult from performing TokenInfo query -pub fn token_info(querier: &QuerierWrapper, contract: &Contract) -> StdResult { - let answer: QueryAnswer = QueryMsg::TokenInfo {}.query(querier, contract)?; - match answer { - QueryAnswer::TokenInfo { - name, - symbol, - decimals, - total_supply, - } => Ok(TokenInfo { - name, - symbol, - decimals, - total_supply, - }), - _ => Err(StdError::generic_err( - "Query answer does not match possible enum values.", - )), //TODO: better error - } -} - -/// Returns a StdResult from performing a Balance query -pub fn balance_query( - querier: &QuerierWrapper, - address: Addr, - key: String, - contract: &Contract, -) -> StdResult { - let answer: QueryAnswer = QueryMsg::Balance { - address: address.to_string(), - key, - } - .query(querier, contract)?; - - match answer { - QueryAnswer::Balance { amount, .. } => Ok(amount), - _ => Err(StdError::generic_err("Invalid Balance Response")), //TODO: better error - } -} - -/// TokenConfig response -#[cw_serde] -pub struct TokenConfig { - pub public_total_supply: bool, - pub deposit_enabled: bool, - pub redeem_enabled: bool, - pub mint_enabled: bool, - pub burn_enabled: bool, - // Optionals only relevant to some snip20a - #[serde(skip_serializing_if = "Option::is_none")] - pub transfer_enabled: Option, -} -/// Returns a StdResult from performing TokenConfig query -pub fn token_config(querier: &QuerierWrapper, contract: &Contract) -> StdResult { - let answer: QueryAnswer = QueryMsg::TokenConfig {}.query(querier, contract)?; - - match answer { - QueryAnswer::TokenConfig { - public_total_supply, - deposit_enabled, - redeem_enabled, - mint_enabled, - burn_enabled, - .. - } => Ok(TokenConfig { - public_total_supply, - deposit_enabled, - redeem_enabled, - mint_enabled, - burn_enabled, - transfer_enabled: None, - }), - _ => Err(StdError::generic_err("Wrong answer")), //TODO: better error - } -} - -/// Returns a StdResult used to execute IncreaseAllowance -/// -/// # Arguments -/// -/// * `spender` - the address of the allowed spender -/// * `amount` - Uint128 additional amount the spender is allowed to send/burn -/// * `expiration` - Optional u64 denoting the epoch time in seconds that the allowance will expire -/// * `padding` - Optional String used as padding if you don't want to use block padding -/// * `block_size` - pad the message to blocks of this size -/// * `callback_code_hash` - String holding the code hash of the contract being called -/// * `contract_addr` - address of the contract being called -pub fn increase_allowance_msg( - spender: Addr, - amount: Uint128, - expiration: Option, - padding: Option, - _block_size: usize, - contract: &Contract, - funds: Vec, -) -> StdResult { - ExecuteMsg::IncreaseAllowance { - spender: spender.to_string(), - amount, - expiration, - padding, - } - .to_cosmos_msg(contract, funds) -} - -/// Returns a StdResult used to execute DecreaseAllowance -/// -/// # Arguments -/// -/// * `spender` - the address of the allowed spender -/// * `amount` - Uint128 amount the spender is no longer allowed to send/burn -/// * `expiration` - Optional u64 denoting the epoch time in seconds that the allowance will expire -/// * `padding` - Optional String used as padding if you don't want to use block padding -/// * `block_size` - pad the message to blocks of this size -/// * `callback_code_hash` - String holding the code hash of the contract being called -/// * `contract_addr` - address of the contract being called -pub fn decrease_allowance_msg( - spender: Addr, - amount: Uint128, - expiration: Option, - padding: Option, - _block_size: usize, - contract: &Contract, - funds: Vec, -) -> StdResult { - ExecuteMsg::DecreaseAllowance { - spender: spender.to_string(), - amount, - expiration, - padding, - } - .to_cosmos_msg(contract, funds) -} - -/// Returns a StdResult from performing Allowance query -/// -/// # Arguments -/// -/// * `querier` - a reference to the Querier dependency of the querying contract -/// * `owner` - the address that owns the tokens -/// * `spender` - the address allowed to send/burn tokens -/// * `key` - String holding the authentication key needed to view the allowance -/// * `block_size` - pad the message to blocks of this size -/// * `callback_code_hash` - String holding the code hash of the contract being queried -/// * `contract_addr` - address of the contract being queried -#[allow(clippy::too_many_arguments)] -pub fn allowance_query( - querier: &QuerierWrapper, - owner: Addr, - spender: Addr, - key: String, - _block_size: usize, - contract: &Contract, -) -> StdResult { - let answer: QueryAnswer = QueryMsg::Allowance { - owner: owner.to_string(), - spender: spender.to_string(), - key, - } - .query(querier, contract)?; - match answer { - QueryAnswer::Allowance { - spender, - owner, - allowance, - expiration, - } => Ok(AllowanceResponse { - spender, - owner, - expiration, - amount: allowance, - }), - QueryAnswer::ViewingKeyError { .. } => Err(StdError::generic_err("Unauthorized")), - _ => Err(StdError::generic_err("Invalid Allowance query response")), - } -} - -pub fn transfer_from_msg( - owner: String, - recipient: String, - amount: Uint128, - memo: Option, - padding: Option, - contract: &Contract, -) -> StdResult { - ExecuteMsg::TransferFrom { - owner, - recipient, - amount, - memo, - padding, - } - .to_cosmos_msg(contract, vec![]) -} diff --git a/packages/shade_protocol/src/utils/liquidity_book/lb_token/state_structs.rs b/packages/shade_protocol/src/utils/liquidity_book/lb_token/state_structs.rs index 6cb94f55..17e5e38e 100644 --- a/packages/shade_protocol/src/utils/liquidity_book/lb_token/state_structs.rs +++ b/packages/shade_protocol/src/utils/liquidity_book/lb_token/state_structs.rs @@ -7,9 +7,6 @@ use cosmwasm_std::{Addr, Uint256}; use self::metadata::Metadata; -#[cfg(test)] -use crate::utils::liquidity_book::lb_token::metadata::Extension; - ///////////////////////////////////////////////////////////////////////////////// // Contract and Token Id configs ///////////////////////////////////////////////////////////////////////////////// diff --git a/packages/shade_protocol/src/utils/liquidity_book/math/packed_u128_math.rs b/packages/shade_protocol/src/utils/liquidity_book/math/packed_u128_math.rs index 63e43ef0..ef88ed0c 100644 --- a/packages/shade_protocol/src/utils/liquidity_book/math/packed_u128_math.rs +++ b/packages/shade_protocol/src/utils/liquidity_book/math/packed_u128_math.rs @@ -821,6 +821,7 @@ mod tests { } #[test] + #[should_panic] fn test_sub() { // Basic Test Case let bytes1 = Bytes32::encode(25, 45); @@ -831,7 +832,7 @@ mod tests { // Underflow Test Case let bytes1 = Bytes32::encode(0, 0); let bytes2 = Bytes32::encode(10, 20); - // This should panic + Bytes32::sub(&bytes1, bytes2); // let result = Bytes32::sub(&bytes1, bytes2); // Zero Test Case @@ -860,7 +861,7 @@ mod tests { // Underflow Test Case let bytes1 = Bytes32::encode(0, 0); // This should panic - let result = Bytes32::sub_alt(&bytes1, 10, 20); + let _result = Bytes32::sub_alt(&bytes1, 10, 20); } #[test] diff --git a/packages/shade_protocol/src/utils/liquidity_book/math/u256x256_math.rs b/packages/shade_protocol/src/utils/liquidity_book/math/u256x256_math.rs index aa4cc3d3..29ef7799 100644 --- a/packages/shade_protocol/src/utils/liquidity_book/math/u256x256_math.rs +++ b/packages/shade_protocol/src/utils/liquidity_book/math/u256x256_math.rs @@ -407,9 +407,9 @@ mod tests { use ethnum::U256; - use crate::{ - utils::liquidity_book::constants::{PRECISION, SCALE_OFFSET}, - utils::liquidity_book::math::u256x256_math::U256x256Math, + use crate::utils::liquidity_book::{ + constants::{PRECISION, SCALE_OFFSET}, + math::u256x256_math::U256x256Math, }; #[test] @@ -418,7 +418,7 @@ mod tests { U256::from_str_prefixed("42008768997448919173843294709597899956404323600000").unwrap(); let y = U256::from_str_prefixed("42008768997448919173843294709597899956404323600000").unwrap(); - let z = U256x256Math::_get_mul_prods(x, y); + let _z = U256x256Math::_get_mul_prods(x, y); } #[test] diff --git a/packages/shade_protocol/src/utils/liquidity_book/oracle_helper.rs b/packages/shade_protocol/src/utils/liquidity_book/oracle_helper.rs index eae790be..aea263db 100644 --- a/packages/shade_protocol/src/utils/liquidity_book/oracle_helper.rs +++ b/packages/shade_protocol/src/utils/liquidity_book/oracle_helper.rs @@ -20,7 +20,8 @@ use serde::{Deserialize, Serialize}; use super::pair_parameter_helper::PairParameters; use crate::utils::liquidity_book::math::{ - encoded_sample::EncodedSample, sample_math::OracleSample, + encoded_sample::EncodedSample, + sample_math::OracleSample, }; // TODO: consider creating a different type of storage for this. @@ -315,7 +316,7 @@ impl Oracle { // It's confusing looking because we don't have methods for pow or bitOR for bytes32, // so we have to convert to U256 and back. let new_sample = - (U256::from_le_bytes(sample.0 .0) ^ U256::from(length)) | U256::from(new_length); + (U256::from_le_bytes(sample.0.0) ^ U256::from(length)) | U256::from(new_length); self.set_sample( oracle_id, @@ -782,7 +783,7 @@ mod tests { }; // Populate inputs struct (you may want to fuzz these values) - let mut inputs = UpdateInputs { + let inputs = UpdateInputs { oracle_length: 3, oracle_id: 2, previous_active_id: 100, diff --git a/packages/shade_protocol/src/utils/liquidity_book/price_helper.rs b/packages/shade_protocol/src/utils/liquidity_book/price_helper.rs index 78abbc3f..b439ffd7 100644 --- a/packages/shade_protocol/src/utils/liquidity_book/price_helper.rs +++ b/packages/shade_protocol/src/utils/liquidity_book/price_helper.rs @@ -5,9 +5,13 @@ use ethnum::{I256, U256}; -use super::constants::*; -use super::math::u128x128_math::{U128x128Math, U128x128MathError}; -use super::math::u256x256_math::{U256x256Math, U256x256MathError}; +use super::{ + constants::*, + math::{ + u128x128_math::{U128x128Math, U128x128MathError}, + u256x256_math::{U256x256Math, U256x256MathError}, + }, +}; // represents a 23 bit number (uint24, which we're not using yet) const REAL_ID_SHIFT: I256 = I256::new(1 << 23); @@ -105,8 +109,8 @@ mod tests { let integer_part = fixed_point >> 128; let shifted: U256 = U256::from(1u128) << 128; let fractional_part = fixed_point & U256::from(shifted.checked_sub(U256::ONE).unwrap()); - let fractional_part_decimal = fractional_part / U256::from(shifted); - let real_value = integer_part; + let _fractional_part_decimal = fractional_part / U256::from(shifted); + let _real_value = integer_part; } #[test] diff --git a/packages/shade_protocol/src/utils/liquidity_book/tokens.rs b/packages/shade_protocol/src/utils/liquidity_book/tokens.rs index 77bcde67..96c688ae 100644 --- a/packages/shade_protocol/src/utils/liquidity_book/tokens.rs +++ b/packages/shade_protocol/src/utils/liquidity_book/tokens.rs @@ -2,17 +2,27 @@ //! Author: Haseeb //! -use crate::{ - snip20::helpers::token_info, - utils::liquidity_book::transfer::{self, HandleMsg, QueryAnswer, QueryMsg}, - Contract, -}; +use crate::utils::liquidity_book::transfer::{self, HandleMsg, QueryAnswer, QueryMsg}; + use std::fmt::{Display, Formatter, Result}; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_binary, Addr, BankMsg, Coin, ContractInfo, CosmosMsg, Deps, MessageInfo, QuerierWrapper, - QueryRequest, StdError, StdResult, Uint128, WasmMsg, WasmQuery, + to_binary, + Addr, + BankMsg, + Coin, + ContractInfo, + CosmosMsg, + Deps, + MessageInfo, + QuerierWrapper, + QueryRequest, + StdError, + StdResult, + Uint128, + WasmMsg, + WasmQuery, }; #[cw_serde] @@ -33,34 +43,33 @@ pub enum TokenType { } impl TokenType { - pub fn query_decimals(&self, deps: &Deps) -> StdResult { - match self { - TokenType::CustomToken { - contract_addr, - token_code_hash, - .. - } => Ok(token_info( - &deps.querier, - &Contract { - address: contract_addr.clone(), - code_hash: token_code_hash.clone(), - }, - )? - .decimals), - TokenType::NativeToken { denom } => match denom.as_str() { - "uscrt" => Ok(6), - _ => Err(StdError::generic_err( - "Cannot retrieve decimals for native token", - )), - }, - } - } + // pub fn query_decimals(&self, deps: &Deps) -> StdResult { + // match self { + // TokenType::CustomToken { + // contract_addr, + // token_code_hash, + // .. + // } => Ok(token_info(&deps.querier, &Contract { + // address: contract_addr.clone(), + // code_hash: token_code_hash.clone(), + // })? + // .decimals), + // TokenType::NativeToken { denom } => match denom.as_str() { + // "uscrt" => Ok(6), + // _ => Err(StdError::generic_err( + // "Cannot retrieve decimals for native token", + // )), + // }, + // } + // } + pub fn is_native_token(&self) -> bool { match self { TokenType::NativeToken { .. } => true, TokenType::CustomToken { .. } => false, } } + pub fn unique_key(&self) -> String { match self { TokenType::NativeToken { denom } => denom.to_string(), @@ -70,6 +79,7 @@ impl TokenType { } => contract_addr.to_string(), } } + pub fn address(&self) -> Addr { match self { TokenType::NativeToken { .. } => panic!("Doesn't work for native tokens"), @@ -79,6 +89,7 @@ impl TokenType { } => contract_addr.clone(), } } + pub fn code_hash(&self) -> String { match self { TokenType::NativeToken { .. } => panic!("Doesn't work for native tokens"), @@ -88,12 +99,14 @@ impl TokenType { } => token_code_hash.to_string(), } } + pub fn is_custom_token(&self) -> bool { match self { TokenType::NativeToken { .. } => false, TokenType::CustomToken { .. } => true, } } + pub fn assert_sent_native_token_balance( &self, info: &MessageInfo, @@ -105,14 +118,18 @@ impl TokenType { if amount == coin.amount { Ok(()) } else { - Err(StdError::generic_err("Native token balance mismatch between the argument and the transferred")) + Err(StdError::generic_err( + "Native token balance mismatch between the argument and the transferred", + )) } } None => { if amount.is_zero() { Ok(()) } else { - Err(StdError::generic_err("Native token balance mismatch between the argument and the transferred")) + Err(StdError::generic_err( + "Native token balance mismatch between the argument and the transferred", + )) } } }; diff --git a/packages/shadeswap_shared/src/core/events.rs b/packages/shadeswap_shared/src/core/events.rs index d00d6c3e..124d326f 100644 --- a/packages/shadeswap_shared/src/core/events.rs +++ b/packages/shadeswap_shared/src/core/events.rs @@ -1,13 +1,5 @@ use cosmwasm_std::{Event, StdError, StdResult}; -struct AttributeKey; - -impl AttributeKey { - pub const AMM_PAIR_ADDRESS: &'static str = "amm_pair_address"; - pub const LP_TOKEN_ADDRESS: &'static str = "lp_token_address"; - pub const STAKING_CONTRACT_ADDRESS: &'static str = "staking_contract_address"; -} - pub struct EventsParser; impl EventsParser { @@ -24,6 +16,7 @@ impl EventsParser { } None } + pub fn try_find_custom_value(events: &[Event], attribute_key: &str) -> StdResult { if let Some(value) = Self::may_find_custom_value(events, attribute_key) { Ok(value) diff --git a/packages/shadeswap_shared/src/core/token_pair.rs b/packages/shadeswap_shared/src/core/token_pair.rs index a4c092f7..85719588 100644 --- a/packages/shadeswap_shared/src/core/token_pair.rs +++ b/packages/shadeswap_shared/src/core/token_pair.rs @@ -1,9 +1,7 @@ -use cosmwasm_std::StdResult; -use cosmwasm_std::{Deps, Uint128}; +use cosmwasm_std::{Deps, StdResult, Uint128}; use schemars::JsonSchema; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use shade_protocol::utils::liquidity_book::tokens::TokenType; -use shade_protocol::Contract; +use shade_protocol::{utils::liquidity_book::tokens::TokenType, Contract}; use super::TokenPairAmount; @@ -40,6 +38,7 @@ impl TokenPair { _ => None, } } + pub fn new_from_custom(token_a: Contract, token_b: Contract, is_stable: bool) -> Self { Self( TokenType::CustomToken { @@ -53,6 +52,7 @@ impl TokenPair { is_stable, ) } + pub fn new_amount( &self, amount_a: impl Into + Copy, @@ -84,11 +84,11 @@ impl TokenPair { Ok([amount_0, amount_1]) } - pub fn query_decimals(&self, deps: &Deps) -> StdResult<[u8; 2]> { - let decimal_0 = self.0.query_decimals(deps)?; - let decimal_1 = self.1.query_decimals(deps)?; - Ok([decimal_0, decimal_1]) - } + // pub fn query_decimals(&self, deps: &Deps) -> StdResult<[u8; 2]> { + // let decimal_0 = self.0.query_decimals(deps)?; + // let decimal_1 = self.1.query_decimals(deps)?; + // Ok([decimal_0, decimal_1]) + // } } impl PartialEq for TokenPair { @@ -99,8 +99,9 @@ impl PartialEq for TokenPair { } impl<'a> IntoIterator for &'a TokenPair { - type Item = &'a TokenType; type IntoIter = TokenPairIterator<'a>; + type Item = &'a TokenType; + fn into_iter(self) -> Self::IntoIter { TokenPairIterator { pair: self, diff --git a/packages/shadeswap_shared/src/core/token_pair_amount.rs b/packages/shadeswap_shared/src/core/token_pair_amount.rs index 401bd066..db2da614 100644 --- a/packages/shadeswap_shared/src/core/token_pair_amount.rs +++ b/packages/shadeswap_shared/src/core/token_pair_amount.rs @@ -1,11 +1,10 @@ -use cosmwasm_std::StdError; -use cosmwasm_std::{MessageInfo, StdResult, Uint128}; +#[warn(unused_imports)] +use cosmwasm_std::{MessageInfo, StdError, StdResult, Uint128}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use shade_protocol::utils::liquidity_book::tokens::TokenType; use super::TokenPair; - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct TokenPairAmount { pub pair: TokenPair, @@ -54,8 +53,9 @@ impl TokenPairAmount { } impl<'a> IntoIterator for &'a TokenPairAmount { - type Item = (Uint128, &'a TokenType); type IntoIter = TokenPairAmountIterator<'a>; + type Item = (Uint128, &'a TokenType); + fn into_iter(self) -> Self::IntoIter { TokenPairAmountIterator { pair: self, @@ -71,6 +71,7 @@ pub struct TokenPairAmountIterator<'a> { impl<'a> Iterator for TokenPairAmountIterator<'a> { type Item = (Uint128, &'a TokenType); + fn next(&mut self) -> Option { let result = match self.index { 0 => Some((self.pair.amount_0, &self.pair.pair.0)), @@ -147,8 +148,10 @@ pub mod tests { }, false, ); - assert!(reverse_amount - .create_new_pair_amount_to_match_order_of(&broken_pair) - .is_err()); + assert!( + reverse_amount + .create_new_pair_amount_to_match_order_of(&broken_pair) + .is_err() + ); } } diff --git a/packages/shadeswap_shared/src/core/token_type.rs b/packages/shadeswap_shared/src/core/token_type.rs index 031c3594..03bd16ad 100644 --- a/packages/shadeswap_shared/src/core/token_type.rs +++ b/packages/shadeswap_shared/src/core/token_type.rs @@ -1,19 +1,6 @@ -use cosmwasm_std::{ - to_binary, Addr, BankMsg, Coin, ContractInfo, CosmosMsg, Deps, MessageInfo, StdError, - StdResult, Uint128, Uint256, WasmMsg, -}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use shade_protocol::Contract; -use shade_protocol::{ - snip20::{ - helpers::{balance_query, token_info}, - ExecuteMsg::Send, - }, - utils::liquidity_book::tokens::TokenType, -}; - -use super::TokenAmount; +use shade_protocol::utils::liquidity_book::tokens::TokenType; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct StableTokenData {