github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/types/test_fixtures.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/sha256"
     6  	"encoding/json"
     7  	"math/rand"
     8  
     9  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    10  )
    11  
    12  func GenesisFixture(mutators ...func(*GenesisState)) GenesisState {
    13  	const (
    14  		numCodes     = 2
    15  		numContracts = 2
    16  		numSequences = 2
    17  		numMsg       = 3
    18  	)
    19  
    20  	fixture := GenesisState{
    21  		Params:    DefaultParams(),
    22  		Codes:     make([]Code, numCodes),
    23  		Contracts: make([]Contract, numContracts),
    24  		Sequences: make([]Sequence, numSequences),
    25  	}
    26  	for i := 0; i < numCodes; i++ {
    27  		fixture.Codes[i] = CodeFixture()
    28  	}
    29  	for i := 0; i < numContracts; i++ {
    30  		fixture.Contracts[i] = ContractFixture()
    31  	}
    32  	for i := 0; i < numSequences; i++ {
    33  		fixture.Sequences[i] = Sequence{
    34  			IDKey: randBytes(5),
    35  			Value: uint64(i),
    36  		}
    37  	}
    38  	fixture.GenMsgs = []GenesisState_GenMsgs{
    39  		{Sum: &GenesisState_GenMsgs_StoreCode{StoreCode: MsgStoreCodeFixture()}},
    40  		{Sum: &GenesisState_GenMsgs_InstantiateContract{InstantiateContract: MsgInstantiateContractFixture()}},
    41  		{Sum: &GenesisState_GenMsgs_ExecuteContract{ExecuteContract: MsgExecuteContractFixture()}},
    42  	}
    43  	for _, m := range mutators {
    44  		m(&fixture)
    45  	}
    46  	return fixture
    47  }
    48  
    49  func randBytes(n int) []byte {
    50  	r := make([]byte, n)
    51  	rand.Read(r)
    52  	return r
    53  }
    54  
    55  func CodeFixture(mutators ...func(*Code)) Code {
    56  	wasmCode := randBytes(100)
    57  
    58  	fixture := Code{
    59  		CodeID:    1,
    60  		CodeInfo:  CodeInfoFixture(WithSHA256CodeHash(wasmCode)),
    61  		CodeBytes: wasmCode,
    62  	}
    63  
    64  	for _, m := range mutators {
    65  		m(&fixture)
    66  	}
    67  	return fixture
    68  }
    69  
    70  func CodeInfoFixture(mutators ...func(*CodeInfo)) CodeInfo {
    71  	wasmCode := bytes.Repeat([]byte{0x1}, 10)
    72  	codeHash := sha256.Sum256(wasmCode)
    73  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
    74  	fixture := CodeInfo{
    75  		CodeHash:          codeHash[:],
    76  		Creator:           anyAddress,
    77  		InstantiateConfig: AllowEverybody,
    78  	}
    79  	for _, m := range mutators {
    80  		m(&fixture)
    81  	}
    82  	return fixture
    83  }
    84  
    85  func ContractFixture(mutators ...func(*Contract)) Contract {
    86  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
    87  
    88  	fixture := Contract{
    89  		ContractAddress: anyAddress,
    90  		ContractInfo:    ContractInfoFixture(OnlyGenesisFields),
    91  		ContractState:   []Model{{Key: []byte("anyKey"), Value: []byte("anyValue")}},
    92  	}
    93  
    94  	for _, m := range mutators {
    95  		m(&fixture)
    96  	}
    97  	return fixture
    98  }
    99  
   100  func OnlyGenesisFields(info *ContractInfo) {
   101  	info.Created = nil
   102  }
   103  
   104  func ContractInfoFixture(mutators ...func(*ContractInfo)) ContractInfo {
   105  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   106  
   107  	fixture := ContractInfo{
   108  		CodeID:  1,
   109  		Creator: anyAddress,
   110  		Label:   "any",
   111  		Created: &AbsoluteTxPosition{BlockHeight: 1, TxIndex: 1},
   112  	}
   113  
   114  	for _, m := range mutators {
   115  		m(&fixture)
   116  	}
   117  	return fixture
   118  }
   119  
   120  func WithSHA256CodeHash(wasmCode []byte) func(info *CodeInfo) {
   121  	return func(info *CodeInfo) {
   122  		codeHash := sha256.Sum256(wasmCode)
   123  		info.CodeHash = codeHash[:]
   124  	}
   125  }
   126  
   127  func MsgStoreCodeFixture(mutators ...func(*MsgStoreCode)) *MsgStoreCode {
   128  	wasmIdent := []byte("\x00\x61\x73\x6D")
   129  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   130  	r := &MsgStoreCode{
   131  		Sender:                anyAddress,
   132  		WASMByteCode:          wasmIdent,
   133  		InstantiatePermission: &AllowEverybody,
   134  	}
   135  	for _, m := range mutators {
   136  		m(r)
   137  	}
   138  	return r
   139  }
   140  
   141  func MsgInstantiateContractFixture(mutators ...func(*MsgInstantiateContract)) *MsgInstantiateContract {
   142  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   143  	r := &MsgInstantiateContract{
   144  		Sender: anyAddress,
   145  		Admin:  anyAddress,
   146  		CodeID: 1,
   147  		Label:  "testing",
   148  		Msg:    []byte(`{"foo":"bar"}`),
   149  		Funds: sdk.CoinAdapters{{
   150  			Denom:  "stake",
   151  			Amount: sdk.NewInt(1),
   152  		}},
   153  	}
   154  	for _, m := range mutators {
   155  		m(r)
   156  	}
   157  	return r
   158  }
   159  
   160  func MsgExecuteContractFixture(mutators ...func(*MsgExecuteContract)) *MsgExecuteContract {
   161  	const (
   162  		anyAddress           = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   163  		firstContractAddress = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"
   164  	)
   165  	r := &MsgExecuteContract{
   166  		Sender:   anyAddress,
   167  		Contract: firstContractAddress,
   168  		Msg:      []byte(`{"do":"something"}`),
   169  		Funds: sdk.CoinAdapters{{
   170  			Denom:  "stake",
   171  			Amount: sdk.NewInt(1),
   172  		}},
   173  	}
   174  	for _, m := range mutators {
   175  		m(r)
   176  	}
   177  	return r
   178  }
   179  
   180  func StoreCodeProposalFixture(mutators ...func(*StoreCodeProposal)) *StoreCodeProposal {
   181  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   182  	p := &StoreCodeProposal{
   183  		Title:        "Foo",
   184  		Description:  "Bar",
   185  		RunAs:        anyAddress,
   186  		WASMByteCode: []byte{0x0},
   187  	}
   188  	for _, m := range mutators {
   189  		m(p)
   190  	}
   191  	return p
   192  }
   193  
   194  func InstantiateContractProposalFixture(mutators ...func(p *InstantiateContractProposal)) *InstantiateContractProposal {
   195  	var (
   196  		anyValidAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, ContractAddrLen)
   197  
   198  		initMsg = struct {
   199  			Verifier    sdk.AccAddress `json:"verifier"`
   200  			Beneficiary sdk.AccAddress `json:"beneficiary"`
   201  		}{
   202  			Verifier:    anyValidAddress,
   203  			Beneficiary: anyValidAddress,
   204  		}
   205  	)
   206  	const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   207  
   208  	initMsgBz, err := json.Marshal(initMsg)
   209  	if err != nil {
   210  		panic(err)
   211  	}
   212  	p := &InstantiateContractProposal{
   213  		Title:       "Foo",
   214  		Description: "Bar",
   215  		RunAs:       anyAddress,
   216  		Admin:       anyAddress,
   217  		CodeID:      1,
   218  		Label:       "testing",
   219  		Msg:         initMsgBz,
   220  		Funds:       nil,
   221  	}
   222  
   223  	for _, m := range mutators {
   224  		m(p)
   225  	}
   226  	return p
   227  }
   228  
   229  func MigrateContractProposalFixture(mutators ...func(p *MigrateContractProposal)) *MigrateContractProposal {
   230  	var (
   231  		anyValidAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, ContractAddrLen)
   232  
   233  		migMsg = struct {
   234  			Verifier sdk.AccAddress `json:"verifier"`
   235  		}{Verifier: anyValidAddress}
   236  	)
   237  
   238  	migMsgBz, err := json.Marshal(migMsg)
   239  	if err != nil {
   240  		panic(err)
   241  	}
   242  	const (
   243  		contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"
   244  		anyAddress   = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   245  	)
   246  	p := &MigrateContractProposal{
   247  		Title:       "Foo",
   248  		Description: "Bar",
   249  		Contract:    contractAddr,
   250  		CodeID:      1,
   251  		Msg:         migMsgBz,
   252  	}
   253  
   254  	for _, m := range mutators {
   255  		m(p)
   256  	}
   257  	return p
   258  }
   259  
   260  func SudoContractProposalFixture(mutators ...func(p *SudoContractProposal)) *SudoContractProposal {
   261  	const (
   262  		contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"
   263  	)
   264  
   265  	p := &SudoContractProposal{
   266  		Title:       "Foo",
   267  		Description: "Bar",
   268  		Contract:    contractAddr,
   269  		Msg:         []byte(`{"do":"something"}`),
   270  	}
   271  
   272  	for _, m := range mutators {
   273  		m(p)
   274  	}
   275  	return p
   276  }
   277  
   278  func ExecuteContractProposalFixture(mutators ...func(p *ExecuteContractProposal)) *ExecuteContractProposal {
   279  	const (
   280  		contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"
   281  		anyAddress   = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   282  	)
   283  
   284  	p := &ExecuteContractProposal{
   285  		Title:       "Foo",
   286  		Description: "Bar",
   287  		Contract:    contractAddr,
   288  		RunAs:       anyAddress,
   289  		Msg:         []byte(`{"do":"something"}`),
   290  		Funds: sdk.CoinsToCoinAdapters(sdk.Coins{{
   291  			Denom:  "stake",
   292  			Amount: sdk.NewDec(1),
   293  		}}),
   294  	}
   295  
   296  	for _, m := range mutators {
   297  		m(p)
   298  	}
   299  	return p
   300  }
   301  
   302  func UpdateAdminProposalFixture(mutators ...func(p *UpdateAdminProposal)) *UpdateAdminProposal {
   303  	const (
   304  		contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"
   305  		anyAddress   = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"
   306  	)
   307  
   308  	p := &UpdateAdminProposal{
   309  		Title:       "Foo",
   310  		Description: "Bar",
   311  		NewAdmin:    anyAddress,
   312  		Contract:    contractAddr,
   313  	}
   314  	for _, m := range mutators {
   315  		m(p)
   316  	}
   317  	return p
   318  }
   319  
   320  func ClearAdminProposalFixture(mutators ...func(p *ClearAdminProposal)) *ClearAdminProposal {
   321  	const contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"
   322  	p := &ClearAdminProposal{
   323  		Title:       "Foo",
   324  		Description: "Bar",
   325  		Contract:    contractAddr,
   326  	}
   327  	for _, m := range mutators {
   328  		m(p)
   329  	}
   330  	return p
   331  }