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 }