package keeper import ( "math/big" errorsmod "cosmossdk.io/errors" "github.com/0glabs/0g-chain/x/evmutil/types" ) var ( bep3Denoms = map[string]bool{ "bnb": true, "busd": true, "btcb": true, "xrpb": true, } bep3ConversionFactor = new(big.Int).Exp(big.NewInt(10), big.NewInt(10), nil) ) func isBep3Asset(denom string) bool { return bep3Denoms[denom] } // convertBep3CoinAmountToERC20Amount converts a bep3 coin amount with 8 decimals // to the equivalent ERC20 token with 18 decimals. func convertBep3CoinAmountToERC20Amount(amount *big.Int) (erc20Amount *big.Int) { return new(big.Int).Mul(amount, bep3ConversionFactor) } // convertBep3ERC20AmountToCoinAmount converts a bep3 ERC20 token with 18 decimals // to the equivalent coin amount with 8 decimals, and dropping the remainder. func convertBep3ERC20AmountToCoinAmount(amount *big.Int) (coinAmount *big.Int) { return new(big.Int).Div(amount, bep3ConversionFactor) } // bep3ERC20AmountToCoinMintAndERC20LockAmount converts 18 decimals erc20 bep3 // amount to the equivalent 8 decimals coin amount to mint, and the // 18 decimals erc20 bep3 amount to lock for the converted coin amount. func bep3ERC20AmountToCoinMintAndERC20LockAmount(amount *big.Int) ( amountToMint *big.Int, amountToLock *big.Int, err error, ) { amountToMint = convertBep3ERC20AmountToCoinAmount(amount) // make sure we have at least 1 sdk.Coin to mint if amountToMint.Cmp(big.NewInt(0)) == 0 { err := errorsmod.Wrapf( types.ErrInsufficientConversionAmount, "unable to convert bep3 coin due converting less than 1 native unit", ) return nil, nil, err } amountToLock = convertBep3CoinAmountToERC20Amount(amountToMint) return amountToMint, amountToLock, nil }