1
WITH requests AS (
2
SELECT
3
COALESCE(purchased_at::VARCHAR, 'day1') AS source_id,
4
MIN(purchased_at) AS purchased_at,
5
SUM(parse_units('200', 6)) AS amount_in_raw
6
FROM generate_series(
7
TIMESTAMP '2025-08-01 00:00:00',
8
TIMESTAMP '2026-07-01 00:00:00',
9
INTERVAL 1 MONTH
10
) AS months(purchased_at)
11
GROUP BY ROLLUP (purchased_at)
12
),
13
quotes AS (
14
SELECT
15
r.source_id,
16
r.purchased_at,
17
r.amount_in_raw,
18
decoded.amountOut AS amount_out_raw,
19
muldiv(r.amount_in_raw, parse_units('1', 30), decoded.amountOut) AS price_raw,
20
SUM(decoded.amountOut) FILTER (WHERE source_id <> 'day1') OVER (ORDER BY purchased_at) AS total_out_raw,
21
MAX(decoded.amountOut) FILTER (WHERE source_id = 'day1') OVER () AS day_one_out_raw
22
FROM read_contract_multicall((
23
SELECT
24
source_id,
25
$client AS client,
26
$quoter AS to_address,
27
encode_function_data(
28
$quoter_v2_abi,
29
'quoteExactInputSingle',
30
struct_pack(
31
tokenIn := $usdc,
32
tokenOut := $weth,
33
amountIn := amount_in_raw,
34
fee := 500,
35
sqrtPriceLimitX96 := 0
36
)
37
) AS call_data,
38
block_at($client, purchased_at) AS block_number
39
FROM requests
40
)) raw
41
CROSS JOIN LATERAL call_decode(
42
$quoter_v2_abi, 'quoteExactInputSingle', return_data
43
) decoded
44
JOIN requests r USING (source_id)
45
WHERE ok AND call_success
46
)
47
SELECT
48
purchased_at AS quoted_at,
49
format_units(price_raw, 18)::DOUBLE AS quote_price_usdc_per_weth,
50
format_units(amount_in_raw, 6)::DOUBLE AS usdc_input,
51
format_units(amount_out_raw, 18)::DOUBLE AS weth_quoted,
52
format_units(total_out_raw, 18)::DOUBLE AS cumulative_weth_quoted,
53
format_units(day_one_out_raw, 18)::DOUBLE AS day_one_weth_quoted
54
FROM quotes
55
WHERE source_id <> 'day1'
56
ORDER BY purchased_at;