Trait cw_multi_test::AddressGenerator

source ·
pub trait AddressGenerator {
    // Provided methods
    fn contract_address(
        &self,
        api: &dyn Api,
        _storage: &mut dyn Storage,
        code_id: u64,
        instance_id: u64
    ) -> AnyResult<Addr> { ... }
    fn predictable_contract_address(
        &self,
        api: &dyn Api,
        _storage: &mut dyn Storage,
        _code_id: u64,
        _instance_id: u64,
        checksum: &[u8],
        creator: &CanonicalAddr,
        salt: &[u8]
    ) -> AnyResult<Addr> { ... }
}
Expand description

Common address generator interface.

The default implementation of this trait generates fully predictable addresses, no matter if contract_address or predictable_contract_address is used, but users should not make any assumptions about the value of the generated address.

Provided Methods§

source

fn contract_address( &self, api: &dyn Api, _storage: &mut dyn Storage, code_id: u64, instance_id: u64 ) -> AnyResult<Addr>

Generates a non-predictable contract address, just like the real-life chain returns contract address after its instantiation. Address generated by this function is returned as a result of processing WasmMsg::Instantiate message.

The default implementation generates a contract address based on contract’s code and instance identifier.

§Example
struct MyAddressGenerator;

impl AddressGenerator for MyAddressGenerator {}

let my_address_generator = MyAddressGenerator{};

let addr = my_address_generator.contract_address(&api, &mut storage, 100, 1).unwrap();
assert!(addr.as_str().starts_with("cosmwasm1"));
source

fn predictable_contract_address( &self, api: &dyn Api, _storage: &mut dyn Storage, _code_id: u64, _instance_id: u64, checksum: &[u8], creator: &CanonicalAddr, salt: &[u8] ) -> AnyResult<Addr>

Generates a predictable contract address, just like the real-life chain returns contract address after its instantiation using MsgInstantiateContract2 message. Address generated by this function is returned as a result of processing WasmMsg::Instantiate2 message.

The default implementation generates a contract address based on provided creator address and salt.

§Example
struct MyAddressGenerator;

impl AddressGenerator for MyAddressGenerator {}

let my_address_generator = MyAddressGenerator{};

let creator1 = api.addr_canonicalize(&api.addr_make("creator1").to_string()).unwrap();
let creator2 = api.addr_canonicalize(&api.addr_make("creator2").to_string()).unwrap();
let salt1 = [0xc0,0xff,0xee];
let salt2 = [0xbe,0xef];
let chs = Checksum::generate(&[1]);

let addr11 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, chs.as_slice(), &creator1, &salt1).unwrap();
let addr12 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, chs.as_slice(), &creator1, &salt2).unwrap();
let addr21 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, chs.as_slice(), &creator2, &salt1).unwrap();
let addr22 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, chs.as_slice(), &creator2, &salt2).unwrap();

assert_ne!(addr11, addr12);
assert_ne!(addr11, addr21);
assert_ne!(addr11, addr22);
assert_ne!(addr12, addr21);
assert_ne!(addr12, addr22);
assert_ne!(addr21, addr22);

Implementors§