From 299e5e7ec4dad54d032b44887d2c6caba154dcb8 Mon Sep 17 00:00:00 2001 From: Denis Carriere Date: Tue, 30 Jan 2024 17:14:43 -0500 Subject: [PATCH] add wax delband example --- examples/package-lock.json | 82 ++++++++++++++++++++++++++++++++++++++ examples/package.json | 1 + examples/wax-delband.mjs | 75 ++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 examples/wax-delband.mjs diff --git a/examples/package-lock.json b/examples/package-lock.json index b3cd8d3..e4c7bc1 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -8,6 +8,7 @@ "@substreams/core": "latest", "@substreams/manifest": "latest", "@substreams/node": "latest", + "@wharfkit/antelope": "^1.0.6", "log-update": "latest" } }, @@ -225,6 +226,19 @@ "node": ">=18" } }, + "node_modules/@wharfkit/antelope": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@wharfkit/antelope/-/antelope-1.0.6.tgz", + "integrity": "sha512-jzE9lKJiZA7ukHbNLv085ZD1w+eh1ArnZQTn4iXlSBDZvPZ1Ha1rzeiVx3K8TsmPQ/ArdyLX6AH7q8ZyVlqaIQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "elliptic": "^6.5.4", + "hash.js": "^1.0.0", + "pako": "^2.1.0", + "tslib": "^2.0.3" + } + }, "node_modules/ansi-escapes": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", @@ -261,6 +275,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -281,6 +305,20 @@ "integrity": "sha512-VA9t/HDs14TdJA7j+VroaPrKxmf0YLA4HMQ0eSxA/P2hv8Gre+vKGk3gxpR45OBR0KK7QOq3gMyCbVr/pW2F/g==", "peer": true }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/emoji-regex": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", @@ -324,6 +362,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "node_modules/is-fullwidth-code-point": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", @@ -364,6 +426,16 @@ "node": ">=6" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -378,6 +450,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/pure-rand": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", @@ -459,6 +536,11 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", diff --git a/examples/package.json b/examples/package.json index 2fe074c..4bce9e0 100644 --- a/examples/package.json +++ b/examples/package.json @@ -3,6 +3,7 @@ "@substreams/core": "latest", "@substreams/manifest": "latest", "@substreams/node": "latest", + "@wharfkit/antelope": "^1.0.6", "log-update": "latest" } } diff --git a/examples/wax-delband.mjs b/examples/wax-delband.mjs new file mode 100644 index 0000000..7614ade --- /dev/null +++ b/examples/wax-delband.mjs @@ -0,0 +1,75 @@ +import { createRegistry, createRequest, applyParams } from "@substreams/core"; +import { readPackage } from "@substreams/manifest"; +import { BlockEmitter, createNodeTransport } from "@substreams/node"; +import { APIClient, Bytes, Serializer } from "@wharfkit/antelope"; + +// auth API token +// https://app.streamingfast.io/ +// https://app.pinax.network/ +if (!process.env.SUBSTREAMS_API_TOKEN) { + throw new Error("SUBSTREAMS_API_TOKEN is require"); +} +const token = process.env.SUBSTREAMS_API_TOKEN; + +// RPC API Client +const rpc = new APIClient({ url: "https://wax.api.eosnation.io" }); +const abi = (await rpc.v1.chain.get_abi("eosio")).abi; +if ( !abi ) throw new Error("ABI not found"); + +// User parameters +const baseUrl = "https://wax.substreams.pinax.network:443"; +const manifest = "https://github.com/pinax-network/substreams/releases/download/common-v0.7.0/common-v0.7.0.spkg"; +const outputModule = "map_db_ops"; +const params = "map_db_ops=contract=eosio&table=delband" +const startBlockNum = -10000; + +// Read Substream +const substreamPackage = await readPackage(manifest); +if (!substreamPackage.modules) { + throw new Error("No modules found in substream package"); +} +applyParams([params], substreamPackage.modules.modules); + +// Connect Transport +const registry = createRegistry(substreamPackage); +const transport = createNodeTransport(baseUrl, token, registry); +const request = createRequest({ + substreamPackage, + outputModule, + startBlockNum, +}); + +// NodeJS Events +const emitter = new BlockEmitter(transport, request, registry); + +// Session Trace ID +emitter.on("session", (session) => { + console.dir(session); +}); + +// Stream Blocks +emitter.on("anyMessage", (message, cursor, clock) => { + for ( const dbOp of message.dbOps ?? [] ) { + console.log(dbOp); + // const data = Bytes.fromString(dbOp.newData.toString("hex")); + // const decoded = Serializer.decode({data, abi, type: "delegated_bandwidth"}); + // console.log(decoded); + } +}); + +// End of Stream +emitter.on("close", (error) => { + if (error) { + console.error(error); + } + console.timeEnd("🆗 close"); +}); + +// Fatal Error +emitter.on("fatalError", (error) => { + console.error(error); +}); + +console.log("✅ start"); +console.time("🆗 close"); +emitter.start();