diff --git a/apis/query/.empty b/apis/query/.empty new file mode 100644 index 00000000..e69de29b diff --git a/apis/query/Dockerfile b/apis/query/Dockerfile index fa75930c..2f86db11 100644 --- a/apis/query/Dockerfile +++ b/apis/query/Dockerfile @@ -1,7 +1,5 @@ FROM node:19-alpine - - RUN apk update RUN apk add python3 \ python3-dev \ @@ -10,7 +8,7 @@ RUN apk add python3 \ py3-pip \ bash -RUN pip install duneapi +RUN pip install duneapi==7.0.0 RUN npm i -g pnpm @@ -23,6 +21,7 @@ RUN pnpm i --frozen-lockfile COPY tsconfig.json . COPY package-scripts.yaml . COPY src src +COPY .empty .empty EXPOSE 3000 diff --git a/apis/query/src/api/repositories/DuneRepository.ts b/apis/query/src/api/repositories/DuneRepository.ts index f3f1b3cd..1ddd4b32 100644 --- a/apis/query/src/api/repositories/DuneRepository.ts +++ b/apis/query/src/api/repositories/DuneRepository.ts @@ -21,7 +21,7 @@ export class DuneRepository { public async executeDuneQuery( queryId: Query, parameters?: Array<{ - name: string + key: string type: ParameterType value: string | number }>, diff --git a/apis/query/src/api/services/QueryService.ts b/apis/query/src/api/services/QueryService.ts index 5b8a5f70..93ef66a3 100644 --- a/apis/query/src/api/services/QueryService.ts +++ b/apis/query/src/api/services/QueryService.ts @@ -33,9 +33,9 @@ export class QueryService { }) { return this.duneRepository .executeDuneQuery(Query.Erc20, [ - { name: 'min', type: ParameterType.Number, value: Number(min) }, + { key: 'min', type: ParameterType.Number, value: Number(min) }, { - name: 'tokenAddress', + key: 'tokenAddress', type: ParameterType.Text, value: `'${tokenAddress}'`, }, diff --git a/apis/query/src/lib/dune/query.py b/apis/query/src/lib/dune/query.py index c96e938e..ef33c9df 100644 --- a/apis/query/src/lib/dune/query.py +++ b/apis/query/src/lib/dune/query.py @@ -3,31 +3,24 @@ import os import sys from duneapi.api import DuneAPI -from duneapi.types import QueryParameter +from duneapi.types import DashboardTile, DuneQuery -QUERY_PARAM_TYPES = { - 'enum': QueryParameter.enum_type, - 'date': QueryParameter.date_type, - 'number': QueryParameter.number_type, - 'text': QueryParameter.text_type, -} - - -def parse_parameters(_parameters: str): - return [QUERY_PARAM_TYPES[p['type']](p['name'], p['value']) for p in json.loads(_parameters)] - - -dune = DuneAPI(os.environ['DUNE_USER'], os.environ['DUNE_PWD']) +dune = DuneAPI(os.environ["DUNE_USER"], os.environ["DUNE_PWD"]) dune.login() query_id = int(sys.argv[1]) +parameters = None # [{\"name\":\"min\",\"type\":\"number\",\"value\":10},{\"name\":\"tokenAddress\",\"type\":\"text\",\"value\":\"'0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'\"}] -parameters = None if len(sys.argv[1:]) == 2: - parameters = parse_parameters(sys.argv[2]) + parameters = json.loads(sys.argv[2]) -job_id = dune.execute(query_id, parameters) -records = dune.get_results(job_id) +# duneapi api is a bit weird, can't simply pass a query id and execute, need to provide a query_file parameter even +# if unused +dashboard_tile = DashboardTile.from_dict( + {"id": query_id, "parameters": parameters, "query_file": "./.empty", "network": "mainnet"}, os.getcwd() +) +dune_query = DuneQuery.from_tile(dashboard_tile) +records = dune.execute_and_await_results(dune_query) -print(json.dumps([r['address'] for r in records])) +print(json.dumps([r["address"] for r in records])) diff --git a/queries/dune_analytics/main.py b/queries/dune_analytics/main.py index d12b0dfb..9207fcc2 100644 --- a/queries/dune_analytics/main.py +++ b/queries/dune_analytics/main.py @@ -1,23 +1,26 @@ +import json import os from duneapi.api import DuneAPI -from duneapi.types import QueryParameter +from duneapi.types import DuneQuery, DashboardTile -queries = { - 'beacon': 1499468, - 'tornado': 1499520, - 'erc20_balance': 1500107 -} +queries = {"beacon": 1499468, "tornado": 1499520, "erc20_balance": 1500107} -dune_api = DuneAPI(os.environ['DUNE_USER'], os.environ['DUNE_PWD']) +dune_api = DuneAPI(os.environ["DUNE_USER"], os.environ["DUNE_PWD"]) dune_api.login() -parameters = [QueryParameter.number_type('min', 10), - QueryParameter.text_type('tokenAddress', - "'0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'")] +parameters = [ + {"key": "min", "type": "number", "value": 10}, + {"key": "tokenAddress", "type": "text", "value": "'0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'"}, +] +query_id = queries["erc20_balance"] +# duneapi api is a bit weird, can't simply pass a query id and execute, need to provide a query_file parameter even +# if unused +dashboard_tile = DashboardTile.from_dict( + {"id": query_id, "parameters": parameters, "query_file": "./empty", "network": "mainnet"}, "." +) +dune_query = DuneQuery.from_tile(dashboard_tile) +records = dune_api.execute_and_await_results(dune_query) -job_id = dune_api.execute(queries['erc20_balance'], parameters) -records = dune_api.get_results(job_id) - -print([r['address'] for r in records]) +print(json.dumps([r["address"] for r in records])) diff --git a/queries/dune_analytics/requirements.txt b/queries/dune_analytics/requirements.txt index 095f327e..4e61ddb2 100644 --- a/queries/dune_analytics/requirements.txt +++ b/queries/dune_analytics/requirements.txt @@ -10,7 +10,7 @@ charset-normalizer==2.1.1 click==8.1.3 cytoolz==0.12.0 Deprecated==1.2.13 -duneapi==6.1.2 +duneapi==7.0.0 eth-abi==2.2.0 eth-account==0.5.9 eth-hash==0.5.0 diff --git a/queries/the_graph/beacon-depositors.graphql b/queries/the_graph/beacon-depositors.graphql new file mode 100644 index 00000000..7c755fea --- /dev/null +++ b/queries/the_graph/beacon-depositors.graphql @@ -0,0 +1,5 @@ +query BeaconDepositors{ + depositors { + id + } +}