mirror of
https://github.com/FlipsideCrypto/flow-models.git
synced 2026-02-06 16:06:48 +00:00
* add trades and swaps * revert old swaps model and branch into new * swaps v2 still some bugs * dup token0 issue * swaps2 * final * tweak * del todo * incr
174 lines
3.9 KiB
SQL
174 lines
3.9 KiB
SQL
{{ config(
|
|
materialized = 'incremental',
|
|
cluster_by = ['_inserted_timestamp::DATE'],
|
|
unique_key = 'tx_id',
|
|
incremental_strategy = 'delete+insert'
|
|
) }}
|
|
|
|
WITH swaps_events AS (
|
|
|
|
SELECT
|
|
*
|
|
FROM
|
|
{{ ref('silver__swaps_events') }}
|
|
|
|
{% if is_incremental() %}
|
|
WHERE
|
|
_inserted_timestamp >= (
|
|
SELECT
|
|
MAX(_inserted_timestamp)
|
|
FROM
|
|
{{ this }}
|
|
)
|
|
{% endif %}
|
|
),
|
|
action_ct AS (
|
|
SELECT
|
|
tx_id,
|
|
event_type,
|
|
COUNT(1) AS n
|
|
FROM
|
|
swaps_events
|
|
WHERE
|
|
event_type IN (
|
|
'Trade',
|
|
'Swap'
|
|
)
|
|
GROUP BY
|
|
1,
|
|
2
|
|
),
|
|
step_ct AS (
|
|
SELECT
|
|
tx_id,
|
|
OBJECT_AGG(
|
|
event_type,
|
|
n
|
|
) AS ob
|
|
FROM
|
|
action_ct
|
|
GROUP BY
|
|
1
|
|
),
|
|
single_trade AS (
|
|
SELECT
|
|
tx_id
|
|
FROM
|
|
step_ct
|
|
WHERE
|
|
ob :Trade = 1
|
|
AND ob :Swap IS NULL
|
|
),
|
|
swaps_single_trade AS (
|
|
SELECT
|
|
*
|
|
FROM
|
|
swaps_events
|
|
WHERE
|
|
tx_id IN (
|
|
SELECT
|
|
tx_id
|
|
FROM
|
|
single_trade
|
|
)
|
|
),
|
|
index_id AS (
|
|
SELECT
|
|
tx_id,
|
|
event_type,
|
|
MIN(event_index) AS event_index
|
|
FROM
|
|
swaps_single_trade
|
|
WHERE
|
|
event_type = 'TokensWithdrawn'
|
|
GROUP BY
|
|
1,
|
|
2
|
|
),
|
|
token_out_data AS (
|
|
SELECT
|
|
sst.tx_id,
|
|
block_timestamp,
|
|
block_height,
|
|
event_contract AS event_contract_token_out,
|
|
event_data AS event_data_token_out,
|
|
event_data :amount :: DOUBLE AS token_amount_token_out,
|
|
LOWER(
|
|
event_data :from :: STRING
|
|
) AS trader_token_out,
|
|
_ingested_at,
|
|
_inserted_timestamp
|
|
FROM
|
|
index_id ii
|
|
LEFT JOIN swaps_single_trade sst USING (
|
|
tx_id,
|
|
event_index
|
|
)
|
|
),
|
|
trade_data AS (
|
|
SELECT
|
|
tx_id,
|
|
block_timestamp,
|
|
event_type,
|
|
event_contract AS event_contract_trade,
|
|
event_data AS event_data_trade,
|
|
event_data :side :: NUMBER AS swap_side,
|
|
event_data :token1Amount :: DOUBLE AS token_1_amount,
|
|
-- note some are decimal adjusted, some are not. identify by contract
|
|
event_data :token2Amount :: DOUBLE AS token_2_amount,
|
|
l.account_address AS swap_account,
|
|
_ingested_at,
|
|
_inserted_timestamp
|
|
FROM
|
|
swaps_single_trade sst
|
|
LEFT JOIN {{ ref('silver__contract_labels') }}
|
|
l USING (event_contract)
|
|
WHERE
|
|
event_type = 'Trade'
|
|
),
|
|
token_in_data AS (
|
|
SELECT
|
|
sst.tx_id,
|
|
sst.block_timestamp,
|
|
sst.event_contract AS event_contract_token_in,
|
|
sst.event_data AS event_data_token_in,
|
|
sst.event_data :amount :: DOUBLE AS amount_token_in
|
|
FROM
|
|
trade_data t
|
|
LEFT JOIN swaps_single_trade sst
|
|
ON sst.tx_id = t.tx_id
|
|
AND t.swap_account = LOWER(
|
|
sst.event_data :from :: STRING
|
|
)
|
|
WHERE
|
|
sst.event_type = 'TokensWithdrawn'
|
|
),
|
|
combo AS (
|
|
SELECT
|
|
tod.tx_id,
|
|
tod.block_timestamp,
|
|
tod.block_height,
|
|
td.event_contract_trade AS swap_contract,
|
|
LOWER(
|
|
tod.trader_token_out
|
|
) AS trader,
|
|
tod.token_amount_token_out AS token_out_amount,
|
|
tod.event_contract_token_out AS token_out_contract,
|
|
tid.amount_token_in AS token_in_amount,
|
|
tid.event_contract_token_in AS token_in_contract,
|
|
-- keep these next 3 columns bc i can derive fees from the difference in token_out_amount and token_[n]_amount where n = swap_side
|
|
td.swap_side,
|
|
td.token_1_amount,
|
|
td.token_2_amount,
|
|
tod._ingested_at,
|
|
tod._inserted_timestamp
|
|
FROM
|
|
token_out_data tod
|
|
LEFT JOIN trade_data td USING (tx_id)
|
|
LEFT JOIN token_in_data tid USING (tx_id)
|
|
)
|
|
SELECT
|
|
*
|
|
FROM
|
|
combo
|