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 }