|
1 | | -import { assetsReceived, categorizedDefaultEvent, displayAsset, getNetTransfers } from './std.js' |
| 1 | +import { assetsReceived, categorizedDefaultEvent, displayAsset, getNetTransfers, filterTransfers } from './std.js' |
2 | 2 | import type { InterpretedTransaction } from '@/types.js' |
3 | 3 | import type { DecodedTransaction } from '@3loop/transaction-decoder' |
4 | 4 |
|
5 | 5 | export function transformEvent(event: DecodedTransaction): InterpretedTransaction { |
6 | 6 | const newEvent = categorizedDefaultEvent(event) |
7 | | - const recipient = event.fromAddress |
8 | | - const contractAddress = event.toAddress |
9 | 7 |
|
10 | | - if (!contractAddress) return newEvent |
| 8 | + if (!event.toAddress) return newEvent |
11 | 9 |
|
12 | | - const netSent = getNetTransfers({ |
13 | | - transfers: event.transfers, |
14 | | - fromAddresses: [event.fromAddress], |
15 | | - type: ['ERC20', 'native'], |
| 10 | + const filteredTransfers = filterTransfers(event.transfers, { |
| 11 | + excludeZero: true, |
| 12 | + excludeNull: true, |
| 13 | + sumUpRepeated: true, |
16 | 14 | }) |
17 | 15 |
|
18 | | - const netReceived = getNetTransfers({ |
19 | | - transfers: event.transfers, |
20 | | - toAddresses: [recipient], |
21 | | - fromAddresses: [contractAddress], |
| 16 | + const netSent = getNetTransfers({ |
| 17 | + transfers: filteredTransfers, |
| 18 | + fromAddresses: [event.fromAddress], |
22 | 19 | type: ['ERC20', 'native'], |
23 | 20 | }) |
24 | 21 |
|
25 | | - //filter the same tokne from netReceived (to filter out received fees) |
26 | 22 | const sentTokens = netSent.map((t) => t.asset.address) |
27 | | - const filteredNetReceived = netReceived.filter((t) => !sentTokens.includes(t.asset.address)) |
28 | 23 |
|
29 | | - if (netSent.length === 1 && filteredNetReceived.length === 1) { |
| 24 | + let netReceived |
| 25 | + |
| 26 | + const buyToken = event.methodCall?.params?.[0]?.components?.find((c) => c.name === 'buyToken') as |
| 27 | + | { value: string } |
| 28 | + | undefined |
| 29 | + |
| 30 | + if (buyToken) { |
| 31 | + netReceived = getNetTransfers({ |
| 32 | + transfers: filteredTransfers.filter((t) => t.address === buyToken.value), |
| 33 | + type: ['ERC20', 'native'], |
| 34 | + }) |
| 35 | + } else { |
| 36 | + netReceived = getNetTransfers({ |
| 37 | + transfers: filteredTransfers, |
| 38 | + toAddresses: [event.toAddress], |
| 39 | + type: ['ERC20', 'native'], |
| 40 | + }).filter((t) => !sentTokens.includes(t.asset.address)) |
| 41 | + } |
| 42 | + |
| 43 | + const receivedTokens = netReceived.map((t) => t.asset.address) |
| 44 | + |
| 45 | + if (netSent.length === 1 && netReceived.length === 1) { |
30 | 46 | return { |
31 | 47 | ...newEvent, |
32 | 48 | type: 'swap', |
33 | | - action: 'Swapped ' + displayAsset(netSent[0]) + ' for ' + displayAsset(filteredNetReceived[0]), |
| 49 | + action: 'Swapped ' + displayAsset(netSent[0]) + ' for ' + displayAsset(netReceived[0]), |
34 | 50 | assetsReceived: assetsReceived( |
35 | | - event.transfers.filter((t) => filteredNetReceived.some((r) => r.asset.address === t.address)), |
36 | | - recipient, |
| 51 | + filteredTransfers.filter((t) => receivedTokens.includes(t.address)), |
| 52 | + event.fromAddress, |
37 | 53 | ), |
38 | 54 | } |
39 | 55 | } |
|
0 commit comments