Skip to content

Commit 092bd56

Browse files
committed
Add 1Inch Scraping to Polygon
1 parent 7ee816e commit 092bd56

13 files changed

+282
-90
lines changed

.dockerignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
postgres/

docker-compose.yml

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ services:
5353
MAX_BLOCKS_TO_SEARCH: 5000
5454
MAX_BLOCKS_TO_PULL: 5000
5555
MINUTES_BETWEEN_RUNS: 1
56+
FEAT_ONEINCH_SWAPPED_EVENT: "true"
57+
ONEINCH_ROUTER_V3_DEPLOYMENT_BLOCK: 14500000
58+
5659
staking-api:
5760
depends_on:
5861
- event-pipeline
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm';
2+
const createTable = ` create table events_polygon.oneinch_swapped_events
3+
(
4+
observed_timestamp bigint not null,
5+
contract_address varchar not null,
6+
transaction_hash varchar not null,
7+
transaction_index bigint not null,
8+
log_index bigint not null,
9+
block_hash varchar not null,
10+
block_number bigint not null,
11+
from_token varchar not null,
12+
to_token varchar not null,
13+
from_token_amount numeric not null,
14+
to_token_amount numeric not null,
15+
"from" varchar not null,
16+
"to" varchar,
17+
constraint "PK_0e29a12f959d1552d589f49c66c"
18+
primary key (transaction_hash, log_index)
19+
);`;
20+
const createIndexes = `
21+
create index oneinch_swapped_events_transaction_transaction_hash_index
22+
on events_polygon.oneinch_swapped_events (transaction_hash);
23+
24+
create index oneinch_swapped_events_transaction_block_number_index
25+
on events_polygon.oneinch_swapped_events (block_number);
26+
27+
create index oneinch_swapped_events_transaction_contract_addres_index
28+
on events_polygon.oneinch_swapped_events (contract_address);
29+
`;
30+
const dropTable = `DROP TABLE events_polygon.oneinch_swapped_events;`;
31+
32+
const dropIndexes = `
33+
DROP INDEX events_polygon.oneinch_swapped_events_transaction_transaction_hash_index;
34+
DROP INDEX events_polygon.oneinch_swapped_events_transaction_block_number_index;
35+
DROP INDEX events_polygon.oneinch_swapped_events_transaction_contract_addres_index;
36+
`;
37+
38+
export class CreatePolygonOneinchSwappedEventTable1622124888967 implements MigrationInterface {
39+
public async up(queryRunner: QueryRunner): Promise<any> {
40+
await queryRunner.query(createTable);
41+
await queryRunner.query(createIndexes);
42+
}
43+
44+
public async down(queryRunner: QueryRunner): Promise<any> {
45+
await queryRunner.query(dropIndexes);
46+
await queryRunner.query(dropTable);
47+
}
48+
}

event-pipeline-evm/src/config.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
DEFAULT_MINUTES_BETWEEN_RUNS,
88
DEFAULT_START_BLOCK_TIMESTAMP_OFFSET,
99
DEFAULT_MAX_TIME_TO_SEARCH,
10+
DEFAULT_FEAT_TRANSFORMED_ERC20_EVENT,
11+
DEFAULT_FEAT_ONEINCH_SWAPPED_EVENT,
1012
} from './constants';
1113

1214
const throwError = (err: string) => {
@@ -60,5 +62,20 @@ export const MAX_TIME_TO_SEARCH = process.env.MAX_TIME_TO_SEARCH
6062
export const STAKING_DEPLOYMENT_BLOCK = process.env.STAKING_DEPLOYMENT_BLOCK
6163
? parseInt(process.env.STAKING_DEPLOYMENT_BLOCK, 10)
6264
: null;
63-
6465
export const FIRST_SEARCH_BLOCK = Math.min(EP_DEPLOYMENT_BLOCK, STAKING_DEPLOYMENT_BLOCK || Infinity);
66+
67+
export const FEAT_TRANSFORMED_ERC20_EVENT = process.env.FEAT_TRANSFORMED_ERC20_EVENT
68+
? process.env.FEAT_TRANSFORMED_ERC20_EVENT === 'true'
69+
: DEFAULT_FEAT_TRANSFORMED_ERC20_EVENT;
70+
export const FEAT_ONEINCH_SWAPPED_EVENT = process.env.FEAT_ONEINCH_SWAPPED_EVENT
71+
? process.env.FEAT_ONEINCH_SWAPPED_EVENT === 'true'
72+
: DEFAULT_FEAT_ONEINCH_SWAPPED_EVENT;
73+
74+
export const ONEINCH_ROUTER_V3_DEPLOYMENT_BLOCK = process.env.ONEINCH_ROUTER_V3_DEPLOYMENT_BLOCK
75+
? parseInt(process.env.ONEINCH_ROUTER_V3_DEPLOYMENT_BLOCK, 10)
76+
: -1;
77+
if (ONEINCH_ROUTER_V3_DEPLOYMENT_BLOCK === -1 && FEAT_ONEINCH_SWAPPED_EVENT) {
78+
throwError(
79+
`The Oneinch Swapped Event scraper is enabled, but no ONEINCH_ROUTER_V3_DEPLOYMENT_BLOCK was provided. Please add a deployment block or disable the feature`,
80+
);
81+
}

event-pipeline-evm/src/constants.ts

+18
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export const DEFAULT_START_BLOCK_TIMESTAMP_OFFSET = 105;
88
export const DEFAULT_MAX_TIME_TO_SEARCH = 360;
99
export const DEFAULT_SCRAPE_CANCEL_EVENTS_FLAG = false;
1010
export const DEFAULT_SCRAPE_TRANSACTIONS_FLAG = false;
11+
export const DEFAULT_FEAT_TRANSFORMED_ERC20_EVENT = true;
12+
export const DEFAULT_FEAT_ONEINCH_SWAPPED_EVENT = false;
1113
export const TRANSFORMEDERC20_EVENT_TOPIC = ['0x0f6672f78a59ba8e5e5b5d38df3ebc67f3c792e2c9259b8d97d7f00dd78ba1b3'];
1214
export const LIQUIDITYPROVIDERSWAP_EVENT_TOPIC = ['0x40a6ba9513d09e3488135e0e0d10e2d4382b792720155b144cbea89ac9db6d34'];
1315
export const RFQORDERFILLED_EVENT_TOPIC = ['0x829fa99d94dc4636925b38632e625736a614c154d55006b7ab6bea979c210c32'];
@@ -19,6 +21,8 @@ export const SWAP_EVENT_TOPIC = [
1921
'0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822',
2022
'0x000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff',
2123
];
24+
export const ONEINCH_ROUTER_V3_CONTRACT_ADDRESS = '0x11111112542D85B3EF69AE05771c2dCCff4fAa26';
25+
export const ONEINCH_SWAPPED_EVENT_TOPIC = ['0xd6d4f5681c246c9f42c203e287975af1601f8df8035a9251f79aab5c8f09e2f8'];
2226

2327
export {
2428
EXPIRED_RFQ_ORDER_ABI,
@@ -110,3 +114,17 @@ export const BRIDGE_FILL_ABI = {
110114
name: 'BridgeFill',
111115
type: 'event',
112116
};
117+
118+
export const ONEINCH_SWAPPED_ABI = {
119+
anonymous: false,
120+
inputs: [
121+
{ indexed: false, internalType: 'address', name: 'sender', type: 'address' },
122+
{ indexed: false, internalType: 'contract IERC20', name: 'srcToken', type: 'address' },
123+
{ indexed: false, internalType: 'contract IERC20', name: 'dstToken', type: 'address' },
124+
{ indexed: false, internalType: 'address', name: 'dstReceiver', type: 'address' },
125+
{ indexed: false, internalType: 'uint256', name: 'spentAmount', type: 'uint256' },
126+
{ indexed: false, internalType: 'uint256', name: 'returnAmount', type: 'uint256' },
127+
],
128+
name: 'Swapped',
129+
type: 'event',
130+
};

event-pipeline-evm/src/entities/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
ExpiredRfqOrderEvent as ExpiredRfqOrderEventTemplate,
55
LastBlockProcessed as LastBlockProcessedTemplate,
66
NativeFill as NativeFillTemplate,
7+
OneinchSwappedEvent as OneinchSwappedEventTemplate,
78
ParamsSetEvent as ParamsSetEventTemplate,
89
TransactionLogs as TransactionLogsTemplate,
910
TransactionReceipt as TransactionReceiptTemplate,
@@ -31,6 +32,9 @@ export class LastBlockProcessed extends LastBlockProcessedTemplate {}
3132
@Entity({ name: 'native_fills', schema: SCHEMA })
3233
export class NativeFill extends NativeFillTemplate {}
3334

35+
@Entity({ name: 'oneinch_swapped_events', schema: SCHEMA })
36+
export class OneinchSwappedEvent extends OneinchSwappedEventTemplate {}
37+
3438
@Entity({ name: 'params_set_events', schema: SCHEMA })
3539
export class ParamsSetEvent extends ParamsSetEventTemplate {}
3640

event-pipeline-evm/src/ormconfig.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ParamsSetEvent,
1111
LastBlockProcessed,
1212
TransformedERC20Event,
13+
OneinchSwappedEvent,
1314
NativeFill,
1415
V4LimitOrderFilledEvent,
1516
V4RfqOrderFilledEvent,
@@ -27,6 +28,7 @@ const entities = [
2728
LastBlockProcessed,
2829
TransformedERC20Event,
2930
NativeFill,
31+
OneinchSwappedEvent,
3032
V4LimitOrderFilledEvent,
3133
V4RfqOrderFilledEvent,
3234
ExpiredRfqOrderEvent,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const abiCoder = require('web3-eth-abi');
2+
import { RawLogEntry } from 'ethereum-types';
3+
import { OneinchSwappedEvent } from '../../entities';
4+
import { parseEvent } from './parse_event';
5+
import { ONEINCH_SWAPPED_ABI } from '../../constants';
6+
import { BigNumber } from '@0x/utils';
7+
8+
export function parseOneinchSwappedEvent(eventLog: RawLogEntry): OneinchSwappedEvent {
9+
const oneinchSwappedEvent = new OneinchSwappedEvent();
10+
11+
parseEvent(eventLog, oneinchSwappedEvent);
12+
13+
const decodedLog = abiCoder.decodeLog(ONEINCH_SWAPPED_ABI.inputs, eventLog.data, []);
14+
15+
oneinchSwappedEvent.from = decodedLog.sender.toLowerCase();
16+
oneinchSwappedEvent.to = decodedLog.dstReceiver.toLowerCase();
17+
oneinchSwappedEvent.fromToken = decodedLog.srcToken.toLowerCase();
18+
oneinchSwappedEvent.toToken = decodedLog.dstToken.toLowerCase();
19+
oneinchSwappedEvent.fromTokenAmount = new BigNumber(decodedLog.spentAmount);
20+
oneinchSwappedEvent.toTokenAmount = new BigNumber(decodedLog.returnAmount);
21+
22+
return oneinchSwappedEvent;
23+
}

0 commit comments

Comments
 (0)