diff --git a/modules/token/keeper/erc20.go b/modules/token/keeper/erc20.go index 4c2d6977..99184532 100644 --- a/modules/token/keeper/erc20.go +++ b/modules/token/keeper/erc20.go @@ -51,7 +51,7 @@ func (k Keeper) DeployERC20( if err != nil { return common.Address{}, errorsmod.Wrapf(types.ErrABIPack, "erc20 metadata is invalid %s: %s", name, err.Error()) } - deployer := k.moduleAddress() + deployer := k.getModuleEthAddress(ctx) data := make([]byte, len(contracts.ERC20TokenContract.Bin)+len(contractArgs)) copy(data[:len(contracts.ERC20TokenContract.Bin)], contracts.ERC20TokenContract.Bin) @@ -205,7 +205,7 @@ func (k Keeper) MintERC20( } abi := contracts.ERC20TokenContract.ABI - res, err := k.CallEVM(ctx, abi, k.moduleAddress(), contract, true, contracts.MethodMint, to, amount) + res, err := k.CallEVM(ctx, abi, k.getModuleEthAddress(ctx), contract, true, contracts.MethodMint, to, amount) if err != nil { return err } @@ -263,7 +263,7 @@ func (k Keeper) BurnERC20( } abi := contracts.ERC20TokenContract.ABI - res, err := k.CallEVM(ctx, abi, k.moduleAddress(), contract, true, contracts.MethodBurn, from, amount) + res, err := k.CallEVM(ctx, abi, k.getModuleEthAddress(ctx), contract, true, contracts.MethodBurn, from, amount) if err != nil { return err } @@ -302,7 +302,7 @@ func (k Keeper) BalanceOf( contract, account common.Address, ) (*big.Int, error) { abi := contracts.ERC20TokenContract.ABI - res, err := k.CallEVM(ctx, abi, k.moduleAddress(), contract, false, contracts.MethodBalanceOf, account) + res, err := k.CallEVM(ctx, abi, k.getModuleEthAddress(ctx), contract, false, contracts.MethodBalanceOf, account) if err != nil { return nil, err } @@ -320,9 +320,9 @@ func (k Keeper) BalanceOf( return balance, nil } -func (k Keeper) moduleAddress() common.Address { - moduleAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) - return common.BytesToAddress(moduleAddr.Bytes()) +func (k Keeper) getModuleEthAddress(ctx sdk.Context) common.Address { + moduleAccount := k.accountKeeper.GetModuleAccount(ctx,types.ModuleName) + return common.BytesToAddress(moduleAccount.GetAddress().Bytes()) } func (k Keeper) buildERC20Token( diff --git a/modules/token/keeper/grpc_query.go b/modules/token/keeper/grpc_query.go index 5160bfff..b651af7a 100644 --- a/modules/token/keeper/grpc_query.go +++ b/modules/token/keeper/grpc_query.go @@ -244,7 +244,7 @@ func (k Keeper) Balances(c context.Context, req *v1.QueryBalancesRequest) (*v1.Q if err != nil { return nil, status.Error(codes.Internal, err.Error()) } - balances = balances.Add(sdk.NewCoin(token.GetContract(), sdkmath.NewIntFromBigInt(erc20Balance))) + balances = balances.Add(sdk.NewCoin("erc20/"+token.GetContract(), sdkmath.NewIntFromBigInt(erc20Balance))) } return &v1.QueryBalancesResponse{Balances: balances}, nil } diff --git a/modules/token/keeper/msg_server.go b/modules/token/keeper/msg_server.go index 59db1ca1..f3598a56 100644 --- a/modules/token/keeper/msg_server.go +++ b/modules/token/keeper/msg_server.go @@ -2,7 +2,6 @@ package keeper import ( "context" - "encoding/hex" errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" @@ -318,12 +317,7 @@ func (m msgServer) SwapToERC20(goCtx context.Context, msg *v1.MsgSwapToERC20) (* return nil, err } - bz, err := hex.DecodeString(msg.Receiver) - if err != nil { - return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "expecting a hex address of 0x, got %s", msg.Receiver) - } - receiver := common.BytesToAddress(bz) - + receiver := common.HexToAddress(msg.Receiver) if err := m.k.SwapToERC20(ctx, sender, receiver, msg.Amount); err != nil { return nil, err } diff --git a/modules/token/types/expected_keepers.go b/modules/token/types/expected_keepers.go index 9f46852a..d091a489 100644 --- a/modules/token/types/expected_keepers.go +++ b/modules/token/types/expected_keepers.go @@ -54,6 +54,7 @@ type AccountKeeper interface { GetModuleAddress(moduleName string) sdk.AccAddress GetSequence(sdk.Context, sdk.AccAddress) (uint64, error) GetAccount(sdk.Context, sdk.AccAddress) authtypes.AccountI + GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI } // EVMKeeper defines the expected keeper of the evm module diff --git a/modules/token/types/v1/msgs.go b/modules/token/types/v1/msgs.go index 46471994..cff0b48e 100644 --- a/modules/token/types/v1/msgs.go +++ b/modules/token/types/v1/msgs.go @@ -7,6 +7,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/ethereum/go-ethereum/common" tokentypes "github.com/irisnet/irismod/modules/token/types" ) @@ -420,8 +421,8 @@ func (m *MsgSwapToERC20) ValidateBasic() error { return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid sender address (%s)", err) } - if tokentypes.IsValidEthAddress(m.Receiver) { - return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "expecting a hex address of 0x, got %s", m.Receiver) + if !common.IsHexAddress(m.Receiver) { + return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "expecting a hex address, got %s", m.Receiver) } if !m.Amount.IsValid() { diff --git a/modules/token/types/validation.go b/modules/token/types/validation.go index 3a58eb10..24d477b9 100644 --- a/modules/token/types/validation.go +++ b/modules/token/types/validation.go @@ -51,10 +51,8 @@ var ( regexpMinUintFmt = fmt.Sprintf("^[a-z][a-z0-9]{%d,%d}$", MinimumMinUnitLen-1, MaximumMinUnitLen-1) regexpMinUint = regexp.MustCompile(regexpMinUintFmt).MatchString - regexpEthAddressLowerStr = "^0x[0-9a-f]{40}$" - regexpEthAddressUpperStr = "^0x[0-9A-F]{40}$" - regexpEthAddressLower = regexp.MustCompile(regexpEthAddressLowerStr).MatchString - regexpEthAddressUpper = regexp.MustCompile(regexpEthAddressUpperStr).MatchString + regexpEthAddressStr = "^0x[0-9a-f]{40}$" + regexpEthAddress = regexp.MustCompile(regexpEthAddressStr).MatchString ) // ValidateInitialSupply verifies whether the initial supply is legal @@ -120,9 +118,3 @@ func ValidateCoin(coin sdk.Coin) error { } return ValidateMinUnit(coin.Denom) } - -// IsValidEthAddress checks if the given address is valid ethereum address -func IsValidEthAddress(address string) bool { - address = strings.ToLower(address) - return regexpEthAddressLower(address) || regexpEthAddressUpper(address) -}