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§
sourcefn contract_address(
&self,
_api: &dyn Api,
_storage: &mut dyn Storage,
_code_id: u64,
instance_id: u64
) -> AnyResult<Addr>
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 instance identifier only.
§Example
struct MyAddressGenerator;
impl AddressGenerator for MyAddressGenerator {}
let my_address_generator = MyAddressGenerator{};
let addr = my_address_generator.contract_address(&api, &mut storage, 100, 0).unwrap();
assert_eq!(addr.as_str(), "contract0");
let addr = my_address_generator.contract_address(&api, &mut storage, 100, 1).unwrap();
assert_eq!(addr.as_str(), "contract1");
let addr = my_address_generator.contract_address(&api, &mut storage, 200, 5).unwrap();
assert_eq!(addr.as_str(), "contract5");
let addr = my_address_generator.contract_address(&api, &mut storage, 200, 6).unwrap();
assert_eq!(addr.as_str(), "contract6");sourcefn 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>
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("creator1").unwrap();
let creator2 = api.addr_canonicalize("creator2").unwrap();
let salt1 = [0xc0,0xff,0xee];
let salt2 = [0xbe,0xef];
let addr11 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, &[1], &creator1, &salt1).unwrap();
let addr12 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, &[1], &creator1, &salt2).unwrap();
let addr21 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, &[1], &creator2, &salt1).unwrap();
let addr22 = my_address_generator.predictable_contract_address(&api, &mut storage, 1, 0, &[1], &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);