Skip to content

Commit

Permalink
move lockable coin from types to keeper package
Browse files Browse the repository at this point in the history
  • Loading branch information
fish-sammy committed Sep 24, 2024
1 parent 92df570 commit 125cd59
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 78 deletions.
3 changes: 1 addition & 2 deletions x/axelarnet/keeper/message_route.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (

"github.com/axelarnetwork/axelar-core/x/axelarnet/types"
nexus "github.com/axelarnetwork/axelar-core/x/nexus/exported"
nexustypes "github.com/axelarnetwork/axelar-core/x/nexus/types"
)

// for IBC execution
Expand Down Expand Up @@ -78,7 +77,7 @@ func escrowAssetToMessageSender(

return asset, bankK.SendCoins(ctx, sender, types.AxelarIBCAccount, sdk.NewCoins(asset))
case nexus.TypeGeneralMessageWithToken:
coin, err := nexustypes.NewCoin(ctx, nexusK, ibcK, bankK, *msg.Asset)
coin, err := nexusK.NewLockableCoin(ctx, ibcK, bankK, *msg.Asset)
if err != nil {
return sdk.Coin{}, err
}
Expand Down
13 changes: 6 additions & 7 deletions x/axelarnet/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/axelarnetwork/axelar-core/x/axelarnet/exported"
"github.com/axelarnetwork/axelar-core/x/axelarnet/types"
nexus "github.com/axelarnetwork/axelar-core/x/nexus/exported"
nexustypes "github.com/axelarnetwork/axelar-core/x/nexus/types"
tss "github.com/axelarnetwork/axelar-core/x/tss/exported"
"github.com/axelarnetwork/utils/funcs"
)
Expand Down Expand Up @@ -80,7 +79,7 @@ func (s msgServer) CallContract(c context.Context, req *types.CallContractReques
})

if req.Fee != nil {
normalizedCoin, err := nexustypes.NewCoin(ctx, s.nexus, s.ibcK, s.bank, req.Fee.Amount)
normalizedCoin, err := s.nexus.NewLockableCoin(ctx, s.ibcK, s.bank, req.Fee.Amount)
if err != nil {
return nil, sdkerrors.Wrap(err, "unrecognized fee denom")
}
Expand All @@ -94,7 +93,7 @@ func (s msgServer) CallContract(c context.Context, req *types.CallContractReques
MessageID: msgID,
Recipient: req.Fee.Recipient,
Fee: req.Fee.Amount,
Asset: normalizedCoin.GetDenom(),
Asset: normalizedCoin.GetCoin().Denom,
}
if req.Fee.RefundRecipient != nil {
feePaidEvent.RefundRecipient = req.Fee.RefundRecipient.String()
Expand Down Expand Up @@ -186,7 +185,7 @@ func (s msgServer) ConfirmDeposit(c context.Context, req *types.ConfirmDepositRe
return nil, fmt.Errorf("recipient chain '%s' is not activated", recipient.Chain.Name)
}

normalizedCoin, err := nexustypes.NewCoin(ctx, s.nexus, s.ibcK, s.bank, coin)
normalizedCoin, err := s.nexus.NewLockableCoin(ctx, s.ibcK, s.bank, coin)
if err != nil {
return nil, err
}
Expand All @@ -195,7 +194,7 @@ func (s msgServer) ConfirmDeposit(c context.Context, req *types.ConfirmDepositRe
return nil, err
}

transferID, err := s.nexus.EnqueueForTransfer(ctx, depositAddr, normalizedCoin.Coin)
transferID, err := s.nexus.EnqueueForTransfer(ctx, depositAddr, normalizedCoin.GetCoin())
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -404,7 +403,7 @@ func (s msgServer) RouteIBCTransfers(c context.Context, _ *types.RouteIBCTransfe
return nil, err
}
for _, p := range pendingTransfers {
coin, err := nexustypes.NewCoin(ctx, s.nexus, s.ibcK, s.bank, p.Asset)
coin, err := s.nexus.NewLockableCoin(ctx, s.ibcK, s.bank, p.Asset)
if err != nil {
s.Logger(ctx).Error(fmt.Sprintf("failed to route IBC transfer %s: %s", p.String(), err))
continue
Expand Down Expand Up @@ -500,7 +499,7 @@ func (s msgServer) RouteMessage(c context.Context, req *types.RouteMessageReques
}

func transfer(ctx sdk.Context, k Keeper, n types.Nexus, b types.BankKeeper, ibc types.IBCKeeper, recipient sdk.AccAddress, coin sdk.Coin) error {
c, err := nexustypes.NewCoin(ctx, n, ibc, b, coin)
c, err := n.NewLockableCoin(ctx, ibc, b, coin)
if err != nil {
return err
}
Expand Down
40 changes: 19 additions & 21 deletions x/axelarnet/message_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"github.com/axelarnetwork/axelar-core/x/axelarnet/keeper"
"github.com/axelarnetwork/axelar-core/x/axelarnet/types"
nexus "github.com/axelarnetwork/axelar-core/x/nexus/exported"
nexustypes "github.com/axelarnetwork/axelar-core/x/nexus/types"
tss "github.com/axelarnetwork/axelar-core/x/tss/exported"
"github.com/axelarnetwork/utils/funcs"
)
Expand Down Expand Up @@ -185,7 +184,7 @@ func OnRecvMessage(ctx sdk.Context, k keeper.Keeper, ibcK keeper.IBCKeeper, n ty
return ack
}

func validateMessage(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.Nexus, ibcPath string, msg Message, token nexustypes.Coin) error {
func validateMessage(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.Nexus, ibcPath string, msg Message, token nexus.LockableCoin) error {
// validate source chain
srcChainName, srcChainFound := ibcK.GetChainNameByIBCPath(ctx, ibcPath)
if !srcChainFound {
Expand All @@ -198,7 +197,7 @@ func validateMessage(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.Nexus, ibcP
}

if msg.Fee != nil {
err := validateFee(ctx, n, token.Coin, nexus.MessageType(msg.Type), srcChain, *msg.Fee)
err := validateFee(ctx, n, token.GetCoin(), nexus.MessageType(msg.Type), srcChain, *msg.Fee)
if err != nil {
return err
}
Expand Down Expand Up @@ -231,20 +230,20 @@ func validateMessage(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.Nexus, ibcP
return fmt.Errorf("unrecognized destination chain %s", destChainName)
}

if !n.IsAssetRegistered(ctx, srcChain, token.GetDenom()) {
return fmt.Errorf("asset %s is not registered on chain %s", token.GetDenom(), srcChain.Name)
if !n.IsAssetRegistered(ctx, srcChain, token.GetCoin().Denom) {
return fmt.Errorf("asset %s is not registered on chain %s", token.GetCoin().Denom, srcChain.Name)
}

if !n.IsAssetRegistered(ctx, destChain, token.GetDenom()) {
return fmt.Errorf("asset %s is not registered on chain %s", token.GetDenom(), destChain.Name)
if !n.IsAssetRegistered(ctx, destChain, token.GetCoin().Denom) {
return fmt.Errorf("asset %s is not registered on chain %s", token.GetCoin().Denom, destChain.Name)
}
return nil
default:
return fmt.Errorf("unrecognized message type")
}
}

func handleMessage(ctx sdk.Context, n types.Nexus, b types.BankKeeper, sourceAddress nexus.CrossChainAddress, msg Message, token nexustypes.Coin) error {
func handleMessage(ctx sdk.Context, n types.Nexus, b types.BankKeeper, sourceAddress nexus.CrossChainAddress, msg Message, token nexus.LockableCoin) error {
id, txID, nonce := n.GenerateMessageID(ctx)

// ignore token for call contract
Expand Down Expand Up @@ -285,7 +284,7 @@ func handleMessage(ctx sdk.Context, n types.Nexus, b types.BankKeeper, sourceAdd
return n.SetNewMessage(ctx, m)
}

func handleMessageWithToken(ctx sdk.Context, n types.Nexus, b types.BankKeeper, sourceAddress nexus.CrossChainAddress, msg Message, token nexustypes.Coin) error {
func handleMessageWithToken(ctx sdk.Context, n types.Nexus, b types.BankKeeper, sourceAddress nexus.CrossChainAddress, msg Message, token nexus.LockableCoin) error {
id, txID, nonce := n.GenerateMessageID(ctx)

token, err := deductFee(ctx, b, msg.Fee, token, id)
Expand All @@ -299,14 +298,15 @@ func handleMessageWithToken(ctx sdk.Context, n types.Nexus, b types.BankKeeper,

destChain := funcs.MustOk(n.GetChain(ctx, nexus.ChainName(msg.DestinationChain)))
recipient := nexus.CrossChainAddress{Chain: destChain, Address: msg.DestinationAddress}
coin := token.GetCoin()
m := nexus.NewGeneralMessage(
id,
sourceAddress,
recipient,
crypto.Keccak256Hash(msg.Payload).Bytes(),
txID,
nonce,
&token.Coin,
&coin,
)

events.Emit(ctx, &types.ContractCallWithTokenSubmitted{
Expand All @@ -317,21 +317,21 @@ func handleMessageWithToken(ctx sdk.Context, n types.Nexus, b types.BankKeeper,
ContractAddress: m.GetDestinationAddress(),
PayloadHash: m.PayloadHash,
Payload: msg.Payload,
Asset: token.Coin,
Asset: token.GetCoin(),
})

return n.SetNewMessage(ctx, m)
}

func handleTokenSent(ctx sdk.Context, n types.Nexus, sourceAddress nexus.CrossChainAddress, msg Message, token nexustypes.Coin) error {
func handleTokenSent(ctx sdk.Context, n types.Nexus, sourceAddress nexus.CrossChainAddress, msg Message, token nexus.LockableCoin) error {
destChain := funcs.MustOk(n.GetChain(ctx, nexus.ChainName(msg.DestinationChain)))
crossChainAddr := nexus.CrossChainAddress{Chain: destChain, Address: msg.DestinationAddress}

if err := token.Lock(ctx, types.AxelarIBCAccount); err != nil {
return err
}

transferID, err := n.EnqueueTransfer(ctx, sourceAddress.Chain, crossChainAddr, token.Coin)
transferID, err := n.EnqueueTransfer(ctx, sourceAddress.Chain, crossChainAddr, token.GetCoin())
if err != nil {
return err
}
Expand All @@ -342,7 +342,7 @@ func handleTokenSent(ctx sdk.Context, n types.Nexus, sourceAddress nexus.CrossCh
SourceChain: sourceAddress.Chain.Name,
DestinationAddress: crossChainAddr.Address,
DestinationChain: crossChainAddr.Chain.Name,
Asset: token.Coin,
Asset: token.GetCoin(),
})

return nil
Expand All @@ -351,7 +351,7 @@ func handleTokenSent(ctx sdk.Context, n types.Nexus, sourceAddress nexus.CrossCh

// extractTokenFromPacketData get normalized token from ICS20 packet
// panic if unable to unmarshal packet data
func extractTokenFromPacketData(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.Nexus, b types.BankKeeper, packet ibcexported.PacketI) (nexustypes.Coin, error) {
func extractTokenFromPacketData(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.Nexus, b types.BankKeeper, packet ibcexported.PacketI) (nexus.LockableCoin, error) {
data := funcs.Must(types.ToICS20Packet(packet))

// parse the transfer amount
Expand Down Expand Up @@ -389,11 +389,11 @@ func extractTokenFromPacketData(ctx sdk.Context, ibcK keeper.IBCKeeper, n types.
denom = denomTrace.IBCDenom()
}

return nexustypes.NewCoin(ctx, n, ibcK, b, sdk.NewCoin(denom, amount))
return n.NewLockableCoin(ctx, ibcK, b, sdk.NewCoin(denom, amount))
}

// deductFee pays the fee and returns the updated transfer amount with the fee deducted
func deductFee(ctx sdk.Context, b types.BankKeeper, fee *Fee, token nexustypes.Coin, msgID string) (nexustypes.Coin, error) {
func deductFee(ctx sdk.Context, b types.BankKeeper, fee *Fee, token nexus.LockableCoin, msgID string) (nexus.LockableCoin, error) {
if fee == nil {
return token, nil
}
Expand All @@ -406,17 +406,15 @@ func deductFee(ctx sdk.Context, b types.BankKeeper, fee *Fee, token nexustypes.C
MessageID: msgID,
Recipient: recipient,
Fee: coin,
Asset: token.GetDenom(),
Asset: token.GetCoin().Denom,
}
if fee.RefundRecipient != nil {
feePaidEvent.RefundRecipient = *fee.RefundRecipient
}
events.Emit(ctx, &feePaidEvent)

// subtract fee from transfer value
token.Amount = token.Amount.Sub(feeAmount)

return token, b.SendCoins(ctx, types.AxelarIBCAccount, recipient, sdk.NewCoins(coin))
return token.Sub(sdk.NewCoin(token.GetCoin().Denom, feeAmount)), b.SendCoins(ctx, types.AxelarIBCAccount, recipient, sdk.NewCoins(coin))
}

// validateReceiver rejects uppercase GMP account address
Expand Down
5 changes: 2 additions & 3 deletions x/axelarnet/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import (
"github.com/axelarnetwork/axelar-core/x/axelarnet/keeper"
"github.com/axelarnetwork/axelar-core/x/axelarnet/types"
nexus "github.com/axelarnetwork/axelar-core/x/nexus/exported"
nexustypes "github.com/axelarnetwork/axelar-core/x/nexus/types"
"github.com/axelarnetwork/utils/funcs"
)

Expand Down Expand Up @@ -343,7 +342,7 @@ func (m AxelarnetIBCModule) setRoutedPacketFailed(ctx sdk.Context, packet channe
// check if the packet is Axelar routed cross chain transfer
transferID, ok := getSeqIDMapping(ctx, m.keeper, port, channel, sequence)
if ok {
coin, err := nexustypes.NewCoin(ctx, m.nexus, m.ibcK, m.bank, funcs.MustOk(m.keeper.GetTransfer(ctx, transferID)).Token)
coin, err := m.nexus.NewLockableCoin(ctx, m.ibcK, m.bank, funcs.MustOk(m.keeper.GetTransfer(ctx, transferID)).Token)
if err != nil {
return err
}
Expand All @@ -369,7 +368,7 @@ func (m AxelarnetIBCModule) setRoutedPacketFailed(ctx sdk.Context, packet channe
// check if the packet is Axelar routed general message
messageID, ok := getSeqMessageIDMapping(ctx, m.keeper, port, channel, sequence)
if ok {
coin, err := nexustypes.NewCoin(ctx, m.nexus, m.ibcK, m.bank, extractTokenFromAckOrTimeoutPacket(packet))
coin, err := m.nexus.NewLockableCoin(ctx, m.ibcK, m.bank, extractTokenFromAckOrTimeoutPacket(packet))
if err != nil {
return err
}
Expand Down
9 changes: 4 additions & 5 deletions x/axelarnet/types/evm_translator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ var (
addressType = funcs.Must(abi.NewType("address", "address", nil))
stringType = funcs.Must(abi.NewType("string", "string", nil))
bytesType = funcs.Must(abi.NewType("bytes", "bytes", nil))
bytes32Type = funcs.Must(abi.NewType("bytes32", "bytes32", nil))
uint8Type = funcs.Must(abi.NewType("uint8", "uint8", nil))
uint64Type = funcs.Must(abi.NewType("uint64", "uint64", nil))
uint64ArrayType = funcs.Must(abi.NewType("uint64[]", "uint64[]", nil))
Expand Down Expand Up @@ -173,23 +172,23 @@ func TestConstructWasmMessageV1Large(t *testing.T) {
assert.True(t, ok)
assert.Equal(t, boolTrue, actualBool)

arrayInterface, ok := executeMsg["string_array"].([]interface{})
arrayInterface, _ := executeMsg["string_array"].([]interface{})
actualStringArray := slices.Map(arrayInterface, func(t interface{}) string { return t.(string) })
assert.Equal(t, stringArray, actualStringArray)

arrayInterface, ok = executeMsg["uint64_array"].([]interface{})
arrayInterface, _ = executeMsg["uint64_array"].([]interface{})
uint64StrArray := slices.Map(arrayInterface, func(t interface{}) string { return t.(json.Number).String() })
assert.Equal(t, uint64Array, slices.Map(uint64StrArray, func(t string) uint64 { return funcs.Must(strconv.ParseUint(t, 10, 64)) }))

arrayInterface, ok = executeMsg["uint64_array_nested"].([]interface{})
arrayInterface, _ = executeMsg["uint64_array_nested"].([]interface{})
actualUint64NestedArray := slices.Map(arrayInterface, func(inner interface{}) []uint64 {
return slices.Map(inner.([]interface{}), func(t interface{}) uint64 {
return funcs.Must(strconv.ParseUint(t.(json.Number).String(), 10, 64))
})
})
assert.Equal(t, uint64NestedArray, actualUint64NestedArray)

arrayInterface, ok = executeMsg["string_array_nested"].([]interface{})
arrayInterface, _ = executeMsg["string_array_nested"].([]interface{})
actualStringNestedArray := slices.Map(arrayInterface, func(inner interface{}) []string {
return slices.Map(inner.([]interface{}), func(t interface{}) string {
return t.(string)
Expand Down
1 change: 1 addition & 0 deletions x/axelarnet/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ type Nexus interface {
SetMessageFailed(ctx sdk.Context, id string) error
GenerateMessageID(ctx sdk.Context) (string, []byte, uint64)
ValidateAddress(ctx sdk.Context, address nexus.CrossChainAddress) error
NewLockableCoin(ctx sdk.Context, ibc nexustypes.IBCKeeper, bank nexustypes.BankKeeper, coin sdk.Coin) (nexus.LockableCoin, error)
}

// BankKeeper defines the expected interface contract the vesting module requires
Expand Down
Loading

0 comments on commit 125cd59

Please sign in to comment.