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

     1  package wasm
     2  
     3  import (
     4  	"github.com/fibonacci-chain/fbc/app/rpc/simulator"
     5  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp"
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     7  	types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
     8  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    10  	"github.com/fibonacci-chain/fbc/x/wasm/keeper"
    11  	"github.com/fibonacci-chain/fbc/x/wasm/proxy"
    12  	"github.com/fibonacci-chain/fbc/x/wasm/types"
    13  )
    14  
    15  type Simulator struct {
    16  	handler sdk.Handler
    17  	ctx     sdk.Context
    18  	k       *keeper.Keeper
    19  }
    20  
    21  func NewWasmSimulator() simulator.Simulator {
    22  	k := NewProxyKeeper()
    23  	h := NewHandler(keeper.NewDefaultPermissionKeeper(k))
    24  	ctx := proxy.MakeContext(k.GetStoreKey())
    25  	return &Simulator{
    26  		handler: h,
    27  		k:       &k,
    28  		ctx:     ctx,
    29  	}
    30  }
    31  
    32  func (w *Simulator) Simulate(msgs []sdk.Msg) (*sdk.Result, error) {
    33  	//wasm Result has no Logs
    34  	data := make([]byte, 0, len(msgs))
    35  	events := sdk.EmptyEvents()
    36  
    37  	for _, msg := range msgs {
    38  		res, err := w.handler(w.ctx, msg)
    39  		if err != nil {
    40  			return nil, err
    41  		}
    42  		data = append(data, res.Data...)
    43  		events = events.AppendEvents(res.Events)
    44  	}
    45  	return &sdk.Result{
    46  		Data:   data,
    47  		Events: events,
    48  	}, nil
    49  }
    50  
    51  func (w *Simulator) Context() *sdk.Context {
    52  	return &w.ctx
    53  }
    54  
    55  func NewProxyKeeper() keeper.Keeper {
    56  	cdc := codec.New()
    57  	RegisterCodec(cdc)
    58  	bank.RegisterCodec(cdc)
    59  	interfaceReg := types2.NewInterfaceRegistry()
    60  	RegisterInterfaces(interfaceReg)
    61  	bank.RegisterInterface(interfaceReg)
    62  	protoCdc := codec.NewProtoCodec(interfaceReg)
    63  
    64  	ss := proxy.SubspaceProxy{}
    65  	akp := proxy.NewAccountKeeperProxy()
    66  	bkp := proxy.NewBankKeeperProxy(akp)
    67  	pkp := proxy.PortKeeperProxy{}
    68  	ckp := proxy.CapabilityKeeperProxy{}
    69  	skp := proxy.SupplyKeeperProxy{}
    70  	msgRouter := baseapp.NewMsgServiceRouter()
    71  	msgRouter.SetInterfaceRegistry(interfaceReg)
    72  	queryRouter := baseapp.NewGRPCQueryRouter()
    73  	queryRouter.SetInterfaceRegistry(interfaceReg)
    74  
    75  	k := keeper.NewSimulateKeeper(codec.NewCodecProxy(protoCdc, cdc), sdk.NewKVStoreKey(StoreKey), ss, akp, bkp, nil, pkp, ckp, nil, msgRouter, queryRouter, WasmDir(), WasmConfig(), SupportedFeatures)
    76  	types.RegisterMsgServer(msgRouter, keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(k)))
    77  	types.RegisterQueryServer(queryRouter, NewQuerier(&k))
    78  	bank.RegisterBankMsgServer(msgRouter, bank.NewMsgServerImpl(bkp))
    79  	bank.RegisterQueryServer(queryRouter, bank.NewBankQueryServer(bkp, skp))
    80  	return k
    81  }