github.com/Finschia/finschia-sdk@v0.48.1/simapp/helpers/test_helpers.go (about)

     1  package helpers
     2  
     3  import (
     4  	"math/rand"
     5  	"time"
     6  
     7  	"github.com/Finschia/finschia-sdk/client"
     8  	cryptotypes "github.com/Finschia/finschia-sdk/crypto/types"
     9  	sdk "github.com/Finschia/finschia-sdk/types"
    10  	"github.com/Finschia/finschia-sdk/types/simulation"
    11  	"github.com/Finschia/finschia-sdk/types/tx/signing"
    12  	authsign "github.com/Finschia/finschia-sdk/x/auth/signing"
    13  )
    14  
    15  // SimAppChainID hardcoded chainID for simulation
    16  const (
    17  	DefaultGenTxGas = 10000000
    18  	SimAppChainID   = "simulation-app"
    19  )
    20  
    21  // GenTx generates a signed mock transaction.
    22  func GenTx(gen client.TxConfig, msgs []sdk.Msg, feeAmt sdk.Coins, gas uint64, chainID string, accNums, accSeqs []uint64, priv ...cryptotypes.PrivKey) (sdk.Tx, error) {
    23  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
    24  	return GenSignedMockTx(r, gen, msgs, feeAmt, gas, chainID, accNums, accSeqs, priv...)
    25  }
    26  
    27  // GenSignedMockTx generates a signed mock transaction.
    28  func GenSignedMockTx(r *rand.Rand, gen client.TxConfig, msgs []sdk.Msg, feeAmt sdk.Coins, gas uint64, chainID string, accNums, accSeqs []uint64, priv ...cryptotypes.PrivKey) (sdk.Tx, error) {
    29  	sigs := make([]signing.SignatureV2, len(priv))
    30  
    31  	memo := simulation.RandStringOfLength(r, simulation.RandIntBetween(r, 0, 100))
    32  
    33  	signMode := gen.SignModeHandler().DefaultMode()
    34  
    35  	// 1st round: set SignatureV2 with empty signatures, to set correct
    36  	// signer infos.
    37  	for i, p := range priv {
    38  		sigs[i] = signing.SignatureV2{
    39  			PubKey: p.PubKey(),
    40  			Data: &signing.SingleSignatureData{
    41  				SignMode: signMode,
    42  			},
    43  			Sequence: accSeqs[i],
    44  		}
    45  	}
    46  
    47  	tx := gen.NewTxBuilder()
    48  	err := tx.SetMsgs(msgs...)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  	err = tx.SetSignatures(sigs...)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	tx.SetMemo(memo)
    57  	tx.SetFeeAmount(feeAmt)
    58  	tx.SetGasLimit(gas)
    59  
    60  	// 2nd round: once all signer infos are set, every signer can sign.
    61  	for i, p := range priv {
    62  		signerData := authsign.SignerData{
    63  			ChainID:       chainID,
    64  			AccountNumber: accNums[i],
    65  			Sequence:      accSeqs[i],
    66  		}
    67  		signBytes, err := gen.SignModeHandler().GetSignBytes(signMode, signerData, tx.GetTx())
    68  		if err != nil {
    69  			panic(err)
    70  		}
    71  		sig, err := p.Sign(signBytes)
    72  		if err != nil {
    73  			panic(err)
    74  		}
    75  		sigs[i].Data.(*signing.SingleSignatureData).Signature = sig
    76  		err = tx.SetSignatures(sigs...)
    77  		if err != nil {
    78  			panic(err)
    79  		}
    80  	}
    81  
    82  	return tx.GetTx(), nil
    83  }