Ошибка смарт-контракта NEAR: «Контракт не инициализирован»
Я создал смарт-контракт NEAR с помощью Assembly Script и развернул его в тестовой сети. Когда я вызываю любую функцию, я получаю сообщение об ошибке, что контракт не инициализирован (контракт был добавлен в рабочие области в asconfig.json):
Error: {"index":0,"kind":{"ExecutionError":"Smart contract panicked: contract is not initialized, filename: \"src/token/assembly/index.ts\" line: 123 col: 3"}}
ServerTransactionError: {"index":0,"kind":{"ExecutionError":"Smart contract panicked: contract is not initialized, filename: \"src/token/assembly/index.ts\" line: 123 col: 3"}}
2 ответа
Эта ошибка может возникнуть, если у вас есть контракт в стиле Singleton, а
constructor(){}
в этом. Если вы не используете конструктор, просто удалите его. Или вы можете вызвать его без аргументов при развертывании контракта:
near deploy --accountId example-contract.testnet --wasmFile out/singleton.wasm --initFunction new --initArgs '{}'
или используя dev-deploy без передачи accountId для создания новой учетной записи dev
near dev-deploy --wasmFile out/singleton.wasm --initFunction new --initArgs '{}'
Если у вас есть конструктор с некоторыми аргументами, вам также необходимо передать аргументы при его развертывании.
near deploy --accountId example-contract.testnet --wasmFile out/singleton.wasm --initFunction new --initArgs '{"name":"someName"}'
@nearBindgen
export class Contract {
name: string;
// If the constructor is empty without any argumanets, just remove it, and you don't have to think about init.
// constructor(){}
// When you have some arguments in the constructor, you need to call init after it's deployed.
constructor(name:string){
this.name = name;
}
}
Если контракт уже развернут, что, как я думаю, происходит, когда вы получаете эту ошибку в первую очередь, вы также можете вызвать
init
после
near call example-contract.testnet init '{"name":"someName"}' --accountId example-contract.testnet
Дополнительную информацию можно найти в документации NEAR.
Я использовал стиль Singleton для своего кода, и поэтому перед использованием необходимо инициировать мой контракт. Самый простой способ: использовать только функции (без Singleton).