diff --git a/tests/e2e/asset/rest.go b/tests/e2e/asset/rest.go index 2eff4b9..80280a5 100644 --- a/tests/e2e/asset/rest.go +++ b/tests/e2e/asset/rest.go @@ -2,46 +2,26 @@ package asset import ( "encoding/hex" - "fmt" "planetmint-go/testutil" "planetmint-go/testutil/sample" assettypes "planetmint-go/x/asset/types" - - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - txtypes "github.com/cosmos/cosmos-sdk/types/tx" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - xauthsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) func (s *E2ETestSuite) TestNotarizeAssetREST() { val := s.network.Validators[0] - baseURL := val.APIAddress - // Query Sequence Number + // Create Msg k, err := val.ClientCtx.Keyring.Key("machine") s.Require().NoError(err) addr, err := k.GetAddress() s.Require().NoError(err) - reqAccountInfo := fmt.Sprintf("%s/cosmos/auth/v1beta1/account_info/%s", baseURL, addr.String()) - respAccountInfo, err := testutil.GetRequest(reqAccountInfo) - s.Require().NoError(err) - - var resAccountInfo authtypes.QueryAccountInfoResponse - err = val.ClientCtx.Codec.UnmarshalJSON(respAccountInfo, &resAccountInfo) - s.Require().NoError(err) - privKey, err := val.ClientCtx.Keyring.(unsafeExporter).ExportPrivateKeyObject("machine") s.Require().NoError(err) sk := hex.EncodeToString(privKey.Bytes()) - cidHash, signature := sample.Asset(sk) msg := assettypes.MsgNotarizeAsset{ @@ -51,65 +31,12 @@ func (s *E2ETestSuite) TestNotarizeAssetREST() { PubKey: hex.EncodeToString(privKey.PubKey().Bytes()), } - txBuilder := val.ClientCtx.TxConfig.NewTxBuilder() - err = txBuilder.SetMsgs(&msg) - - txBuilder.SetGasLimit(200000) - txBuilder.SetFeeAmount(sdk.Coins{sdk.NewInt64Coin("stake", 2)}) - txBuilder.SetTimeoutHeight(0) - - pk, err := k.GetPubKey() - s.Require().NoError(err) - secretk := k.GetLocal().PrivKey - - var priv cryptotypes.PrivKey - err = val.ClientCtx.Codec.UnpackAny(secretk, &priv) + // Prepare Tx + txBytes, err := testutil.PrepareTx(val, &msg, "machine") s.Require().NoError(err) - sigV2 := signing.SignatureV2{ - PubKey: pk, - Data: &signing.SingleSignatureData{ - SignMode: val.ClientCtx.TxConfig.SignModeHandler().DefaultMode(), - Signature: nil, - }, - Sequence: resAccountInfo.Info.Sequence, - } - - err = txBuilder.SetSignatures(sigV2) + // Broadcast Tx + broadcastTxResponse, err := testutil.BroadcastTx(val, txBytes) s.Require().NoError(err) - - signerData := xauthsigning.SignerData{ - ChainID: val.ClientCtx.ChainID, - AccountNumber: resAccountInfo.Info.AccountNumber, - Sequence: resAccountInfo.Info.Sequence, - } - sigV2, err = tx.SignWithPrivKey( - val.ClientCtx.TxConfig.SignModeHandler().DefaultMode(), signerData, - txBuilder, priv, val.ClientCtx.TxConfig, resAccountInfo.Info.Sequence, - ) - s.Require().NoError(err) - - err = txBuilder.SetSignatures(sigV2) - s.Require().NoError(err) - - txBytes, err := val.ClientCtx.TxConfig.TxEncoder()(txBuilder.GetTx()) - s.Require().NoError(err) - - broadcastTxUrl := fmt.Sprintf("%s/cosmos/tx/v1beta1/txs", baseURL) - req := txtypes.BroadcastTxRequest{ - TxBytes: txBytes, - Mode: txtypes.BroadcastMode_BROADCAST_MODE_SYNC, - } - - broadCastTxBody, err := val.ClientCtx.Codec.MarshalJSON(&req) - s.Require().NoError(err) - - s.Require().NoError(err) - broadCastTxResponse, err := testutil.PostRequest(broadcastTxUrl, "application/json", broadCastTxBody) - s.Require().NoError(err) - - var bctRes txtypes.BroadcastTxResponse - err = val.ClientCtx.Codec.UnmarshalJSON(broadCastTxResponse, &bctRes) - s.Require().NoError(err) - s.Require().Equal(uint32(0), bctRes.TxResponse.Code) + s.Require().Equal(uint32(0), broadcastTxResponse.TxResponse.Code) } diff --git a/testutil/rest.go b/testutil/rest.go index 180a7be..31bdd65 100644 --- a/testutil/rest.go +++ b/testutil/rest.go @@ -5,6 +5,17 @@ import ( "fmt" "io" "net/http" + + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/testutil/network" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + xauthsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" ) // GetRequest defines a wrapper around an HTTP GET request with a provided URL. @@ -44,3 +55,110 @@ func PostRequest(url, contentType string, data []byte) ([]byte, error) { return bz, nil } + +func PrepareTx(val *network.Validator, msg sdk.Msg, signer string) ([]byte, error) { + k, err := val.ClientCtx.Keyring.Key(signer) + if err != nil { + return nil, err + } + + addr, err := k.GetAddress() + if err != nil { + return nil, err + } + + reqAccountInfo := fmt.Sprintf("%s/cosmos/auth/v1beta1/account_info/%s", val.APIAddress, addr.String()) + respAccountInfo, err := GetRequest(reqAccountInfo) + if err != nil { + return nil, err + } + + var resAccountInfo authtypes.QueryAccountInfoResponse + err = val.ClientCtx.Codec.UnmarshalJSON(respAccountInfo, &resAccountInfo) + if err != nil { + return nil, err + } + + txBuilder := val.ClientCtx.TxConfig.NewTxBuilder() + txBuilder.SetMsgs(msg) + txBuilder.SetGasLimit(200000) + txBuilder.SetFeeAmount(sdk.Coins{sdk.NewInt64Coin("stake", 2)}) + txBuilder.SetTimeoutHeight(0) + + pk, err := k.GetPubKey() + if err != nil { + return nil, err + } + + sk := k.GetLocal().PrivKey + + var priv cryptotypes.PrivKey + err = val.ClientCtx.Codec.UnpackAny(sk, &priv) + if err != nil { + return nil, err + } + + sigV2 := signing.SignatureV2{ + PubKey: pk, + Data: &signing.SingleSignatureData{ + SignMode: val.ClientCtx.TxConfig.SignModeHandler().DefaultMode(), + Signature: nil, + }, + Sequence: resAccountInfo.Info.Sequence, + } + + err = txBuilder.SetSignatures(sigV2) + if err != nil { + return nil, err + } + + signerData := xauthsigning.SignerData{ + ChainID: val.ClientCtx.ChainID, + AccountNumber: resAccountInfo.Info.AccountNumber, + Sequence: resAccountInfo.Info.Sequence, + } + sigV2, err = tx.SignWithPrivKey( + val.ClientCtx.TxConfig.SignModeHandler().DefaultMode(), signerData, + txBuilder, priv, val.ClientCtx.TxConfig, resAccountInfo.Info.Sequence, + ) + if err != nil { + return nil, err + } + + err = txBuilder.SetSignatures(sigV2) + if err != nil { + return nil, err + } + + txBytes, err := val.ClientCtx.TxConfig.TxEncoder()(txBuilder.GetTx()) + if err != nil { + return nil, err + } + + return txBytes, nil +} + +func BroadcastTx(val *network.Validator, txBytes []byte) (*txtypes.BroadcastTxResponse, error) { + broadcastTxUrl := fmt.Sprintf("%s/cosmos/tx/v1beta1/txs", val.APIAddress) + req := txtypes.BroadcastTxRequest{ + TxBytes: txBytes, + Mode: txtypes.BroadcastMode_BROADCAST_MODE_SYNC, + } + + broadCastTxBody, err := val.ClientCtx.Codec.MarshalJSON(&req) + if err != nil { + return nil, err + } + broadCastTxResponse, err := PostRequest(broadcastTxUrl, "application/json", broadCastTxBody) + if err != nil { + return nil, err + } + + var bctRes txtypes.BroadcastTxResponse + err = val.ClientCtx.Codec.UnmarshalJSON(broadCastTxResponse, &bctRes) + if err != nil { + return nil, err + } + + return &bctRes, nil +}