Адрес контракта - это хэш кода **stateInit**.
Если вы меняете первоначальное хранилище контракта, вы меняете будущий адрес контракта. Однако адрес будущего контракта является детерминированным (известен до развертывания), поэтому вы можете передать адрес в хранилище как часть инициализации контракта.
Например, приведенный ниже язык Tact показывает, как я могу создать код stateInit для получения адреса смарт-контракта:
contract Example {
any_int: Int;
init() {
self.any_int = 0;
}
receive("A") {
let contractInit: StateInit = initOf TargetContract(self.any_int, 666);
send(SendParameters{
to: contractAddress(contractInit),
value: 0,
mode: 0 + 64 + 128,
bounce: false
});
}
}
contract TargetContract {
counter: Int;
balance: Int;
init(input_counter: Int, input_balance: Int){
self.counter = input_counter;
self.balance = input_balance;
}
receive(){
// empty, means do nothing when receive empty body message.
}
}
Как вы можете видеть, мы можем изменить параметры, необходимые второму контракту, чтобы предопределить адрес контракта, поскольку мы получили код stateInit.