diff --git a/.github/workflows/typo-check.yml b/.github/workflows/typo-check.yml index ed726963ee..5d386dc5cb 100644 --- a/.github/workflows/typo-check.yml +++ b/.github/workflows/typo-check.yml @@ -16,7 +16,12 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - id: files - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 + with: + files_ignore: | + contracts/**/schema/** + packages/crypto/**/*.json + packages/vm/**/*.wasm - name: Run spell-check uses: crate-ci/typos@master with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 420788f40d..a63b305ca7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,8 @@ and this project adheres to ([#2195]) - cosmwasm-std: Make `GovMsg` `#[non_exhaustive]` for consistency. ([#2347]) - cosmwasm-crypto: Upgrade ark-\* dependencies to 0.5.0. ([#2432]) +- cosmwasm-std: Remove support for `BankQuery::AllBalances` and + `query_all_balances`. ([#2433]) ## Fixed @@ -94,6 +96,7 @@ and this project adheres to [#2399]: https://github.com/CosmWasm/cosmwasm/pull/2399 [#2403]: https://github.com/CosmWasm/cosmwasm/pull/2403 [#2432]: https://github.com/CosmWasm/cosmwasm/pull/2432 +[#2433]: https://github.com/CosmWasm/cosmwasm/pull/2433 [#2438]: https://github.com/CosmWasm/cosmwasm/pull/2438 ## [2.2.0] - 2024-12-17 diff --git a/contracts/burner/schema/burner.json b/contracts/burner/schema/burner.json index 94c2124eb3..10b6b3c68a 100644 --- a/contracts/burner/schema/burner.json +++ b/contracts/burner/schema/burner.json @@ -16,6 +16,7 @@ "title": "MigrateMsg", "type": "object", "required": [ + "denoms", "payout" ], "properties": { @@ -26,8 +27,15 @@ "format": "uint32", "minimum": 0.0 }, + "denoms": { + "description": "The denoms of the final payout. Balances of tokens not listed here will remain in the account untouched.", + "type": "array", + "items": { + "type": "string" + } + }, "payout": { - "description": "The address we send all remaining balance to", + "description": "The address we send all remaining balance to. See denoms below for the denoms to consider.", "type": "string" } }, diff --git a/contracts/burner/schema/raw/migrate.json b/contracts/burner/schema/raw/migrate.json index 752175c3ea..f4adeb0f87 100644 --- a/contracts/burner/schema/raw/migrate.json +++ b/contracts/burner/schema/raw/migrate.json @@ -3,6 +3,7 @@ "title": "MigrateMsg", "type": "object", "required": [ + "denoms", "payout" ], "properties": { @@ -13,8 +14,15 @@ "format": "uint32", "minimum": 0.0 }, + "denoms": { + "description": "The denoms of the final payout. Balances of tokens not listed here will remain in the account untouched.", + "type": "array", + "items": { + "type": "string" + } + }, "payout": { - "description": "The address we send all remaining balance to", + "description": "The address we send all remaining balance to. See denoms below for the denoms to consider.", "type": "string" } }, diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 37727f96ab..b39f4f09c0 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -1,6 +1,8 @@ use cosmwasm_std::{ - entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, Storage, + entry_point, BankMsg, Coin, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, + Storage, }; +use std::collections::BTreeSet; use crate::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg}; @@ -18,12 +20,22 @@ pub fn instantiate( #[entry_point] pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult { - // get balance and send all to recipient - #[allow(deprecated)] - let balance = deps.querier.query_all_balances(env.contract.address)?; + let denom_len = msg.denoms.len(); + let denoms = BTreeSet::::from_iter(msg.denoms); // Ensure uniqueness + if denoms.len() != denom_len { + return Err(StdError::generic_err("Denoms not unique")); + } + + // get balance and send to recipient + let mut balances = Vec::::with_capacity(denoms.len()); + for denom in denoms { + let balance = deps.querier.query_balance(&env.contract.address, denom)?; + balances.push(balance); + } + let send = BankMsg::Send { to_address: msg.payout.clone(), - amount: balance, + amount: balances, }; let deleted = cleanup(deps.storage, msg.delete as usize); @@ -86,7 +98,7 @@ mod tests { use cosmwasm_std::testing::{ message_info, mock_dependencies, mock_dependencies_with_balance, mock_env, }; - use cosmwasm_std::{coins, Attribute, StdError, Storage, SubMsg}; + use cosmwasm_std::{coin, coins, Attribute, StdError, Storage, SubMsg}; /// Gets the value of the first attribute with the given key fn first_attr(data: impl AsRef<[Attribute]>, search_key: &str) -> Option { @@ -118,24 +130,64 @@ mod tests { } #[test] - fn migrate_sends_funds() { - let mut deps = mock_dependencies_with_balance(&coins(123456, "gold")); + fn migrate_sends_one_balance() { + let initial_balance = vec![coin(123456, "gold"), coin(77, "silver")]; + let mut deps = mock_dependencies_with_balance(&initial_balance); + let payout = String::from("someone else"); + + // malformed denoms + let msg = MigrateMsg { + payout: payout.clone(), + denoms: vec!["gold".to_string(), "silver".to_string(), "gold".to_string()], + delete: 0, + }; + let err = migrate(deps.as_mut(), mock_env(), msg).unwrap_err(); + match err { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Denoms not unique"), + err => panic!("Unexpected error: {err:?}"), + } + + // One denom + let msg = MigrateMsg { + payout: payout.clone(), + denoms: vec!["gold".to_string()], + delete: 0, + }; + let res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); + // check payout + assert_eq!(res.messages.len(), 1); + let msg = res.messages.first().expect("no message"); + assert_eq!( + msg, + &SubMsg::new(BankMsg::Send { + to_address: payout, + amount: coins(123456, "gold"), + }) + ); + } + + // as above but this time we want all gold and silver + #[test] + fn migrate_sends_two_balances() { + let initial_balance = vec![coin(123456, "gold"), coin(77, "silver")]; + let mut deps = mock_dependencies_with_balance(&initial_balance); // change the verifier via migrate let payout = String::from("someone else"); let msg = MigrateMsg { payout: payout.clone(), + denoms: vec!["silver".to_string(), "gold".to_string()], delete: 0, }; let res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); // check payout - assert_eq!(1, res.messages.len()); + assert_eq!(res.messages.len(), 1); let msg = res.messages.first().expect("no message"); assert_eq!( msg, &SubMsg::new(BankMsg::Send { to_address: payout, - amount: coins(123456, "gold"), + amount: vec![coin(123456, "gold"), coin(77, "silver")], }) ); } @@ -154,6 +206,7 @@ mod tests { // migrate all of the data in one go let msg = MigrateMsg { payout: "user".to_string(), + denoms: vec![], delete: 100, }; migrate(deps.as_mut(), mock_env(), msg).unwrap(); @@ -178,7 +231,11 @@ mod tests { // change the verifier via migrate let payout = String::from("someone else"); - let msg = MigrateMsg { payout, delete: 0 }; + let msg = MigrateMsg { + payout, + denoms: vec![], + delete: 0, + }; let _res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); let res = execute( diff --git a/contracts/burner/src/msg.rs b/contracts/burner/src/msg.rs index 9eb8dfae7d..a45552c461 100644 --- a/contracts/burner/src/msg.rs +++ b/contracts/burner/src/msg.rs @@ -2,8 +2,12 @@ use cosmwasm_schema::cw_serde; #[cw_serde] pub struct MigrateMsg { - /// The address we send all remaining balance to + /// The address we send all remaining balance to. See denoms + /// below for the denoms to consider. pub payout: String, + /// The denoms of the final payout. Balances of tokens not listed here + /// will remain in the account untouched. + pub denoms: Vec, /// Optional amount of items to delete in this call. /// If it is not provided, nothing will be deleted. /// You can delete further items in a subsequent execute call. diff --git a/contracts/burner/tests/integration.rs b/contracts/burner/tests/integration.rs index ab893d598d..3f3c97d6a5 100644 --- a/contracts/burner/tests/integration.rs +++ b/contracts/burner/tests/integration.rs @@ -60,8 +60,10 @@ fn migrate_sends_funds() { // change the verifier via migrate let payout = String::from("someone else"); + let msg = MigrateMsg { payout: payout.clone(), + denoms: vec!["gold".to_string()], delete: 0, }; let res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); @@ -95,7 +97,11 @@ fn execute_cleans_up_data() { // change the verifier via migrate let payout = String::from("someone else"); - let msg = MigrateMsg { payout, delete: 0 }; + let msg = MigrateMsg { + payout, + denoms: vec![], + delete: 0, + }; let _res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); let res: Response = execute( diff --git a/contracts/hackatom/schema/hackatom.json b/contracts/hackatom/schema/hackatom.json index 307c89871f..939e86590d 100644 --- a/contracts/hackatom/schema/hackatom.json +++ b/contracts/hackatom/schema/hackatom.json @@ -25,7 +25,7 @@ "title": "ExecuteMsg", "oneOf": [ { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "description": "Releasing all funds of the given denom in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", "type": "object", "required": [ "release" @@ -33,6 +33,14 @@ "properties": { "release": { "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, "additionalProperties": false } }, @@ -166,28 +174,6 @@ }, "additionalProperties": false }, - { - "description": "This returns cosmwasm_std::AllBalanceResponse to demo use of the querier", - "type": "object", - "required": [ - "other_balance" - ], - "properties": { - "other_balance": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, { "description": "Recurse will execute a query into itself up to depth-times and return Each step of the recursion may perform some extra work to test gas metering (`work` rounds of sha256 on contract). Now that we have Env, we can auto-calculate the address to recurse into", "type": "object", @@ -323,46 +309,6 @@ }, "additionalProperties": false }, - "other_balance": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllBalanceResponse", - "type": "object", - "required": [ - "amount" - ], - "properties": { - "amount": { - "description": "Returns all non-zero coins held by this account.", - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, "recurse": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "RecurseResponse", diff --git a/contracts/hackatom/schema/raw/execute.json b/contracts/hackatom/schema/raw/execute.json index a82fdeef2d..c018dc234f 100644 --- a/contracts/hackatom/schema/raw/execute.json +++ b/contracts/hackatom/schema/raw/execute.json @@ -3,7 +3,7 @@ "title": "ExecuteMsg", "oneOf": [ { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "description": "Releasing all funds of the given denom in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", "type": "object", "required": [ "release" @@ -11,6 +11,14 @@ "properties": { "release": { "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, "additionalProperties": false } }, diff --git a/contracts/hackatom/schema/raw/query.json b/contracts/hackatom/schema/raw/query.json index dfd58202b2..a00ee6aeab 100644 --- a/contracts/hackatom/schema/raw/query.json +++ b/contracts/hackatom/schema/raw/query.json @@ -16,28 +16,6 @@ }, "additionalProperties": false }, - { - "description": "This returns cosmwasm_std::AllBalanceResponse to demo use of the querier", - "type": "object", - "required": [ - "other_balance" - ], - "properties": { - "other_balance": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, { "description": "Recurse will execute a query into itself up to depth-times and return Each step of the recursion may perform some extra work to test gas metering (`work` rounds of sha256 on contract). Now that we have Env, we can auto-calculate the address to recurse into", "type": "object", diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index e8e551b69c..746c3ee806 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -1,9 +1,9 @@ use sha2::{Digest, Sha256}; use cosmwasm_std::{ - entry_point, from_json, to_json_binary, to_json_vec, Addr, AllBalanceResponse, Api, BankMsg, - BankQuery, CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, MigrateInfo, QueryRequest, - QueryResponse, Response, StdError, StdResult, WasmMsg, WasmQuery, + entry_point, from_json, to_json_binary, to_json_vec, Addr, Api, BankMsg, CanonicalAddr, Deps, + DepsMut, Env, Event, MessageInfo, MigrateInfo, QueryRequest, QueryResponse, Response, StdError, + StdResult, WasmMsg, WasmQuery, }; use crate::errors::HackError; @@ -82,7 +82,7 @@ pub fn execute( msg: ExecuteMsg, ) -> Result { match msg { - ExecuteMsg::Release {} => do_release(deps, env, info), + ExecuteMsg::Release { denom } => do_release(deps, env, info, denom), ExecuteMsg::CpuLoop {} => do_cpu_loop(), ExecuteMsg::StorageLoop {} => do_storage_loop(deps), ExecuteMsg::MemoryLoop {} => do_memory_loop(), @@ -93,7 +93,12 @@ pub fn execute( } } -fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result { +fn do_release( + deps: DepsMut, + env: Env, + info: MessageInfo, + denom: String, +) -> Result { let data = deps .storage .get(CONFIG_KEY) @@ -102,8 +107,7 @@ fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result Result Result { pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::Verifier {} => to_json_binary(&query_verifier(deps)?), - QueryMsg::OtherBalance { address } => to_json_binary(&query_other_balance(deps, address)?), QueryMsg::Recurse { depth, work } => { to_json_binary(&query_recurse(deps, depth, work, env.contract.address)?) } @@ -269,12 +272,6 @@ fn query_verifier(deps: Deps) -> StdResult { }) } -#[allow(deprecated)] -fn query_other_balance(deps: Deps, address: String) -> StdResult { - deps.querier - .query(&BankQuery::AllBalances { address }.into()) -} - fn query_recurse(deps: Deps, depth: u32, work: u32, contract: Addr) -> StdResult { // perform all hashes as requested let mut hashed: Vec = contract.as_str().into(); @@ -308,12 +305,9 @@ fn query_int() -> IntResponse { #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::testing::{ - message_info, mock_dependencies, mock_dependencies_with_balances, mock_env, - MOCK_CONTRACT_ADDR, - }; + use cosmwasm_std::testing::{message_info, mock_dependencies, mock_env, MOCK_CONTRACT_ADDR}; // import trait Storage to get access to read - use cosmwasm_std::{coins, Binary, Storage, SubMsg}; + use cosmwasm_std::{coin, coins, Binary, Storage, SubMsg}; #[test] fn proper_initialization() { @@ -440,21 +434,6 @@ mod tests { ); } - #[test] - fn querier_callbacks_work() { - let rich_addr = String::from("foobar"); - let rich_balance = coins(10000, "gold"); - let deps = mock_dependencies_with_balances(&[(&rich_addr, &rich_balance)]); - - // querying with balance gets the balance - let bal = query_other_balance(deps.as_ref(), rich_addr).unwrap(); - assert_eq!(bal.amount, rich_balance); - - // querying other accounts gets none - let bal = query_other_balance(deps.as_ref(), String::from("someone else")).unwrap(); - assert_eq!(bal.amount, vec![]); - } - #[test] fn execute_release_works() { let mut deps = mock_dependencies(); @@ -484,7 +463,9 @@ mod tests { deps.as_mut(), mock_env(), execute_info, - ExecuteMsg::Release {}, + ExecuteMsg::Release { + denom: "earth".to_string(), + }, ) .unwrap(); assert_eq!(execute_res.messages.len(), 1); @@ -503,6 +484,71 @@ mod tests { assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } + #[test] + fn execute_release_can_be_called_multiple_times() { + let mut deps = mock_dependencies(); + + // initialize the store + let creator = deps.api.addr_make("creator"); + let verifier = deps.api.addr_make("verifies"); + let beneficiary = deps.api.addr_make("benefits"); + + let instantiate_msg = InstantiateMsg { + verifier: verifier.to_string(), + beneficiary: beneficiary.to_string(), + }; + let init_amount = vec![coin(1000, "earth"), coin(70, "sun")]; + let info = message_info(&creator, &init_amount); + instantiate(deps.as_mut(), mock_env(), info, instantiate_msg).unwrap(); + + // balance changed in init + deps.querier + .bank + .update_balance(MOCK_CONTRACT_ADDR, init_amount); + + // beneficiary can release it + let execute_info = message_info(&verifier, &[]); + let execute_res = execute( + deps.as_mut(), + mock_env(), + execute_info, + ExecuteMsg::Release { + denom: "sun".to_string(), + }, + ) + .unwrap(); + assert_eq!(execute_res.messages.len(), 1); + let msg = execute_res.messages.first().expect("no message"); + assert_eq!( + msg, + &SubMsg::new(BankMsg::Send { + to_address: beneficiary.to_string(), + amount: coins(70, "sun"), + }), + ); + + // beneficiary can release it again + let execute_info = message_info(&verifier, &[]); + let execute_res = execute( + deps.as_mut(), + mock_env(), + execute_info, + ExecuteMsg::Release { + denom: "earth".to_string(), + }, + ) + .unwrap(); + assert_eq!(execute_res.messages.len(), 1); + let msg = execute_res.messages.first().expect("no message"); + assert_eq!( + msg, + &SubMsg::new(BankMsg::Send { + to_address: beneficiary.to_string(), + amount: coins(1000, "earth"), + }), + ); + } + #[test] fn execute_release_fails_for_wrong_sender() { let mut deps = mock_dependencies(); @@ -532,7 +578,9 @@ mod tests { deps.as_mut(), mock_env(), execute_info, - ExecuteMsg::Release {}, + ExecuteMsg::Release { + denom: "earth".to_string(), + }, ); assert_eq!(execute_res.unwrap_err(), HackError::Unauthorized {}); diff --git a/contracts/hackatom/src/msg.rs b/contracts/hackatom/src/msg.rs index 16c454aadb..dfb2405148 100644 --- a/contracts/hackatom/src/msg.rs +++ b/contracts/hackatom/src/msg.rs @@ -35,8 +35,9 @@ pub enum SudoMsg { // https://github.com/cosmwasm/wasmd/issues/8#issuecomment-576146751 #[cw_serde] pub enum ExecuteMsg { - /// Releasing all funds in the contract to the beneficiary. This is the only "proper" action of this demo contract. - Release {}, + /// Releasing all funds of the given denom in the contract to the beneficiary. + /// This is the only "proper" action of this demo contract. + Release { denom: String }, /// Infinite loop to burn cpu cycles (only run when metering is enabled) CpuLoop {}, /// Infinite loop making storage calls (to test when their limit hits) @@ -61,9 +62,6 @@ pub enum QueryMsg { /// use to ensure query path works in integration tests #[returns(VerifierResponse)] Verifier {}, - /// This returns cosmwasm_std::AllBalanceResponse to demo use of the querier - #[returns(cosmwasm_std::AllBalanceResponse)] - OtherBalance { address: String }, /// Recurse will execute a query into itself up to depth-times and return /// Each step of the recursion may perform some extra work to test gas metering /// (`work` rounds of sha256 on contract). diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index a1298c9e1e..0b2f7efc1d 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -18,14 +18,14 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - assert_approx_eq, coins, from_json, to_json_vec, Addr, AllBalanceResponse, BankMsg, Binary, - ContractResult, Empty, MigrateInfo, Response, SubMsg, + assert_approx_eq, coins, to_json_vec, Addr, BankMsg, Binary, ContractResult, Empty, + MigrateInfo, Response, SubMsg, }; use cosmwasm_vm::{ call_execute, from_slice, testing::{ - execute, instantiate, migrate_with_info, mock_env, mock_info, mock_instance, - mock_instance_with_balances, query, sudo, test_io, MockApi, MOCK_CONTRACT_ADDR, + execute, instantiate, migrate_with_info, mock_env, mock_info, mock_instance, query, sudo, + test_io, MockApi, MOCK_CONTRACT_ADDR, }, Storage, VmError, }; @@ -110,7 +110,7 @@ fn instantiate_and_query() { ); // bad query returns parse error (pass wrong type - this connection is not enforced) - let qres = query(&mut deps, mock_env(), ExecuteMsg::Release {}); + let qres = query(&mut deps, mock_env(), ExecuteMsg::Panic {}); let msg = qres.unwrap_err(); assert!(msg.contains("Error parsing")); } @@ -185,34 +185,13 @@ fn sudo_can_steal_tokens() { assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); } -#[test] -fn querier_callbacks_work() { - let rich_addr = String::from("cosmwasm1qqvk2mde"); - let rich_balance = coins(10000, "gold"); - let mut deps = mock_instance_with_balances(WASM, &[(&rich_addr, &rich_balance)]); - - // querying with balance gets the balance - let query_msg = QueryMsg::OtherBalance { address: rich_addr }; - let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_json(query_response).unwrap(); - assert_eq!(bal.amount, rich_balance); - - // querying other accounts gets none - let query_msg = QueryMsg::OtherBalance { - address: String::from("someone else"), - }; - let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_json(query_response).unwrap(); - assert_eq!(bal.amount, vec![]); -} - #[test] fn fails_on_bad_init() { let mut deps = mock_instance(WASM, &[]); let info = mock_info("creator", &coins(1000, "earth")); // bad init returns parse error (pass wrong type - this connection is not enforced) let res: ContractResult = - instantiate(&mut deps, mock_env(), info, ExecuteMsg::Release {}); + instantiate(&mut deps, mock_env(), info, ExecuteMsg::Panic {}); let msg = res.unwrap_err(); assert!(msg.contains("Error parsing")); } @@ -245,8 +224,15 @@ fn execute_release_works() { // beneficiary can release it let execute_info = mock_info(&verifier, &[]); - let execute_res: Response = - execute(&mut deps, mock_env(), execute_info, ExecuteMsg::Release {}).unwrap(); + let execute_res: Response = execute( + &mut deps, + mock_env(), + execute_info, + ExecuteMsg::Release { + denom: "earth".to_string(), + }, + ) + .unwrap(); assert_eq!(execute_res.messages.len(), 1); let msg = execute_res.messages.first().expect("no message"); assert_eq!( @@ -291,8 +277,14 @@ fn execute_release_fails_for_wrong_sender() { // beneficiary cannot release it let execute_info = mock_info(&beneficiary, &[]); - let execute_res: ContractResult = - execute(&mut deps, mock_env(), execute_info, ExecuteMsg::Release {}); + let execute_res: ContractResult = execute( + &mut deps, + mock_env(), + execute_info, + ExecuteMsg::Release { + denom: "earth".to_string(), + }, + ); let msg = execute_res.unwrap_err(); assert!(msg.contains("Unauthorized")); diff --git a/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balances.json b/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balance.json similarity index 88% rename from contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balances.json rename to contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balance.json index 4f6447522d..782e634a72 100644 --- a/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balances.json +++ b/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balance.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AcknowledgementMsgBalances", + "title": "AcknowledgementMsgBalance", "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", "oneOf": [ { @@ -10,7 +10,7 @@ ], "properties": { "ok": { - "$ref": "#/definitions/BalancesResponse" + "$ref": "#/definitions/BalanceResponse" } }, "additionalProperties": false @@ -29,22 +29,19 @@ } ], "definitions": { - "BalancesResponse": { + "BalanceResponse": { "description": "This is the success response we send on ack for PacketMsg::Balance. Just acknowledge success or error", "type": "object", "required": [ "account", - "balances" + "balance" ], "properties": { "account": { "type": "string" }, - "balances": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } + "balance": { + "$ref": "#/definitions/Coin" } }, "additionalProperties": false diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index eec0371bd4..d6b4eb8551 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -42,11 +42,19 @@ { "type": "object", "required": [ - "balances" + "balance" ], "properties": { - "balances": { + "balance": { "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, "additionalProperties": false } }, diff --git a/contracts/ibc-reflect/src/bin/schema.rs b/contracts/ibc-reflect/src/bin/schema.rs index 995d5873c7..2ce53014cb 100644 --- a/contracts/ibc-reflect/src/bin/schema.rs +++ b/contracts/ibc-reflect/src/bin/schema.rs @@ -4,7 +4,7 @@ use cosmwasm_schema::{export_schema, export_schema_with_title, schema_for, write use cosmwasm_std::Empty; use ibc_reflect::msg::{ - AcknowledgementMsg, BalancesResponse, DispatchResponse, ExecuteMsg, InstantiateMsg, PacketMsg, + AcknowledgementMsg, BalanceResponse, DispatchResponse, ExecuteMsg, InstantiateMsg, PacketMsg, QueryMsg, WhoAmIResponse, }; @@ -23,9 +23,9 @@ fn main() { out_dir.push("ibc"); export_schema(&schema_for!(PacketMsg), &out_dir); export_schema_with_title( - &schema_for!(AcknowledgementMsg), + &schema_for!(AcknowledgementMsg), &out_dir, - "AcknowledgementMsgBalances", + "AcknowledgementMsgBalance", ); export_schema_with_title( &schema_for!(AcknowledgementMsg), diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index db25bff7fb..1e0e8d1567 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,14 +1,14 @@ use cosmwasm_std::{ - entry_point, from_json, to_json_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, - DepsMut, Empty, Env, Event, Ibc3ChannelOpenResponse, IbcAcknowledgement, IbcBasicResponse, - IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcMsg, - IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, - MessageInfo, Never, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, - SubMsgResponse, SubMsgResult, WasmMsg, + entry_point, from_json, to_json_binary, wasm_execute, Binary, CosmosMsg, Deps, DepsMut, Empty, + Env, Event, Ibc3ChannelOpenResponse, IbcAcknowledgement, IbcBasicResponse, IbcChannelCloseMsg, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcMsg, IbcOrder, + IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, + Never, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SubMsgResponse, + SubMsgResult, WasmMsg, }; use crate::msg::{ - AccountInfo, AccountResponse, AcknowledgementMsg, BalancesResponse, DispatchResponse, + AccountInfo, AccountResponse, AcknowledgementMsg, BalanceResponse, DispatchResponse, ExecuteMsg, InstantiateMsg, ListAccountsResponse, PacketMsg, QueryMsg, ReflectExecuteMsg, ReturnMsgsResponse, WhoAmIResponse, }; @@ -206,42 +206,20 @@ pub fn ibc_channel_connect( } #[entry_point] -/// On closed channel, we take all tokens from reflect contract to this contract. -/// We also delete the channel entry from accounts. +/// On closed channel, we delete the channel entry from accounts. pub fn ibc_channel_close( deps: DepsMut, - env: Env, + _env: Env, msg: IbcChannelCloseMsg, ) -> StdResult { let channel = msg.channel(); // get contract address and remove lookup let channel_id = channel.endpoint.channel_id.as_str(); - let reflect_addr = load_account(deps.storage, channel_id)?; remove_account(deps.storage, channel_id); - // transfer current balance if any (steal the money) - #[allow(deprecated)] - let amount = deps.querier.query_all_balances(&reflect_addr)?; - let messages: Vec> = if !amount.is_empty() { - let bank_msg = BankMsg::Send { - to_address: env.contract.address.into(), - amount, - }; - let reflect_msg = ReflectExecuteMsg::ReflectMsg { - msgs: vec![bank_msg.into()], - }; - let wasm_msg = wasm_execute(reflect_addr, &reflect_msg, vec![])?; - vec![SubMsg::new(wasm_msg)] - } else { - vec![] - }; - let steal_funds = !messages.is_empty(); - Ok(IbcBasicResponse::new() - .add_submessages(messages) .add_attribute("action", "ibc_close") - .add_attribute("channel_id", channel_id) - .add_attribute("steal_funds", steal_funds.to_string())) + .add_attribute("channel_id", channel_id)) } /// this is a no-op just to test how this integrates with wasmd @@ -274,7 +252,7 @@ pub fn ibc_packet_receive( match msg { PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), - PacketMsg::Balances {} => receive_balances(deps, caller), + PacketMsg::Balance { denom } => receive_balance(deps, caller, denom), PacketMsg::Panic {} => execute_panic(), PacketMsg::ReturnErr { text } => execute_error(text), PacketMsg::ReturnMsgs { msgs } => execute_return_msgs(msgs), @@ -301,18 +279,17 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult { +// processes PacketMsg::Balance variant +fn receive_balance(deps: DepsMut, caller: String, denom: String) -> StdResult { let account = load_account(deps.storage, &caller)?; - #[allow(deprecated)] - let balances = deps.querier.query_all_balances(&account)?; - let response = BalancesResponse { + let balance = deps.querier.query_balance(&account, denom)?; + let response = BalanceResponse { account: account.into(), - balances, + balance, }; let acknowledgement = to_json_binary(&AcknowledgementMsg::Ok(response))?; // and we are golden - Ok(IbcReceiveResponse::new(acknowledgement).add_attribute("action", "receive_balances")) + Ok(IbcReceiveResponse::new(acknowledgement).add_attribute("action", "receive_balance")) } // processes PacketMsg::Dispatch variant @@ -381,7 +358,6 @@ mod tests { message_info, mock_dependencies, mock_env, mock_ibc_channel_close_init, mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_wasmd_attr, MockApi, MockQuerier, MockStorage, - MOCK_CONTRACT_ADDR, }; use cosmwasm_std::{attr, coin, coins, from_json, BankMsg, OwnedDeps, WasmMsg}; @@ -638,7 +614,7 @@ mod tests { // acknowledgement is an error let ack: AcknowledgementMsg = from_json(res.acknowledgement.unwrap()).unwrap(); - assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`, `no_ack` at line 1 column 18"); + assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balance`, `panic`, `return_err`, `return_msgs`, `no_ack` at line 1 column 18"); } #[test] @@ -658,38 +634,11 @@ mod tests { let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); let res: ListAccountsResponse = from_json(raw).unwrap(); assert_eq!(1, res.accounts.len()); - #[allow(deprecated)] - let balance = deps.as_ref().querier.query_all_balances(&account).unwrap(); - assert_eq!(funds, balance); // close the channel let channel = mock_ibc_channel_close_init(channel_id, IbcOrder::Ordered, IBC_APP_VERSION); let res = ibc_channel_close(deps.as_mut(), mock_env(), channel).unwrap(); - - // it pulls out all money from the reflect contract - assert_eq!(1, res.messages.len()); - if let CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr, msg, .. - }) = &res.messages[0].msg - { - assert_eq!(contract_addr, account.as_str()); - let reflect: ReflectExecuteMsg = from_json(msg).unwrap(); - match reflect { - ReflectExecuteMsg::ReflectMsg { msgs } => { - assert_eq!(1, msgs.len()); - assert_eq!( - &msgs[0], - &BankMsg::Send { - to_address: MOCK_CONTRACT_ADDR.into(), - amount: funds - } - .into() - ) - } - } - } else { - panic!("Unexpected message: {:?}", &res.messages[0]); - } + assert_eq!(res.messages.len(), 0); // and removes the account lookup let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index 65277e1fc8..6299b6f959 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -57,7 +57,7 @@ pub enum ReflectExecuteMsg { pub enum PacketMsg { Dispatch { msgs: Vec }, WhoAmI {}, - Balances {}, + Balance { denom: String }, Panic {}, ReturnErr { text: String }, ReturnMsgs { msgs: Vec }, @@ -108,9 +108,9 @@ pub struct WhoAmIResponse { /// This is the success response we send on ack for PacketMsg::Balance. /// Just acknowledge success or error #[cw_serde] -pub struct BalancesResponse { +pub struct BalanceResponse { pub account: String, - pub balances: Vec, + pub balance: Coin, } /// This is the success response we send on ack for PacketMsg::ReturnMsgs. diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 3c845acce9..0815e67f1e 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -298,5 +298,5 @@ fn handle_dispatch_packet() { // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap(); - assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`, `no_ack` at line 1 column 18"); + assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balance`, `panic`, `return_err`, `return_msgs`, `no_ack` at line 1 column 18"); } diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index 2419726e55..05ee4f404b 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -161,29 +161,6 @@ }, "additionalProperties": false }, - { - "description": "This calls into the native bank module for all denominations. Note that this may be much more expensive than Balance and should be avoided if possible. Return value is AllBalanceResponse.", - "deprecated": true, - "type": "object", - "required": [ - "all_balances" - ], - "properties": { - "all_balances": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, { "description": "This calls into the native bank module for querying metadata for a specific bank token. Return value is DenomMetadataResponse", "type": "object", diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 9a4c0e5364..848787249c 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1421,29 +1421,6 @@ }, "additionalProperties": false }, - { - "description": "This calls into the native bank module for all denominations. Note that this may be much more expensive than Balance and should be avoided if possible. Return value is AllBalanceResponse.", - "deprecated": true, - "type": "object", - "required": [ - "all_balances" - ], - "properties": { - "all_balances": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, { "description": "This calls into the native bank module for querying metadata for a specific bank token. Return value is DenomMetadataResponse", "type": "object", diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 7f8bd5400f..b53daa996c 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -176,7 +176,7 @@ mod tests { use crate::testing::mock_dependencies_with_custom_querier; use cosmwasm_std::testing::{message_info, mock_env, MOCK_CONTRACT_ADDR}; use cosmwasm_std::{ - coin, coins, from_json, AllBalanceResponse, BankMsg, BankQuery, Binary, Event, StakingMsg, + coin, coins, from_json, BalanceResponse, BankMsg, BankQuery, Binary, Event, StakingMsg, StdError, SubMsgResponse, SubMsgResult, }; @@ -385,17 +385,17 @@ mod tests { let deps = mock_dependencies_with_custom_querier(&coins(123, "ucosm")); // with bank query - #[allow(deprecated)] let msg = QueryMsg::Chain { - request: BankQuery::AllBalances { + request: BankQuery::Balance { address: MOCK_CONTRACT_ADDR.to_string(), + denom: "ucosm".to_string(), } .into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); let outer: ChainResponse = from_json(response).unwrap(); - let inner: AllBalanceResponse = from_json(outer.data).unwrap(); - assert_eq!(inner.amount, coins(123, "ucosm")); + let inner: BalanceResponse = from_json(outer.data).unwrap(); + assert_eq!(inner.amount, coin(123, "ucosm")); // with custom query let msg = QueryMsg::Chain { diff --git a/packages/check/tests/cosmwasm_check_tests.rs b/packages/check/tests/cosmwasm_check_tests.rs index e3f00cb645..9dc3f085de 100644 --- a/packages/check/tests/cosmwasm_check_tests.rs +++ b/packages/check/tests/cosmwasm_check_tests.rs @@ -86,7 +86,7 @@ fn custom_capabilities_check() -> Result<(), Box> { let mut cmd = Command::cargo_bin("cosmwasm-check")?; cmd.arg("--available-capabilities") - .arg("iterator,osmosis,friendship") + .arg("iterator,osmosis,friendship,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4,cosmwasm_2_0,cosmwasm_2_1,cosmwasm_2_2") .arg("../vm/testdata/hackatom.wasm"); cmd.assert() .success() diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index dc5b6e54fe..1174884428 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -339,7 +339,6 @@ mod tests { // bank compare_codes!(cosmwasm_std::SupplyResponse); compare_codes!(cosmwasm_std::BalanceResponse); - // compare_codes!(cosmwasm_std::AllBalanceResponse); // has different name in wasmvm compare_codes!(cosmwasm_std::DenomMetadataResponse); // compare_codes!(cosmwasm_std::AllDenomMetadataResponse); // uses `[]byte` instead of `*[]byte` // staking diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 83794c1c8d..ca4df2a896 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -90,14 +90,14 @@ pub use crate::msgpack::{from_msgpack, to_msgpack_binary, to_msgpack_vec}; pub use crate::never::Never; pub use crate::pagination::PageRequest; pub use crate::query::{ - AllBalanceResponse, AllDelegationsResponse, AllDenomMetadataResponse, AllValidatorsResponse, - BalanceResponse, BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, - ContractInfoResponse, CustomQuery, DecCoin, Delegation, DelegationResponse, - DelegationRewardsResponse, DelegationTotalRewardsResponse, DelegatorReward, - DelegatorValidatorsResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, - DistributionQuery, FeeEnabledChannelResponse, FullDelegation, GrpcQuery, IbcQuery, - ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, Validator, - ValidatorResponse, WasmQuery, + AllDelegationsResponse, AllDenomMetadataResponse, AllValidatorsResponse, BalanceResponse, + BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, ContractInfoResponse, + CustomQuery, DecCoin, Delegation, DelegationResponse, DelegationRewardsResponse, + DelegationTotalRewardsResponse, DelegatorReward, DelegatorValidatorsResponse, + DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, + FeeEnabledChannelResponse, FullDelegation, GrpcQuery, IbcQuery, ListChannelsResponse, + PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, + WasmQuery, }; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use crate::results::WeightedVoteOption; diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 7bd4f62e97..63e6eea4a9 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -22,11 +22,6 @@ pub enum BankQuery { /// This calls into the native bank module for one denomination /// Return value is BalanceResponse Balance { address: String, denom: String }, - /// This calls into the native bank module for all denominations. - /// Note that this may be much more expensive than Balance and should be avoided if possible. - /// Return value is AllBalanceResponse. - #[deprecated = "Returns a potentially unbound number of results. If you think you have a valid usecase, please open an issue."] - AllBalances { address: String }, /// This calls into the native bank module for querying metadata for a specific bank token. /// Return value is DenomMetadataResponse #[cfg(feature = "cosmwasm_1_3")] @@ -63,18 +58,6 @@ impl_response_constructor!(BalanceResponse, amount: Coin); impl QueryResponseType for BalanceResponse {} -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -#[non_exhaustive] -pub struct AllBalanceResponse { - /// Returns all non-zero coins held by this account. - pub amount: Vec, -} - -impl_response_constructor!(AllBalanceResponse, amount: Vec); - -impl QueryResponseType for AllBalanceResponse {} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] @@ -110,11 +93,11 @@ mod tests { #[test] fn private_constructor_works() { - let response = AllBalanceResponse::new(vec![Coin::new(1234u128, "uatom")]); + let response = BalanceResponse::new(Coin::new(1234u128, "uatom")); assert_eq!( response, - AllBalanceResponse { - amount: vec![Coin::new(1234u128, "uatom")] + BalanceResponse { + amount: Coin::new(1234u128, "uatom") } ); } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index e9500956be..e802af4be0 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -27,14 +27,12 @@ use crate::ibc::{ use crate::ibc2::{Ibc2PacketReceiveMsg, Ibc2Payload}; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; -use crate::query::{ - AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, -}; #[cfg(feature = "staking")] use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +use crate::query::{BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery}; #[cfg(feature = "cosmwasm_1_3")] use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; @@ -831,14 +829,6 @@ impl BankQuerier { }; to_json_binary(&bank_res).into() } - #[allow(deprecated)] - BankQuery::AllBalances { address } => { - // proper error on not found, serialize result on found - let bank_res = AllBalanceResponse { - amount: self.balances.get(address).cloned().unwrap_or_default(), - }; - to_json_binary(&bank_res).into() - } #[cfg(feature = "cosmwasm_1_3")] BankQuery::DenomMetadata { denom } => { let denom_metadata = self.denom_metadata.get(denom.as_bytes()); @@ -1861,21 +1851,6 @@ mod tests { assert_eq!(res.amount, coin(0, "ATOM")); } - #[test] - #[allow(deprecated)] - fn bank_querier_all_balances() { - let addr = String::from("foobar"); - let balance = vec![coin(123, "ELF"), coin(777, "FLY")]; - let bank = BankQuerier::new(&[(&addr, &balance)]); - - let all = bank - .query(&BankQuery::AllBalances { address: addr }) - .unwrap() - .unwrap(); - let res: AllBalanceResponse = from_json(all).unwrap(); - assert_eq!(&res.amount, &balance); - } - #[test] fn bank_querier_one_balance() { let addr = String::from("foobar"); @@ -1912,16 +1887,6 @@ mod tests { let balance = vec![coin(123, "ELF"), coin(777, "FLY")]; let bank = BankQuerier::new(&[(&addr, &balance)]); - // all balances on empty account is empty vec - let all = bank - .query(&BankQuery::AllBalances { - address: String::from("elsewhere"), - }) - .unwrap() - .unwrap(); - let res: AllBalanceResponse = from_json(all).unwrap(); - assert_eq!(res.amount, vec![]); - // any denom on balances on empty account is empty coin let miss = bank .query(&BankQuery::Balance { diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index aaadaaba81..09b5906215 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -11,9 +11,6 @@ use crate::prelude::*; use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; -use crate::query::{ - AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, -}; #[cfg(feature = "staking")] use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, @@ -24,6 +21,7 @@ use crate::query::{ AllDenomMetadataResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, }; +use crate::query::{BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::ContractInfoResponse; use crate::{from_json, to_json_binary, to_json_vec, Binary}; @@ -434,17 +432,6 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { Ok(res.amount) } - #[deprecated] - pub fn query_all_balances(&self, address: impl Into) -> StdResult> { - #[allow(deprecated)] - let request = BankQuery::AllBalances { - address: address.into(), - } - .into(); - let res: AllBalanceResponse = self.query(&request)?; - Ok(res.amount) - } - #[cfg(feature = "cosmwasm_1_3")] pub fn query_delegator_withdraw_address( &self, @@ -721,10 +708,6 @@ mod tests { let balance = wrapper.query_balance("foo", "ELF").unwrap(); assert_eq!(balance, coin(123, "ELF")); - - #[allow(deprecated)] - let all_balances = wrapper.query_all_balances("foo").unwrap(); - assert_eq!(all_balances, vec![coin(123, "ELF"), coin(777, "FLY")]); } #[test] diff --git a/packages/vm/README.md b/packages/vm/README.md index d45f78d56e..a825c7df8d 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -51,31 +51,31 @@ To rebuild the test contracts, go to the repo root and do docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_cyberpunk",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0 ./contracts/cyberpunk \ + cosmwasm/optimizer:0.16.1 ./contracts/cyberpunk \ && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0 ./contracts/hackatom \ + cosmwasm/optimizer:0.16.1 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect \ - && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.2.wasm + cosmwasm/optimizer:0.16.1 ./contracts/ibc-reflect \ + && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_empty",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0 ./contracts/empty \ + cosmwasm/optimizer:0.16.1 ./contracts/empty \ && cp artifacts/empty.wasm packages/vm/testdata/empty.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_callback",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0 ./contracts/ibc-callbacks \ + cosmwasm/optimizer:0.16.1 ./contracts/ibc-callbacks \ && cp artifacts/ibc_callbacks.wasm packages/vm/testdata/ibc_callbacks.wasm ``` diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index b6232c130e..682d7487b7 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -101,7 +101,7 @@ fn bench_instance(c: &mut Criterion) { b.iter(|| { let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let contract_result = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); assert!(contract_result.into_result().is_ok()); diff --git a/packages/vm/examples/heap_profiling.rs b/packages/vm/examples/heap_profiling.rs index bebdb2c156..037b6794fd 100644 --- a/packages/vm/examples/heap_profiling.rs +++ b/packages/vm/examples/heap_profiling.rs @@ -77,7 +77,7 @@ fn contracts() -> Vec { .into_bytes(), ), execute_msgs: vec![Execute { - msg: br#"{"release":{}}"#, + msg: br#"{"release":{"denom":"earth"}}"#, expect_error: false, }], }, @@ -88,7 +88,7 @@ fn contracts() -> Vec { .into_bytes(), ), execute_msgs: vec![Execute { - msg: br#"{"release":{}}"#, + msg: br#"{"release":{"denom":"earth"}}"#, expect_error: false, }], }, diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 3c79ec5bc3..295627e0b1 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -27,7 +27,7 @@ const THREADS: usize = STORE_CODE_THREADS + INSTANTIATION_THREADS; pub fn main() { let options = CacheOptions::new( TempDir::new().unwrap().into_path(), - capabilities_from_csv("iterator,staking"), + capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4,cosmwasm_2_0,cosmwasm_2_1,cosmwasm_2_2"), MEMORY_CACHE_SIZE, DEFAULT_MEMORY_LIMIT, ); @@ -69,7 +69,7 @@ pub fn main() { assert!(contract_result.into_result().is_ok()); let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let contract_result = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); assert!(contract_result.into_result().is_ok()); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 995de9981b..429c5ccf51 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -611,7 +611,6 @@ fn remove_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResu mod tests { use super::*; use crate::calls::{call_execute, call_instantiate}; - use crate::capabilities::capabilities_from_csv; use crate::testing::{mock_backend, mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{coins, Empty}; use std::borrow::Cow; @@ -640,7 +639,19 @@ mod tests { "#; fn default_capabilities() -> HashSet { - capabilities_from_csv("iterator,staking") + HashSet::from([ + "cosmwasm_1_1".to_string(), + "cosmwasm_1_2".to_string(), + "cosmwasm_1_3".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_2_0".to_string(), + "cosmwasm_2_1".to_string(), + "cosmwasm_2_2".to_string(), + "iterator".to_string(), + "staking".to_string(), + "stargate".to_string(), + ]) } fn make_testing_options() -> CacheOptions { @@ -693,7 +704,7 @@ mod tests { // execute let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let response = call_execute::<_, _, _, Empty>(instance, &mock_env(), &info, msg) .unwrap() .unwrap(); @@ -1137,7 +1148,7 @@ mod tests { // execute let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() .unwrap(); @@ -1171,7 +1182,7 @@ mod tests { // execute let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() .unwrap(); @@ -1207,7 +1218,7 @@ mod tests { // execute let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() .unwrap(); @@ -1280,7 +1291,7 @@ mod tests { .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); let info = mock_info(&bob, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(1, msgs.len()); @@ -1290,7 +1301,7 @@ mod tests { .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); let info = mock_info(&sue, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(1, msgs.len()); @@ -1468,15 +1479,24 @@ mod tests { E::Execute, E::Query ]), - required_capabilities: BTreeSet::new(), - contract_migrate_version: Some(42), + required_capabilities: BTreeSet::from([ + "cosmwasm_1_1".to_string(), + "cosmwasm_1_2".to_string(), + "cosmwasm_1_3".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_2_0".to_string(), + "cosmwasm_2_1".to_string(), + "cosmwasm_2_2".to_string(), + ]), + contract_migrate_version: Some(420), } ); let checksum2 = cache.store_code(IBC_REFLECT, true, true).unwrap(); let report2 = cache.analyze(&checksum2).unwrap(); let mut ibc_contract_entrypoints = - BTreeSet::from([E::Instantiate, E::Migrate, E::Reply, E::Query]); + BTreeSet::from([E::Instantiate, E::Migrate, E::Execute, E::Reply, E::Query]); ibc_contract_entrypoints.extend(REQUIRED_IBC_EXPORTS); assert_eq!( report2, @@ -1485,6 +1505,14 @@ mod tests { has_ibc2_entry_points: false, entrypoints: ibc_contract_entrypoints, required_capabilities: BTreeSet::from_iter([ + "cosmwasm_1_1".to_string(), + "cosmwasm_1_2".to_string(), + "cosmwasm_1_3".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_2_0".to_string(), + "cosmwasm_2_1".to_string(), + "cosmwasm_2_2".to_string(), "iterator".to_string(), "stargate".to_string() ]), diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index e546e77097..ea5a874b77 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -847,7 +847,7 @@ mod tests { // execute let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() .unwrap(); diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 707c45848c..f459ada497 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -331,7 +331,6 @@ fn check_wasm_functions(module: &ParsedWasm, limits: &WasmLimits, logs: Logger) #[cfg(test)] mod tests { use super::*; - use crate::capabilities_from_csv; static CONTRACT_0_7: &[u8] = include_bytes!("../testdata/hackatom_0.7.wasm"); static CONTRACT_0_12: &[u8] = include_bytes!("../testdata/hackatom_0.12.wasm"); @@ -342,7 +341,19 @@ mod tests { static CYBERPUNK_RUST_170: &[u8] = include_bytes!("../testdata/cyberpunk_rust170.wasm"); fn default_capabilities() -> HashSet { - capabilities_from_csv("cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,iterator,staking,stargate") + HashSet::from([ + "cosmwasm_1_1".to_string(), + "cosmwasm_1_2".to_string(), + "cosmwasm_1_3".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_1_4".to_string(), + "cosmwasm_2_0".to_string(), + "cosmwasm_2_1".to_string(), + "cosmwasm_2_2".to_string(), + "iterator".to_string(), + "staking".to_string(), + "stargate".to_string(), + ]) } #[test] diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 601b176352..ca088d3c02 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -556,7 +556,7 @@ mod tests { use crate::testing::{MockApi, MockQuerier, MockStorage}; use crate::wasm_backend::{compile, make_compiling_engine}; use cosmwasm_std::{ - coins, from_json, to_json_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, + coin, coins, from_json, to_json_vec, BalanceResponse, BankQuery, Empty, QueryRequest, }; use wasmer::{imports, Function, Instance as WasmerInstance, Store}; @@ -601,6 +601,11 @@ mod tests { "addr_validate" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "addr_canonicalize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), "addr_humanize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "bls12_381_aggregate_g1" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "bls12_381_aggregate_g2" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "bls12_381_pairing_equality" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32, _d: u32| -> u32 { 0 }), + "bls12_381_hash_to_g1" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32, _d: u32| -> u32 { 0 }), + "bls12_381_hash_to_g2" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32, _d: u32| -> u32 { 0 }), "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), "secp256r1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), @@ -994,8 +999,9 @@ mod tests { let res = env .with_querier_from_context::<_, _>(|querier| { - let req: QueryRequest = QueryRequest::Bank(BankQuery::AllBalances { + let req: QueryRequest = QueryRequest::Bank(BankQuery::Balance { address: INIT_ADDR.to_string(), + denom: INIT_DENOM.to_string(), }); let (result, _gas_info) = querier.query_raw(&to_json_vec(&req).unwrap(), DEFAULT_QUERY_GAS_LIMIT); @@ -1004,9 +1010,9 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let balance: AllBalanceResponse = from_json(res).unwrap(); + let balance: BalanceResponse = from_json(res).unwrap(); - assert_eq!(balance.amount, coins(INIT_AMOUNT, INIT_DENOM)); + assert_eq!(balance.amount, coin(INIT_AMOUNT, INIT_DENOM)); } #[test] diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 34eaa56a0a..6805759cbb 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1015,8 +1015,8 @@ fn to_low_half(data: u32) -> u64 { mod tests { use super::*; use cosmwasm_std::{ - coins, from_json, AllBalanceResponse, BankQuery, Binary, Empty, QueryRequest, SystemError, - SystemResult, WasmQuery, + coin, coins, from_json, BalanceResponse, BankQuery, Binary, Empty, QueryRequest, + SystemError, SystemResult, WasmQuery, }; use hex_literal::hex; use std::ptr::NonNull; @@ -1086,6 +1086,11 @@ mod tests { "addr_validate" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "addr_canonicalize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), "addr_humanize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "bls12_381_aggregate_g1" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "bls12_381_aggregate_g2" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "bls12_381_pairing_equality" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32, _d: u32| -> u32 { 0 }), + "bls12_381_hash_to_g1" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32, _d: u32| -> u32 { 0 }), + "bls12_381_hash_to_g2" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32, _d: u32| -> u32 { 0 }), "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), "secp256r1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), @@ -2608,8 +2613,9 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let request: QueryRequest = QueryRequest::Bank(BankQuery::AllBalances { + let request: QueryRequest = QueryRequest::Bank(BankQuery::Balance { address: INIT_ADDR.to_string(), + denom: INIT_DENOM.to_string(), }); let request_data = cosmwasm_std::to_json_vec(&request).unwrap(); let request_ptr = write_data(&mut fe_mut, &request_data); @@ -2622,8 +2628,8 @@ mod tests { let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(response).unwrap(); let query_result_inner = query_result.unwrap(); let query_result_inner_inner = query_result_inner.unwrap(); - let parsed_again: AllBalanceResponse = from_json(query_result_inner_inner).unwrap(); - assert_eq!(parsed_again.amount, coins(INIT_AMOUNT, INIT_DENOM)); + let parsed_again: BalanceResponse = from_json(query_result_inner_inner).unwrap(); + assert_eq!(parsed_again.amount, coin(INIT_AMOUNT, INIT_DENOM)); } #[test] diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b05e1e8efd..732f29a6c7 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -541,15 +541,14 @@ mod tests { mock_instance_with_balances, mock_instance_with_failing_api, mock_instance_with_gas_limit, mock_instance_with_options, MockInstanceOptions, }; - use cosmwasm_std::{ - coin, coins, from_json, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, - }; + use cosmwasm_std::{coin, coins, from_json, BalanceResponse, BankQuery, Empty, QueryRequest}; use wasmer::FunctionEnvMut; const KIB: usize = 1024; const MIB: usize = 1024 * 1024; const DEFAULT_QUERY_GAS_LIMIT: u64 = 300_000; static HACKATOM: &[u8] = include_bytes!("../testdata/hackatom.wasm"); + static HACKATOM_1_3: &[u8] = include_bytes!("../testdata/hackatom_1.3.wasm"); static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); #[test] @@ -602,8 +601,14 @@ mod tests { let backend = mock_backend(&[]); let (instance_options, memory_limit) = mock_instance_options(); let instance = - Instance::from_code(HACKATOM, backend, instance_options, memory_limit).unwrap(); + Instance::from_code(HACKATOM_1_3, backend, instance_options, memory_limit).unwrap(); assert_eq!(instance.required_capabilities().len(), 0); + + let backend = mock_backend(&[]); + let (instance_options, memory_limit) = mock_instance_options(); + let instance = + Instance::from_code(HACKATOM, backend, instance_options, memory_limit).unwrap(); + assert_eq!(instance.required_capabilities().len(), 7); } #[test] @@ -914,7 +919,7 @@ mod tests { let report2 = instance.create_gas_report(); assert_eq!(report2.used_externally, 251); - assert_eq!(report2.used_internally, 24140405); + assert_eq!(report2.used_internally, 17646125); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -1005,31 +1010,6 @@ mod tests { Ok(()) }) .unwrap(); - - // query all - instance - .with_querier(|querier| { - let response = querier - .query::( - &QueryRequest::Bank(BankQuery::AllBalances { - address: rich_addr.clone(), - }), - DEFAULT_QUERY_GAS_LIMIT, - ) - .0 - .unwrap() - .unwrap() - .unwrap(); - let AllBalanceResponse { amount, .. } = from_json(response).unwrap(); - assert_eq!(amount.len(), 2); - assert_eq!(amount[0].amount.u128(), 10000); - assert_eq!(amount[0].denom, "gold"); - assert_eq!(amount[1].amount.u128(), 8000); - assert_eq!(amount[1].denom, "silver"); - - Ok(()) - }) - .unwrap(); } /// This is needed for writing integration tests in which the balance of a contract changes over time. @@ -1106,7 +1086,7 @@ mod tests { .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 24140656); + assert_eq!(init_used, 17646376); } #[test] @@ -1125,13 +1105,13 @@ mod tests { // run contract - just sanity check - results validate in contract unit tests let gas_before_execute = instance.get_gas_left(); let info = mock_info(&verifier, &coins(15, "earth")); - let msg = br#"{"release":{}}"#; + let msg = br#"{"release":{"denom":"earth"}}"#; call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 29167931); + assert_eq!(execute_used, 24409471); } #[test] @@ -1174,6 +1154,6 @@ mod tests { ); let query_used = gas_before_query - instance.get_gas_left(); - assert_eq!(query_used, 17327451); + assert_eq!(query_used, 10789586); } } diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 7dfc78d3f1..93c5204dcc 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -133,7 +133,7 @@ mod tests { .exports .iter() .filter(|entry| matches!(entry.kind, ExternalKind::Func)); - assert_eq!(exported_functions.count(), 8); // 4 required exports plus "execute", "migrate", "query" and "sudo" + assert_eq!(exported_functions.count(), 15); let exported_memories = module .exports diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index a8efcb0d4a..edc892e980 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -113,7 +113,7 @@ impl MockQuerier { #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::{coin, from_json, AllBalanceResponse, BalanceResponse, BankQuery}; + use cosmwasm_std::{coin, from_json, BalanceResponse, BankQuery}; const DEFAULT_QUERY_GAS_LIMIT: u64 = 300_000; @@ -132,28 +132,7 @@ mod tests { } #[test] - #[allow(deprecated)] - fn bank_querier_all_balances() { - let addr = String::from("foobar"); - let balance = vec![coin(123, "ELF"), coin(777, "FLY")]; - let querier = MockQuerier::new(&[(&addr, &balance)]); - - // all - let all = querier - .query::( - &BankQuery::AllBalances { address: addr }.into(), - DEFAULT_QUERY_GAS_LIMIT, - ) - .0 - .unwrap() - .unwrap() - .unwrap(); - let res: AllBalanceResponse = from_json(all).unwrap(); - assert_eq!(&res.amount, &balance); - } - - #[test] - fn bank_querier_one_balance() { + fn bank_querier_balance() { let addr = String::from("foobar"); let balance = vec![coin(123, "ELF"), coin(777, "FLY")]; let querier = MockQuerier::new(&[(&addr, &balance)]); @@ -200,22 +179,6 @@ mod tests { let balance = vec![coin(123, "ELF"), coin(777, "FLY")]; let querier = MockQuerier::new(&[(&addr, &balance)]); - // all balances on empty account is empty vec - let all = querier - .query::( - &BankQuery::AllBalances { - address: String::from("elsewhere"), - } - .into(), - DEFAULT_QUERY_GAS_LIMIT, - ) - .0 - .unwrap() - .unwrap() - .unwrap(); - let res: AllBalanceResponse = from_json(all).unwrap(); - assert_eq!(res.amount, vec![]); - // any denom on balances on empty account is empty coin let miss = querier .query::( diff --git a/packages/vm/testdata/hackatom.wasm b/packages/vm/testdata/hackatom.wasm index 580f9cf136..2c7dc55ff6 100644 Binary files a/packages/vm/testdata/hackatom.wasm and b/packages/vm/testdata/hackatom.wasm differ diff --git a/packages/vm/testdata/ibc_reflect.wasm b/packages/vm/testdata/ibc_reflect.wasm deleted file mode 120000 index b2876f3146..0000000000 --- a/packages/vm/testdata/ibc_reflect.wasm +++ /dev/null @@ -1 +0,0 @@ -ibc_reflect_1.2.wasm \ No newline at end of file diff --git a/packages/vm/testdata/ibc_reflect.wasm b/packages/vm/testdata/ibc_reflect.wasm new file mode 100644 index 0000000000..1c388adfaa Binary files /dev/null and b/packages/vm/testdata/ibc_reflect.wasm differ