Ошибка смарт-контракта 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).

Другие вопросы по тегам