Инициализатор не вызывается автоматически при развертывании. deploy
просто развертывает код и ничего не вызывает в контракте. Вероятно, мы должны добавить новый метод для оболочки, который делает deploy_and_call
. Но сейчас просто вызовите new
вручную.
Причина, по которой мы не инициализируем автоматически, заключается в том, что initializer
может принимать дополнительные аргументы. Вы можете передать владельца методу new
. Вот пример того, как использовать инициализатор с пользовательскими аргументами, а также как убедиться, что контракт не может быть вызван без инициализации:
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct FunToken {
/// AccountID -> Account details.
pub accounts: Map<AccountId, Account>,
/// Total supply of the all token.
pub total_supply: Balance,
}
impl Default for FunToken {
fn default() -> Self {
env::panic(b"Not initialized");
unreachable!();
}
}
#[near_bindgen(init => new)]
impl FunToken {
pub fn new(owner_id: AccountId, total_supply: Balance) -> Self {
let mut ft = Self { accounts: Map::new(b"a".to_vec()), total_supply };
let mut account = ft.get_account(&owner_id);
account.balance = total_supply;
ft.accounts.insert(&owner_id, &account);
ft
}
}
Отсюда: https://github.com/nearprotocol/near-bindgen/blob/master/examples/fun-token/src/lib.rs#L52-L77
В основном это паника во время вызова по умолчанию, поэтому не инициализированный контракт не может быть вызван.