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 }