diff --git a/Cargo.lock b/Cargo.lock index a0c328923..fa5237c46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -153,16 +153,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" -[[package]] -name = "cosmwasm-schema" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2196586ea197eaa21129d09c84a19e2eb80bdce239eec8e6a4f108cb644c295f" -dependencies = [ - "schemars", - "serde_json", -] - [[package]] name = "cosmwasm-schema" version = "0.11.0-alpha3" @@ -173,19 +163,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "cosmwasm-std" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85908a2696117c8f2c1b3ce201d34a1aa9a6b3c1583a65cfb794ec66e1cfde4" -dependencies = [ - "base64", - "schemars", - "serde", - "serde-json-wasm", - "snafu", -] - [[package]] name = "cosmwasm-std" version = "0.11.0-alpha3" @@ -199,23 +176,13 @@ dependencies = [ "snafu", ] -[[package]] -name = "cosmwasm-storage" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e103531a2ce636e86b7639cec25d348c4d360832ab8e0e7f9a6e00f08aac1379" -dependencies = [ - "cosmwasm-std 0.10.1", - "serde", -] - [[package]] name = "cosmwasm-storage" version = "0.11.0-alpha3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e88d0c7adecda4a6f045e8d4d14d88cf3f6cb42a2ec4a09c2ed822c2c1e6a7f" dependencies = [ - "cosmwasm-std 0.11.0-alpha3", + "cosmwasm-std", "serde", ] @@ -225,7 +192,7 @@ version = "0.11.0-alpha3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59bd95500a064925b505810fce5175a5948aea0b4189f9b5700afe71cc3d5529" dependencies = [ - "cosmwasm-std 0.11.0-alpha3", + "cosmwasm-std", "hex 0.4.2", "memmap", "parity-wasm", @@ -367,18 +334,7 @@ dependencies = [ name = "cw0" version = "0.2.2" dependencies = [ - "cosmwasm-std 0.11.0-alpha3", - "schemars", - "serde", -] - -[[package]] -name = "cw0" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd55b1bb0bb419fe065d80d9ac5a4a0512d9fecf08ad9796f8aa29c7dbe63618" -dependencies = [ - "cosmwasm-std 0.10.1", + "cosmwasm-std", "schemars", "serde", ] @@ -387,8 +343,8 @@ dependencies = [ name = "cw1" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", + "cosmwasm-schema", + "cosmwasm-std", "schemars", "serde", ] @@ -397,13 +353,13 @@ dependencies = [ name = "cw1-subkeys" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", - "cw0 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw0", "cw1", "cw1-whitelist", - "cw2 0.2.2", + "cw2", "schemars", "serde", "thiserror", @@ -413,12 +369,12 @@ dependencies = [ name = "cw1-whitelist" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", - "cw0 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw0", "cw1", - "cw2 0.2.2", + "cw2", "schemars", "serde", "thiserror", @@ -428,20 +384,8 @@ dependencies = [ name = "cw2" version = "0.2.2" dependencies = [ - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", - "schemars", - "serde", -] - -[[package]] -name = "cw2" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b7d5d7ea75a5eb53bfa4db60112bef22cdb56a8d612b67aab5c70edd2fbf34e" -dependencies = [ - "cosmwasm-std 0.10.1", - "cosmwasm-storage 0.10.1", + "cosmwasm-std", + "cosmwasm-storage", "schemars", "serde", ] @@ -450,9 +394,9 @@ dependencies = [ name = "cw20" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cw0 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cw0", "schemars", "serde", ] @@ -461,12 +405,12 @@ dependencies = [ name = "cw20-atomic-swap" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", "cosmwasm-vm", - "cw0 0.2.2", - "cw2 0.2.2", + "cw0", + "cw2", "cw20", "hex 0.3.2", "schemars", @@ -479,11 +423,11 @@ dependencies = [ name = "cw20-base" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", - "cw0 0.2.2", - "cw2 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw0", + "cw2", "cw20", "schemars", "serde", @@ -494,11 +438,11 @@ dependencies = [ name = "cw20-escrow" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", - "cw0 0.2.2", - "cw2 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw0", + "cw2", "cw20", "cw20-atomic-swap", "schemars", @@ -510,10 +454,10 @@ dependencies = [ name = "cw20-staking" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cosmwasm-storage 0.11.0-alpha3", - "cw2 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw2", "cw20", "cw20-base", "schemars", @@ -525,21 +469,9 @@ dependencies = [ name = "cw3" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cw0 0.2.2", - "schemars", - "serde", -] - -[[package]] -name = "cw3" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee5d1178ace2f890b1191c860fec599f1ab8d62857e8dd082b09bd3b30476e7f" -dependencies = [ - "cosmwasm-std 0.10.1", - "cw0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cosmwasm-schema", + "cosmwasm-std", + "cw0", "schemars", "serde", ] @@ -548,36 +480,24 @@ dependencies = [ name = "cw3-fixed-multisig" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.10.1", - "cosmwasm-std 0.10.1", - "cosmwasm-storage 0.10.1", - "cw0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cw2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cw3 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "schemars", - "serde", - "snafu", -] - -[[package]] -name = "cw721" -version = "0.2.2" -dependencies = [ - "cosmwasm-schema 0.11.0-alpha3", - "cosmwasm-std 0.11.0-alpha3", - "cw0 0.2.2", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw0", + "cw2", + "cw3", "schemars", "serde", + "thiserror", ] [[package]] name = "cw721" version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca5605828fcd84f063ffb39bc4ac4d7a58b883250f8293b7b159c419993f0bb" dependencies = [ - "cosmwasm-std 0.10.1", - "cw0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cosmwasm-schema", + "cosmwasm-std", + "cw0", "schemars", "serde", ] @@ -586,15 +506,15 @@ dependencies = [ name = "cw721-base" version = "0.2.2" dependencies = [ - "cosmwasm-schema 0.10.1", - "cosmwasm-std 0.10.1", - "cosmwasm-storage 0.10.1", - "cw0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cw2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cw721 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw0", + "cw2", + "cw721", "schemars", "serde", - "snafu", + "thiserror", ] [[package]] @@ -728,9 +648,9 @@ checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" [[package]] name = "hermit-abi" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151" +checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" dependencies = [ "libc", ] @@ -772,9 +692,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa7087f49d294270db4e1928fc110c976cd4b9e5a16348e0a1df09afa99e6c98" +checksum = "2448f6066e80e3bfc792e9c98bf705b4b0fc6e8ef5b43e5889aff0eaa9c58743" [[package]] name = "lock_api" diff --git a/contracts/cw20-escrow/src/contract.rs b/contracts/cw20-escrow/src/contract.rs index bc6b86c76..bcdd8a582 100644 --- a/contracts/cw20-escrow/src/contract.rs +++ b/contracts/cw20-escrow/src/contract.rs @@ -2,7 +2,6 @@ use cosmwasm_std::{ attr, from_binary, to_binary, Api, BankMsg, Binary, CosmosMsg, Env, Extern, HandleResponse, HumanAddr, InitResponse, Querier, StdResult, Storage, WasmMsg, }; -use cosmwasm_storage::prefixed; use cw2::set_contract_version; use cw20::{Cw20Coin, Cw20CoinHuman, Cw20HandleMsg, Cw20ReceiveMsg}; @@ -12,7 +11,7 @@ use crate::error::ContractError; use crate::msg::{ CreateMsg, DetailsResponse, HandleMsg, InitMsg, ListResponse, QueryMsg, ReceiveMsg, }; -use crate::state::{all_escrow_ids, escrows, escrows_read, Escrow, GenericBalance, PREFIX_ESCROW}; +use crate::state::{all_escrow_ids, escrows, escrows_read, Escrow, GenericBalance}; // version info for migration info const CONTRACT_NAME: &str = "crates.io:cw20-escrow"; @@ -157,8 +156,8 @@ pub fn try_approve( } else if escrow.is_expired(&env) { Err(ContractError::Expired {}) } else { - // we delete the escrow (TODO: expose this in Bucket for simpler API) - prefixed(&mut deps.storage, PREFIX_ESCROW).remove(id.as_bytes()); + // we delete the escrow + escrows(&mut deps.storage).remove(id.as_bytes()); let rcpt = deps.api.human_address(&escrow.recipient)?; @@ -188,8 +187,8 @@ pub fn try_refund( { Err(ContractError::Unauthorized {}) } else { - // we delete the escrow (TODO: expose this in Bucket for simpler API) - prefixed(&mut deps.storage, PREFIX_ESCROW).remove(id.as_bytes()); + // we delete the escrow + escrows(&mut deps.storage).remove(id.as_bytes()); let rcpt = deps.api.human_address(&escrow.source)?; diff --git a/contracts/cw20-staking/src/contract.rs b/contracts/cw20-staking/src/contract.rs index 83c44ce54..7672d65c1 100644 --- a/contracts/cw20-staking/src/contract.rs +++ b/contracts/cw20-staking/src/contract.rs @@ -35,7 +35,9 @@ pub fn init( // ensure the validator is registered let vals = deps.querier.query_validators()?; if !vals.iter().any(|v| v.address == msg.validator) { - return Err(ContractError::NotInValidatorSet(msg.validator.to_string())); + return Err(ContractError::NotInValidatorSet { + validator: msg.validator.to_string(), + }); } // store token info using cw20-base format @@ -131,10 +133,10 @@ fn get_bonded(querier: &Q, contract: &HumanAddr) -> Result(querier: &Q, contract: &HumanAddr) -> Result Result<(), ContractError> { if supply.bonded != bonded { - Err(ContractError::BondedMismatch(supply.bonded, bonded)) + Err(ContractError::BondedMismatch { + stored: supply.bonded, + queried: bonded, + }) } else { Ok(()) } @@ -161,7 +166,9 @@ pub fn bond( .sent_funds .iter() .find(|x| x.denom == invest.bond_denom) - .ok_or_else(|| ContractError::EmptyBalance(invest.bond_denom.clone()))?; + .ok_or_else(|| ContractError::EmptyBalance { + denom: invest.bond_denom.clone(), + })?; // bonded is the total number of tokens we have delegated from this address let bonded = get_bonded(&deps.querier, &env.contract.address)?; @@ -215,10 +222,10 @@ pub fn unbond( let invest = invest_info_read(&deps.storage).load()?; // ensure it is big enough to care if amount < invest.min_withdrawal { - return Err(ContractError::UnbondTooSmall( - invest.min_withdrawal, - invest.bond_denom, - )); + return Err(ContractError::UnbondTooSmall { + min_bonded: invest.min_withdrawal, + denom: invest.bond_denom, + }); } // calculate tax and remainer to unbond let tax = amount * invest.exit_tax; diff --git a/contracts/cw20-staking/src/error.rs b/contracts/cw20-staking/src/error.rs index 6113c0c9f..687e6437c 100644 --- a/contracts/cw20-staking/src/error.rs +++ b/contracts/cw20-staking/src/error.rs @@ -9,20 +9,20 @@ pub enum ContractError { #[error("Unauthorized")] Unauthorized {}, - #[error("Validator '{0}' not in current validator set")] - NotInValidatorSet(String), + #[error("Validator '{validator}' not in current validator set")] + NotInValidatorSet { validator: String }, - #[error("Different denominations in bonds: '{0}' vs. '{1}'")] - DifferentBondDenom(String, String), + #[error("Different denominations in bonds: '{denom1}' vs. '{denom2}'")] + DifferentBondDenom { denom1: String, denom2: String }, - #[error("Stored bonded {0}, but query bonded {1}")] - BondedMismatch(Uint128, Uint128), + #[error("Stored bonded {stored}, but query bonded {queried}")] + BondedMismatch { stored: Uint128, queried: Uint128 }, - #[error("No {0} tokens sent")] - EmptyBalance(String), + #[error("No {denom} tokens sent")] + EmptyBalance { denom: String }, - #[error("Must unbond at least {0} {1}")] - UnbondTooSmall(Uint128, String), + #[error("Must unbond at least {min_bonded} {denom}")] + UnbondTooSmall { min_bonded: Uint128, denom: String }, #[error("Insufficient balance in contract to process claim")] BalanceTooSmall {}, diff --git a/contracts/cw3-fixed-multisig/Cargo.toml b/contracts/cw3-fixed-multisig/Cargo.toml index cb6a1528b..ffda92ffa 100644 --- a/contracts/cw3-fixed-multisig/Cargo.toml +++ b/contracts/cw3-fixed-multisig/Cargo.toml @@ -18,14 +18,14 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cosmwasm-std = { version = "0.10.1", features = ["iterator"] } -cosmwasm-storage = { version = "0.10.1", features = ["iterator"] } -cw0 = { version = "0.2.2" } -cw2 = { version = "0.2.2" } -cw3 = { version = "0.2.2" } +cosmwasm-std = { version = "0.11.0-alpha3", features = ["iterator"] } +cosmwasm-storage = { version = "0.11.0-alpha3", features = ["iterator"] } +cw0 = { path = "../../packages/cw0", version = "0.2.2" } +cw2 = { path = "../../packages/cw2", version = "0.2.2" } +cw3 = { path = "../../packages/cw3", version = "0.2.2" } schemars = "0.7" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -snafu = { version = "0.6.3" } +thiserror = { version = "1.0.20" } [dev-dependencies] -cosmwasm-schema = { version = "0.10.1" } +cosmwasm-schema = { version = "0.11.0-alpha3" } diff --git a/contracts/cw3-fixed-multisig/src/contract.rs b/contracts/cw3-fixed-multisig/src/contract.rs index 0e27664ef..6b0dd4d51 100644 --- a/contracts/cw3-fixed-multisig/src/contract.rs +++ b/contracts/cw3-fixed-multisig/src/contract.rs @@ -1,8 +1,8 @@ use std::cmp::Ordering; use cosmwasm_std::{ - log, to_binary, Api, Binary, CanonicalAddr, CosmosMsg, Empty, Env, Extern, HandleResponse, - HumanAddr, InitResponse, Order, Querier, StdError, StdResult, Storage, + attr, to_binary, Api, Binary, CanonicalAddr, CosmosMsg, Empty, Env, Extern, HandleResponse, + HumanAddr, InitResponse, Order, Querier, StdResult, Storage, }; use cw0::{calc_range_start_human, Expiration}; @@ -12,6 +12,7 @@ use cw3::{ VoteListResponse, VoteResponse, VoterListResponse, VoterResponse, }; +use crate::error::ContractError; use crate::msg::{HandleMsg, InitMsg, QueryMsg}; use crate::state::{ ballots, ballots_read, config, config_read, next_id, parse_id, proposal, proposal_read, voters, @@ -26,19 +27,17 @@ pub fn init( deps: &mut Extern, _env: Env, msg: InitMsg, -) -> StdResult { +) -> Result { if msg.required_weight == 0 { - return Err(StdError::generic_err("Required weight cannot be zero")); + return Err(ContractError::ZeroWeight {}); } if msg.voters.is_empty() { - return Err(StdError::generic_err("No voters")); + return Err(ContractError::NoVoters {}); } let total_weight = msg.voters.iter().map(|v| v.weight).sum(); if total_weight < msg.required_weight { - return Err(StdError::generic_err( - "Not possible to reach required (passing) weight", - )); + return Err(ContractError::UnreachableWeight {}); } set_contract_version(&mut deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; @@ -63,7 +62,7 @@ pub fn handle( deps: &mut Extern, env: Env, msg: HandleMsg, -) -> StdResult> { +) -> Result, ContractError> { match msg { HandleMsg::Propose { title, @@ -85,12 +84,12 @@ pub fn handle_propose( msgs: Vec, // we ignore earliest latest: Option, -) -> StdResult> { +) -> Result, ContractError> { // only members of the multisig can create a proposal let raw_sender = deps.api.canonical_address(&env.message.sender)?; let vote_power = voters_read(&deps.storage) .may_load(raw_sender.as_slice())? - .ok_or_else(StdError::unauthorized)?; + .ok_or_else(|| ContractError::Unauthorized {})?; let cfg = config_read(&deps.storage).load()?; @@ -101,7 +100,7 @@ pub fn handle_propose( if let Some(Ordering::Greater) = comp { expires = max_expires; } else if comp.is_none() { - return Err(StdError::generic_err("Wrong expiration option")); + return Err(ContractError::WrongExpiration {}); } let status = if vote_power < cfg.required_weight { @@ -132,11 +131,11 @@ pub fn handle_propose( Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "propose"), - log("sender", env.message.sender), - log("proposal_id", id), - log("status", format!("{:?}", prop.status)), + attributes: vec![ + attr("action", "propose"), + attr("sender", env.message.sender), + attr("proposal_id", id), + attr("status", format!("{:?}", prop.status)), ], data: None, }) @@ -147,25 +146,25 @@ pub fn handle_vote( env: Env, proposal_id: u64, vote: Vote, -) -> StdResult> { +) -> Result, ContractError> { // only members of the multisig can vote let raw_sender = deps.api.canonical_address(&env.message.sender)?; let vote_power = voters_read(&deps.storage) .may_load(raw_sender.as_slice())? - .ok_or_else(StdError::unauthorized)?; + .ok_or_else(|| ContractError::Unauthorized {})?; // ensure proposal exists and can be voted on let mut prop = proposal_read(&deps.storage).load(&proposal_id.to_be_bytes())?; if prop.status != Status::Open { - return Err(StdError::generic_err("Proposal is not open")); + return Err(ContractError::NotOpen {}); } if prop.expires.is_expired(&env.block) { - return Err(StdError::generic_err("Proposal voting period has expired")); + return Err(ContractError::Expired {}); } // cast vote if no vote previously cast ballots(&mut deps.storage, proposal_id).update(raw_sender.as_slice(), |bal| match bal { - Some(_) => Err(StdError::generic_err("Already voted on this proposal")), + Some(_) => Err(ContractError::AlreadyVoted {}), None => Ok(Ballot { weight: vote_power, vote, @@ -184,11 +183,11 @@ pub fn handle_vote( Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "vote"), - log("sender", env.message.sender), - log("proposal_id", proposal_id), - log("status", format!("{:?}", prop.status)), + attributes: vec![ + attr("action", "vote"), + attr("sender", env.message.sender), + attr("proposal_id", proposal_id), + attr("status", format!("{:?}", prop.status)), ], data: None, }) @@ -198,16 +197,14 @@ pub fn handle_execute( deps: &mut Extern, env: Env, proposal_id: u64, -) -> StdResult> { +) -> Result { // anyone can trigger this if the vote passed let mut prop = proposal_read(&deps.storage).load(&proposal_id.to_be_bytes())?; // we allow execution even after the proposal "expiration" as long as all vote come in before // that point. If it was approved on time, it can be executed any time. if prop.status != Status::Passed { - return Err(StdError::generic_err( - "Proposal must have passed and not yet been executed", - )); + return Err(ContractError::WrongExecuteStatus {}); } // set it to executed @@ -217,10 +214,10 @@ pub fn handle_execute( // dispatch all proposed messages Ok(HandleResponse { messages: prop.msgs, - log: vec![ - log("action", "execute"), - log("sender", env.message.sender), - log("proposal_id", proposal_id), + attributes: vec![ + attr("action", "execute"), + attr("sender", env.message.sender), + attr("proposal_id", proposal_id), ], data: None, }) @@ -230,7 +227,7 @@ pub fn handle_close( deps: &mut Extern, env: Env, proposal_id: u64, -) -> StdResult> { +) -> Result, ContractError> { // anyone can trigger this if the vote passed let mut prop = proposal_read(&deps.storage).load(&proposal_id.to_be_bytes())?; @@ -238,14 +235,10 @@ pub fn handle_close( .iter() .any(|x| *x == prop.status) { - return Err(StdError::generic_err( - "Cannot close completed or passed proposals", - )); + return Err(ContractError::WrongCloseStatus {}); } if !prop.expires.is_expired(&env.block) { - return Err(StdError::generic_err( - "Proposal must expire before you can close it", - )); + return Err(ContractError::NotExpired {}); } // set it to failed @@ -254,10 +247,10 @@ pub fn handle_close( Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "close"), - log("sender", env.message.sender), - log("proposal_id", proposal_id), + attributes: vec![ + attr("action", "close"), + attr("sender", env.message.sender), + attr("proposal_id", proposal_id), ], data: None, }) @@ -485,7 +478,7 @@ mod tests { env: Env, required_weight: u64, max_voting_period: Duration, - ) -> StdResult> { + ) -> Result, ContractError> { // Init a contract with voters let voters = vec![ voter(&env.message.sender, 0), @@ -539,7 +532,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(&msg, "No voters"), + ContractError::NoVoters {} => {} e => panic!("unexpected error: {}", e), } @@ -554,7 +547,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(&msg, "Required weight cannot be zero"), + ContractError::ZeroWeight {} => {} e => panic!("unexpected error: {}", e), } @@ -565,9 +558,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Not possible to reach required (passing) weight") - } + ContractError::UnreachableWeight {} => {} e => panic!("unexpected error: {}", e), } @@ -617,7 +608,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::Unauthorized { .. } => {} + ContractError::Unauthorized {} => {} e => panic!("unexpected error: {}", e), } @@ -634,7 +625,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!("Wrong expiration option", &msg), + ContractError::WrongExpiration {} => {} e => panic!("unexpected error: {}", e), } @@ -647,11 +638,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "propose"), - log("sender", VOTER3), - log("proposal_id", 1), - log("status", "Open"), + attributes: vec![ + attr("action", "propose"), + attr("sender", VOTER3), + attr("proposal_id", 1), + attr("status", "Open"), ], data: None, } @@ -666,11 +657,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "propose"), - log("sender", VOTER4), - log("proposal_id", 2), - log("status", "Passed"), + attributes: vec![ + attr("action", "propose"), + attr("sender", VOTER4), + attr("proposal_id", 2), + attr("status", "Passed"), ], data: None, } @@ -703,7 +694,7 @@ mod tests { let res = handle(&mut deps, env.clone(), proposal).unwrap(); // Get the proposal id from the logs - let proposal_id: u64 = res.log[2].value.parse().unwrap(); + let proposal_id: u64 = res.attributes[2].value.parse().unwrap(); // Owner cannot vote (again) let yes_vote = HandleMsg::Vote { @@ -715,7 +706,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(&msg, "Already voted on this proposal"), + ContractError::AlreadyVoted {} => {} e => panic!("unexpected error: {}", e), } @@ -726,7 +717,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::Unauthorized { .. } => {} + ContractError::Unauthorized {} => {} e => panic!("unexpected error: {}", e), } @@ -739,11 +730,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "vote"), - log("sender", VOTER1), - log("proposal_id", proposal_id), - log("status", "Open"), + attributes: vec![ + attr("action", "vote"), + attr("sender", VOTER1), + attr("proposal_id", proposal_id), + attr("status", "Open"), ], data: None, } @@ -751,7 +742,7 @@ mod tests { // No/Veto votes have no effect on the tally // Get the proposal id from the logs - let proposal_id: u64 = res.log[2].value.parse().unwrap(); + let proposal_id: u64 = res.attributes[2].value.parse().unwrap(); // Compute the current tally let tally = get_tally(&deps, proposal_id); @@ -781,7 +772,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(&msg, "Already voted on this proposal"), + ContractError::AlreadyVoted {} => {} e => panic!("unexpected error: {}", e), } assert_eq!(tally, get_tally(&deps, proposal_id)); @@ -796,9 +787,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Proposal voting period has expired") - } + ContractError::Expired {} => {} e => panic!("unexpected error: {}", e), } @@ -811,11 +800,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "vote"), - log("sender", VOTER4), - log("proposal_id", proposal_id), - log("status", "Passed"), + attributes: vec![ + attr("action", "vote"), + attr("sender", VOTER4), + attr("proposal_id", proposal_id), + attr("status", "Passed"), ], data: None, } @@ -828,7 +817,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(&msg, "Proposal is not open"), + ContractError::NotOpen {} => {} e => panic!("unexpected error: {}", e), } } @@ -859,7 +848,7 @@ mod tests { let res = handle(&mut deps, env.clone(), proposal).unwrap(); // Get the proposal id from the logs - let proposal_id: u64 = res.log[2].value.parse().unwrap(); + let proposal_id: u64 = res.attributes[2].value.parse().unwrap(); // Only Passed can be executed let execution = HandleMsg::Execute { proposal_id }; @@ -868,9 +857,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Proposal must have passed and not yet been executed") - } + ContractError::WrongExecuteStatus {} => {} e => panic!("unexpected error: {}", e), } @@ -887,11 +874,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "vote"), - log("sender", VOTER3), - log("proposal_id", proposal_id), - log("status", "Passed"), + attributes: vec![ + attr("action", "vote"), + attr("sender", VOTER3), + attr("proposal_id", proposal_id), + attr("status", "Passed"), ], data: None, } @@ -904,9 +891,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Cannot close completed or passed proposals"); - } + ContractError::WrongCloseStatus {} => {} e => panic!("unexpected error: {}", e), } @@ -919,10 +904,10 @@ mod tests { res, HandleResponse { messages: msgs, - log: vec![ - log("action", "execute"), - log("sender", SOMEBODY), - log("proposal_id", proposal_id), + attributes: vec![ + attr("action", "execute"), + attr("sender", SOMEBODY), + attr("proposal_id", proposal_id), ], data: None, } @@ -935,9 +920,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Cannot close completed or passed proposals"); - } + ContractError::WrongCloseStatus {} => {} e => panic!("unexpected error: {}", e), } } @@ -968,7 +951,7 @@ mod tests { let res = handle(&mut deps, env.clone(), proposal).unwrap(); // Get the proposal id from the logs - let proposal_id: u64 = res.log[2].value.parse().unwrap(); + let proposal_id: u64 = res.attributes[2].value.parse().unwrap(); let closing = HandleMsg::Close { proposal_id }; @@ -981,9 +964,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Proposal must expire before you can close it"); - } + ContractError::NotExpired {} => {} e => panic!("unexpected error: {}", e), } @@ -999,7 +980,7 @@ mod tests { let res = handle(&mut deps, env.clone(), proposal).unwrap(); // Get the proposal id from the logs - let proposal_id: u64 = res.log[2].value.parse().unwrap(); + let proposal_id: u64 = res.attributes[2].value.parse().unwrap(); let closing = HandleMsg::Close { proposal_id }; @@ -1012,10 +993,10 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "close"), - log("sender", SOMEBODY), - log("proposal_id", proposal_id), + attributes: vec![ + attr("action", "close"), + attr("sender", SOMEBODY), + attr("proposal_id", proposal_id), ], data: None, } @@ -1027,9 +1008,7 @@ mod tests { // Verify assert!(res.is_err()); match res.unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(&msg, "Cannot close completed or passed proposals"); - } + ContractError::WrongCloseStatus {} => {} e => panic!("unexpected error: {}", e), } } diff --git a/contracts/cw3-fixed-multisig/src/error.rs b/contracts/cw3-fixed-multisig/src/error.rs new file mode 100644 index 000000000..037d75cf3 --- /dev/null +++ b/contracts/cw3-fixed-multisig/src/error.rs @@ -0,0 +1,41 @@ +use cosmwasm_std::StdError; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("Required weight cannot be zero")] + ZeroWeight {}, + + #[error("Not possible to reach required (passing) weight")] + UnreachableWeight {}, + + #[error("No voters")] + NoVoters {}, + + #[error("Unauthorized")] + Unauthorized {}, + + #[error("Proposal is not open")] + NotOpen {}, + + #[error("Proposal voting period has expired")] + Expired {}, + + #[error("Proposal must expire before you can close it")] + NotExpired {}, + + #[error("Wrong expiration option")] + WrongExpiration {}, + + #[error("Already voted on this proposal")] + AlreadyVoted {}, + + #[error("Proposal must have passed and not yet been executed")] + WrongExecuteStatus {}, + + #[error("Cannot close completed or passed proposals")] + WrongCloseStatus {}, +} diff --git a/contracts/cw3-fixed-multisig/src/lib.rs b/contracts/cw3-fixed-multisig/src/lib.rs index 2546c7677..33ecec4df 100644 --- a/contracts/cw3-fixed-multisig/src/lib.rs +++ b/contracts/cw3-fixed-multisig/src/lib.rs @@ -1,4 +1,5 @@ pub mod contract; +mod error; pub mod msg; pub mod state; diff --git a/contracts/cw3-fixed-multisig/src/state.rs b/contracts/cw3-fixed-multisig/src/state.rs index e436b43af..1e45ce9a5 100644 --- a/contracts/cw3-fixed-multisig/src/state.rs +++ b/contracts/cw3-fixed-multisig/src/state.rs @@ -68,19 +68,19 @@ pub fn config_read(storage: &S) -> ReadonlySingleton(storage: &mut S) -> Bucket { - bucket(PREFIX_VOTERS, storage) + bucket(storage, PREFIX_VOTERS) } pub fn voters_read(storage: &S) -> ReadonlyBucket { - bucket_read(PREFIX_VOTERS, storage) + bucket_read(storage, PREFIX_VOTERS) } pub fn proposal(storage: &mut S) -> Bucket { - bucket(PREFIX_PROPOSAL, storage) + bucket(storage, PREFIX_PROPOSAL) } pub fn proposal_read(storage: &S) -> ReadonlyBucket { - bucket_read(PREFIX_PROPOSAL, storage) + bucket_read(storage, PREFIX_PROPOSAL) } pub fn next_id(storage: &mut S) -> StdResult { @@ -100,12 +100,12 @@ pub fn parse_id(data: &[u8]) -> StdResult { } pub fn ballots(storage: &mut S, proposal_id: u64) -> Bucket { - Bucket::multilevel(&[PREFIX_VOTES, &proposal_id.to_be_bytes()], storage) + Bucket::multilevel(storage, &[PREFIX_VOTES, &proposal_id.to_be_bytes()]) } pub fn ballots_read( storage: &S, proposal_id: u64, ) -> ReadonlyBucket { - ReadonlyBucket::multilevel(&[PREFIX_VOTES, &proposal_id.to_be_bytes()], storage) + ReadonlyBucket::multilevel(storage, &[PREFIX_VOTES, &proposal_id.to_be_bytes()]) } diff --git a/contracts/cw721-base/Cargo.toml b/contracts/cw721-base/Cargo.toml index e579407b0..115b35017 100644 --- a/contracts/cw721-base/Cargo.toml +++ b/contracts/cw721-base/Cargo.toml @@ -25,14 +25,14 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cosmwasm-std = { version = "0.10.1" } -cosmwasm-storage = { version = "0.10.1", features = ["iterator"] } -cw0 = { version = "0.2.2" } -cw2 = { version = "0.2.2" } -cw721 = { version = "0.2.2" } +cosmwasm-std = { version = "0.11.0-alpha3" } +cosmwasm-storage = { version = "0.11.0-alpha3", features = ["iterator"] } +cw0 = { path = "../../packages/cw0", version = "0.2.2" } +cw2 = { path = "../../packages/cw2", version = "0.2.2" } +cw721 = { path = "../../packages/cw721", version = "0.2.2" } schemars = "0.7" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -snafu = { version = "0.6.3" } +thiserror = { version = "1.0.20" } [dev-dependencies] -cosmwasm-schema = { version = "0.10.1" } +cosmwasm-schema = { version = "0.11.0-alpha3" } diff --git a/contracts/cw721-base/src/contract.rs b/contracts/cw721-base/src/contract.rs index 63120ef7b..1071e476e 100644 --- a/contracts/cw721-base/src/contract.rs +++ b/contracts/cw721-base/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - from_binary, log, to_binary, Api, Binary, CosmosMsg, Env, Extern, HandleResponse, HumanAddr, - InitResponse, Order, Querier, StdError, StdResult, Storage, + attr, from_binary, to_binary, Api, Binary, CosmosMsg, Env, Extern, HandleResponse, HumanAddr, + InitResponse, Order, Querier, StdResult, Storage, }; use cw0::{calc_range_start_human, calc_range_start_string}; @@ -10,6 +10,7 @@ use cw721::{ NumTokensResponse, OwnerOfResponse, TokensResponse, }; +use crate::error::ContractError; use crate::msg::{HandleMsg, InitMsg, MinterResponse, QueryMsg}; use crate::state::{ contract_info, contract_info_read, increment_tokens, mint, mint_read, num_tokens, operators, @@ -41,7 +42,7 @@ pub fn handle( deps: &mut Extern, env: Env, msg: HandleMsg, -) -> StdResult { +) -> Result { match msg { HandleMsg::Mint { token_id, @@ -80,12 +81,12 @@ pub fn handle_mint( name: String, description: Option, image: Option, -) -> StdResult { +) -> Result { let minter = mint(&mut deps.storage).load()?; let sender_raw = deps.api.canonical_address(&env.message.sender)?; if sender_raw != minter { - return Err(StdError::unauthorized()); + return Err(ContractError::Unauthorized {}); } // create the token @@ -97,7 +98,7 @@ pub fn handle_mint( image, }; tokens(&mut deps.storage).update(token_id.as_bytes(), |old| match old { - Some(_) => Err(StdError::generic_err("token_id already claimed")), + Some(_) => Err(ContractError::Claimed {}), None => Ok(token), })?; @@ -105,10 +106,10 @@ pub fn handle_mint( Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "mint"), - log("minter", env.message.sender), - log("token_id", token_id), + attributes: vec![ + attr("action", "mint"), + attr("minter", env.message.sender), + attr("token_id", token_id), ], data: None, }) @@ -119,16 +120,16 @@ pub fn handle_transfer_nft( env: Env, recipient: HumanAddr, token_id: String, -) -> StdResult { +) -> Result { _transfer_nft(deps, &env, &recipient, &token_id)?; Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "transfer_nft"), - log("sender", env.message.sender), - log("recipient", recipient), - log("token_id", token_id), + attributes: vec![ + attr("action", "transfer_nft"), + attr("sender", env.message.sender), + attr("recipient", recipient), + attr("token_id", token_id), ], data: None, }) @@ -140,7 +141,7 @@ pub fn handle_send_nft( contract: HumanAddr, token_id: String, msg: Option, -) -> StdResult { +) -> Result { // Unwrap message first let msgs: Vec = match &msg { None => vec![], @@ -153,11 +154,11 @@ pub fn handle_send_nft( // Send message Ok(HandleResponse { messages: msgs, - log: vec![ - log("action", "send_nft"), - log("sender", env.message.sender), - log("recipient", contract), - log("token_id", token_id), + attributes: vec![ + attr("action", "send_nft"), + attr("sender", env.message.sender), + attr("recipient", contract), + attr("token_id", token_id), ], data: None, }) @@ -168,7 +169,7 @@ pub fn _transfer_nft( env: &Env, recipient: &HumanAddr, token_id: &str, -) -> StdResult { +) -> Result { let mut token = tokens(&mut deps.storage).load(token_id.as_bytes())?; // ensure we have permissions check_can_send(&deps, env, &token)?; @@ -185,16 +186,16 @@ pub fn handle_approve( spender: HumanAddr, token_id: String, expires: Option, -) -> StdResult { +) -> Result { _update_approvals(deps, &env, &spender, &token_id, true, expires)?; Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "approve"), - log("sender", env.message.sender), - log("spender", spender), - log("token_id", token_id), + attributes: vec![ + attr("action", "approve"), + attr("sender", env.message.sender), + attr("spender", spender), + attr("token_id", token_id), ], data: None, }) @@ -205,16 +206,16 @@ pub fn handle_revoke( env: Env, spender: HumanAddr, token_id: String, -) -> StdResult { +) -> Result { _update_approvals(deps, &env, &spender, &token_id, false, None)?; Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "revoke"), - log("sender", env.message.sender), - log("spender", spender), - log("token_id", token_id), + attributes: vec![ + attr("action", "revoke"), + attr("sender", env.message.sender), + attr("spender", spender), + attr("token_id", token_id), ], data: None, }) @@ -228,7 +229,7 @@ pub fn _update_approvals( // if add == false, remove. if add == true, remove then set with this expiration add: bool, expires: Option, -) -> StdResult { +) -> Result { let mut token = tokens(&mut deps.storage).load(token_id.as_bytes())?; // ensure we have permissions check_can_approve(&deps, &env, &token)?; @@ -246,9 +247,7 @@ pub fn _update_approvals( // reject expired data as invalid let expires = expires.unwrap_or_default(); if expires.is_expired(&env.block) { - return Err(StdError::generic_err( - "Cannot set approval that is already expired", - )); + return Err(ContractError::Expired {}); } let approval = Approval { spender: spender_raw, @@ -267,13 +266,11 @@ pub fn handle_approve_all( env: Env, operator: HumanAddr, expires: Option, -) -> StdResult { +) -> Result { // reject expired data as invalid let expires = expires.unwrap_or_default(); if expires.is_expired(&env.block) { - return Err(StdError::generic_err( - "Cannot set approval that is already expired", - )); + return Err(ContractError::Expired {}); } // set the operator for us @@ -283,10 +280,10 @@ pub fn handle_approve_all( Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "approve_all"), - log("sender", env.message.sender), - log("operator", operator), + attributes: vec![ + attr("action", "approve_all"), + attr("sender", env.message.sender), + attr("operator", operator), ], data: None, }) @@ -296,17 +293,17 @@ pub fn handle_revoke_all( deps: &mut Extern, env: Env, operator: HumanAddr, -) -> StdResult { +) -> Result { let sender_raw = deps.api.canonical_address(&env.message.sender)?; let operator_raw = deps.api.canonical_address(&operator)?; operators(&mut deps.storage, &sender_raw).remove(operator_raw.as_slice()); Ok(HandleResponse { messages: vec![], - log: vec![ - log("action", "revoke_all"), - log("sender", env.message.sender), - log("operator", operator), + attributes: vec![ + attr("action", "revoke_all"), + attr("sender", env.message.sender), + attr("operator", operator), ], data: None, }) @@ -317,7 +314,7 @@ fn check_can_approve( deps: &Extern, env: &Env, token: &TokenInfo, -) -> StdResult<()> { +) -> Result<(), ContractError> { // owner can approve let sender_raw = deps.api.canonical_address(&env.message.sender)?; if token.owner == sender_raw { @@ -328,12 +325,12 @@ fn check_can_approve( match op { Some(ex) => { if ex.is_expired(&env.block) { - Err(StdError::unauthorized()) + Err(ContractError::Unauthorized {}) } else { Ok(()) } } - None => Err(StdError::unauthorized()), + None => Err(ContractError::Unauthorized {}), } } @@ -342,7 +339,7 @@ fn check_can_send( deps: &Extern, env: &Env, token: &TokenInfo, -) -> StdResult<()> { +) -> Result<(), ContractError> { // owner can send let sender_raw = deps.api.canonical_address(&env.message.sender)?; if token.owner == sender_raw { @@ -363,12 +360,12 @@ fn check_can_send( match op { Some(ex) => { if ex.is_expired(&env.block) { - Err(StdError::unauthorized()) + Err(ContractError::Unauthorized {}) } else { Ok(()) } } - None => Err(StdError::unauthorized()), + None => Err(ContractError::Unauthorized {}), } } @@ -517,7 +514,7 @@ fn humanize_approval(api: A, approval: &Approval) -> StdResult {} + ContractError::Unauthorized {} => {} e => panic!("unexpected error: {}", e), } @@ -641,9 +638,7 @@ mod tests { let allowed = mock_env(MINTER, &[]); let err = handle(&mut deps, allowed, mint_msg2).unwrap_err(); match err { - StdError::GenericErr { msg, .. } => { - assert_eq!(msg.as_str(), "token_id already claimed") - } + ContractError::Claimed {} => {} e => panic!("unexpected error: {}", e), } @@ -684,7 +679,7 @@ mod tests { let err = handle(&mut deps, random, transfer_msg.clone()).unwrap_err(); match err { - StdError::Unauthorized { .. } => {} + ContractError::Unauthorized {} => {} e => panic!("unexpected error: {}", e), } @@ -701,11 +696,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "transfer_nft"), - log("sender", "venus"), - log("recipient", "random"), - log("token_id", token_id), + attributes: vec![ + attr("action", "transfer_nft"), + attr("sender", "venus"), + attr("recipient", "random"), + attr("token_id", token_id), ], data: None, } @@ -750,7 +745,7 @@ mod tests { let random = mock_env("random", &[]); let err = handle(&mut deps, random, send_msg.clone()).unwrap_err(); match err { - StdError::Unauthorized { .. } => {} + ContractError::Unauthorized {} => {} e => panic!("unexpected error: {}", e), } @@ -761,11 +756,11 @@ mod tests { res, HandleResponse { messages: vec![msg], - log: vec![ - log("action", "send_nft"), - log("sender", "venus"), - log("recipient", "another_contract"), - log("token_id", token_id), + attributes: vec![ + attr("action", "send_nft"), + attr("sender", "venus"), + attr("recipient", "another_contract"), + attr("token_id", token_id), ], data: None, } @@ -805,11 +800,11 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "approve"), - log("sender", "demeter"), - log("spender", "random"), - log("token_id", token_id.clone()), + attributes: vec![ + attr("action", "approve"), + attr("sender", "demeter"), + attr("spender", "random"), + attr("token_id", token_id.clone()), ], data: None, } @@ -915,10 +910,10 @@ mod tests { res, HandleResponse { messages: vec![], - log: vec![ - log("action", "approve_all"), - log("sender", "demeter"), - log("operator", "random"), + attributes: vec![ + attr("action", "approve_all"), + attr("sender", "demeter"), + attr("operator", "random"), ], data: None, } diff --git a/contracts/cw721-base/src/error.rs b/contracts/cw721-base/src/error.rs new file mode 100644 index 000000000..14d97acc5 --- /dev/null +++ b/contracts/cw721-base/src/error.rs @@ -0,0 +1,17 @@ +use cosmwasm_std::StdError; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("Unauthorized")] + Unauthorized {}, + + #[error("token_id already claimed")] + Claimed {}, + + #[error("Cannot set approval that is already expired")] + Expired {}, +} diff --git a/contracts/cw721-base/src/lib.rs b/contracts/cw721-base/src/lib.rs index 2546c7677..33ecec4df 100644 --- a/contracts/cw721-base/src/lib.rs +++ b/contracts/cw721-base/src/lib.rs @@ -1,4 +1,5 @@ pub mod contract; +mod error; pub mod msg; pub mod state; diff --git a/contracts/cw721-base/src/state.rs b/contracts/cw721-base/src/state.rs index 547e656ee..67947d1da 100644 --- a/contracts/cw721-base/src/state.rs +++ b/contracts/cw721-base/src/state.rs @@ -76,23 +76,23 @@ pub fn increment_tokens(storage: &mut S) -> StdResult { } pub fn tokens(storage: &mut S) -> Bucket { - bucket(TOKEN_PREFIX, storage) + bucket(storage, TOKEN_PREFIX) } pub fn tokens_read(storage: &S) -> ReadonlyBucket { - bucket_read(TOKEN_PREFIX, storage) + bucket_read(storage, TOKEN_PREFIX) } pub fn operators<'a, S: Storage>( storage: &'a mut S, owner: &CanonicalAddr, ) -> Bucket<'a, S, Expiration> { - Bucket::multilevel(&[OPERATOR_PREFIX, owner.as_slice()], storage) + Bucket::multilevel(storage, &[OPERATOR_PREFIX, owner.as_slice()]) } pub fn operators_read<'a, S: ReadonlyStorage>( storage: &'a S, owner: &CanonicalAddr, ) -> ReadonlyBucket<'a, S, Expiration> { - ReadonlyBucket::multilevel(&[OPERATOR_PREFIX, owner.as_slice()], storage) + ReadonlyBucket::multilevel(storage, &[OPERATOR_PREFIX, owner.as_slice()]) }