Skip to content

Commit 5a11b53

Browse files
committed
improve arm swap detection logic
1 parent c41318d commit 5a11b53

File tree

1 file changed

+37
-19
lines changed

1 file changed

+37
-19
lines changed

src/templates/origin-arm/origin-arm.ts

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dayjs from 'dayjs'
22
import { findLast } from 'lodash'
33
import { LessThan } from 'typeorm'
4-
import { formatUnits } from 'viem'
4+
import { formatEther, formatUnits } from 'viem'
55

66
import * as erc20Abi from '@abi/erc20'
77
import * as originOsArmAbi from '@abi/origin-arm'
@@ -326,24 +326,42 @@ export const createOriginARMProcessors = ({
326326
.filter((log) => log.address === armEntity.token1)
327327
.map((log) => erc20Abi.events.Transfer.decode(log))
328328

329-
const assets0 = transfers0.reduce(
330-
(acc, data) =>
331-
data.from.toLowerCase() === armAddress
332-
? acc - data.value
333-
: data.to.toLowerCase() === armAddress
334-
? acc + data.value
335-
: acc,
336-
0n,
337-
)
338-
const assets1 = transfers1.reduce(
339-
(acc, data) =>
340-
data.from.toLowerCase() === armAddress
341-
? acc - data.value
342-
: data.to.toLowerCase() === armAddress
343-
? acc + data.value
344-
: acc,
345-
0n,
346-
)
329+
const pairs: { assets0: bigint; assets1: bigint }[] = []
330+
331+
const transfersOut0 = transfers0.filter((t) => t.from.toLowerCase() === armAddress)
332+
const transfersIn1 = transfers1.filter((t) => t.to.toLowerCase() === armAddress)
333+
for (let i = 0; i < transfersOut0.length; i++) {
334+
for (let j = 0; j < transfersIn1.length; j++) {
335+
const out0 = transfersOut0[i]
336+
const in1 = transfersIn1[j]
337+
if (out0.value === 0n || in1.value === 0n) continue
338+
const rate = +formatEther((out0.value * 10n ** 18n) / in1.value)
339+
if (Math.abs(rate - 1) <= 0.001) {
340+
pairs.push({ assets0: -out0.value, assets1: in1.value })
341+
transfersIn1.splice(j, 1)
342+
break
343+
}
344+
}
345+
}
346+
347+
const transfersOut1 = transfers1.filter((t) => t.from.toLowerCase() === armAddress)
348+
const transfersIn0 = transfers0.filter((t) => t.to.toLowerCase() === armAddress)
349+
for (let i = 0; i < transfersOut1.length; i++) {
350+
for (let j = 0; j < transfersIn0.length; j++) {
351+
const out1 = transfersOut1[i]
352+
const in0 = transfersIn0[j]
353+
if (out1.value === 0n || in0.value === 0n) continue
354+
const rate = +formatEther((out1.value * 10n ** 18n) / in0.value)
355+
if (Math.abs(rate - 1) <= 0.001) {
356+
pairs.push({ assets0: in0.value, assets1: -out1.value })
357+
transfersIn0.splice(j, 1)
358+
break
359+
}
360+
}
361+
}
362+
363+
const assets0 = pairs.reduce((acc, pair) => acc + pair.assets0, 0n)
364+
const assets1 = pairs.reduce((acc, pair) => acc + pair.assets1, 0n)
347365

348366
swaps.push(
349367
new ArmSwap({

0 commit comments

Comments
 (0)