diff --git a/apps/server/src/api/protocols/users/index.ts b/apps/server/src/api/protocols/users/index.ts index 41591bb6..2688b535 100644 --- a/apps/server/src/api/protocols/users/index.ts +++ b/apps/server/src/api/protocols/users/index.ts @@ -46,7 +46,8 @@ export default defineCachedEventHandler(async (event) => { })); return stats; -}, apiCacheConfig); + // }, apiCacheConfig); +}); interface QueryParams { limit: number; @@ -63,22 +64,29 @@ const getProtocolUsersDirect = async ({ } const result = await sql` - SELECT - dapps.id as protocol_name, - COUNT(DISTINCT txs.sender_address) AS unique_senders - FROM - txs - JOIN - dapps ON txs.contract_call_contract_id = ANY (dapps.contracts) - WHERE - txs.type_id = 2 - ${sql.unsafe(dateCondition)} - GROUP BY - dapps.id - ORDER BY - unique_senders DESC - LIMIT ${limit}; - `; +WITH protocol_contracts AS ( + SELECT id, UNNEST(contracts) AS contract_address + FROM dapps +) + +SELECT + protocol_contracts.id as protocol_name, + COUNT(DISTINCT txs.sender_address) AS unique_senders +FROM + txs +JOIN + protocol_contracts ON txs.contract_call_contract_id LIKE protocol_contracts.contract_address +WHERE + txs.type_id = 2 + ${sql.unsafe(dateCondition)} +GROUP BY + protocol_contracts.id +ORDER BY + unique_senders DESC +LIMIT ${limit}; + `; + + console.log("result", JSON.stringify(result, null, 2)); return result; }; @@ -125,7 +133,7 @@ address_txs AS ( SELECT tx_id, index_block_hash, microblock_hash, recipient FROM nft_events ) sub - JOIN protocol_contracts ON sub.address = protocol_contracts.contract_address + JOIN protocol_contracts ON sub.address LIKE protocol_contracts.contract_address ) SELECT @@ -147,5 +155,7 @@ ORDER BY LIMIT ${limit}; `; + console.log("result", JSON.stringify(result, null, 2)); + return result; }; diff --git a/apps/server/src/api/transactions/index.get.ts b/apps/server/src/api/transactions/index.get.ts index fc4508d2..e382c9f2 100644 --- a/apps/server/src/api/transactions/index.get.ts +++ b/apps/server/src/api/transactions/index.get.ts @@ -17,9 +17,9 @@ type TransactionsRouteResponse = (ContractCallTransaction & { export default defineCachedEventHandler(async (event) => { const query = await getValidatedQueryZod(event, transactionsRouteSchema); - let protocolCondition = ""; + let protocolContractsCondition = ""; if (query.protocol) { - protocolCondition = `AND dapps.id = '${query.protocol}'`; + protocolContractsCondition = `WHERE id = '${query.protocol}'`; } const result = await sql< @@ -28,16 +28,21 @@ export default defineCachedEventHandler(async (event) => { tx_id: Buffer; }[] >` +WITH protocol_contracts AS ( + SELECT id, UNNEST(contracts) AS contract_address + FROM dapps + ${sql.unsafe(protocolContractsCondition)} +) + SELECT - dapps.id as protocol, + protocol_contracts.id as protocol, tx_id FROM txs JOIN - dapps ON txs.contract_call_contract_id = ANY (dapps.contracts) + protocol_contracts ON txs.contract_call_contract_id LIKE protocol_contracts.contract_address WHERE txs.type_id = 2 - ${sql.unsafe(protocolCondition)} AND canonical = TRUE AND microblock_canonical = TRUE ORDER BY diff --git a/apps/server/src/api/transactions/stats/index.ts b/apps/server/src/api/transactions/stats/index.ts index c2e2f2fd..b0c4982f 100644 --- a/apps/server/src/api/transactions/stats/index.ts +++ b/apps/server/src/api/transactions/stats/index.ts @@ -23,50 +23,52 @@ export default defineCachedEventHandler(async (event) => { const result = await sql` WITH protocol_contracts AS ( - SELECT UNNEST(contracts) AS contract_address - FROM dapps - ${sql.unsafe(protocolContractsCondition)} + SELECT DISTINCT contract_id as contract_address + FROM smart_contracts + WHERE contract_id LIKE ANY ( + SELECT contract_address + FROM dapps, UNNEST(contracts) AS contract_address + ${sql.unsafe(protocolContractsCondition)} + ) ), address_txs AS ( SELECT DISTINCT tx_id, index_block_hash, microblock_hash FROM ( - SELECT tx_id, index_block_hash, microblock_hash, contract_call_contract_id AS address - FROM txs - UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, principal + SELECT tx_id, index_block_hash, microblock_hash FROM principal_stx_txs + WHERE principal IN (SELECT contract_address FROM protocol_contracts) + UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, sender - FROM stx_events - UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, recipient + + SELECT tx_id, index_block_hash, microblock_hash FROM stx_events + WHERE sender IN (SELECT contract_address FROM protocol_contracts) + OR recipient IN (SELECT contract_address FROM protocol_contracts) + UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, sender - FROM ft_events - UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, recipient + + SELECT tx_id, index_block_hash, microblock_hash FROM ft_events + WHERE sender IN (SELECT contract_address FROM protocol_contracts) + OR recipient IN (SELECT contract_address FROM protocol_contracts) + UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, sender - FROM nft_events - UNION ALL - SELECT tx_id, index_block_hash, microblock_hash, recipient + + SELECT tx_id, index_block_hash, microblock_hash FROM nft_events - ) sub - WHERE address IN (SELECT contract_address FROM protocol_contracts) + WHERE sender IN (SELECT contract_address FROM protocol_contracts) + OR recipient IN (SELECT contract_address FROM protocol_contracts) + ) combined_events ) SELECT - COUNT(DISTINCT atxs.tx_id) AS count, + COUNT(DISTINCT address_txs.tx_id) AS count, COUNT(DISTINCT txs.sender_address) AS unique_senders -FROM - txs -JOIN - address_txs atxs ON atxs.tx_id = txs.tx_id - AND atxs.index_block_hash = txs.index_block_hash - AND atxs.microblock_hash = txs.microblock_hash +FROM address_txs +INNER JOIN txs USING (tx_id, index_block_hash, microblock_hash) +WHERE txs.canonical = TRUE +AND txs.microblock_canonical = TRUE; `; const stats: TransactionStatsRouteResponse = { diff --git a/apps/server/src/api/transactions/unique-senders/index.ts b/apps/server/src/api/transactions/unique-senders/index.ts index a59caf9c..f7a45ee1 100644 --- a/apps/server/src/api/transactions/unique-senders/index.ts +++ b/apps/server/src/api/transactions/unique-senders/index.ts @@ -32,39 +32,46 @@ WITH monthly_blocks AS ( ), protocol_contracts AS ( - SELECT UNNEST(contracts) AS contract_address - FROM dapps - WHERE id = ${query.protocol} + SELECT DISTINCT contract_id as contract_address + FROM smart_contracts + WHERE contract_id LIKE ANY ( + SELECT contract_address + FROM dapps, UNNEST(contracts) AS contract_address + WHERE id = ${query.protocol} + ) ), address_txs AS ( SELECT DISTINCT tx_id, index_block_hash, microblock_hash FROM ( - SELECT tx_id, index_block_hash, microblock_hash, contract_call_contract_id AS address - FROM txs - UNION ALL SELECT tx_id, index_block_hash, microblock_hash, principal FROM principal_stx_txs + WHERE principal IN (SELECT contract_address FROM protocol_contracts) UNION ALL SELECT tx_id, index_block_hash, microblock_hash, sender FROM stx_events + WHERE sender IN (SELECT contract_address FROM protocol_contracts) UNION ALL SELECT tx_id, index_block_hash, microblock_hash, recipient FROM stx_events + WHERE recipient IN (SELECT contract_address FROM protocol_contracts) UNION ALL SELECT tx_id, index_block_hash, microblock_hash, sender FROM ft_events + WHERE sender IN (SELECT contract_address FROM protocol_contracts) UNION ALL SELECT tx_id, index_block_hash, microblock_hash, recipient FROM ft_events + WHERE recipient IN (SELECT contract_address FROM protocol_contracts) UNION ALL SELECT tx_id, index_block_hash, microblock_hash, sender FROM nft_events + WHERE sender IN (SELECT contract_address FROM protocol_contracts) UNION ALL SELECT tx_id, index_block_hash, microblock_hash, recipient FROM nft_events + WHERE recipient IN (SELECT contract_address FROM protocol_contracts) ) sub - WHERE address IN (SELECT contract_address FROM protocol_contracts) ) SELECT diff --git a/packages/protocols/src/protocols.ts b/packages/protocols/src/protocols.ts index be13dda4..87ac292f 100644 --- a/packages/protocols/src/protocols.ts +++ b/packages/protocols/src/protocols.ts @@ -35,9 +35,7 @@ export const protocolsInfo: { "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01", "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-vault-v2-01", "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-01", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-02", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-03", + "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-%", ], }, arkadiko: { @@ -47,7 +45,7 @@ export const protocolsInfo: { website: "https://arkadiko.finance/", x: "https://twitter.com/ArkadikoFinance", contracts: [ - "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1", + "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-%", "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-multi-hop-swap-v1-1", ], }, @@ -59,56 +57,14 @@ export const protocolsInfo: { // List of contract https://docs.bitflow.finance/bitflow-documentation/developers/deployed-contracts/stacks contracts: [ // StableSwap Contracts - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-susdt-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-aeusdc-susdt-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-4", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-abtc-xbtc-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-abtc-xbtc-v-1-2", - "SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdh-v-1-1", - "SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdh-v-1-2", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-%", + "SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-%", // Earn Contracts - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-stx-ststx-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-stx-ststx-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-usda-susdt-v-1-3", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-aeusdc-susdt-v-1-3", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-usda-aeusdc-v-1-3", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-usda-aeusdc-v-1-5", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-abtc-xbtc-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-abtc-xbtc-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-abtc-xbtc-v-1-3", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-%", // Router Contracts - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-arkadiko-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-velar-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-velar-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-alex-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-alex-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-alex-v-2-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-ststx-bitflow-xyk-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-usda-arkadiko-alex-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stx-usda-arkadiko-velar-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-xyk-arkadiko-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-xyk-velar-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-xyk-alex-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-xyk-alex-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-velar-alex-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-velar-alex-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-aeusdc-ststx-v-2-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-susdt-ststx-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-xyk-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-xyk-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-velar-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-velar-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-alex-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-alex-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-stableswap-usda-aeusdc-v-1-1", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.router-%", // Wrapper Contracts - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.wrapper-velar-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.wrapper-alex-v-2-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.wrapper-velar-multihop-v-1-1", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.wrapper-arkadiko-v-1-1", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.wrapper-%", // Core Contracts "SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-core-v-1-1", "SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-core-v-1-1", @@ -121,10 +77,7 @@ export const protocolsInfo: { "Liquid stacking on Stacks. Earn 10% APY on STX with instant liquidity 📈", website: "https://www.stackingdao.com/", x: "https://twitter.com/StackingDao", - contracts: [ - "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v1", - "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v2", - ], + contracts: ["SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-%"], }, stackswap: { name: "StackSwap", @@ -144,21 +97,9 @@ export const protocolsInfo: { "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-path2", "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-core", // V1 - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0001", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0002", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0003", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0004", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0005", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0006", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0007", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0008", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0009", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0010", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0011", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0012", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-v1_0_0-0013", + "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-pool-%", // Stables - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.curve-pool-v1_1_0-0001", + "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.curve-pool-%", ], }, zest: {