github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/ibc-go/testing/simapp/helpers/test_helpers.go (about)

     1  package helpers
     2  
     3  import (
     4  	"math/rand"
     5  	"time"
     6  
     7  	ica "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts"
     8  	ibc "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core"
     9  
    10  	ibcfee "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee"
    11  
    12  	fbexchaincodec "github.com/fibonacci-chain/fbc/app/codec"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/crypto/types"
    16  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    17  	ibcmsg "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/ibc-adapter"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/module"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/tx/signing"
    20  	ibc_tx "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/ibc-tx"
    21  	signing2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/ibcsigning"
    22  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    23  	capabilityModule "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability"
    24  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/simulation"
    25  	ibctransfer "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer"
    26  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    27  	"github.com/fibonacci-chain/fbc/x/icamauth"
    28  )
    29  
    30  // SimAppChainID hardcoded chainID for simulation
    31  const (
    32  	DefaultGenTxGas = 1000000
    33  	SimAppChainID   = "simulation-app"
    34  )
    35  
    36  // GenTx generates a signed mock transaction.
    37  func GenTx(gen client.TxConfig, msgs []ibcmsg.Msg, feeAmt sdk.CoinAdapters, gas uint64, chainID string, accNums, accSeqs []uint64, smode int, priv ...crypto.PrivKey) (sdk.Tx, error) {
    38  	txBytes, err := GenTxBytes(gen, msgs, feeAmt, gas, chainID, accNums, accSeqs, smode, priv...)
    39  	if nil != err {
    40  		panic(err)
    41  	}
    42  	cdcProxy := newProxyDecoder()
    43  
    44  	ibcTx, err := ibc_tx.IbcTxDecoder(cdcProxy.GetProtocMarshal())(txBytes)
    45  
    46  	return ibcTx, err
    47  }
    48  
    49  func GenTxBytes(gen client.TxConfig, msgs []ibcmsg.Msg, feeAmt sdk.CoinAdapters, gas uint64, chainID string, accNums, accSeqs []uint64, smode int, priv ...crypto.PrivKey) ([]byte, error) {
    50  	sigs := make([]signing.SignatureV2, len(priv))
    51  
    52  	// create a random length memo
    53  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
    54  
    55  	memo := simulation.RandStringOfLength(r, simulation.RandIntBetween(r, 0, 100))
    56  	signMode := gen.SignModeHandler().DefaultMode()
    57  	// 1st round: set SignatureV2 with empty signatures, to set correct
    58  	// signer infos.
    59  	// 1 mode single
    60  	// 2 mode multi
    61  	switch smode {
    62  	case 1:
    63  		for i, p := range priv {
    64  			pubKey := ibc_tx.LagacyKey2PbKey(p.PubKey())
    65  			sigs[i] = signing.SignatureV2{
    66  				PubKey: pubKey,
    67  				Data: &signing.SingleSignatureData{
    68  					SignMode: gen.SignModeHandler().DefaultMode(),
    69  				},
    70  				Sequence: accSeqs[i],
    71  			}
    72  		}
    73  	case 2:
    74  		//only support for ut
    75  		keyLen := 10
    76  		for i, p := range priv {
    77  			pubKey := ibc_tx.LagacyKey2PbKey(p.PubKey())
    78  			sigs[i] = signing.SignatureV2{
    79  				PubKey: pubKey,
    80  				Data: &signing.MultiSignatureData{
    81  					BitArray:   types.NewCompactBitArray(keyLen),
    82  					Signatures: make([]signing.SignatureData, 0, keyLen),
    83  				},
    84  				Sequence: accSeqs[i],
    85  			}
    86  		}
    87  	}
    88  
    89  	tx := gen.NewTxBuilder()
    90  	err := tx.SetMsgs(msgs...)
    91  	if err != nil {
    92  		return nil, err
    93  	}
    94  	err = tx.SetSignatures(sigs...)
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  	tx.SetMemo(memo)
    99  	tx.SetFeeAmount(feeAmt)
   100  	tx.SetGasLimit(gas)
   101  
   102  	// 2nd round: once all signer infos are set, every signer can sign.
   103  	for i, p := range priv {
   104  		signerData := signing2.SignerData{
   105  			ChainID:       chainID,
   106  			AccountNumber: accNums[i],
   107  			Sequence:      accSeqs[i],
   108  		}
   109  		signBytes, err := gen.SignModeHandler().GetSignBytes(signMode, signerData, tx.GetTx())
   110  		if err != nil {
   111  			panic(err)
   112  		}
   113  		sig, err := p.Sign(signBytes)
   114  		if err != nil {
   115  			panic(err)
   116  		}
   117  		sigs[i].Data.(*signing.SingleSignatureData).Signature = sig
   118  		err = tx.SetSignatures(sigs...)
   119  		if err != nil {
   120  			panic(err)
   121  		}
   122  	}
   123  	return gen.TxEncoder()(tx.GetTx())
   124  }
   125  
   126  func newProxyDecoder() *codec.CodecProxy {
   127  	ModuleBasics := module.NewBasicManager(
   128  		bank.AppModuleBasic{},
   129  		capabilityModule.AppModuleBasic{},
   130  		ibc.AppModuleBasic{},
   131  		ibctransfer.AppModuleBasic{},
   132  		ica.AppModuleBasic{},
   133  		ibcfee.AppModuleBasic{},
   134  		icamauth.AppModuleBasic{},
   135  	)
   136  	cdc := fbexchaincodec.MakeCodec(ModuleBasics)
   137  	interfaceReg := fbexchaincodec.MakeIBC(ModuleBasics)
   138  	protoCodec := codec.NewProtoCodec(interfaceReg)
   139  	codecProxy := codec.NewCodecProxy(protoCodec, cdc)
   140  	return codecProxy
   141  }