-
Notifications
You must be signed in to change notification settings - Fork 1k
/
insert_1inch_lp.sql
145 lines (142 loc) · 4.98 KB
/
insert_1inch_lp.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
CREATE OR REPLACE FUNCTION dex.insert_1inch_lp(start_ts timestamptz, end_ts timestamptz=now(), start_block numeric=0, end_block numeric=9e18) RETURNS integer
LANGUAGE plpgsql AS $function$
DECLARE r integer;
BEGIN
WITH rows AS (
INSERT INTO dex.trades (
block_time,
token_a_symbol,
token_b_symbol,
token_a_amount,
token_b_amount,
project,
version,
category,
trader_a,
trader_b,
token_a_amount_raw,
token_b_amount_raw,
usd_amount,
token_a_address,
token_b_address,
exchange_contract_address,
tx_hash,
tx_from,
tx_to,
trace_address,
evt_index,
trade_id
)
SELECT
dexs.block_time,
erc20a.symbol AS token_a_symbol,
erc20b.symbol AS token_b_symbol,
token_a_amount_raw / 10 ^ erc20a.decimals AS token_a_amount,
token_b_amount_raw / 10 ^ erc20b.decimals AS token_b_amount,
project,
version,
category,
coalesce(trader_a, tx."from") as trader_a, -- subqueries rely on this COALESCE to avoid redundant joins with the transactions table
trader_b,
token_a_amount_raw,
token_b_amount_raw,
coalesce(
usd_amount,
token_a_amount_raw / 10 ^ pa.decimals * pa.price,
token_b_amount_raw / 10 ^ pb.decimals * pb.price
) as usd_amount,
token_a_address,
token_b_address,
exchange_contract_address,
tx_hash,
tx."from" as tx_from,
tx."to" as tx_to,
trace_address,
evt_index,
row_number() OVER (PARTITION BY project, tx_hash, evt_index, trace_address ORDER BY version, category) AS trade_id
FROM (
-- 1inch LP
SELECT
evt_block_time AS block_time,
'1inch LP' AS project,
'1' AS version,
'DEX' AS category,
sender AS trader_a,
NULL::bytea AS trader_b,
result AS token_a_amount_raw,
amount AS token_b_amount_raw,
NULL::numeric AS usd_amount,
CASE WHEN "dstToken" = '\x0000000000000000000000000000000000000000' THEN
'\xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'::bytea ELSE "dstToken"
END AS token_a_address,
CASE WHEN "srcToken" = '\x0000000000000000000000000000000000000000' THEN
'\xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'::bytea ELSE "srcToken"
END AS token_b_address,
contract_address AS exchange_contract_address,
evt_tx_hash AS tx_hash,
NULL::integer[] AS trace_address,
evt_index
FROM onelp."Mooniswap_evt_Swapped"
) dexs
INNER JOIN ethereum.transactions tx
ON dexs.tx_hash = tx.hash
AND tx.block_time >= start_ts
AND tx.block_time < end_ts
AND tx.block_number >= start_block
AND tx.block_number < end_block
LEFT JOIN erc20.tokens erc20a ON erc20a.contract_address = dexs.token_a_address
LEFT JOIN erc20.tokens erc20b ON erc20b.contract_address = dexs.token_b_address
LEFT JOIN prices.usd pa ON pa.minute = date_trunc('minute', dexs.block_time)
AND pa.contract_address = dexs.token_a_address
AND pa.minute >= start_ts
AND pa.minute < end_ts
LEFT JOIN prices.usd pb ON pb.minute = date_trunc('minute', dexs.block_time)
AND pb.contract_address = dexs.token_b_address
AND pb.minute >= start_ts
AND pb.minute < end_ts
WHERE dexs.block_time >= start_ts
AND dexs.block_time < end_ts
ON CONFLICT DO NOTHING
RETURNING 1
)
SELECT count(*) INTO r from rows;
RETURN r;
END
$function$;
-- fill 2020
SELECT dex.insert_1inch_lp(
'2020-01-01',
'2021-01-01',
(SELECT max(number) FROM ethereum.blocks WHERE time <= '2020-01-01'),
(SELECT max(number) FROM ethereum.blocks WHERE time <= '2021-01-01')
)
WHERE NOT EXISTS (
SELECT *
FROM dex.trades
WHERE block_time > '2020-01-01'
AND block_time <= '2021-01-01'
AND project = '1inch LP'
);
-- fill 2021
SELECT dex.insert_1inch_lp(
'2021-01-01',
now(),
(SELECT max(number) FROM ethereum.blocks WHERE time <= '2020-07-01'),
(SELECT MAX(number) FROM ethereum.blocks where time < now() - interval '20 minutes')
)
WHERE NOT EXISTS (
SELECT *
FROM dex.trades
WHERE block_time > '2021-01-01'
AND block_time <= now() - interval '20 minutes'
AND project = '1inch LP'
);
INSERT INTO cron.job (schedule, command)
VALUES ('*/12 * * * *', $$
SELECT dex.insert_1inch_lp(
(SELECT max(block_time) - interval '1 days' FROM dex.trades WHERE project='1inch LP'),
(SELECT now() - interval '20 minutes'),
(SELECT max(number) FROM ethereum.blocks WHERE time < (SELECT max(block_time) - interval '1 days' FROM dex.trades WHERE project='1inch LP')),
(SELECT MAX(number) FROM ethereum.blocks where time < now() - interval '20 minutes'));
$$)
ON CONFLICT (command) DO UPDATE SET schedule=EXCLUDED.schedule;