Skip to content

Improve EVM /swaps and /pools SQL #184

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion biome.jsonc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.1.3/schema.json",
"$schema": "https://biomejs.dev/schemas/2.1.4/schema.json",
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"linter": {
"enabled": true,
Expand Down
52 changes: 26 additions & 26 deletions bun.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,25 @@
"": {
"name": "token-api",
"dependencies": {
"@clickhouse/client": "latest",
"@clickhouse/client-web": "latest",
"@hono/zod-openapi": "latest",
"@hono/zod-validator": "latest",
"@modelcontextprotocol/sdk": "latest",
"@pinax/graph-networks-registry": "latest",
"@web3icons/core": "latest",
"commander": "latest",
"dotenv": "latest",
"hono": "latest",
"hono-openapi": "latest",
"tslog": "latest",
"zod": "latest",
"zod-openapi": "latest",
"@clickhouse/client": "^1.12.0",
"@clickhouse/client-web": "^1.12.0",
"@hono/zod-openapi": "^1.1.0",
"@hono/zod-validator": "^0.7.2",
"@modelcontextprotocol/sdk": "^1.17.1",
"@pinax/graph-networks-registry": "^0.7.1",
"@web3icons/core": "^4.0.18",
"commander": "^14.0.0",
"dotenv": "^17.2.1",
"hono": "^4.8.12",
"hono-openapi": "^0.4.8",
"tslog": "^4.9.3",
"zod": "^4.0.15",
"zod-openapi": "^5.3.0",
},
"devDependencies": {
"@biomejs/biome": "latest",
"@types/bun": "latest",
"typescript": "latest",
"@biomejs/biome": "^2.1.3",
"@types/bun": "^1.2.19",
"typescript": "^5.9.2",
},
},
},
Expand All @@ -31,23 +31,23 @@

"@asteasolutions/zod-to-openapi": ["@asteasolutions/zod-to-openapi@8.1.0", "", { "dependencies": { "openapi3-ts": "^4.1.2" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-tQFxVs05J/6QXXqIzj6rTRk3nj1HFs4pe+uThwE95jL5II2JfpVXkK+CqkO7aT0Do5AYqO6LDrKpleLUFXgY+g=="],

"@biomejs/biome": ["@biomejs/biome@2.1.3", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.3", "@biomejs/cli-darwin-x64": "2.1.3", "@biomejs/cli-linux-arm64": "2.1.3", "@biomejs/cli-linux-arm64-musl": "2.1.3", "@biomejs/cli-linux-x64": "2.1.3", "@biomejs/cli-linux-x64-musl": "2.1.3", "@biomejs/cli-win32-arm64": "2.1.3", "@biomejs/cli-win32-x64": "2.1.3" }, "bin": { "biome": "bin/biome" } }, "sha512-KE/tegvJIxTkl7gJbGWSgun7G6X/n2M6C35COT6ctYrAy7SiPyNvi6JtoQERVK/VRbttZfgGq96j2bFmhmnH4w=="],
"@biomejs/biome": ["@biomejs/biome@2.1.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.4", "@biomejs/cli-darwin-x64": "2.1.4", "@biomejs/cli-linux-arm64": "2.1.4", "@biomejs/cli-linux-arm64-musl": "2.1.4", "@biomejs/cli-linux-x64": "2.1.4", "@biomejs/cli-linux-x64-musl": "2.1.4", "@biomejs/cli-win32-arm64": "2.1.4", "@biomejs/cli-win32-x64": "2.1.4" }, "bin": { "biome": "bin/biome" } }, "sha512-QWlrqyxsU0FCebuMnkvBIkxvPqH89afiJzjMl+z67ybutse590jgeaFdDurE9XYtzpjRGTI1tlUZPGWmbKsElA=="],

"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LFLkSWRoSGS1wVUD/BE6Nlt2dSn0ulH3XImzg2O/36BoToJHKXjSxzPEMAqT9QvwVtk7/9AQhZpTneERU9qaXA=="],
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-sCrNENE74I9MV090Wq/9Dg7EhPudx3+5OiSoQOkIe3DLPzFARuL1dOwCWhKCpA3I5RHmbrsbNSRfZwCabwd8Qg=="],

"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-Q/4OTw8P9No9QeowyxswcWdm0n2MsdCwWcc5NcKQQvzwPjwuPdf8dpPPf4r+x0RWKBtl1FLiAUtJvBlri6DnYw=="],
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-gOEICJbTCy6iruBywBDcG4X5rHMbqCPs3clh3UQ+hRKlgvJTk4NHWQAyHOXvaLe+AxD1/TNX1jbZeffBJzcrOw=="],

"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-2hS6LgylRqMFmAZCOFwYrf77QMdUwJp49oe8PX/O8+P2yKZMSpyQTf3Eo5ewnsMFUEmYbPOskafdV1ds1MZMJA=="],
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-juhEkdkKR4nbUi5k/KRp1ocGPNWLgFRD4NrHZSveYrD6i98pyvuzmS9yFYgOZa5JhaVqo0HPnci0+YuzSwT2fw=="],

"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-KXouFSBnoxAWZYDQrnNRzZBbt5s9UJkIm40hdvSL9mBxSSoxRFQJbtg1hP3aa8A2SnXyQHxQfpiVeJlczZt76w=="],
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-nYr7H0CyAJPaLupFE2cH16KZmRC5Z9PEftiA2vWxk+CsFkPZQ6dBRdcC6RuS+zJlPc/JOd8xw3uCCt9Pv41WvQ=="],

"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-NxlSCBhLvQtWGagEztfAZ4WcE1AkMTntZV65ZvR+J9jp06+EtOYEBPQndA70ZGhHbEDG57bR6uNvqkd1WrEYVA=="],
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Eoy9ycbhpJVYuR+LskV9s3uyaIkp89+qqgqhGQsWnp/I02Uqg2fXFblHJOpGZR8AxdB9ADy87oFVxn9MpFKUrw=="],

"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-KaLAxnROouzIWtl6a0Y88r/4hW5oDUJTIqQorOTVQITaKQsKjZX4XCUmHIhdEk8zMnaiLZzRTAwk1yIAl+mIew=="],
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lvwvb2SQQHctHUKvBKptR6PLFCM7JfRjpCCrDaTmvB7EeZ5/dQJPhTYBf36BE/B4CRWR2ZiBLRYhK7hhXBCZAg=="],

"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-V9CUZCtWH4u0YwyCYbQ3W5F4ZGPWp2C2TYcsiWFNNyRfmOW1j/TY/jAurl33SaRjgZPO5UUhGyr9m6BN9t84NQ=="],
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-3WRYte7orvyi6TRfIZkDN9Jzoogbv+gSvR+b9VOXUg1We1XrjBg6WljADeVEaKTvOcpVdH0a90TwyOQ6ue4fGw=="],

"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-dxy599q6lgp8ANPpR8sDMscwdp9oOumEsVXuVCVT9N2vAho8uYXlCz53JhxX6LtJOXaE73qzgkGQ7QqvFlMC0g=="],
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.4", "", { "os": "win32", "cpu": "x64" }, "sha512-tBc+W7anBPSFXGAoQW+f/+svkpt8/uXfRwDzN1DvnatkRMt16KIYpEi/iw8u9GahJlFv98kgHcIrSsZHZTR0sw=="],

"@clickhouse/client": ["@clickhouse/client@1.12.0", "", { "dependencies": { "@clickhouse/client-common": "1.12.0" } }, "sha512-vJUSX8THhTzlVn0WxPukVjOgNRaSoY02ubQkB0LpqNoHFxXuF5jQZZAYvGZWpBGbYQ/4gfPrqu8g4TX5UKeNxA=="],

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
"zod-openapi": "^5.3.0"
},
"devDependencies": {
"@biomejs/biome": "^2.1.3",
"@biomejs/biome": "^2.1.4",
"typescript": "^5.9.2",
"@types/bun": "^1.2.19"
}
Expand Down
31 changes: 22 additions & 9 deletions src/sql/pools/evm.sql
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,22 @@ WITH filtered_pools AS (
if ({factory:String} == '', true, factory = {factory:String}) AND
if ({token:String} == '', true, token0 = {token:String} OR token1 = {token:String}) AND
if ({protocol:String} == '', true, protocol = {protocol:String})
ORDER BY datetime DESC
LIMIT {limit:int}
OFFSET {offset:int}
),
unique_tokens AS (
SELECT DISTINCT token0 AS address FROM filtered_pools
UNION DISTINCT
SELECT DISTINCT token1 AS address FROM filtered_pools
),
filtered_tokens AS (
SELECT
t.address,
if(isNull(t.symbol), '', t.symbol) AS symbol,
coalesce(t.decimals, 0) AS decimals
FROM erc20_metadata_initialize t
WHERE t.address IN (SELECT address FROM unique_tokens)
)
SELECT
pools.block_num AS block_num,
Expand All @@ -35,10 +51,10 @@ SELECT
token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'matic', 'MATIC',
token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'optimism', 'ETH',
token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'unichain', 'ETH',
c0.symbol
t0.symbol
), '')),
coalesce(
if(token0 = '0x0000000000000000000000000000000000000000', 18, c0.decimals), 0
if(token0 = '0x0000000000000000000000000000000000000000', 18, t0.decimals), 0
)
)
AS Tuple(address String, symbol String, decimals UInt8)
Expand All @@ -56,10 +72,10 @@ SELECT
token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'matic', 'MATIC',
token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'optimism', 'ETH',
token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'unichain', 'ETH',
c1.symbol
t1.symbol
), '')),
coalesce(
if(token1 = '0x0000000000000000000000000000000000000000', 18, c1.decimals), 0
if(token1 = '0x0000000000000000000000000000000000000000', 18, t1.decimals), 0
)
)
AS Tuple(address String, symbol String, decimals UInt8)
Expand All @@ -68,8 +84,5 @@ SELECT
protocol,
{network_id: String} as network_id
FROM filtered_pools AS pools
LEFT JOIN erc20_metadata_initialize AS c0 ON c0.address = pools.token0
LEFT JOIN erc20_metadata_initialize AS c1 ON c1.address = pools.token1
ORDER BY datetime DESC
LIMIT {limit:int}
OFFSET {offset:int}
LEFT JOIN filtered_tokens t0 ON pools.token0 = t0.address
LEFT JOIN filtered_tokens t1 ON pools.token1 = t1.address
62 changes: 57 additions & 5 deletions src/sql/swaps/evm.sql
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,69 @@ filtered_pools AS (
FROM pools
WHERE pool IN (SELECT DISTINCT pool FROM s)
),
unique_tokens AS (
SELECT DISTINCT token0 AS address FROM filtered_pools
UNION DISTINCT
SELECT DISTINCT token1 AS address FROM filtered_pools
),
filtered_tokens AS (
SELECT
t.address,
if(isNull(t.symbol), '', t.symbol) AS symbol,
coalesce(t.decimals, 0) AS decimals
FROM erc20_metadata_initialize t
WHERE t.address IN (SELECT address FROM unique_tokens)
),
p AS (
SELECT
pool,
factory,
c0.decimals AS decimals0,
c1.decimals AS decimals1,
CAST(( p.token0, if(isNull(c0.symbol), '', c0.symbol), c0.decimals ) AS Tuple(address String, symbol String, decimals UInt8)) AS token0,
CAST(( p.token1, if(isNull(c1.symbol), '', c1.symbol), c1.decimals ) AS Tuple(address String, symbol String, decimals UInt8)) AS token1
FROM filtered_pools AS p
JOIN erc20_metadata_initialize AS c0 ON c0.address = p.token0
JOIN erc20_metadata_initialize AS c1 ON c1.address = p.token1
CAST((
toString(p.token0),
trim(coalesce(
multiIf(
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'mainnet', 'ETH',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'arbitrum-one', 'ETH',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'avalanche', 'AVAX',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'base', 'ETH',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'bsc', 'BNB',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'matic', 'MATIC',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'optimism', 'ETH',
p.token0 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'unichain', 'ETH',
c0.symbol
), '')),
coalesce(
if(p.token0 = '0x0000000000000000000000000000000000000000', 18, c0.decimals), 0
)
)
AS Tuple(address String, symbol String, decimals UInt8)
) AS token0,
CAST(
(
toString(p.token1),
trim(coalesce(
multiIf(
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'mainnet', 'ETH',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'arbitrum-one', 'ETH',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'avalanche', 'AVAX',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'base', 'ETH',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'bsc', 'BNB',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'matic', 'MATIC',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'optimism', 'ETH',
p.token1 = '0x0000000000000000000000000000000000000000' AND {network_id:String} = 'unichain', 'ETH',
c1.symbol
), '')),
coalesce(
if(p.token1 = '0x0000000000000000000000000000000000000000', 18, c1.decimals), 0
)
)
AS Tuple(address String, symbol String, decimals UInt8)
) AS token1
FROM filtered_pools AS p
JOIN filtered_tokens c0 ON c0.address = p.token0
JOIN filtered_tokens c1 ON c1.address = p.token1
)
SELECT
s.block_num AS block_num,
Expand Down