Skip to content

Commit

Permalink
chore: Add temp copy of gnoclient. Use it in execCall.
Browse files Browse the repository at this point in the history
Signed-off-by: Jeff Thompson <[email protected]>
  • Loading branch information
jefft0 committed Aug 31, 2023
1 parent 65589bb commit cb964e6
Show file tree
Hide file tree
Showing 2 changed files with 222 additions and 167 deletions.
184 changes: 17 additions & 167 deletions framework/call.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package gnomobile

import (
"encoding/json"
"fmt"

"github.com/gnolang/gno/tm2/pkg/amino"
Expand All @@ -10,7 +9,6 @@ import (
"github.com/gnolang/gno/tm2/pkg/commands"
"github.com/gnolang/gno/tm2/pkg/crypto/keys"
"github.com/gnolang/gno/tm2/pkg/errors"
"github.com/gnolang/gno/tm2/pkg/sdk/vm"
"github.com/gnolang/gno/tm2/pkg/std"
)

Expand Down Expand Up @@ -40,29 +38,9 @@ type makeTxCfg struct {
chainID string
}

func (m *makeTxCfg) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
RootCfg *baseCfg

GasWanted int64
GasFee string
Memo string

Broadcast bool
ChainID string
}{
RootCfg: m.rootCfg,
GasWanted: m.gasWanted,
GasFee: m.gasFee,
Memo: m.memo,
Broadcast: m.broadcast,
ChainID: m.chainID,
})
}

// From https://github.com/gnolang/gno/blob/master/tm2/pkg/crypto/keys/client/query.go
type queryCfg struct {
rootCfg *baseCfg
remote string

data string
height int64
Expand All @@ -74,7 +52,7 @@ type queryCfg struct {

// From https://github.com/gnolang/gno/blob/master/tm2/pkg/crypto/keys/client/sign.go
type signCfg struct {
rootCfg *baseCfg
kb keys.Keybase

txPath string
chainID string
Expand All @@ -90,7 +68,7 @@ type signCfg struct {

// From https://github.com/gnolang/gno/blob/master/tm2/pkg/crypto/keys/client/broadcast.go
type broadcastCfg struct {
rootCfg *baseCfg
remote string

dryRun bool

Expand All @@ -110,149 +88,26 @@ type callCfg struct {

// From https://github.com/gnolang/gno/blob/master/tm2/pkg/crypto/keys/client/call.go
func execCall(cfg *callCfg, nameOrBech32 string, password string) error {
if cfg.pkgPath == "" {
return errors.New("pkgpath not specified")
}
if cfg.funcName == "" {
return errors.New("func not specified")
}
if cfg.rootCfg.gasWanted == 0 {
return errors.New("gas-wanted not specified")
}
if cfg.rootCfg.gasFee == "" {
return errors.New("gas-fee not specified")
}

// read statement.
fnc := cfg.funcName

// read account pubkey.
kb, err := keys.NewKeyBaseFromDir(cfg.rootCfg.rootCfg.Home)
if err != nil {
return err
}
info, err := kb.GetByNameOrAddress(nameOrBech32)
if err != nil {
return err
}
caller := info.GetAddress()
// info.GetPubKey()

// Parse send amount.
send, err := std.ParseCoins(cfg.send)
if err != nil {
return errors.Wrap(err, "parsing send coins")
}

// parse gas wanted & fee.
gaswanted := cfg.rootCfg.gasWanted
gasfee, err := std.ParseCoin(cfg.rootCfg.gasFee)
if err != nil {
return errors.Wrap(err, "parsing gas fee coin")
}

// construct msg & tx and marshal.
msg := vm.MsgCall{
Caller: caller,
Send: send,
PkgPath: cfg.pkgPath,
Func: fnc,
Args: cfg.args,
}
tx := std.Tx{
Msgs: []std.Msg{msg},
Fee: std.NewFee(gaswanted, gasfee),
Signatures: nil,
Memo: cfg.rootCfg.memo,
}

if cfg.rootCfg.broadcast {
err := signAndBroadcast(cfg.rootCfg, tx, kb, nameOrBech32, password)
if err != nil {
return err
}
} else {
errors.New(string(amino.MustMarshalJSON(tx)))
}
return nil
}

// From https://github.com/gnolang/gno/blob/master/tm2/pkg/crypto/keys/client/addpkg.go
func signAndBroadcast(
cfg *makeTxCfg,
tx std.Tx,
kb keys.Keybase,
nameOrBech32 string,
password string,
) error {
baseopts := cfg.rootCfg
txopts := cfg

// query account
kb, err := keys.NewKeyBaseFromDir(baseopts.Home)
if err != nil {
return err
}
info, err := kb.GetByNameOrAddress(nameOrBech32)
if err != nil {
return err
}
accountAddr := info.GetAddress()

qopts := &queryCfg{
rootCfg: baseopts,
path: fmt.Sprintf("auth/accounts/%s", accountAddr),
}
qres, err := queryHandler(qopts)
if err != nil {
return errors.Wrap(err, "query account")
}
var qret struct{ BaseAccount std.BaseAccount }
err = amino.UnmarshalJSON(qres.Response.Data, &qret)
if err != nil {
client := NewClient(cfg.rootCfg.rootCfg.Remote, cfg.rootCfg.chainID)
client.SetAccount(nameOrBech32, password)
if err := client.SetKeyBaseFromDir(cfg.rootCfg.rootCfg.Home); err != nil {
return err
}

// sign tx
accountNumber := qret.BaseAccount.AccountNumber
sequence := qret.BaseAccount.Sequence
sopts := &signCfg{
rootCfg: baseopts,
sequence: sequence,
accountNumber: accountNumber,
chainID: txopts.chainID,
nameOrBech32: nameOrBech32,
txJSON: amino.MustMarshalJSON(tx),
pass: password,
}

signedTx, err := SignHandler(sopts)
if err != nil {
return errors.Wrap(err, "sign tx")
}

// broadcast signed tx
bopts := &broadcastCfg{
rootCfg: baseopts,
tx: signedTx,
}
bres, err := broadcastHandler(bopts)
if err != nil {
return errors.Wrap(err, "broadcast tx")
}
if bres.CheckTx.IsErr() {
return errors.Wrap(bres.CheckTx.Error, "check transaction failed: log:%s", bres.CheckTx.Log)
}
if bres.DeliverTx.IsErr() {
return errors.Wrap(bres.DeliverTx.Error, "deliver transaction failed: log:%s", bres.DeliverTx.Log)
r := client.NewRequest("call")
r.StringOption("pkgpath", cfg.pkgPath)
r.StringOption("func", cfg.funcName)
r.StringOption("gas-fee", cfg.rootCfg.gasFee)
r.Int64Option("gas-wanted", cfg.rootCfg.gasWanted)
for _, arg := range cfg.args {
r.Argument(arg)
}

return nil
return r.Send()
}

// From https://github.com/gnolang/gno/blob/master/tm2/pkg/crypto/keys/client/query.go
func queryHandler(cfg *queryCfg) (*ctypes.ResultABCIQuery, error) {
remote := cfg.rootCfg.Remote
remote := cfg.remote
if remote == "" || remote == "y" {
return nil, errors.New("missing remote url")
}
Expand All @@ -278,7 +133,7 @@ func broadcastHandler(cfg *broadcastCfg) (*ctypes.ResultBroadcastTxCommit, error
return nil, errors.New("invalid tx")
}

remote := cfg.rootCfg.Remote
remote := cfg.remote
if remote == "" || remote == "y" {
return nil, errors.New("missing remote url")
}
Expand Down Expand Up @@ -314,11 +169,6 @@ func SignHandler(cfg *signCfg) (*std.Tx, error) {
return nil, errors.New("invalid tx content")
}

kb, err := keys.NewKeyBaseFromDir(cfg.rootCfg.Home)
if err != nil {
return nil, err
}

err = amino.UnmarshalJSON(cfg.txJSON, &tx)
if err != nil {
return nil, err
Expand Down Expand Up @@ -351,7 +201,7 @@ func SignHandler(cfg *signCfg) (*std.Tx, error) {
return nil, nil
}

sig, pub, err := kb.Sign(cfg.nameOrBech32, cfg.pass, signbz)
sig, pub, err := cfg.kb.Sign(cfg.nameOrBech32, cfg.pass, signbz)
if err != nil {
return nil, err
}
Expand Down
Loading

0 comments on commit cb964e6

Please sign in to comment.