@@ -11,11 +11,6 @@ import (
1111 "github.com/0xsequence/go-sequence/contracts/gen/tokens"
1212)
1313
14- var tokenTransferTopicHashes = []common.Hash {
15- common .HexToHash ("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" ), // ERC20 Transfer
16- common .HexToHash ("0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4" ), // Polygon POL LogTransfer (custom)
17- }
18-
1914// FetchReceiptTokenTransfers fetches the transaction receipt for the given transaction hash
2015// and decodes any token transfer events (ERC20) that occurred within that transaction. TODOXXX: we
2116// currently only support ERC20 token transfers, but we can extend this to support ERC721 and ERC1155 as well.
@@ -27,13 +22,25 @@ func FetchReceiptTokenTransfers(ctx context.Context, provider *ethrpc.Provider,
2722 if receipt == nil {
2823 return nil , nil , nil
2924 }
25+ transfers , err := DecodeTokenTransfersFromLogs (ctx , receipt .Logs )
26+ if err != nil {
27+ return receipt , nil , err
28+ }
29+ return receipt , transfers , nil
30+ }
31+
32+ var tokenTransferTopicHashes = []common.Hash {
33+ common .HexToHash ("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" ), // ERC20 Transfer
34+ common .HexToHash ("0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4" ), // Polygon POL LogTransfer (custom)
35+ }
3036
37+ func DecodeTokenTransfersFromLogs (ctx context.Context , logs []* types.Log ) (TokenTransfers , error ) {
3138 transferTopic := common .HexToHash ("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" )
3239 polLogTransferTopic := common .HexToHash ("0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4" )
3340
3441 var decoded []* TokenTransfer
3542
36- for _ , log := range receipt . Logs {
43+ for _ , log := range logs {
3744 if len (log .Topics ) == 0 {
3845 continue
3946 }
@@ -44,7 +51,7 @@ func FetchReceiptTokenTransfers(ctx context.Context, provider *ethrpc.Provider,
4451 tokenAddress := log .Address
4552
4653 if log .Topics [0 ] == transferTopic {
47- filterer , err := tokens .NewIERC20Filterer (log .Address , provider )
54+ filterer , err := tokens .NewIERC20Filterer (log .Address , nil )
4855 if err == nil {
4956 if ev , err := filterer .ParseTransfer (* log ); err == nil && ev != nil {
5057 decoded = append (decoded , & TokenTransfer {Token : tokenAddress , From : ev .From , To : ev .To , Value : ev .Value , Raw : * log })
@@ -65,14 +72,14 @@ func FetchReceiptTokenTransfers(ctx context.Context, provider *ethrpc.Provider,
6572 }
6673 }
6774
68- return receipt , decoded , nil
75+ return decoded , nil
6976}
7077
7178type TokenTransfer struct {
7279 Token common.Address
7380 From common.Address
7481 To common.Address
75- Value * big.Int // TODO: check the erc20 log spec to see if we should call this value or amount
82+ Value * big.Int
7683 Raw types.Log
7784}
7885
@@ -131,7 +138,7 @@ func (t TokenTransfers) Delta() TokenTransfers {
131138 return out
132139}
133140
134- // ComputeBalances aggregates net balance changes per token per account from the transfers.
141+ // ComputeBalanceOutputs aggregates net balance changes per token per account from the transfers.
135142// For each transfer, it subtracts `Value` from `From` and adds `Value` to `To`.
136143// Accounts with a resulting zero balance change for a given token are omitted.
137144func (s TokenTransfers ) ComputeBalanceOutputs () TokenBalances {
0 commit comments