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

     1  package proxy
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	apptypes "github.com/fibonacci-chain/fbc/app/types"
     8  	types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types"
     9  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    11  	authexported "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/exported"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    13  	capabilitytypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/types"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/params"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    17  	supplyexported "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/exported"
    18  	"github.com/fibonacci-chain/fbc/libs/tendermint/global"
    19  	"github.com/fibonacci-chain/fbc/x/ammswap"
    20  	dex "github.com/fibonacci-chain/fbc/x/dex/types"
    21  	distr "github.com/fibonacci-chain/fbc/x/distribution"
    22  	"github.com/fibonacci-chain/fbc/x/farm"
    23  	"github.com/fibonacci-chain/fbc/x/gov"
    24  	"github.com/fibonacci-chain/fbc/x/order"
    25  	"github.com/fibonacci-chain/fbc/x/staking"
    26  	token "github.com/fibonacci-chain/fbc/x/token/types"
    27  	"github.com/fibonacci-chain/fbc/x/wasm/types"
    28  	"github.com/fibonacci-chain/fbc/x/wasm/watcher"
    29  )
    30  
    31  const (
    32  	accountBytesLen = 80
    33  )
    34  
    35  var gasConfig = types2.KVGasConfig()
    36  
    37  // AccountKeeperProxy defines the expected account keeper interface
    38  type AccountKeeperProxy struct {
    39  	cachedAcc map[string]*apptypes.EthAccount
    40  }
    41  
    42  func NewAccountKeeperProxy() AccountKeeperProxy {
    43  	return AccountKeeperProxy{}
    44  }
    45  
    46  func (a AccountKeeperProxy) SetObserverKeeper(observer auth.ObserverI) {}
    47  
    48  func (a AccountKeeperProxy) NewAccountWithAddress(ctx sdk.Context, addr sdk.AccAddress) authexported.Account {
    49  	ctx.GasMeter().ConsumeGas(3066, "AccountKeeperProxy NewAccountWithAddress")
    50  	acc := apptypes.EthAccount{
    51  		BaseAccount: &auth.BaseAccount{
    52  			Address: addr,
    53  		},
    54  	}
    55  	return &acc
    56  }
    57  
    58  func (a AccountKeeperProxy) GetAllAccounts(ctx sdk.Context) (accounts []authexported.Account) {
    59  	return nil
    60  }
    61  
    62  func (a AccountKeeperProxy) IterateAccounts(ctx sdk.Context, cb func(account authexported.Account) bool) {
    63  }
    64  
    65  func (a AccountKeeperProxy) GetAccount(ctx sdk.Context, addr sdk.AccAddress) authexported.Account {
    66  	ctx.GasMeter().ConsumeGas(gasConfig.ReadCostFlat, types2.GasReadCostFlatDesc)
    67  	ctx.GasMeter().ConsumeGas(gasConfig.ReadCostPerByte*accountBytesLen, types2.GasReadPerByteDesc)
    68  	acc, ok := a.cachedAcc[addr.String()]
    69  	if ok {
    70  		return acc
    71  	}
    72  	return nil
    73  }
    74  
    75  func (a AccountKeeperProxy) SetAccount(ctx sdk.Context, account authexported.Account) {
    76  	acc, ok := account.(*apptypes.EthAccount)
    77  	if !ok {
    78  		return
    79  	}
    80  	// delay to make
    81  	if a.cachedAcc == nil {
    82  		a.cachedAcc = make(map[string]*apptypes.EthAccount)
    83  	}
    84  	a.cachedAcc[account.GetAddress().String()] = acc
    85  	ctx.GasMeter().ConsumeGas(gasConfig.WriteCostFlat, types2.GasWriteCostFlatDesc)
    86  	ctx.GasMeter().ConsumeGas(gasConfig.WriteCostPerByte*accountBytesLen, types2.GasWritePerByteDesc)
    87  	return
    88  }
    89  
    90  func (a AccountKeeperProxy) RemoveAccount(ctx sdk.Context, account authexported.Account) {
    91  	delete(a.cachedAcc, account.GetAddress().String())
    92  	ctx.GasMeter().ConsumeGas(gasConfig.DeleteCost, types2.GasDeleteDesc)
    93  }
    94  
    95  type SubspaceProxy struct{}
    96  
    97  func (s SubspaceProxy) GetParamSet(ctx sdk.Context, ps params.ParamSet) {
    98  	ctx.GasMeter().ConsumeGas(2111, "SubspaceProxy GetParamSet")
    99  	if wasmParams, ok := ps.(*types.Params); ok {
   100  		wps := watcher.GetParams()
   101  		wasmParams.CodeUploadAccess = wps.CodeUploadAccess
   102  		wasmParams.InstantiateDefaultPermission = wps.InstantiateDefaultPermission
   103  	}
   104  }
   105  func (s SubspaceProxy) SetParamSet(ctx sdk.Context, ps params.ParamSet) {}
   106  
   107  type BankKeeperProxy struct {
   108  	blacklistedAddrs map[string]bool
   109  	akp              AccountKeeperProxy
   110  }
   111  
   112  func NewBankKeeperProxy(akp AccountKeeperProxy) BankKeeperProxy {
   113  	modAccAddrs := make(map[string]bool)
   114  	maccPerms := map[string][]string{
   115  		auth.FeeCollectorName:     nil,
   116  		distr.ModuleName:          nil,
   117  		mint.ModuleName:           {supply.Minter},
   118  		staking.BondedPoolName:    {supply.Burner, supply.Staking},
   119  		staking.NotBondedPoolName: {supply.Burner, supply.Staking},
   120  		gov.ModuleName:            nil,
   121  		token.ModuleName:          {supply.Minter, supply.Burner},
   122  		dex.ModuleName:            nil,
   123  		order.ModuleName:          nil,
   124  		ammswap.ModuleName:        {supply.Minter, supply.Burner},
   125  		farm.ModuleName:           nil,
   126  		farm.YieldFarmingAccount:  nil,
   127  		farm.MintFarmingAccount:   {supply.Burner},
   128  	}
   129  
   130  	for acc := range maccPerms {
   131  		modAccAddrs[supply.NewModuleAddress(acc).String()] = true
   132  	}
   133  	return BankKeeperProxy{
   134  		blacklistedAddrs: modAccAddrs,
   135  		akp:              akp,
   136  	}
   137  }
   138  
   139  func (b BankKeeperProxy) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins {
   140  	acc, err := watcher.GetAccount(addr)
   141  	if err == nil {
   142  		return acc.GetCoins()
   143  	}
   144  
   145  	bs, err := clientCtx.Codec.MarshalJSON(auth.NewQueryAccountParams(addr.Bytes()))
   146  	if err != nil {
   147  		log.Println("GetAllBalances marshal json error", err)
   148  		return sdk.NewCoins()
   149  	}
   150  	res, _, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", auth.QuerierRoute, auth.QueryAccount), bs)
   151  	if err != nil {
   152  		log.Println("GetAllBalances query with data error", err)
   153  		return sdk.NewCoins()
   154  	}
   155  	var account apptypes.EthAccount
   156  	err = clientCtx.Codec.UnmarshalJSON(res, &account)
   157  	if err != nil {
   158  		log.Println("GetAllBalances unmarshal json error", err)
   159  		return sdk.NewCoins()
   160  	}
   161  
   162  	if err = watcher.SetAccount(&account); err != nil {
   163  		log.Println("GetAllBalances save account error", err)
   164  	}
   165  
   166  	return account.GetCoins()
   167  }
   168  
   169  func (b BankKeeperProxy) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin {
   170  	coins := b.GetAllBalances(ctx, addr)
   171  	return sdk.Coin{
   172  		Amount: coins.AmountOf(denom),
   173  		Denom:  denom,
   174  	}
   175  }
   176  
   177  func (b BankKeeperProxy) IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error {
   178  	if b.GetSendEnabled(ctx) {
   179  		return bank.ErrSendDisabled
   180  	}
   181  	return nil
   182  }
   183  
   184  func (b BankKeeperProxy) GetSendEnabled(ctx sdk.Context) bool {
   185  	ctx.GasMeter().ConsumeGas(1012, "BankKeeperProxy GetSendEnabled")
   186  	return global.Manager.GetSendEnabled()
   187  }
   188  
   189  func (b BankKeeperProxy) BlockedAddr(addr sdk.AccAddress) bool {
   190  	return b.BlacklistedAddr(addr)
   191  }
   192  
   193  func (b BankKeeperProxy) BlacklistedAddr(addr sdk.AccAddress) bool {
   194  	return b.blacklistedAddrs[addr.String()]
   195  }
   196  
   197  func (b BankKeeperProxy) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error {
   198  	ctx.GasMeter().ConsumeGas(16748, "BankKeeperProxy SendCoins")
   199  	return nil
   200  }
   201  
   202  type SupplyKeeperProxy struct{}
   203  
   204  func (s SupplyKeeperProxy) GetSupply(ctx sdk.Context) supplyexported.SupplyI {
   205  	//TODO: cache total supply in watchDB
   206  	//rarely used, so just query from chain db
   207  	tsParams := supply.NewQueryTotalSupplyParams(1, 0) // no pagination
   208  	bz, err := clientCtx.Codec.MarshalJSON(tsParams)
   209  	if err != nil {
   210  		return supply.DefaultSupply()
   211  	}
   212  
   213  	res, _, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", supply.QuerierRoute, supply.QueryTotalSupply), bz)
   214  	if err != nil {
   215  		return supply.DefaultSupply()
   216  	}
   217  
   218  	var totalSupply sdk.Coins
   219  	err = clientCtx.Codec.UnmarshalJSON(res, &totalSupply)
   220  	if err != nil {
   221  		return supply.DefaultSupply()
   222  	}
   223  	return supply.Supply{
   224  		Total: totalSupply,
   225  	}
   226  }
   227  
   228  type CapabilityKeeperProxy struct{}
   229  
   230  func (c CapabilityKeeperProxy) GetCapability(ctx sdk.Context, name string) (*capabilitytypes.Capability, bool) {
   231  	return nil, false
   232  }
   233  
   234  func (c CapabilityKeeperProxy) ClaimCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) error {
   235  	return nil
   236  }
   237  
   238  func (c CapabilityKeeperProxy) AuthenticateCapability(ctx sdk.Context, capability *capabilitytypes.Capability, name string) bool {
   239  	return false
   240  }
   241  
   242  type PortKeeperProxy struct{}
   243  
   244  func (p PortKeeperProxy) BindPort(ctx sdk.Context, portID string) *capabilitytypes.Capability {
   245  	return nil
   246  }