Skip to content

Commit

Permalink
add wrap/unwrap eth scrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
0xyijing committed Oct 6, 2023
1 parent 39494dd commit baa839f
Show file tree
Hide file tree
Showing 11 changed files with 219 additions and 0 deletions.
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ services:
UNISWAP_V2_SYNC_START_BLOCK: 10000835
FEAT_ONCHAIN_GOVERNANCE: "true"
ONCHAIN_GOVERNANCE_START_BLOCK: 16990159
FEAT_WRAP_UNWRAP_ETH_EVENT: "true"
WRAP_UNWRAP_ETH_START_BLOCK: 18287970

event-pipeline-bsc:
depends_on:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm';

const wrapETHEvent = new Table({
name: 'events.wrap_eth_events',
columns: [
{ name: 'observed_timestamp', type: 'bigint' },
{ name: 'contract_address', type: 'varchar' },
{ name: 'transaction_hash', type: 'varchar', isPrimary: true },
{ name: 'transaction_index', type: 'bigint' },
{ name: 'log_index', type: 'bigint', isPrimary: true },
{ name: 'block_hash', type: 'varchar' },
{ name: 'block_number', type: 'bigint' },
{ name: 'sender_address', type: 'varchar' },
{ name: 'amount', type: 'bigint' },
],
});

const createWrapETHEventIndexQuery = `
CREATE INDEX wrap_eth_events_transaction_hash_index
ON events.wrap_eth_events (transaction_hash);
CREATE INDEX wrap_eth_events_block_number_index
ON events.wrap_eth_events (block_number);
`;

const dropWrapETHEventIndexQuery = `
DROP INDEX events.wrap_eth_events_transaction_hash_index;
DROP INDEX events.wrap_eth_events_block_number_index;
`;

const unwrapETHEvent = new Table({
name: 'events.unwrap_eth_events',
columns: [
{ name: 'observed_timestamp', type: 'bigint' },
{ name: 'contract_address', type: 'varchar' },
{ name: 'transaction_hash', type: 'varchar', isPrimary: true },
{ name: 'transaction_index', type: 'bigint' },
{ name: 'log_index', type: 'bigint', isPrimary: true },
{ name: 'block_hash', type: 'varchar' },
{ name: 'block_number', type: 'bigint' },
{ name: 'receiver_address', type: 'varchar' },
{ name: 'amount', type: 'bigint' },
],
});

const createUnwrapETHEventIndexQuery = `
CREATE INDEX unwrap_eth_events_transaction_hash_index
ON events.unwrap_eth_events (transaction_hash);
CREATE INDEX unwrap_eth_events_block_number_index
ON events.unwrap_eth_events (block_number);
`;

const dropUnwrapETHEventIndexQuery = `
DROP INDEX events.unwrap_eth_events_transaction_hash_index;
DROP INDEX events.unwrap_eth_events_block_number_index;
`;

export class CreateOnchainGovernanceEventTable1683558341000 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.createTable(wrapETHEvent);
await queryRunner.query(createWrapETHEventIndexQuery);
await queryRunner.createTable(unwrapETHEvent);
await queryRunner.query(createUnwrapETHEventIndexQuery);
}

public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(dropWrapETHEventIndexQuery);
await queryRunner.dropTable(wrapETHEvent);
await queryRunner.query(dropUnwrapETHEventIndexQuery);
await queryRunner.dropTable(unwrapETHEvent);
}
}
20 changes: 20 additions & 0 deletions src/abis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -993,3 +993,23 @@ export const ONCHAIN_GOVERNANCE_CALL_SCHEDULED_ABI = {
name: 'CallScheduled',
type: 'event',
};

export const WRAP_ETH_ABI = {
anonymous: false,
inputs: [
{ indexed: true, name: 'dst', type: 'address' },
{ indexed: false, name: 'wad', type: 'uint256' },
],
name: 'Deposit',
type: 'event',
};

export const UNWRAP_ETH_ABI = {
anonymous: false,
inputs: [
{ indexed: true, name: 'src', type: 'address' },
{ indexed: false, name: 'wad', type: 'uint256' },
],
name: 'Withdrawal',
type: 'event',
};
15 changes: 15 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {
DEFAULT_STAKING_POOLS_JSON_URL,
DEFAULT_STAKING_POOLS_METADATA_JSON_URL,
DEFAULT_FEAT_ONCHAIN_GOVERNANCE,
DEFAULT_FEAT_WRAP_UNWRAP_ETH_EVENT,
} from './constants';

const throwError = (err: string) => {
Expand Down Expand Up @@ -374,6 +375,20 @@ validateStartBlock(
DEFAULT_FEAT_ONCHAIN_GOVERNANCE,
);

export const FEAT_WRAP_UNWRAP_ETH_EVENT = getBoolConfig(
'FEAT_WRAP_UNWRAP_ETH_EVENT',
DEFAULT_FEAT_WRAP_UNWRAP_ETH_EVENT,
);

export const WRAP_UNWRAP_ETH_START_BLOCK = getIntConfig('WRAP_UNWRAP_ETH_START_BLOCK', -1);

validateStartBlock(
'WRAP_UNWRAP_ETH_START_BLOCK',
WRAP_UNWRAP_ETH_START_BLOCK,
'FEAT_WRAP_UNWRAP_ETH_EVENT',
FEAT_WRAP_UNWRAP_ETH_EVENT,
);

export const KAFKA_BROKERS = process.env.KAFKA_BROKERS ? process.env.KAFKA_BROKERS.split(',') : [];
if (KAFKA_BROKERS.length === 0) {
throwError(`KAFKA_BROKERS is missing`);
Expand Down
7 changes: 7 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export const DEFAULT_METRICS_PATH = '/metrics';
export const DEFAULT_PROMETHEUS_PORT = 3000;
export const DEFAULT_ENABLE_PROMETHEUS_METRICS = false;
export const DEFAULT_FEAT_ONCHAIN_GOVERNANCE = false;
export const DEFAULT_FEAT_WRAP_UNWRAP_ETH_EVENT = false;

export const BRIDGEFILL_EVENT_TOPIC = ['0xe59e71a14fe90157eedc866c4f8c767d3943d6b6b2e8cd64dddcc92ab4c55af8'];
export const TRANSFORMEDERC20_EVENT_TOPIC = ['0x0f6672f78a59ba8e5e5b5d38df3ebc67f3c792e2c9259b8d97d7f00dd78ba1b3'];
Expand Down Expand Up @@ -104,3 +105,9 @@ export const ONCHAIN_GOVERNANCE_CALL_SCHEDULED_EVENT_TOPIC = [
export const ONCHAIN_GOVERNANCE_PROPOSAL_CREATED_EVENT_TOPIC = [
'0x7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0',
];

export const DEFAULT_UNISWAP_V3_FACTORY_ADDRESS = '0x1f98431c8ad98523631ae4a59f267346ea31f984';

export const WRAP_ETH_EVENT_TOPIC = ['0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c'];
export const UNWRAP_ETH_EVENT_TOPIC = ['0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65'];
export const WRAP_UNWRAP_ETH_CONTRACT_ADDRESS = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2';
2 changes: 2 additions & 0 deletions src/entities/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,5 @@ export { V4LimitOrderFilledEvent } from './v4_limit_order_filled_event';
export { V4RfqOrderFilledEvent } from './v4_rfq_order_filled_event';
export { OnchainGovernanceProposalCreatedEvent } from './onchain_governance_proposal_created_event';
export { OnchainGovernanceCallScheduledEvent } from './onchain_governance_call_scheduled_event';
export { WrapETHEvent } from './wrap_eth_event';
export { UnwrapETHEvent } from './unwrap_eth_event';
13 changes: 13 additions & 0 deletions src/entities/unwrap_eth_event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { BigNumber } from '@0x/utils';
import { Column, Entity } from 'typeorm';

import { Event } from './event';
import { bigNumberTransformer } from '../transformers/big_number';

@Entity({ name: 'unwrap_eth_events' })
export class UnwrapETHEvent extends Event {
@Column({ name: 'receiver_address' })
public receiver_address!: string;
@Column({ name: 'amount', type: 'bigint', transformer: bigNumberTransformer })
public amount!: BigNumber;
}
13 changes: 13 additions & 0 deletions src/entities/wrap_eth_event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { BigNumber } from '@0x/utils';
import { Column, Entity } from 'typeorm';

import { Event } from './event';
import { bigNumberTransformer } from '../transformers/big_number';

@Entity({ name: 'wrap_eth_events' })
export class WrapETHEvent extends Event {
@Column({ name: 'sender_address' })
public sender_address!: string;
@Column({ name: 'amount', type: 'bigint', transformer: bigNumberTransformer })
public amount!: BigNumber;
}
39 changes: 39 additions & 0 deletions src/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import {
V4CancelEvent,
V4LimitOrderFilledEvent,
V4RfqOrderFilledEvent,
WrapETHEvent,
UnwrapETHEvent,
} from './entities';

import {
Expand All @@ -46,6 +48,7 @@ import {
FEAT_UNISWAP_V2_VIP_SWAP_EVENT,
FEAT_UNISWAP_V3_SWAP_EVENT,
FEAT_UNISWAP_V3_VIP_SWAP_EVENT,
FEAT_WRAP_UNWRAP_ETH_EVENT,
FEAT_V3_FILL_EVENT,
FEAT_V3_NATIVE_FILL,
FIRST_SEARCH_BLOCK,
Expand All @@ -65,7 +68,9 @@ import {
UNISWAP_V3_SWAP_START_BLOCK,
UNISWAP_V3_VIP_SWAP_START_BLOCK,
V4_NATIVE_FILL_START_BLOCK,
WRAP_UNWRAP_ETH_START_BLOCK,
} from './config';

import {
BRIDGEFILL_EVENT_TOPIC,
ERC1155_ORDER_CANCELLED_EVENT_TOPIC,
Expand Down Expand Up @@ -96,6 +101,9 @@ import {
V4_CANCEL_EVENT_TOPIC,
ZEROEX_PROTOCOL_GOVERNOR_CONTRACT_ADDRESS,
ZEROEX_TREASURY_GOVERNOR_CONTRACT_ADDRESS,
WRAP_ETH_EVENT_TOPIC,
UNWRAP_ETH_EVENT_TOPIC,
WRAP_UNWRAP_ETH_CONTRACT_ADDRESS,
} from './constants';

import { DeleteOptions } from './utils';
Expand Down Expand Up @@ -141,6 +149,11 @@ import {
parseOnchainGovernanceCallScheduledEvent,
} from './parsers/events/onchain_governance_events';

import {
parseWrapETHEvent,
parseUnwrapETHEvent,
} from './parsers/events/wrap_unwrap_eth_events';

import { TokenMetadataMap } from './scripts/utils/web3_utils';
import { UniV2PoolSingleton } from './uniV2PoolSingleton';

Expand Down Expand Up @@ -552,6 +565,32 @@ export const eventScrperProps: EventScraperProps[] = [
tokenMetadataMap: null,
callback: null,
},
{
enabled: FEAT_WRAP_UNWRAP_ETH_EVENT,
name: 'WrapETHEvent',
tType: WrapETHEvent,
table: 'wrap_eth_events',
topics: WRAP_ETH_EVENT_TOPIC,
contractAddress: WRAP_UNWRAP_ETH_CONTRACT_ADDRESS,
startBlock: WRAP_UNWRAP_ETH_START_BLOCK,
parser: parseWrapETHEvent,
deleteOptions: {},
tokenMetadataMap: null,
callback: null,
},
{
enabled: FEAT_WRAP_UNWRAP_ETH_EVENT,
name: 'UnwrapETHEvent',
tType: UnwrapETHEvent,
table: 'unwrap_eth_events',
topics: UNWRAP_ETH_EVENT_TOPIC,
contractAddress: WRAP_UNWRAP_ETH_CONTRACT_ADDRESS,
startBlock: WRAP_UNWRAP_ETH_START_BLOCK,
parser: parseUnwrapETHEvent,
deleteOptions: {},
tokenMetadataMap: null,
callback: null,
},
];

for (const payment_recipient of POLYGON_RFQM_PAYMENTS_ADDRESSES) {
Expand Down
4 changes: 4 additions & 0 deletions src/ormconfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ import {
V4RfqOrderFilledEvent,
OnchainGovernanceProposalCreatedEvent,
OnchainGovernanceCallScheduledEvent,
WrapETHEvent,
UnwrapETHEvent,
} from './entities';

const entities = [
Expand Down Expand Up @@ -100,6 +102,8 @@ const entities = [
V4RfqOrderFilledEvent,
OnchainGovernanceProposalCreatedEvent,
OnchainGovernanceCallScheduledEvent,
WrapETHEvent,
UnwrapETHEvent,
];

const config: ConnectionOptions = {
Expand Down
31 changes: 31 additions & 0 deletions src/parsers/events/wrap_unwrap_eth_events.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
const abiCoder = require('web3-eth-abi');
import { RawLogEntry } from 'ethereum-types';
import { WrapETHEvent, UnwrapETHEvent } from '../../entities';

import { parseEvent } from './parse_event';
import { WRAP_ETH_ABI, UNWRAP_ETH_ABI } from '../../constants';
import { BigNumber } from '@0x/utils';

export function parseWrapETHEvent(eventLog: RawLogEntry): WrapETHEvent {
const wrapETHEvent = new WrapETHEvent();
parseEvent(eventLog, wrapETHEvent);
// decode the basic info
const decodedLog = abiCoder.decodeLog(WRAP_ETH_ABI.inputs, eventLog.data);

wrapETHEvent.sender_address = decodedLog.dst.toLowerCase();
wrapETHEvent.amount = new BigNumber(decodedLog.wad);

return wrapETHEvent;
}

export function parseUnwrapETHEvent(eventLog: RawLogEntry): UnwrapETHEvent {
const unwrapETHEvent = new UnwrapETHEvent();
parseEvent(eventLog, unwrapETHEvent);
// decode the basic info
const decodedLog = abiCoder.decodeLog(UNWRAP_ETH_ABI.inputs, eventLog.data);

unwrapETHEvent.receiver_address = decodedLog.src.toLowerCase();
unwrapETHEvent.amount = new BigNumber(decodedLog.wad);

return unwrapETHEvent;
}

0 comments on commit baa839f

Please sign in to comment.