1
1
import { GoldRushDecoder } from "../../decoder" ;
2
- import { type EventType } from "../../decoder.types" ;
2
+ import { type EventDetails , type EventType } from "../../decoder.types" ;
3
3
import {
4
4
DECODED_ACTION ,
5
5
DECODED_EVENT_CATEGORY ,
6
6
} from "../../decoder.constants" ;
7
7
import { decodeEventLog , type Abi } from "viem" ;
8
- import ABI from "./abis/transfer.abi.json" ;
8
+ import ERC20ABI from "./abis/transfer-erc20.abi.json" ;
9
+ import ERC721ABI from "./abis/transfer-erc721.abi.json" ;
9
10
import { TimestampParser } from "../../../../utils/functions" ;
10
11
import { prettifyCurrency } from "@covalenthq/client-sdk" ;
11
12
12
13
GoldRushDecoder . fallback (
13
14
"Transfer" ,
14
- ABI as Abi ,
15
+ ERC20ABI as Abi ,
15
16
async ( log_event , tx , chain_name , covalent_client ) : Promise < EventType > => {
16
17
const { raw_log_data, raw_log_topics } = log_event ;
17
18
18
- const { args : decoded } = decodeEventLog ( {
19
- abi : ABI ,
20
- topics : raw_log_topics as [ ] ,
21
- data : raw_log_data as `0x${string } `,
22
- eventName : "Transfer" ,
23
- } ) as {
24
- eventName : "Transfer" ;
25
- args : {
26
- from : string ;
27
- to : string ;
28
- value : bigint ;
19
+ let decoded :
20
+ | {
21
+ from : string ;
22
+ to : string ;
23
+ value : bigint ;
24
+ tokenId ?: never ;
25
+ }
26
+ | {
27
+ from : string ;
28
+ to : string ;
29
+ tokenId : bigint ;
30
+ value ?: never ;
31
+ } ;
32
+
33
+ try {
34
+ const { args } = decodeEventLog ( {
35
+ abi : ERC20ABI ,
36
+ topics : raw_log_topics as [ ] ,
37
+ data : raw_log_data as `0x${string } `,
38
+ eventName : "Transfer" ,
39
+ } ) as {
40
+ eventName : "Transfer" ;
41
+ args : {
42
+ from : string ;
43
+ to : string ;
44
+ value : bigint ;
45
+ } ;
29
46
} ;
30
- } ;
47
+ decoded = args ;
48
+ } catch ( error ) {
49
+ const { args } = decodeEventLog ( {
50
+ abi : ERC721ABI ,
51
+ topics : raw_log_topics as [ ] ,
52
+ data : raw_log_data as `0x${string } `,
53
+ eventName : "Transfer" ,
54
+ } ) as {
55
+ eventName : "Transfer" ;
56
+ args : {
57
+ from : string ;
58
+ to : string ;
59
+ tokenId : bigint ;
60
+ } ;
61
+ } ;
62
+ decoded = args ;
63
+ }
31
64
32
- const date = TimestampParser ( log_event . block_signed_at , "YYYY-MM-DD" ) ;
33
- const { data } = await covalent_client . PricingService . getTokenPrices (
34
- chain_name ,
35
- "USD" ,
36
- log_event . sender_address ,
65
+ const details : EventDetails = [
37
66
{
38
- from : date ,
39
- to : date ,
40
- }
41
- ) ;
42
-
43
- const pretty_quote =
44
- data ?. [ 0 ] ?. items ?. [ 0 ] ?. price *
45
- ( Number ( decoded . value ) /
46
- Math . pow (
47
- 10 ,
48
- data ?. [ 0 ] ?. items ?. [ 0 ] ?. contract_metadata
49
- ?. contract_decimals ?? 18
50
- ) ) ;
67
+ title : "From" ,
68
+ value : decoded . from ,
69
+ type : "address" ,
70
+ } ,
71
+ {
72
+ title : "To" ,
73
+ value : decoded . to ,
74
+ type : "address" ,
75
+ } ,
76
+ ] ;
51
77
52
- return {
78
+ const parsedData : EventType = {
53
79
action : DECODED_ACTION . SWAPPED ,
54
80
category : DECODED_EVENT_CATEGORY . DEX ,
55
81
name : "Transfer" ,
56
82
protocol : {
57
83
logo : log_event . sender_logo_url as string ,
58
84
name : log_event . sender_name as string ,
59
85
} ,
60
- details : [
61
- {
62
- title : "From" ,
63
- value : decoded . from ,
64
- type : "address" ,
65
- } ,
66
- {
67
- title : "To" ,
68
- value : decoded . to ,
69
- type : "address" ,
70
- } ,
71
- ] ,
72
- tokens : [
86
+ details : details ,
87
+ } ;
88
+
89
+ if ( decoded . value ) {
90
+ const date = TimestampParser (
91
+ log_event . block_signed_at ,
92
+ "YYYY-MM-DD"
93
+ ) ;
94
+ const { data } =
95
+ await covalent_client . PricingService . getTokenPrices (
96
+ chain_name ,
97
+ "USD" ,
98
+ log_event . sender_address ,
99
+ {
100
+ from : date ,
101
+ to : date ,
102
+ }
103
+ ) ;
104
+
105
+ const pretty_quote =
106
+ data ?. [ 0 ] ?. items ?. [ 0 ] ?. price *
107
+ ( Number ( decoded . value ) /
108
+ Math . pow (
109
+ 10 ,
110
+ data ?. [ 0 ] ?. items ?. [ 0 ] ?. contract_metadata
111
+ ?. contract_decimals ?? 18
112
+ ) ) ;
113
+
114
+ parsedData . tokens = [
73
115
{
74
116
decimals :
75
117
data ?. [ 0 ] ?. items ?. [ 0 ] ?. contract_metadata
@@ -85,7 +127,45 @@ GoldRushDecoder.fallback(
85
127
?. contract_ticker_symbol ,
86
128
value : decoded . value . toString ( ) ,
87
129
} ,
88
- ] ,
89
- } ;
130
+ ] ;
131
+ } else if ( decoded . tokenId ) {
132
+ const { data } =
133
+ await covalent_client . NftService . getNftMetadataForGivenTokenIdForContract (
134
+ chain_name ,
135
+ log_event . sender_address ,
136
+ decoded . tokenId . toString ( ) ,
137
+ {
138
+ withUncached : true ,
139
+ }
140
+ ) ;
141
+
142
+ parsedData . nfts = [
143
+ {
144
+ heading : "NFT Transferred" ,
145
+ collection_address : data ?. items ?. [ 0 ] ?. contract_address ,
146
+ collection_name :
147
+ data ?. items ?. [ 0 ] ?. nft_data ?. external_data ?. name || null ,
148
+ token_identifier :
149
+ data ?. items ?. [ 0 ] ?. nft_data ?. token_id ?. toString ( ) ||
150
+ null ,
151
+ images : {
152
+ "1024" :
153
+ data ?. items ?. [ 0 ] ?. nft_data ?. external_data
154
+ ?. image_1024 || null ,
155
+ "512" :
156
+ data ?. items ?. [ 0 ] ?. nft_data ?. external_data
157
+ ?. image_512 || null ,
158
+ "256" :
159
+ data ?. items ?. [ 0 ] ?. nft_data ?. external_data
160
+ ?. image_256 || null ,
161
+ default :
162
+ data ?. items ?. [ 0 ] ?. nft_data ?. external_data ?. image ||
163
+ null ,
164
+ } ,
165
+ } ,
166
+ ] ;
167
+ }
168
+
169
+ return parsedData ;
90
170
}
91
171
) ;
0 commit comments