1

我使用汇编脚本创建了 NEAR 智能合约并部署到了测试网。当我调用任何函数时,我收到合同未初始化的错误(合同已添加到 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"}}

我的合同的第一行

4

2 回答 2

0

我在我的代码中使用了 Singleton 样式,因此需要在使用之前初始化我的合约。最简单的方法:只使用函数(没有 Singleton)。

于 2021-12-09T15:39:10.593 回答
0

当您有一个单例样式合同并且其中包含一个时,可能会发生此错误constructor(){}。如果您不使用构造函数,只需将其删除。或者,您可以在部署合约时使用零参数调用它:

near deploy --accountId example-contract.testnet --wasmFile out/singleton.wasm --initFunction new --initArgs '{}'

或使用 dev-deploy,不传递 accountId 来生成新的 dev-account

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 的文档中找到

于 2022-02-11T15:03:29.117 回答