Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests(erc20): add erc20 query tests #2023

Merged
merged 28 commits into from
Nov 9, 2023
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
877d281
add name query tests
MalteHerrmann Nov 8, 2023
949c7ac
extract getting the base denom from IBC voucher to own method
MalteHerrmann Nov 8, 2023
0fda882
Add check for empty denom in symbol query
MalteHerrmann Nov 9, 2023
3799780
add symbol tests
MalteHerrmann Nov 9, 2023
20c83eb
add decimals tests
MalteHerrmann Nov 9, 2023
faf6afe
return error for unexpected denom prefix in decimals query
MalteHerrmann Nov 9, 2023
b965ac0
fix iterating through metadata denom units
MalteHerrmann Nov 9, 2023
adc3919
fix decimals tests
MalteHerrmann Nov 9, 2023
6ad3152
add more decimals test cases
MalteHerrmann Nov 9, 2023
0bfac57
add changelog entry
MalteHerrmann Nov 9, 2023
1d811a1
Merge branch 'main' into malte/add-erc20-query-tests
MalteHerrmann Nov 9, 2023
163660a
fix tests after inflation v1 rename and slight adjustments
MalteHerrmann Nov 9, 2023
8780ccd
address linter
MalteHerrmann Nov 9, 2023
e0965a5
Merge branch 'main' into malte/add-erc20-query-tests
MalteHerrmann Nov 9, 2023
8f4767b
run make format
MalteHerrmann Nov 9, 2023
e686d1b
Merge branch 'main' into malte/add-erc20-query-tests
0xstepit Nov 9, 2023
b79bd0b
remove checks to empty denomination
MalteHerrmann Nov 9, 2023
37d476c
throw error if display denom not found in metadata
MalteHerrmann Nov 9, 2023
1c6c474
add total supply tests
MalteHerrmann Nov 9, 2023
d69ae15
add balance of tests
MalteHerrmann Nov 9, 2023
7a41acb
add allowance tests
MalteHerrmann Nov 9, 2023
8276634
remove TODO
MalteHerrmann Nov 9, 2023
4a9c569
Update precompiles/erc20/query_test.go
MalteHerrmann Nov 9, 2023
1d3cd50
refactor output checking for query tests
MalteHerrmann Nov 9, 2023
de543de
move requireOut to test utils
MalteHerrmann Nov 9, 2023
1b6bd3c
split name&symbol tests from decimals tests
MalteHerrmann Nov 9, 2023
9cf075b
fix doc comment
MalteHerrmann Nov 9, 2023
51a81b2
Merge branch 'main' into malte/add-erc20-query-tests
MalteHerrmann Nov 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
- (osmosis-outpost) [#2011](https://github.com/evmos/evmos/pull/2011) Update outpost swap ABI to return IBC next sequence.
- (utils) [#2010](https://github.com/evmos/evmos/pull/2010) Add utils function to create ibc denom trace.
- (osmosis-outpost) [#2017](https://github.com/evmos/evmos/pull/2017) Refactor types, errors and precompile struct.
- (erc20) [#2023](https://github.com/evmos/evmos/pull/2023) Add tests for ERC20 precompile queries.

### Bug Fixes

Expand Down
48 changes: 37 additions & 11 deletions precompiles/erc20/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
"github.com/evmos/evmos/v15/precompiles/authorization"
auth "github.com/evmos/evmos/v15/precompiles/authorization"
transferkeeper "github.com/evmos/evmos/v15/x/ibc/transfer/keeper"

"github.com/ethereum/go-ethereum/accounts/abi"
Expand Down Expand Up @@ -51,26 +51,42 @@ func (p Precompile) Name(
method *abi.Method,
_ []interface{},
) ([]byte, error) {
// TODO: is this actually necessary here? It won't be possible to register a token
// with an empty denomination right? So calling this with an empty denom also won't happen..
if p.tokenPair.Denom == "" {
return nil, errors.New("denom cannot be empty")
}

MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
metadata, found := p.bankKeeper.GetDenomMetaData(ctx, p.tokenPair.Denom)
if found {
return method.Outputs.Pack(metadata.Name)
}

baseDenom, err := p.getBaseDenomFromIBCVoucher(ctx, p.tokenPair.Denom)
if err != nil {
return nil, err
}

name := strings.ToUpper(string(baseDenom[1])) + baseDenom[2:]
return method.Outputs.Pack(name)
}

// getBaseDenom returns the base denomination from the given IBC voucher denomination.
MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
func (p Precompile) getBaseDenomFromIBCVoucher(ctx sdk.Context, denom string) (string, error) {
// Infer the denomination name from the coin denomination base denom
denomTrace, err := GetDenomTrace(p.transferKeeper, ctx, p.tokenPair.Denom)
denomTrace, err := GetDenomTrace(p.transferKeeper, ctx, denom)
if err != nil {
// FIXME: return 'not supported' (same error as when you call the method on an ERC20.sol)
return nil, err
return "", err
}

// safety check
if len(denomTrace.BaseDenom) < 3 {
// FIXME: return not supported (same error as when you call the method on an ERC20.sol)
return nil, nil
return "", fmt.Errorf("invalid base denomination; should be at least length 3; got: %q", denomTrace.BaseDenom)
MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
}

name := strings.ToUpper(string(denomTrace.BaseDenom[1])) + denomTrace.BaseDenom[2:]
return method.Outputs.Pack(name)
return denomTrace.BaseDenom, nil
}

// Symbol returns the symbol of the token. If the token metadata is registered in the
Expand All @@ -83,6 +99,12 @@ func (p Precompile) Symbol(
method *abi.Method,
_ []interface{},
) ([]byte, error) {
// TODO: added this check here, do we want that? It won't be possible to register a token
// with an empty denomination right? So calling this with an empty denom also won't happen..
if p.tokenPair.Denom == "" {
return nil, errors.New("denom cannot be empty")
}

MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
metadata, found := p.bankKeeper.GetDenomMetaData(ctx, p.tokenPair.Denom)
if found {
return method.Outputs.Pack(metadata.Symbol)
Expand All @@ -97,7 +119,7 @@ func (p Precompile) Symbol(
// safety check
if len(denomTrace.BaseDenom) < 3 {
// FIXME: return not supported (same error as when you call the method on an ERC20.sol)
return nil, nil
return nil, fmt.Errorf("invalid base denomination; should be at least length 3; got: %q", denomTrace.BaseDenom)
MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
}

symbol := strings.ToUpper(denomTrace.BaseDenom[1:])
Expand Down Expand Up @@ -130,11 +152,15 @@ func (p Precompile) Decimals(
return method.Outputs.Pack(uint8(18))
}
// FIXME: return not supported (same error as when you call the method on an ERC20.sol)
return nil, nil
return nil, fmt.Errorf(
"invalid base denomination; should be either micro ('u[...]') or atto ('a[...]'); got: %q",
MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
denomTrace.BaseDenom,
)
}

var decimals uint32
for i := len(metadata.DenomUnits); i >= 0; i-- {
for i := len(metadata.DenomUnits) - 1; i >= 0; i-- {
// TODO: return error here if display denom is not found?
MalteHerrmann marked this conversation as resolved.
Show resolved Hide resolved
if metadata.DenomUnits[i].Denom == metadata.Display {
decimals = metadata.DenomUnits[i].Exponent
break
Expand All @@ -145,7 +171,7 @@ func (p Precompile) Decimals(
return nil, errors.New("uint8 overflow: invalid decimals")
}

return method.Outputs.Pack(uint8(decimals)) //#nosec G701
return method.Outputs.Pack(uint8(decimals)) //#nosec G701 // we are checking for overflow above
}

// TotalSupply returns the amount of tokens in existence. It fetches the supply
Expand Down Expand Up @@ -238,7 +264,7 @@ func GetAuthzAndAllowance(
grantee, granter common.Address,
denom string,
) (authz.Authorization, *big.Int, error) {
authorization, _, err := authorization.CheckAuthzExists(ctx, authzKeeper, grantee, granter, SendMsgURL)
authorization, _, err := auth.CheckAuthzExists(ctx, authzKeeper, grantee, granter, SendMsgURL)
// TODO: return error if doesn't exist?
if err != nil {
return nil, common.Big0, err
Expand Down