From 8e01ede723ab6b573e09262da8f6a8c56e24afa2 Mon Sep 17 00:00:00 2001 From: Alireza Haghshenas Date: Wed, 4 Jan 2023 21:11:18 -0800 Subject: [PATCH 1/5] Run dipdup metadata indexer when starting a sandbox --- taqueria-plugin-flextesa/proxy.ts | 5 +++-- taqueria-plugin-flextesa/tzkt-manager.ts | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/taqueria-plugin-flextesa/proxy.ts b/taqueria-plugin-flextesa/proxy.ts index 1867eeb19..c3083ff91 100644 --- a/taqueria-plugin-flextesa/proxy.ts +++ b/taqueria-plugin-flextesa/proxy.ts @@ -293,11 +293,12 @@ const startInstance = async (sandboxName: string, sandbox: SandboxConfig.t, opts if (sandbox.tzkt?.disableAutostartWithSandbox === true) { return; } - const { postgres, sync, api } = await getTzKtStartCommands(sandboxName, sandbox, opts); + const { postgres, sync, api, metadata } = await getTzKtStartCommands(sandboxName, sandbox, opts); const tzKtContainers = [ { name: 'postgresql', command: postgres }, { name: 'TzKt.Sync', command: sync }, { name: 'TzKt.Api', command: api }, + { name: 'metadata', command: metadata }, ]; for (const container of tzKtContainers) { await startContainer(container); @@ -447,7 +448,7 @@ const stopTzKtContainers = async ( parsedArgs: ValidOpts, ): Promise => { const containerNames = await getTzKtContainerNames(sandboxName, parsedArgs); - const containersToStop = [containerNames.api, containerNames.sync, containerNames.postgres]; + const containersToStop = [containerNames.api, containerNames.sync, containerNames.postgres, containerNames.metadata]; for (const container of containersToStop) { try { const result = await execCmd(`docker stop ${container}`); diff --git a/taqueria-plugin-flextesa/tzkt-manager.ts b/taqueria-plugin-flextesa/tzkt-manager.ts index 2f34f4f94..5ce8f77cd 100644 --- a/taqueria-plugin-flextesa/tzkt-manager.ts +++ b/taqueria-plugin-flextesa/tzkt-manager.ts @@ -7,6 +7,7 @@ const getTzKtDockerImages = (opts: ValidOpts) => ({ postgres: `postgres:14.5-alpine`, sync: `ghcr.io/ecadlabs/tzkt-sync:v1.11.0-taqueria`, api: `ghcr.io/ecadlabs/tzkt-api:v1.11.0-taqueria`, + metadata: 'dipdup/metadata:latest', }); export const getTzKtContainerNames = async (sandboxName: string, parsedArgs: ValidOpts) => { @@ -15,6 +16,7 @@ export const getTzKtContainerNames = async (sandboxName: string, parsedArgs: Val postgres: `taq-postgres-${uniqueSandboxName}`, sync: `taq-tzkt-sync-${uniqueSandboxName}`, api: `taq-tzkt-api-${uniqueSandboxName}`, + metadata: `taq-metadata-${uniqueSandboxName}`, }; }; @@ -28,6 +30,7 @@ const getTzKtContainerEnvironments = async (sandboxName: string, sandbox: Sandbo sync: `--env ${connectionStringEnv} --env TezosNode__Endpoint="http://${sandboxContainerName}:20000/"`, api: `--env ${connectionStringEnv} --env Kestrel__Endpoints__Http__Url="http://*:5000" --env MaxAttemptsForMigrations=120`, + metadata: ``, }; }; @@ -89,5 +92,7 @@ export const getTzKtStartCommands = async (sandboxName: string, sandbox: Sandbox `docker run --network sandbox_${sandboxName}_net --name ${containerNames.sync} --rm --detach --platform ${arch} ${environmentVariables.sync} ${images.sync}`, api: `docker run --network sandbox_${sandboxName}_net --name ${containerNames.api} --rm --detach --platform ${arch} -p ${newAPIPort}:5000 ${environmentVariables.api} ${images.api}`, + metadata: + `docker run --network sandbox_${sandboxName}_net --name ${containerNames.metadata} --rm --detach --platform ${arch} -v ${opts.projectDir}/dipdup:/work:Z ${environmentVariables.metadata} ${images.metadata} -c /work/dipdup.yml`, }; }; From e43186864dab03569adda4492d1ffe3415ddd11a Mon Sep 17 00:00:00 2001 From: Alireza Haghshenas Date: Thu, 5 Jan 2023 15:54:57 -0800 Subject: [PATCH 2/5] Fix dipdup.metadata Envs and TzKt sync protocol --- taqueria-plugin-flextesa/tzkt-manager.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/taqueria-plugin-flextesa/tzkt-manager.ts b/taqueria-plugin-flextesa/tzkt-manager.ts index 5ce8f77cd..6e0d8fb0c 100644 --- a/taqueria-plugin-flextesa/tzkt-manager.ts +++ b/taqueria-plugin-flextesa/tzkt-manager.ts @@ -27,10 +27,11 @@ const getTzKtContainerEnvironments = async (sandboxName: string, sandbox: Sandbo `ConnectionStrings__DefaultConnection="host=${containerNames.postgres};port=5432;database=sandbox_data;username=tzkt;password=${sandboxName};"`; return { postgres: `--env POSTGRES_PASSWORD=${sandboxName} --env POSTGRES_USER=tzkt`, - sync: `--env ${connectionStringEnv} --env TezosNode__Endpoint="http://${sandboxContainerName}:20000/"`, + sync: + `--env ${connectionStringEnv} --env TezosNode__Endpoint="http://${sandboxContainerName}:20000/" --env Protocols__Fallback="PtLimaPtLMwfNinJi9rCfDPWea8dFgTZ1MeJ9f1m2SRic6ayiwW"`, api: `--env ${connectionStringEnv} --env Kestrel__Endpoints__Http__Url="http://*:5000" --env MaxAttemptsForMigrations=120`, - metadata: ``, + metadata: `--env POSTGRES_HOST=${containerNames.postgres} --env TZKT_URL="http://${containerNames.api}:5000"`, }; }; @@ -93,6 +94,6 @@ export const getTzKtStartCommands = async (sandboxName: string, sandbox: Sandbox api: `docker run --network sandbox_${sandboxName}_net --name ${containerNames.api} --rm --detach --platform ${arch} -p ${newAPIPort}:5000 ${environmentVariables.api} ${images.api}`, metadata: - `docker run --network sandbox_${sandboxName}_net --name ${containerNames.metadata} --rm --detach --platform ${arch} -v ${opts.projectDir}/dipdup:/work:Z ${environmentVariables.metadata} ${images.metadata} -c /work/dipdup.yml`, + `docker run --network sandbox_${sandboxName}_net --name ${containerNames.metadata} --rm --detach --platform ${arch} -v /home/alireza/work/scrap/EcadLabs/DipdupExplorations:/work:Z ${environmentVariables.metadata} ${images.metadata} -c /work/dipdup.yml`, }; }; From 8346a4ca36cd05e9bd0043e07e8da4e7c3d0323e Mon Sep 17 00:00:00 2001 From: Alireza Haghshenas Date: Tue, 10 Jan 2023 02:17:28 -0800 Subject: [PATCH 3/5] read tokens from dipdup and tzkt --- package-lock.json | 379 ++++++++++++++++++ taqueria-plugin-flextesa/proxy.ts | 2 +- taqueria-vscode-extension/package.json | 3 + .../src/lib/gui/CachedSandboxState.ts | 9 + .../src/lib/gui/DataModels.ts | 35 ++ .../src/lib/gui/DbConnectionPools.ts | 17 + .../src/lib/gui/SandboxTreeItemTypes.ts | 12 +- .../src/lib/gui/SandboxesDataProvider.ts | 44 +- 8 files changed, 498 insertions(+), 3 deletions(-) create mode 100644 taqueria-vscode-extension/src/lib/gui/DataModels.ts create mode 100644 taqueria-vscode-extension/src/lib/gui/DbConnectionPools.ts diff --git a/package-lock.json b/package-lock.json index 0d6a2ed85..726a1df72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7225,6 +7225,17 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, + "node_modules/@types/pg": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", + "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -9009,6 +9020,14 @@ "node": ">=0.10" } }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, "node_modules/buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -22485,6 +22504,11 @@ "semver": "bin/semver.js" } }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "node_modules/pacote": { "version": "13.6.2", "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", @@ -22852,6 +22876,97 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, + "node_modules/pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/pgpass/node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -23673,6 +23788,47 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-range": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.3.tgz", + "integrity": "sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==", + "dev": true + }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -30861,6 +31017,7 @@ "comment-json": "^4.1.1", "eventsource": "^2.0.2", "node-fetch-commonjs": "^3.1.1", + "pg": "^8.8.0", "promise-memoize": "^1.2.1", "rambda": "^7.0.1", "rxjs": "^7.5.6", @@ -30872,6 +31029,7 @@ "@types/glob": "^7.2.0", "@types/mocha": "^5.2.6", "@types/node": "^17.0.17", + "@types/pg": "^8.6.6", "@types/promise-memoize": "^1.2.1", "@types/semver": "^7.3.10", "@types/vscode": "1.63.0", @@ -30883,6 +31041,7 @@ "fs-extra": "^10.1.0", "glob": "^7.2.0", "mocha": "^9.2.1", + "pg-types": "^4.0.0", "typescript": "4.7.2", "vsce": "^2.6.4" }, @@ -30897,6 +31056,63 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", "dev": true }, + "taqueria-vscode-extension/node_modules/pg-types": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.0.tgz", + "integrity": "sha512-q4I7zG+d2mDg52WdrOA0TmBvab9ZBC8DE8+opl3gSegnH5ml+0pKbICOfRKXgwQ5aa6NRjLoF5pEDs0YpGvFrw==", + "dev": true, + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.0.1", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "taqueria-vscode-extension/node_modules/postgres-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.1.tgz", + "integrity": "sha512-h7i53Dw2Yq3a1uuZ6lbVFAkvMMwssJ8jkzeAg0XaZm1XIFF/t/s+tockdqbWTymyEm07dVenOQbFisEi+kj8uA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "taqueria-vscode-extension/node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dev": true, + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "taqueria-vscode-extension/node_modules/postgres-date": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.0.1.tgz", + "integrity": "sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "taqueria-vscode-extension/node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "taqueria-vscode-extension/node_modules/typescript": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", @@ -38537,6 +38753,17 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, + "@types/pg": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", + "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", + "dev": true, + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -39948,6 +40175,11 @@ "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", "dev": true }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -49963,6 +50195,11 @@ } } }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "pacote": { "version": "13.6.2", "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", @@ -50262,6 +50499,74 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, + "pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "dev": true + }, + "pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "requires": {} + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "requires": { + "split2": "^4.1.0" + }, + "dependencies": { + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + } + } + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -50767,6 +51072,35 @@ "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", "requires": {} }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "postgres-range": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.3.tgz", + "integrity": "sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==", + "dev": true + }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -53228,6 +53562,7 @@ "@types/glob": "^7.2.0", "@types/mocha": "^5.2.6", "@types/node": "^17.0.17", + "@types/pg": "*", "@types/promise-memoize": "^1.2.1", "@types/semver": "^7.3.10", "@types/vscode": "1.63.0", @@ -53243,6 +53578,8 @@ "glob": "^7.2.0", "mocha": "^9.2.1", "node-fetch-commonjs": "^3.1.1", + "pg": "^8.8.0", + "pg-types": "^4.0.0", "promise-memoize": "^1.2.1", "rambda": "^7.0.1", "rxjs": "^7.5.6", @@ -53257,6 +53594,48 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", "dev": true }, + "pg-types": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.0.tgz", + "integrity": "sha512-q4I7zG+d2mDg52WdrOA0TmBvab9ZBC8DE8+opl3gSegnH5ml+0pKbICOfRKXgwQ5aa6NRjLoF5pEDs0YpGvFrw==", + "dev": true, + "requires": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.0.1", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + } + }, + "postgres-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.1.tgz", + "integrity": "sha512-h7i53Dw2Yq3a1uuZ6lbVFAkvMMwssJ8jkzeAg0XaZm1XIFF/t/s+tockdqbWTymyEm07dVenOQbFisEi+kj8uA==", + "dev": true + }, + "postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dev": true, + "requires": { + "obuf": "~1.1.2" + } + }, + "postgres-date": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.0.1.tgz", + "integrity": "sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==", + "dev": true + }, + "postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "dev": true + }, "typescript": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", diff --git a/taqueria-plugin-flextesa/proxy.ts b/taqueria-plugin-flextesa/proxy.ts index c3083ff91..1a4bf37e5 100644 --- a/taqueria-plugin-flextesa/proxy.ts +++ b/taqueria-plugin-flextesa/proxy.ts @@ -298,7 +298,7 @@ const startInstance = async (sandboxName: string, sandbox: SandboxConfig.t, opts { name: 'postgresql', command: postgres }, { name: 'TzKt.Sync', command: sync }, { name: 'TzKt.Api', command: api }, - { name: 'metadata', command: metadata }, + // { name: 'metadata', command: metadata }, ]; for (const container of tzKtContainers) { await startContainer(container); diff --git a/taqueria-vscode-extension/package.json b/taqueria-vscode-extension/package.json index 75e88185e..8314a3723 100644 --- a/taqueria-vscode-extension/package.json +++ b/taqueria-vscode-extension/package.json @@ -764,6 +764,7 @@ "@types/glob": "^7.2.0", "@types/mocha": "^5.2.6", "@types/node": "^17.0.17", + "@types/pg": "^8.6.6", "@types/promise-memoize": "^1.2.1", "@types/semver": "^7.3.10", "@types/vscode": "1.63.0", @@ -775,6 +776,7 @@ "fs-extra": "^10.1.0", "glob": "^7.2.0", "mocha": "^9.2.1", + "pg-types": "^4.0.0", "typescript": "4.7.2", "vsce": "^2.6.4" }, @@ -785,6 +787,7 @@ "comment-json": "^4.1.1", "eventsource": "^2.0.2", "node-fetch-commonjs": "^3.1.1", + "pg": "^8.8.0", "promise-memoize": "^1.2.1", "rambda": "^7.0.1", "rxjs": "^7.5.6", diff --git a/taqueria-vscode-extension/src/lib/gui/CachedSandboxState.ts b/taqueria-vscode-extension/src/lib/gui/CachedSandboxState.ts index 72881d3f3..9ed770f5a 100644 --- a/taqueria-vscode-extension/src/lib/gui/CachedSandboxState.ts +++ b/taqueria-vscode-extension/src/lib/gui/CachedSandboxState.ts @@ -149,4 +149,13 @@ export class CachedSandboxState { let port = sandbox.tzkt?.apiPort ?? 5000; return `http://127.0.0.1:${port}`; } + + getDipupConnectionString(sandboxName: string): string | undefined { + const sandbox = this.observableConfig.currentConfig.config?.config.sandbox?.[sandboxName]; + if (!sandbox || typeof sandbox === 'string') { + return undefined; + } + let port = sandbox.tzkt?.postgresqlPort ?? 5432; + return `postgres://tzkt:${sandboxName}@127.0.0.1:${port}/sandbox_data`; + } } diff --git a/taqueria-vscode-extension/src/lib/gui/DataModels.ts b/taqueria-vscode-extension/src/lib/gui/DataModels.ts new file mode 100644 index 000000000..1700f05b3 --- /dev/null +++ b/taqueria-vscode-extension/src/lib/gui/DataModels.ts @@ -0,0 +1,35 @@ +export type TokenInfo_TzKt = { + id: number; + contract: AccountReferenece; + tokenId: string; + standard: string; + firstMinter: AccountReferenece; + firstLevel: number; + firstTime: string; + lastLevel: number; + lastTime: string; + transfersCount: number; + balancesCount: number; + holdersCount: number; + totalMinted: string; + totalBurned: string; + totalSupply: string; + metadata: TokenMetadata; +}; + +export type TokenInfo_Dipdup = { + id: bigint; + token_id: bigint; + link: string | undefined | null; + metadata: string | undefined | null; + image_processed: boolean | undefined | null; +}; + +export type TokenMetadata = { + name?: string | undefined; +}; + +export type AccountReferenece = { + alias: string; + address: string; +}; diff --git a/taqueria-vscode-extension/src/lib/gui/DbConnectionPools.ts b/taqueria-vscode-extension/src/lib/gui/DbConnectionPools.ts new file mode 100644 index 000000000..ce18806fa --- /dev/null +++ b/taqueria-vscode-extension/src/lib/gui/DbConnectionPools.ts @@ -0,0 +1,17 @@ +import { Pool } from 'pg'; + +export class DbConnectionPools { + private static pools: Map = new Map(); + + getPool(connectionString: string): Pool { + let pool = DbConnectionPools.pools.get(connectionString); + if (pool) { + return pool; + } + pool = new Pool({ + connectionString, + }); + DbConnectionPools.pools.set(connectionString, pool); + return pool; + } +} diff --git a/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts b/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts index 5a543cce8..acc869bb8 100644 --- a/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts +++ b/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts @@ -11,6 +11,7 @@ export class SandboxTreeItemBase extends vscode.TreeItem { | 'smartContract' | 'smartContractChild' | 'smartContractEntryPoint' + | 'token' | 'operation', collapsibleState: vscode.TreeItemCollapsibleState, ) { @@ -108,7 +109,7 @@ export class SandboxSmartContractTreeItem extends SandboxTreeItemBase { export class SmartContractChildrenTreeItem extends SandboxTreeItemBase { constructor( - public kind: 'Operations' | 'Entrypoints', + public kind: 'Operations' | 'Entrypoints' | 'Tokens', public readonly parent: SandboxSmartContractTreeItem, ) { super(kind, 'smartContractChild', vscode.TreeItemCollapsibleState.Collapsed); @@ -140,3 +141,12 @@ export class OperationTreeItem extends SandboxTreeItemBase { this.contextValue = 'operation'; } } + +export class TokenTreeItem extends SandboxTreeItemBase { + constructor( + public readonly tokenId: string, + public readonly name: string | undefined, + ) { + super(name || tokenId.toString(), 'token', vscode.TreeItemCollapsibleState.None); + } +} diff --git a/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts b/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts index c2b166ce8..05c079630 100644 --- a/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts +++ b/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts @@ -7,6 +7,8 @@ import { OutputLevels } from '../LogHelper'; import { getRunningContainerNames } from '../pure'; import * as Util from '../pure'; import { CachedSandboxState, SandboxState } from './CachedSandboxState'; +import { TokenInfo_Dipdup, TokenInfo_TzKt } from './DataModels'; +import { DbConnectionPools } from './DbConnectionPools'; import { ObservableConfig } from './ObservableConfig'; import { TzKtHead } from './SandboxDataModels'; import { @@ -18,6 +20,7 @@ import { SandboxTreeItemBase, SmartContractChildrenTreeItem, SmartContractEntrypointTreeItem, + TokenTreeItem, } from './SandboxTreeItemTypes'; import { TaqueriaDataProviderBase } from './TaqueriaDataProviderBase'; @@ -32,6 +35,7 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase } private sandboxStates: Record = {}; + private pools = new DbConnectionPools(); refreshLevelInterval: NodeJS.Timer | undefined; private sandboxTreeItems: SandboxTreeItem[] | undefined; @@ -63,6 +67,8 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase return await this.getSmartContractEntrypoints(element); case 'Operations': return await this.getAccountOperations(element); + case 'Tokens': + return await this.getTokens(element); default: return []; } @@ -280,6 +286,7 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase return [ new SmartContractChildrenTreeItem('Entrypoints', element), new SmartContractChildrenTreeItem('Operations', element), + new SmartContractChildrenTreeItem('Tokens', element), ]; } @@ -291,7 +298,6 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase return []; } const response = await fetch(`${tzktBaseUrl}/v1/accounts?type.ne=contract`); - tzktBaseUrl; const data = await response.json(); const sandbox = this.observableConfig.currentConfig.config?.config.sandbox?.[element.parent.sandboxName]; const aliases = (sandbox === undefined || typeof sandbox === 'string' || !sandbox.accounts) @@ -395,4 +401,40 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase } this._onDidChangeTreeData.fire(); } + + async getTokens(element: SmartContractChildrenTreeItem): Promise { + const data = await this.getTokensFromTzKt(element); + return data.map(item => new TokenTreeItem(item.tokenId, item.metadata?.name)); + } + + private async getTokensFromTzKt(element: SmartContractChildrenTreeItem): Promise { + const tzktBaseUrl = this.sandboxStates[element.parent.sandboxName]?.getTzKtBaseUrl(element.parent.sandboxName); + if (!tzktBaseUrl) { + return []; + } + const contractAddress = element.parent.address; + const response = await fetch(`${tzktBaseUrl}/v1/tokens?contract.eq=${contractAddress}`); + const data = await response.json(); + return data as TokenInfo_TzKt[]; + } + + private async getTokensFromDipdup(element: SmartContractChildrenTreeItem): Promise { + const connectionString = this.sandboxStates[element.parent.sandboxName]?.getDipupConnectionString( + element.parent.sandboxName, + ); + if (!connectionString) { + return []; + } + const pool = this.pools.getPool(connectionString); + const contractAddress = element.parent.address; + const tokens = await pool.query(`select * from token_metadata where contract='${contractAddress}'`); + this.helper.logHelper.showOutput(JSON.stringify(tokens.rows)); + return tokens.rows.map(row => ({ + id: row.id, + token_id: row.token_id, + link: row.link, + metadata: JSON.parse(row.metadata), + image_processed: row.image_processed, + })); + } } From 9cf8b3d888e13aa6cb4fef1208acd980f50bdfe2 Mon Sep 17 00:00:00 2001 From: Alireza Haghshenas Date: Tue, 10 Jan 2023 16:08:07 -0800 Subject: [PATCH 4/5] Token names are being shown --- taqueria-vscode-extension/package.json | 2 +- .../src/lib/gui/DataModels.ts | 2 +- .../src/lib/gui/SandboxesDataProvider.ts | 14 ++++++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/taqueria-vscode-extension/package.json b/taqueria-vscode-extension/package.json index 8314a3723..c5905a39c 100644 --- a/taqueria-vscode-extension/package.json +++ b/taqueria-vscode-extension/package.json @@ -750,7 +750,7 @@ }, "scripts": { "vscode:prepublish": "npm run compile:base -- --minify", - "compile:base": "esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --format=cjs --platform=node", + "compile:base": "esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --external:pg-native --format=cjs --platform=node", "compile": "npx tsc -noEmit && npm run compile:base -- --sourcemap", "compile:watch": "npm run compile:base -- --sourcemap --watch", "compile:test": "tsc -p tsconfig.test.json", diff --git a/taqueria-vscode-extension/src/lib/gui/DataModels.ts b/taqueria-vscode-extension/src/lib/gui/DataModels.ts index 1700f05b3..0111166e4 100644 --- a/taqueria-vscode-extension/src/lib/gui/DataModels.ts +++ b/taqueria-vscode-extension/src/lib/gui/DataModels.ts @@ -21,7 +21,7 @@ export type TokenInfo_Dipdup = { id: bigint; token_id: bigint; link: string | undefined | null; - metadata: string | undefined | null; + metadata: TokenMetadata | undefined | null; image_processed: boolean | undefined | null; }; diff --git a/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts b/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts index 05c079630..6debe920e 100644 --- a/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts +++ b/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts @@ -403,8 +403,15 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase } async getTokens(element: SmartContractChildrenTreeItem): Promise { - const data = await this.getTokensFromTzKt(element); - return data.map(item => new TokenTreeItem(item.tokenId, item.metadata?.name)); + const [dataFromTzKt, dataFromDipdup] = await Promise.all([ + this.getTokensFromTzKt(element), + this.getTokensFromDipdup(element), + ]); + const data = dataFromTzKt.map(tzKtItem => ({ + tzKtItem, + dipDupItem: dataFromDipdup.find(dipDupItem => dipDupItem.token_id.toString() === tzKtItem.tokenId), + })); + return data.map(item => new TokenTreeItem(item.tzKtItem.tokenId, item.dipDupItem?.metadata?.name)); } private async getTokensFromTzKt(element: SmartContractChildrenTreeItem): Promise { @@ -428,12 +435,11 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase const pool = this.pools.getPool(connectionString); const contractAddress = element.parent.address; const tokens = await pool.query(`select * from token_metadata where contract='${contractAddress}'`); - this.helper.logHelper.showOutput(JSON.stringify(tokens.rows)); return tokens.rows.map(row => ({ id: row.id, token_id: row.token_id, link: row.link, - metadata: JSON.parse(row.metadata), + metadata: row.metadata, image_processed: row.image_processed, })); } From e8f331a465fe67841cd347c251bc8e79fe4f963a Mon Sep 17 00:00:00 2001 From: Alireza Haghshenas Date: Tue, 10 Jan 2023 16:46:17 -0800 Subject: [PATCH 5/5] Show token metadata --- taqueria-vscode-extension/package.json | 16 ++++++++++++++++ .../src/lib/gui/SandboxTreeItemTypes.ts | 3 +++ .../src/lib/gui/SandboxesDataProvider.ts | 4 +++- taqueria-vscode-extension/src/lib/helpers.ts | 9 +++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/taqueria-vscode-extension/package.json b/taqueria-vscode-extension/package.json index c5905a39c..682cfc1ad 100644 --- a/taqueria-vscode-extension/package.json +++ b/taqueria-vscode-extension/package.json @@ -431,6 +431,13 @@ "title": "Invoke Entrypoint", "shortTitle": "invoke", "icon": "$(call-outgoing)" + }, + { + "command": "taqueria.show_token_metadata", + "category": "Taqueria", + "title": "Show Token Metadata", + "shortTitle": "show token metadata", + "icon": "$(list-unordered)" } ], "menus": { @@ -482,6 +489,10 @@ { "command": "taqueria.originate", "when": "false" + }, + { + "command": "taqueria.show_token_metadata", + "when": "false" } ], "explorer/context": [ @@ -631,6 +642,11 @@ "command": "taqueria.show_operation_details", "when": "view == taqueria-sandboxes && viewItem == operation", "group": "inline" + }, + { + "command": "taqueria.show_token_metadata", + "when": "view == taqueria-sandboxes && viewItem == token", + "group": "inline" } ], "view/title": [ diff --git a/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts b/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts index acc869bb8..134796288 100644 --- a/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts +++ b/taqueria-vscode-extension/src/lib/gui/SandboxTreeItemTypes.ts @@ -1,5 +1,6 @@ import * as vscode from 'vscode'; import { SandboxState } from './CachedSandboxState'; +import { TokenMetadata } from './DataModels'; export class SandboxTreeItemBase extends vscode.TreeItem { constructor( @@ -146,7 +147,9 @@ export class TokenTreeItem extends SandboxTreeItemBase { constructor( public readonly tokenId: string, public readonly name: string | undefined, + public readonly metadata: TokenMetadata | undefined, ) { super(name || tokenId.toString(), 'token', vscode.TreeItemCollapsibleState.None); + this.contextValue = 'token'; } } diff --git a/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts b/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts index 6debe920e..f95f54a52 100644 --- a/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts +++ b/taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts @@ -411,7 +411,9 @@ export class SandboxesDataProvider extends TaqueriaDataProviderBase tzKtItem, dipDupItem: dataFromDipdup.find(dipDupItem => dipDupItem.token_id.toString() === tzKtItem.tokenId), })); - return data.map(item => new TokenTreeItem(item.tzKtItem.tokenId, item.dipDupItem?.metadata?.name)); + return data.map(item => + new TokenTreeItem(item.tzKtItem.tokenId, item.dipDupItem?.metadata?.name, item.dipDupItem?.metadata ?? undefined) + ); } private async getTokensFromTzKt(element: SmartContractChildrenTreeItem): Promise { diff --git a/taqueria-vscode-extension/src/lib/helpers.ts b/taqueria-vscode-extension/src/lib/helpers.ts index bf2211b65..de5ead13a 100644 --- a/taqueria-vscode-extension/src/lib/helpers.ts +++ b/taqueria-vscode-extension/src/lib/helpers.ts @@ -25,6 +25,7 @@ import { SandboxTreeItem, SandboxTreeItemBase, SmartContractEntrypointTreeItem, + TokenTreeItem, } from './gui/SandboxTreeItemTypes'; import { ScaffoldsDataProvider, ScaffoldTreeItem } from './gui/ScaffoldsDataProvider'; import { SystemCheckDataProvider, SystemCheckTreeItem } from './gui/SystemCheckDataProvider'; @@ -241,6 +242,7 @@ export class VsCodeHelper { this.exposeRefreshSandBoxDataCommand(); this.exposeShowEntrypointParametersCommand(); this.exposeShowOperationDetailsCommand(); + this.exposeShowTokenMetadataCommand(); this.exposeInvokeEntrypointCommand(); await this.registerDataProviders(); @@ -1729,6 +1731,13 @@ export class VsCodeHelper { }); } + exposeShowTokenMetadataCommand() { + this.registerCommand('show_token_metadata', async (item: TokenTreeItem) => { + const metadata = item.metadata; + this.logHelper.showOutput(JSON.stringify(metadata, null, 2)); + }); + } + exposeInvokeEntrypointCommand() { this.registerCommand( 'invoke_entrypoint',