Skip to content

Commit

Permalink
feat: add SignAndBroadcastHandler
Browse files Browse the repository at this point in the history
Signed-off-by: gfanton <8671905+gfanton@users.noreply.github.com>
  • Loading branch information
gfanton committed Dec 21, 2023
1 parent b222d72 commit 489e4a4
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 83 deletions.
83 changes: 0 additions & 83 deletions tm2/pkg/crypto/keys/client/addpkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,86 +137,3 @@ func execMakeAddPkg(cfg *MakeAddPkgCfg, args []string, io commands.IO) error {
}
return nil
}

func SignAndBroadcast(
cfg *MakeTxCfg,
args []string,
tx std.Tx,
io commands.IO,
) error {
baseopts := cfg.RootCfg
txopts := cfg

// query account
nameOrBech32 := args[0]
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 {
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),
}
if baseopts.Quiet {
sopts.pass, err = io.GetPassword("", baseopts.InsecurePasswordStdin)
} else {
sopts.pass, err = io.GetPassword("Enter password.", baseopts.InsecurePasswordStdin)
}
if err != nil {
return err
}

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)
}
io.Println(string(bres.DeliverTx.Data))
io.Println("OK!")
io.Println("GAS WANTED:", bres.DeliverTx.GasWanted)
io.Println("GAS USED: ", bres.DeliverTx.GasUsed)

return nil
}
109 changes: 109 additions & 0 deletions tm2/pkg/crypto/keys/client/maketx.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,14 @@ package client

import (
"flag"
"fmt"

"github.com/gnolang/gno/tm2/pkg/amino"
types "github.com/gnolang/gno/tm2/pkg/bft/rpc/core/types"
"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/std"
)

type MakeTxCfg struct {
Expand Down Expand Up @@ -78,3 +84,106 @@ func (c *MakeTxCfg) RegisterFlags(fs *flag.FlagSet) {
"chainid to sign for (only useful if --broadcast)",
)
}

func SignAndBroadcastHandler(
cfg *MakeTxCfg,
nameOrBech32 string,
tx std.Tx,
pass string,
) (*types.ResultBroadcastTxCommit, error) {
baseopts := cfg.RootCfg
txopts := cfg

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

info, err := kb.GetByNameOrAddress(nameOrBech32)
if err != nil {
return nil, err
}
accountAddr := info.GetAddress()

qopts := &QueryCfg{
RootCfg: baseopts,
Path: fmt.Sprintf("auth/accounts/%s", accountAddr),
}
qres, err := QueryHandler(qopts)
if err != nil {
return nil, errors.Wrap(err, "query account")
}
var qret struct{ BaseAccount std.BaseAccount }
err = amino.UnmarshalJSON(qres.Response.Data, &qret)
if err != nil {
return nil, err
}

// sign tx
accountNumber := qret.BaseAccount.AccountNumber
sequence := qret.BaseAccount.Sequence
sopts := &SignCfg{
Pass: pass,
RootCfg: baseopts,
Sequence: sequence,
AccountNumber: accountNumber,
ChainID: txopts.ChainID,
NameOrBech32: nameOrBech32,
TxJSON: amino.MustMarshalJSON(tx),
}

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

// broadcast signed tx
bopts := &BroadcastCfg{
RootCfg: baseopts,
tx: signedTx,
}

return BroadcastHandler(bopts)
}

func signAndBroadcast(
cfg *MakeTxCfg,
args []string,
tx std.Tx,
io commands.IO,
) error {
baseopts := cfg.RootCfg

// query account
nameOrBech32 := args[0]

var err error
var pass string
if baseopts.Quiet {
pass, err = io.GetPassword("", baseopts.InsecurePasswordStdin)
} else {
pass, err = io.GetPassword("Enter password.", baseopts.InsecurePasswordStdin)
}

if err != nil {
return err
}

bres, err := SignAndBroadcastHandler(cfg, nameOrBech32, tx, pass)
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)
}

io.Println(string(bres.DeliverTx.Data))
io.Println("OK!")
io.Println("GAS WANTED:", bres.DeliverTx.GasWanted)
io.Println("GAS USED: ", bres.DeliverTx.GasUsed)

return nil
}

0 comments on commit 489e4a4

Please sign in to comment.