-
Notifications
You must be signed in to change notification settings - Fork 12
/
contract_event.go
101 lines (89 loc) · 2.68 KB
/
contract_event.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package types
import (
"math/big"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
ethtypes "github.com/ethereum/go-ethereum/core/types"
fxtypes "github.com/functionx/fx-core/v3/types"
)
const (
FIP20EventTransferCrossChain = "TransferCrossChain"
ERC20EventTransfer = "Transfer"
)
type TransferCrossChainEvent struct {
From common.Address
Recipient string
Amount *big.Int
Fee *big.Int
Target [32]byte
}
func ParseTransferCrossChainEvent(log *ethtypes.Log) (*TransferCrossChainEvent, error) {
if len(log.Topics) != 2 {
return nil, nil
}
fip20ABI := fxtypes.GetERC20().ABI
tc := new(TransferCrossChainEvent)
if log.Topics[0] != fip20ABI.Events[FIP20EventTransferCrossChain].ID {
return nil, nil
}
if len(log.Data) > 0 {
if err := fip20ABI.UnpackIntoInterface(tc, FIP20EventTransferCrossChain, log.Data); err != nil {
return nil, err
}
}
var indexed abi.Arguments
for _, arg := range fip20ABI.Events[FIP20EventTransferCrossChain].Inputs {
if arg.Indexed {
indexed = append(indexed, arg)
}
}
if err := abi.ParseTopics(tc, indexed, log.Topics[1:]); err != nil {
return nil, err
}
return tc, nil
}
func (event *TransferCrossChainEvent) GetFrom() sdk.AccAddress {
return event.From.Bytes()
}
func (event *TransferCrossChainEvent) GetAmount(denom string) sdk.Coin {
return sdk.NewCoin(denom, sdk.NewIntFromBigInt(event.Amount))
}
func (event *TransferCrossChainEvent) GetFee(denom string) sdk.Coin {
return sdk.NewCoin(denom, sdk.NewIntFromBigInt(event.Fee))
}
func (event *TransferCrossChainEvent) TotalAmount(denom string) sdk.Coins {
return sdk.NewCoins(event.GetAmount(denom)).Add(event.GetFee(denom))
}
type TransferEvent struct {
From common.Address
To common.Address
Value *big.Int
}
// ParseTransferEvent transfer event ---> event Transfer(address indexed from, address indexed to, uint256 value);
func ParseTransferEvent(log *ethtypes.Log) (*TransferEvent, error) {
// Note: the `Transfer` event contains 3 topics (id, from, to)
if len(log.Topics) != 3 {
return nil, nil
}
fip20ABI := fxtypes.GetERC20().ABI
if log.Topics[0] != fip20ABI.Events[ERC20EventTransfer].ID {
return nil, nil
}
transferEvent := new(TransferEvent)
if len(log.Data) > 0 {
if err := fip20ABI.UnpackIntoInterface(transferEvent, ERC20EventTransfer, log.Data); err != nil {
return nil, err
}
}
var indexed abi.Arguments
for _, arg := range fip20ABI.Events[ERC20EventTransfer].Inputs {
if arg.Indexed {
indexed = append(indexed, arg)
}
}
if err := abi.ParseTopics(transferEvent, indexed, log.Topics[1:]); err != nil {
return nil, err
}
return transferEvent, nil
}