-
Notifications
You must be signed in to change notification settings - Fork 12
/
hook_transfer.go
64 lines (56 loc) · 2.27 KB
/
hook_transfer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package keeper
import (
"github.com/armon/go-metrics"
"github.com/cosmos/cosmos-sdk/telemetry"
sdk "github.com/cosmos/cosmos-sdk/types"
fxtypes "github.com/functionx/fx-core/v3/types"
"github.com/functionx/fx-core/v3/x/erc20/types"
)
func (h Hooks) HookTransferEvent(ctx sdk.Context, relayTransfers []types.RelayTransfer) error {
fip20ABI := fxtypes.GetERC20().ABI
for _, relay := range relayTransfers {
h.k.Logger(ctx).Info("relay token", "from", relay.From.Hex(), "amount", relay.Amount.String(), "denom", relay.Denom, "token", relay.TokenContract)
// create the corresponding sdk.Coin that is paired with FIP20
coins := sdk.Coins{{Denom: relay.Denom, Amount: sdk.NewIntFromBigInt(relay.Amount)}}
switch relay.ContractOwner {
case types.OWNER_MODULE: // native coin
if _, err := h.k.CallEVM(ctx, fip20ABI, h.k.moduleAddress, relay.TokenContract, true, "burn", h.k.moduleAddress, relay.Amount); err != nil {
return err
}
if relay.Denom == fxtypes.DefaultDenom {
if err := h.k.bankKeeper.SendCoinsFromAccountToModule(ctx, relay.TokenContract.Bytes(), types.ModuleName, coins); err != nil {
return err
}
}
case types.OWNER_EXTERNAL: // native coin
if err := h.k.bankKeeper.MintCoins(ctx, types.ModuleName, coins); err != nil {
return err
}
default:
return types.ErrUndefinedOwner
}
// sender receive relay amount
recipient := sdk.AccAddress(relay.From.Bytes())
if err := h.k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipient, coins); err != nil {
return err
}
ctx.EventManager().EmitEvent(sdk.NewEvent(
types.EventTypeRelayTransfer,
sdk.NewAttribute(sdk.AttributeKeySender, relay.From.String()),
sdk.NewAttribute(types.AttributeKeyReceiver, sdk.AccAddress(recipient.Bytes()).String()),
sdk.NewAttribute(sdk.AttributeKeyAmount, relay.Amount.String()),
sdk.NewAttribute(types.AttributeKeyDenom, relay.Denom),
sdk.NewAttribute(types.AttributeKeyTokenAddress, relay.TokenContract.String()),
))
telemetry.IncrCounterWithLabels(
[]string{types.ModuleName, "relay_transfer"},
1,
[]metrics.Label{
telemetry.NewLabel("erc20", relay.TokenContract.String()),
telemetry.NewLabel("denom", relay.Denom),
telemetry.NewLabel("amount", relay.Amount.String()),
},
)
}
return nil
}