Base on github.com/centrifuge/go-substrate-rpc-client
used to generate contract call code through ABI files.
go install github.com/wetee-dao/ink.go/tools/go-ink-gen@latest
go get github.com/wetee-dao/ink.go
Through go-ink-gen, we can directly generate smart contract code in Golang from ABI files. For example
go-ink-gen -json xxx.json
The files will be divided into types.go
and calls.go
in the directory named after the contract name.
In types.go
. All types, including Error, are automatically converted into golang structs.
For example, Complete example types.go](https://github.com/wetee-dao/ink.go/blob/main/example/contracts/dao/types.go)
type AccountId = [32]byte
type Error struct {
NotEnoughBalance *bool
MustCallByMainContract *bool
}
In the calls.go file, it contains all the Query, DryRun, and Call functions. For example, Complete example calls.go](https://github.com/wetee-dao/ink.go/blob/main/example/contracts/dao/calls.go)
func (c *Dao) QueryMemberList(
params chain.DryRunParams,
) ([]types.H160, *chain.DryRunReturnGas, error) {
v, gas, err := chain.DryRun[[]types.H160](
c,
params.Origin,
params.PayAmount,
params.GasLimit,
params.StorageDepositLimit,
util.InkContractInput{
Selector: "Member::list",
Args: []any{},
},
)
if err != nil && !errors.Is(err, chain.ContractReverted) {
return *v, nil, err
}
return *v, gas, nil
}
After the complete code is generated, users can quickly complete the contract invocation. For example
// Step1: connect to chain
chainClient, err := chain.ClientInit([]string{"ws://127.0.0.1:9944"}, false)
if err != nil {
panic(err)
}
// Step2: initialize the account
var testSecretSeed = "0x167d9a020688544ea246b056799d6a771e97c9da057e4d0b87024537f99177bc"
p, err := chain.Ed25519PairFromSecret(testSecretSeed, 42)
if err != nil {
panic(err)
}
// Step3: initialize contract
contract,_ := dao.InitDaoContract(chainClient,"0x1547E25E7fe95a931E96907C70529d57D2438aD1")
// Step4: query contract data
_, _, err = contract.QueryMemberList(
chain.DryRunParams{
Origin: util.NewAccountID(p.PublicKey),
PayAmount: types.NewU128(*big.NewInt(0)),
GasLimit: util.NewNone[types.Weight](),
StorageDepositLimit: util.NewNone[types.U128](),
},
)
if err != nil {
fmt.Println(err)
}
Similar queries can also complete the DryRun steps in 4 steps. For example
// Step1: connect to chain
chainClient, err := chain.ClientInit([]string{"ws://127.0.0.1:9944"}, false)
if err != nil {
panic(err)
}
// Step2: initialize the account
var testSecretSeed = "0x167d9a020688544ea246b056799d6a771e97c9da057e4d0b87024537f99177bc"
p, err := chain.Ed25519PairFromSecret(testSecretSeed, 42)
if err != nil {
panic(err)
}
// Step3: initialize contract
contract,_ := dao.InitDaoContract(chainClient,"0x1547E25E7fe95a931E96907C70529d57D2438aD1")
// Step4: dry-run contract
result, gas, err := contract.DryRunMemberPublicJoin(
chain.DefaultParamWithOrigin(p.AccountID()),
)
if err == nil {
fmt.Println(result.E)
} else {
fmt.Println(err)
return
}
// Step1: connect to chain
chainClient, err := chain.ClientInit([]string{"ws://127.0.0.1:9944"}, false)
if err != nil {
panic(err)
}
// Step2: initialize the account
var testSecretSeed = "0x167d9a020688544ea246b056799d6a771e97c9da057e4d0b87024537f99177bc"
p, err := chain.Ed25519PairFromSecret(testSecretSeed, 42)
if err != nil {
panic(err)
}
// Step3: initialize contract
contract,_ := dao.InitDaoContract(chainClient,"0x1547E25E7fe95a931E96907C70529d57D2438aD1")
// Step4: call contract
err = contract.ExecMemberPublicJoin(
chain.ExecParams{
Signer: &p,
PayAmount: types.NewU128(*big.NewInt(0)),
},
)
if err != nil {
fmt.Println(err)
}