diff --git a/lib/tx.go b/lib/tx.go index 7861d0a..02ac44c 100644 --- a/lib/tx.go +++ b/lib/tx.go @@ -38,16 +38,25 @@ func getAccountNumberAndSequence(clientCtx client.Context) (accountNumber, seque return } -func getClientContextAndTxFactory(address sdk.AccAddress) (clientCtx client.Context, txf tx.Factory, err error) { +func getClientContextAndTxFactory(fromAddress sdk.AccAddress) (clientCtx client.Context, txf tx.Factory, err error) { clientCtx = GetConfig().ClientCtx // at least we need an account retriever // it would be better to check for an empty client context, but that does not work at the moment if clientCtx.AccountRetriever == nil { - clientCtx, err = getClientContext(address) + clientCtx, err = getClientContext(fromAddress) if err != nil { return } } + record, err := clientCtx.Keyring.KeyByAddress(fromAddress) + if err != nil { + return + } + // name and address of private key with which to sign + clientCtx = clientCtx. + WithFromAddress(fromAddress). + WithFromName(record.Name) + accountNumber, sequence, err := getAccountNumberAndSequence(clientCtx) if err != nil { return @@ -69,7 +78,7 @@ func getTxFactoryWithAccountNumberAndSequence(clientCtx client.Context, accountN WithTxConfig(clientCtx.TxConfig) } -func getClientContext(address sdk.AccAddress) (clientCtx client.Context, err error) { +func getClientContext(fromAddress sdk.AccAddress) (clientCtx client.Context, err error) { encodingConfig := GetConfig().EncodingConfig rootDir := GetConfig().RootDir @@ -82,7 +91,7 @@ func getClientContext(address sdk.AccAddress) (clientCtx client.Context, err err return } - record, err := keyring.KeyByAddress(address) + record, err := keyring.KeyByAddress(fromAddress) if err != nil { return } @@ -101,8 +110,8 @@ func getClientContext(address sdk.AccAddress) (clientCtx client.Context, err err ChainID: GetConfig().ChainID, Client: wsClient, Codec: codec, - From: address.String(), - FromAddress: address, + From: fromAddress.String(), + FromAddress: fromAddress, FromName: record.Name, HomeDir: rootDir, Input: input, @@ -122,8 +131,8 @@ func getClientContext(address sdk.AccAddress) (clientCtx client.Context, err err // BuildUnsignedTx builds a transaction to be signed given a set of messages. // Once created, the fee, memo, and messages are set. -func BuildUnsignedTx(address sdk.AccAddress, msgs ...sdk.Msg) (txJSON string, err error) { - clientCtx, txf, err := getClientContextAndTxFactory(address) +func BuildUnsignedTx(fromAddress sdk.AccAddress, msgs ...sdk.Msg) (txJSON string, err error) { + clientCtx, txf, err := getClientContextAndTxFactory(fromAddress) if err != nil { return } @@ -160,7 +169,9 @@ func broadcastTx(clientCtx client.Context, txf tx.Factory, msgs ...sdk.Msg) (out // Make a copy because we `defer output.Reset()` out = &bytes.Buffer{} - *out = *output + // This is still copying references: *out = *output + // Make a real copy: https://stackoverflow.com/a/69758157 + out.Write(output.Bytes()) return } @@ -201,7 +212,7 @@ func getSequenceFromChain(clientCtx client.Context) (sequence uint64, err error) } // BroadcastTxWithFileLock broadcasts a transaction via gRPC and synchronises requests via a file lock. -func BroadcastTxWithFileLock(address sdk.AccAddress, msgs ...sdk.Msg) (out *bytes.Buffer, err error) { +func BroadcastTxWithFileLock(fromAddress sdk.AccAddress, msgs ...sdk.Msg) (out *bytes.Buffer, err error) { // open and lock file, if it exists usr, err := user.Current() if err != nil { @@ -209,7 +220,7 @@ func BroadcastTxWithFileLock(address sdk.AccAddress, msgs ...sdk.Msg) (out *byte } homeDir := usr.HomeDir - addrHex := hex.EncodeToString(address) + addrHex := hex.EncodeToString(fromAddress) filename := filepath.Join(GetConfig().RootDir, addrHex+".sequence") // Expand tilde to user's home directory. @@ -237,7 +248,7 @@ func BroadcastTxWithFileLock(address sdk.AccAddress, msgs ...sdk.Msg) (out *byte }() // get basic chain information - clientCtx, txf, err := getClientContextAndTxFactory(address) + clientCtx, txf, err := getClientContextAndTxFactory(fromAddress) if err != nil { return } diff --git a/tests/e2e/asset/rest.go b/tests/e2e/asset/rest.go index 70f08f1..d269615 100644 --- a/tests/e2e/asset/rest.go +++ b/tests/e2e/asset/rest.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/planetmint/planetmint-go/config" - "github.com/planetmint/planetmint-go/lib" "github.com/planetmint/planetmint-go/testutil" e2etestutil "github.com/planetmint/planetmint-go/testutil/e2e" "github.com/planetmint/planetmint-go/testutil/network" @@ -37,18 +36,6 @@ func (s *RestE2ETestSuite) SetupSuite() { s.network = network.New(s.T()) err := e2etestutil.AttestMachine(s.network, sample.Name, sample.Mnemonic, 0) s.Require().NoError(err) - - val := s.network.Validators[0] - k, err := val.ClientCtx.Keyring.Key(sample.Name) - s.Require().NoError(err) - - addr, _ := k.GetAddress() - - clientCtx := val.ClientCtx. - WithFromAddress(addr). - WithFromName(sample.Name) - libConfig := lib.GetConfig() - libConfig.SetClientCtx(clientCtx) } // TearDownSuite clean up after testing diff --git a/tests/e2e/asset/suite.go b/tests/e2e/asset/suite.go index 2235923..53e28db 100644 --- a/tests/e2e/asset/suite.go +++ b/tests/e2e/asset/suite.go @@ -37,18 +37,6 @@ func (s *E2ETestSuite) SetupSuite() { s.network = network.New(s.T()) err := e2etestutil.AttestMachine(s.network, sample.Name, sample.Mnemonic, 0) s.Require().NoError(err) - - val := s.network.Validators[0] - k, err := val.ClientCtx.Keyring.Key(sample.Name) - s.Require().NoError(err) - - addr, _ := k.GetAddress() - - clientCtx := val.ClientCtx. - WithFromAddress(addr). - WithFromName(sample.Name) - libConfig := lib.GetConfig() - libConfig.SetClientCtx(clientCtx) } // TearDownSuite clean up after testing diff --git a/tests/e2e/machine/suite.go b/tests/e2e/machine/suite.go index ea710d8..72437a7 100644 --- a/tests/e2e/machine/suite.go +++ b/tests/e2e/machine/suite.go @@ -73,13 +73,6 @@ func (s *E2ETestSuite) TestAttestMachine() { s.Require().NoError(err) addr, _ := k.GetAddress() - // name and address of private key with which to sign - clientCtx := val.ClientCtx. - WithFromAddress(addr). - WithFromName(sample.Name) - libConfig := lib.GetConfig() - libConfig.SetClientCtx(clientCtx) - machine := sample.Machine(sample.Name, pubKey, prvKey, addr.String()) msg2 := machinetypes.NewMsgAttestMachine(addr.String(), &machine) out, err = e2etestutil.BuildSignBroadcastTx(s.T(), addr, msg2) @@ -112,13 +105,6 @@ func (s *E2ETestSuite) TestInvalidAttestMachine() { machine := sample.Machine(sample.Name, pubKey, prvKey, addr.String()) s.Require().NoError(err) - // name and address of private key with which to sign - clientCtx := val.ClientCtx. - WithFromAddress(addr). - WithFromName(sample.Name) - libConfig := lib.GetConfig() - libConfig.SetClientCtx(clientCtx) - msg := machinetypes.NewMsgAttestMachine(addr.String(), &machine) out, _ := lib.BroadcastTxWithFileLock(addr, msg) txResponse, err := lib.GetTxResponseFromOut(out) @@ -150,10 +136,6 @@ func (s *E2ETestSuite) TestMachineAllowanceAttestation() { // register TA prvKey, pubKey := sample.KeyPair(3) - // name and address of private key with which to sign - libConfig := lib.GetConfig() - libConfig.SetClientCtx(val.ClientCtx) - ta := sample.TrustAnchor(pubKey) msg1 := machinetypes.NewMsgRegisterTrustAnchor(val.Address.String(), &ta) _, err = e2etestutil.BuildSignBroadcastTx(s.T(), val.Address, msg1) @@ -183,9 +165,8 @@ func (s *E2ETestSuite) TestMachineAllowanceAttestation() { // name and address of private key with which to sign clientCtx := val.ClientCtx. - WithFromAddress(addr). - WithFromName("AllowanceMachine"). WithFeeGranterAddress(val.Address) + libConfig := lib.GetConfig() libConfig.SetClientCtx(clientCtx) msg3 := machinetypes.NewMsgAttestMachine(addr.String(), &machine) @@ -193,6 +174,9 @@ func (s *E2ETestSuite) TestMachineAllowanceAttestation() { s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) + // reset clientCtx to validator ctx + libConfig.SetClientCtx(val.ClientCtx) + args := []string{ pubKey, } diff --git a/testutil/e2e/e2e.go b/testutil/e2e/e2e.go index 59bcbcd..9840a10 100644 --- a/testutil/e2e/e2e.go +++ b/testutil/e2e/e2e.go @@ -92,13 +92,6 @@ func AttestMachine(network *network.Network, name string, mnemonic string, num i return err } - // name and address of private key with which to sign - clientCtx := val.ClientCtx. - WithFromAddress(addr). - WithFromName(name) - libConfig := lib.GetConfig() - libConfig.SetClientCtx(clientCtx) - machine := sample.Machine(name, pubKey, prvKey, addr.String()) attestMsg := machinetypes.NewMsgAttestMachine(addr.String(), &machine) _, err = lib.BroadcastTxWithFileLock(addr, attestMsg) @@ -111,8 +104,5 @@ func AttestMachine(network *network.Network, name string, mnemonic string, num i return err } - // reset clientCtx to validator ctx - libConfig.SetClientCtx(val.ClientCtx) - return }