Skip to content

Commit 7b1fedf

Browse files
Decode all swaps (#155)
* Fix error chatching in event decoding * Refactor std in interpreter * Refactoring * Add changesets
1 parent 6c4483e commit 7b1fedf

File tree

18 files changed

+260
-147
lines changed

18 files changed

+260
-147
lines changed

.changeset/early-carrots-smell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@3loop/transaction-interpreter': minor
3+
---
4+
5+
Add default categorization of swaps into fallback interpreter
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@3loop/transaction-decoder': patch
3+
---
4+
5+
Improve decoder error displaying

packages/transaction-decoder/src/decoding/abi-decode.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { Data, Effect } from 'effect'
55
import { messageFromUnknown } from '../helpers/error.js'
66

77
export class DecodeError extends Data.TaggedError('DecodeError')<{ message: string }> {
8-
constructor(error: unknown) {
9-
super({ message: `Failed to decode ${messageFromUnknown(error)}` })
8+
constructor(message: string, error?: unknown) {
9+
super({ message: `${message} ${messageFromUnknown(error)}` })
1010
}
1111
}
1212

@@ -72,15 +72,15 @@ export const decodeMethod = (data: Hex, abi: Abi): Effect.Effect<DecodeResult |
7272
Effect.gen(function* () {
7373
const { functionName, args = [] } = yield* Effect.try({
7474
try: () => decodeFunctionData({ abi, data }),
75-
catch: (error) => new DecodeError(error),
75+
catch: (error) => new DecodeError(`Could not decode function data`, error),
7676
})
7777

7878
const method = getAbiItem({ abi, name: functionName, args }) as AbiFunction | undefined
7979

8080
if (method != null) {
8181
const signature = yield* Effect.try({
8282
try: () => formatAbiItem(method),
83-
catch: (error) => new DecodeError(error),
83+
catch: (error) => new DecodeError(`Could not format function data`, error),
8484
})
8585

8686
const paramsTree = attachValues(method.inputs, args)

packages/transaction-decoder/src/decoding/calldata-decode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ const decodeGnosisMultisendParams = (
107107
abi: SAFE_MULTISEND_ABI,
108108
args: [txs],
109109
}),
110-
catch: (error) => new AbiDecoder.DecodeError(error),
110+
catch: (error) => new AbiDecoder.DecodeError(`Could not encode multisend transactions`, error),
111111
})
112112
const txsDecoded = yield* AbiDecoder.decodeMethod(txsEncoded, SAFE_MULTISEND_ABI)
113113

packages/transaction-decoder/src/decoding/log-decode.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,7 @@ const decodedLog = (transaction: GetTransactionReturnType, logItem: Log) =>
4545
data: logItem.data,
4646
strict: false,
4747
}),
48-
catch: (err) =>
49-
Effect.gen(function* () {
50-
yield* Effect.logError(`Could not decode log ${abiAddress} `, err)
51-
return new AbiDecoder.DecodeError(`Could not decode log ${abiAddress}`)
52-
}),
48+
catch: (err) => new AbiDecoder.DecodeError(`Could not decode log ${abiAddress}`, err),
5349
})
5450

5551
if (eventName == null) {
@@ -58,7 +54,12 @@ const decodedLog = (transaction: GetTransactionReturnType, logItem: Log) =>
5854

5955
const args = args_ as any
6056

61-
const fragment = getAbiItem({ abi: abiItem, name: eventName })
57+
const fragment = yield* Effect.try({
58+
try: () => getAbiItem({ abi: abiItem, name: eventName }),
59+
catch: () => {
60+
Effect.logError(`Could not find fragment in ABI ${abiAddress} ${eventName}`)
61+
},
62+
})
6263

6364
if (fragment == null) {
6465
return yield* new AbiDecoder.DecodeError(`Could not find fragment in ABI ${abiAddress} ${eventName}`)
@@ -136,8 +137,10 @@ export const decodeLogs = ({ logs, transaction }: { logs: readonly Log[]; transa
136137

137138
const eithers = effects.map((e) => Effect.either(e))
138139

139-
return yield* Effect.all(eithers, {
140+
const resp = yield* Effect.all(eithers, {
140141
concurrency: 'inherit',
141142
batching: 'inherit',
142143
})
144+
145+
return resp
143146
})

packages/transaction-interpreter/interpreters/1inch.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { displayAsset, getPayments, isSwap, defaultEvent } from './std.js'
1+
import { displayAsset, getNetTransfers, isSwap, defaultEvent } from './std.js'
22
import type { InterpretedTransaction } from '@/types.js'
33
import type { DecodedTransaction } from '@3loop/transaction-decoder'
44

55
export function transformEvent(event: DecodedTransaction): InterpretedTransaction {
66
const newEvent = defaultEvent(event)
77

8-
const netSent = getPayments({
8+
const netSent = getNetTransfers({
99
transfers: event.transfers,
1010
fromAddresses: [event.fromAddress],
1111
})
1212

13-
const netReceived = getPayments({
13+
const netReceived = getNetTransfers({
1414
transfers: event.transfers,
1515
toAddresses: [event.fromAddress],
1616
})

packages/transaction-interpreter/interpreters/aerodrom.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { displayAsset, getPayments, isSwap, defaultEvent } from './std.js'
1+
import { displayAsset, getNetTransfers, isSwap, defaultEvent } from './std.js'
22
import type { InterpretedTransaction } from '@/types.js'
33
import type { DecodedTransaction } from '@3loop/transaction-decoder'
44

55
export function transformEvent(event: DecodedTransaction): InterpretedTransaction {
66
const newEvent = defaultEvent(event)
77

8-
const netSent = getPayments({
8+
const netSent = getNetTransfers({
99
transfers: event.transfers,
1010
fromAddresses: [event.fromAddress],
1111
})
1212

13-
const netReceived = getPayments({
13+
const netReceived = getNetTransfers({
1414
transfers: event.transfers,
1515
toAddresses: [event.fromAddress],
1616
})

packages/transaction-interpreter/interpreters/banana-gun.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { displayAsset, getPayments, isSwap, defaultEvent } from './std.js'
1+
import { displayAsset, getNetTransfers, isSwap, defaultEvent } from './std.js'
22
import type { InterpretedTransaction } from '@/types.js'
33
import type { DecodedTransaction } from '@3loop/transaction-decoder'
44

55
export function transformEvent(event: DecodedTransaction): InterpretedTransaction {
66
const newEvent = defaultEvent(event)
77

8-
const netSent = getPayments({
8+
const netSent = getNetTransfers({
99
transfers: event.transfers,
1010
fromAddresses: [event.fromAddress],
1111
})
1212

13-
const netReceived = getPayments({
13+
const netReceived = getNetTransfers({
1414
transfers: event.transfers,
1515
toAddresses: [event.fromAddress],
1616
})

packages/transaction-interpreter/interpreters/blur.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { displayPayments, processNftTransfers, defaultEvent } from './std.js'
1+
import { displayAssets, processNftTransfers, defaultEvent } from './std.js'
22
import type { InterpretedTransaction } from '@/types.js'
33
import type { DecodedTransaction } from '@3loop/transaction-decoder'
44

@@ -16,7 +16,7 @@ export function transformEvent(event: DecodedTransaction): InterpretedTransactio
1616

1717
const collection = nftTransfers[0].name ?? ''
1818
const numberOfNfts = nftTransfers.length > 1 ? ` ${nftTransfers.length} ${collection} NFTS` : ` 1 ${collection} NFT`
19-
const payment = displayPayments(erc20Payments, nativePayments)
19+
const payment = displayAssets([...erc20Payments, ...nativePayments])
2020

2121
const sell = ['takeBidSingle', 'takeBid']
2222
const buy = ['takeAskSinglePool', 'takeAskSingle', 'takeAsk', 'takeAskPool', 'batchBuyWithETH', 'batchBuyWithERC20s']

packages/transaction-interpreter/interpreters/friend-tech.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { displayAddress, displayAsset, getPayments, defaultEvent } from './std.js'
1+
import { displayAddress, displayAsset, getNetTransfers, defaultEvent } from './std.js'
22
import type { InterpretedTransaction } from '@/types.js'
33
import type { DecodedTransaction } from '@3loop/transaction-decoder'
44

55
export function transformEvent(event: DecodedTransaction): InterpretedTransaction {
66
const newEvent = defaultEvent(event)
77

8-
const netSent = getPayments({
8+
const netSent = getNetTransfers({
99
transfers: event.transfers,
1010
fromAddresses: [event.fromAddress],
1111
})
1212

13-
const netReceived = getPayments({
13+
const netReceived = getNetTransfers({
1414
transfers: event.transfers,
1515
toAddresses: [event.fromAddress],
1616
})

0 commit comments

Comments
 (0)