|
1 | 1 | import dayjs from 'dayjs' |
2 | 2 | import { findLast } from 'lodash' |
3 | 3 | import { LessThan } from 'typeorm' |
4 | | -import { formatUnits } from 'viem' |
| 4 | +import { formatEther, formatUnits } from 'viem' |
5 | 5 |
|
6 | 6 | import * as erc20Abi from '@abi/erc20' |
7 | 7 | import * as originOsArmAbi from '@abi/origin-arm' |
@@ -326,24 +326,42 @@ export const createOriginARMProcessors = ({ |
326 | 326 | .filter((log) => log.address === armEntity.token1) |
327 | 327 | .map((log) => erc20Abi.events.Transfer.decode(log)) |
328 | 328 |
|
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) |
347 | 365 |
|
348 | 366 | swaps.push( |
349 | 367 | new ArmSwap({ |
|
0 commit comments