diff --git a/.gitignore b/.gitignore index 40d25f6..b920894 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,7 @@ coverage/ # Temporary files *.tmp .cache/ + +# local yalc configuration for help build and test local environment +.yalc/ +yalc.lock \ No newline at end of file diff --git a/README.md b/README.md index 3020a61..c846ef5 100644 --- a/README.md +++ b/README.md @@ -1352,7 +1352,7 @@ You can override the default RPC endpoints for any network by setting environmen - `SEPOLIA_RPC` - Sepolia testnet - `MAINNET_RPC` - Ethereum mainnet -- `MATIC_RPC` - Polygon mainnet +- `POL_RPC` - Polygon mainnet - `AMOY_RPC` - Polygon Amoy testnet - `XDC_RPC` - XDC Network - `XDCAPOTHEM_RPC` - XDC Apothem testnet @@ -1374,7 +1374,7 @@ trustvc mint # Set multiple custom RPCs export MAINNET_RPC=https://mainnet.infura.io/v3/your-api-key -export MATIC_RPC=https://polygon-rpc.com +export POL_RPC=https://polygon-rpc.com ``` If no environment variable is set, the CLI will use the default RPC endpoint for each network. diff --git a/package-lock.json b/package-lock.json index 8d64737..737cc65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@trustvc/trustvc-cli", - "version": "0.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@trustvc/trustvc-cli", - "version": "0.0.0", + "version": "1.0.1", "license": "Apache-2.0", "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "^2.11.1", + "@trustvc/trustvc": "^2.14.1", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", @@ -831,32 +831,42 @@ "node": ">=18" } }, + "node_modules/@digitalbazaar/bbs-2023-cryptosuite/node_modules/cborg": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", + "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", + "license": "Apache-2.0", + "bin": { + "cborg": "lib/bin.js" + } + }, "node_modules/@digitalbazaar/bbs-signatures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/bbs-signatures/-/bbs-signatures-3.0.0.tgz", - "integrity": "sha512-mQMCMnCWAraVSswJg1kJK/qmUrb3jMoWB9c8kOmztsWfnMZJcyYAcavuF8jgrVZ5cl/ZRNMK61ZbIvkqd6BE6g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/bbs-signatures/-/bbs-signatures-3.1.0.tgz", + "integrity": "sha512-wx86l/PFOaRcoLBPmzwpF9Oo4uYJrm4uq/B1rHX5OHD15NakmUINfRr8NAGDG356GeTBDGZkMsBFgNj1x0dc+g==", "license": "BSD-3-Clause", "dependencies": { - "@noble/curves": "^1.3.0" + "@noble/curves": "^2.2.0", + "@noble/hashes": "^2.2.0" }, "engines": { "node": ">=18" } }, "node_modules/@digitalbazaar/bls12-381-multikey": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/bls12-381-multikey/-/bls12-381-multikey-2.1.0.tgz", - "integrity": "sha512-JelU85fNhvHl2/mqRdmrtrE2ZQJ0//+UwI0l/YFmvsOr6YN2GuKPzdkfXjpm7f3UvnBqz5f8QKFTb9mVa7mVVg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/bls12-381-multikey/-/bls12-381-multikey-2.2.0.tgz", + "integrity": "sha512-C71W5QIVSkLK24XsDWENOqihfy8ITKXqP2c+aKtx09j4vbHstwG6grn4sF9qKEQ2FOMm3KPIrL2byiIIqt61ow==", "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/bbs-signatures": "^3.0.0", - "@noble/curves": "^1.3.0", + "@noble/curves": "^2.2.0", "base58-universal": "^2.0.0", "base64url-universal": "^2.0.0", - "cborg": "^4.2.0" + "cborg": "^5.1.1" }, "engines": { - "node": ">=18" + "node": ">=22" } }, "node_modules/@digitalbazaar/data-integrity": { @@ -874,19 +884,18 @@ } }, "node_modules/@digitalbazaar/di-sd-primitives": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/di-sd-primitives/-/di-sd-primitives-3.2.0.tgz", - "integrity": "sha512-DydbRtDPY2vVVk7hLicSFfCCzd1d5e3GLjzqamLV4t9f9mGbHtnU2IeNhtUDGJZRpviFmtFjPMZwuns6sCAP9A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/di-sd-primitives/-/di-sd-primitives-3.3.0.tgz", + "integrity": "sha512-ljbopcxLts2ALg6ce1EG3AjIlXOC77EHmkqvghtyZBNl3XwOZueBQJmTDD6XvRQq930n6kfCtvt4JUWOrg5CrQ==", "license": "BSD-3-Clause", "dependencies": { "base64url-universal": "^2.0.0", "jsonld": "^9.0.0", "klona": "^2.0.6", - "rdf-canonize": "^5.0.0", - "uuid": "^10.0.0" + "rdf-canonize": "^5.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/@digitalbazaar/di-sd-primitives/node_modules/@digitalbazaar/http-client": { @@ -926,6 +935,18 @@ "node": ">=18" } }, + "node_modules/@digitalbazaar/di-sd-primitives/node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/@digitalbazaar/di-sd-primitives/node_modules/rdf-canonize": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", @@ -938,19 +959,6 @@ "node": ">=18" } }, - "node_modules/@digitalbazaar/di-sd-primitives/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@digitalbazaar/ecdsa-multikey": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@digitalbazaar/ecdsa-multikey/-/ecdsa-multikey-1.8.0.tgz", @@ -981,6 +989,15 @@ "node": ">=18" } }, + "node_modules/@digitalbazaar/ecdsa-sd-2023-cryptosuite/node_modules/cborg": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", + "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", + "license": "Apache-2.0", + "bin": { + "cborg": "lib/bin.js" + } + }, "node_modules/@digitalbazaar/http-client": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", @@ -995,18 +1012,6 @@ "node": ">=14.0" } }, - "node_modules/@digitalbazaar/http-client/node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, "node_modules/@digitalbazaar/http-client/node_modules/undici": { "version": "5.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", @@ -2932,27 +2937,27 @@ } }, "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", + "integrity": "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" + "@noble/hashes": "2.2.0" }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -4907,9 +4912,9 @@ "license": "MIT" }, "node_modules/@tradetrust-tt/dnsprove": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/dnsprove/-/dnsprove-2.18.0.tgz", - "integrity": "sha512-UgcwV17hZSSBW5oDb+DUtXle5XdBRWXURSASkr207PYjCxZOhZV88KHJi3PB45UgtUCbtvrJK7czSsgDNnpRtg==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/dnsprove/-/dnsprove-2.21.0.tgz", + "integrity": "sha512-acxJGS07WLfLDli1E4uvT5IbPcmh9vzVelgEdhxzi2KE50r3k/vvkwUQl1ctgkw152cIxnqR20cch8x3HLLvcw==", "license": "Apache-2.0", "dependencies": { "axios": "1.7.2", @@ -4920,15 +4925,6 @@ "node": ">=18.x" } }, - "node_modules/@tradetrust-tt/document-store": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/document-store/-/document-store-4.1.1.tgz", - "integrity": "sha512-+gIR+icfbJOHVNXTc6D1Fo4jdwGRboZqUek/YN+ThXIaLaUP1dvD85tnEz63Nu4LfiDcjYld0aVXOfKsnCJ+yw==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.x" - } - }, "node_modules/@tradetrust-tt/ethers-aws-kms-signer": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@tradetrust-tt/ethers-aws-kms-signer/-/ethers-aws-kms-signer-2.1.4.tgz", @@ -5017,9 +5013,9 @@ } }, "node_modules/@tradetrust-tt/tradetrust": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/tradetrust/-/tradetrust-6.10.2.tgz", - "integrity": "sha512-4zj4zlsrrQiUJQxvl4N8Pa4cLHtFtFIs0lMg6daP/gRJXIn1QWD0Kl4mQ5FsjuopeM7JOBX/xok22SmElEtT5w==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/tradetrust/-/tradetrust-6.10.3.tgz", + "integrity": "sha512-2A/o6GguA31V7GnOfvhG1zANuxKdlBS5+k6jvAMeh/VotZEDvoOOA+mTArt5Fv+BKHhpgh7J8dS0DUohfVAiqg==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -5111,6 +5107,7 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -5266,6 +5263,16 @@ "node": ">=8" } }, + "node_modules/@tradetrust-tt/tradetrust/node_modules/web-did-resolver": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", + "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "^4.1.0", + "did-resolver": "^4.1.0" + } + }, "node_modules/@tradetrust-tt/tradetrust/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -5273,15 +5280,15 @@ "license": "ISC" }, "node_modules/@tradetrust-tt/tt-verify": { - "version": "9.6.2", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/tt-verify/-/tt-verify-9.6.2.tgz", - "integrity": "sha512-G6XB/fhzIDAc+p07/cDCVCNYgKxx9x5e2HwOORPS8kMkimoB4FXNoWlV8GMXcbzjIjU4frI2KEL54y8TA8+Wpw==", + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/tt-verify/-/tt-verify-9.7.5.tgz", + "integrity": "sha512-LoVrJLiWB9ZnMHoe7IGBAc4edK2upKYsfCRgo9T7VNLo3XiBM4cIr25RQ5e1AQ58m+3gKWRnpP9ZKj0qqN+xFg==", "license": "Apache-2.0", "dependencies": { - "@tradetrust-tt/dnsprove": "^2.18.0", - "@tradetrust-tt/document-store": "^4.1.1", + "@tradetrust-tt/dnsprove": "^2.21.0", "@tradetrust-tt/token-registry": "^5.5.0", - "@tradetrust-tt/tradetrust": "^6.10.1", + "@tradetrust-tt/tradetrust": "^6.10.3", + "@trustvc/document-store": "^1.0.3", "axios": "^1.7.2", "debug": "^4.3.1", "did-resolver": "^3.1.0", @@ -5289,13 +5296,13 @@ "ethr-did-resolver": "^4.3.3", "node-cache": "^5.1.2", "runtypes": "^6.3.0", - "web-did-resolver": "^2.0.4" + "web-did-resolver": "2.0.4" }, "engines": { "node": ">=18.x" }, "peerDependencies": { - "ethers": "^5.7.2" + "ethers": "^5.8.0" } }, "node_modules/@tradetrust-tt/tt-verify/node_modules/ethers": { @@ -5353,23 +5360,23 @@ "license": "Apache-2.0" }, "node_modules/@trustvc/trustvc": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.11.1.tgz", - "integrity": "sha512-+5LesJeGwoUDj2QuGGyiAtogpytzu0k+jzdedL2TkjoOGX+yx8do2uqB76WFP4gwVLcpnx7BOaN1mvqtx81W2A==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.14.1.tgz", + "integrity": "sha512-vGR6/s8nn69sl3Ntr/rE8+kg64RuqsRN2AeB0yeNOAUwTWEmQRk16cvB4g1xW7+CsLc5yI5sRuAqeAmbhHdV0g==", "license": "Apache-2.0", "dependencies": { "@tradetrust-tt/dnsprove": "^2.18.0", "@tradetrust-tt/ethers-aws-kms-signer": "^2.1.4", "@tradetrust-tt/token-registry-v4": "npm:@tradetrust-tt/token-registry@^4.16.0", "@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.5.0", - "@tradetrust-tt/tradetrust": "^6.10.2", - "@tradetrust-tt/tt-verify": "^9.6.0", + "@tradetrust-tt/tradetrust": "^6.10.3", + "@tradetrust-tt/tt-verify": "^9.7.5", "@trustvc/document-store": "^1.0.3", - "@trustvc/w3c": "^2.0.0", - "@trustvc/w3c-context": "^2.0.0", - "@trustvc/w3c-credential-status": "^2.0.0", - "@trustvc/w3c-issuer": "^2.0.0", - "@trustvc/w3c-vc": "^2.0.0", + "@trustvc/w3c": "^2.2.0", + "@trustvc/w3c-context": "^2.2.0", + "@trustvc/w3c-credential-status": "^2.2.0", + "@trustvc/w3c-issuer": "^2.2.0", + "@trustvc/w3c-vc": "^2.2.0", "ethers": "^5.8.0", "ethersV6": "npm:ethers@^6.14.4", "js-sha3": "^0.9.3", @@ -5471,24 +5478,24 @@ } }, "node_modules/@trustvc/w3c": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.0.2.tgz", - "integrity": "sha512-xWgyhdVjw1mR0GdLjzeoH1s4jseaEJpmJ2ndM0Xcn0zCzqeUql2C1ijnb0Sb/76R7XLUuc0hgAo1CzLp27lQKw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.2.0.tgz", + "integrity": "sha512-2WhAoYZW7JLt9H1OrT1qcwTL0g6LymMVg9uiZ3xxlaRgYzOmEqClN3Pq6apo1kRZTzJMHcKWECKADkHGa0Jgqw==", "license": "Apache-2.0", "dependencies": { - "@trustvc/w3c-context": "^2.0.2", - "@trustvc/w3c-credential-status": "^2.0.2", - "@trustvc/w3c-issuer": "^2.0.2", - "@trustvc/w3c-vc": "^2.0.2" + "@trustvc/w3c-context": "^2.2.0", + "@trustvc/w3c-credential-status": "^2.2.0", + "@trustvc/w3c-issuer": "^2.2.0", + "@trustvc/w3c-vc": "^2.2.0" }, "engines": { "node": ">=18.x" } }, "node_modules/@trustvc/w3c-context": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-2.0.2.tgz", - "integrity": "sha512-2DM73n1z2FXML9/suGHea6BcJqs7GKiJsvpozRf6lE9d3ZyFRmCd6H84f7Z7zGvacuLXMRnPX2A9DKE0ETs8HA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-2.2.0.tgz", + "integrity": "sha512-p9mtIWZ1v1hhqiGLJ5Fu+2PK9ClIRsdo04vgCVC8BxhIjwUU7ZHb95sYF1E8Ay9pP2BRyFujBdoaYXHH8n5v4A==", "license": "Apache-2.0", "dependencies": { "did-resolver": "^4.1.0", @@ -5505,13 +5512,13 @@ "license": "Apache-2.0" }, "node_modules/@trustvc/w3c-credential-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-2.0.2.tgz", - "integrity": "sha512-8f5sHoDAT8YqLlHm82t/wh1HrZdmR3PgRGfDcgbKWrJtA+X2769kk6qVXCNP6tq1Ghyqe8v/HLortrXp9JSdGw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-2.2.0.tgz", + "integrity": "sha512-lfgnvAUSwdi5hWnuf+wqTkpPTYxmZyZ8kdzVPRQeKWqb0ysdWN+n32ROoNpQAFSPqYlSL0pLWuI/vg35WuhnEA==", "license": "Apache-2.0", "dependencies": { - "@trustvc/w3c-context": "^2.0.2", - "@trustvc/w3c-issuer": "^2.0.2", + "@trustvc/w3c-context": "^2.2.0", + "@trustvc/w3c-issuer": "^2.2.0", "base64url-universal": "^2.0.0", "pako": "^2.1.0" }, @@ -5520,9 +5527,9 @@ } }, "node_modules/@trustvc/w3c-issuer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-2.0.2.tgz", - "integrity": "sha512-NDtEcGV7ryuWHbaX3hwlz2cN/hhDWHzA+D2AF56I7teNfev+X62pro+HrXYAa3EclPET7BI+fYmLgh61/DAl7w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-2.2.0.tgz", + "integrity": "sha512-o5XWh52c3KeNqrrIpSvjPt+3zwZ/wwh2hlGOst6PZXVzS9nMab+jUwhs52d+HBhe2r8BL4Z81sdMGA8YAEnk6Q==", "license": "Apache-2.0", "dependencies": { "@digitalbazaar/bls12-381-multikey": "^2.1.0", @@ -5543,10 +5550,20 @@ "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", "license": "Apache-2.0" }, + "node_modules/@trustvc/w3c-issuer/node_modules/web-did-resolver": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", + "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "^4.1.0", + "did-resolver": "^4.1.0" + } + }, "node_modules/@trustvc/w3c-vc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.0.2.tgz", - "integrity": "sha512-3A488DgukqrKXDSNdtZE02tOfj6V9C6uRJAEKEnMiaUevxNzFO9TFpqXkeOdxNhg9yHEH7m68b6SqfwU/tbVXQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.2.0.tgz", + "integrity": "sha512-QAfoEgNndi2X+V0Nz9nBGiUk4Ko0XUFVLn0BY6qJK8GHJndMMCEcZ14PlaHyKG8nIossQeKZbsBwnavm2jRFdg==", "license": "Apache-2.0", "dependencies": { "@digitalbazaar/bbs-2023-cryptosuite": "^2.0.1", @@ -5555,8 +5572,8 @@ "@digitalbazaar/ecdsa-multikey": "^1.8.0", "@digitalbazaar/ecdsa-sd-2023-cryptosuite": "^3.4.1", "@mattrglobal/jsonld-signatures-bbs": "^1.2.0", - "@trustvc/w3c-credential-status": "^2.0.2", - "@trustvc/w3c-issuer": "^2.0.2", + "@trustvc/w3c-credential-status": "^2.2.0", + "@trustvc/w3c-issuer": "^2.2.0", "base64url-universal": "^2.0.0", "cbor": "^9.0.2", "did-resolver": "^4.1.0", @@ -5582,6 +5599,7 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6424,6 +6442,18 @@ "@noble/hashes": "^1.2.0" } }, + "node_modules/bip39/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/bn.js": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", @@ -6510,14 +6540,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -6590,9 +6620,9 @@ } }, "node_modules/cborg": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", - "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.1.tgz", + "integrity": "sha512-BDbSRIp6XrQXkTc7g+DN0RB9RrDPTUfals2ecWUlt3juPLjbAvy/V72mJcXY0Ehu0Dq/3WpNCOCT68HUTbW+lw==", "license": "Apache-2.0", "bin": { "cborg": "lib/bin.js" @@ -7685,9 +7715,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", @@ -7771,9 +7801,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -8606,9 +8636,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -9176,9 +9206,9 @@ } }, "node_modules/har-validator/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -9289,9 +9319,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -10703,6 +10733,18 @@ "node": ">=18" } }, + "node_modules/jsonld-signatures/node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/jsonld-signatures/node_modules/rdf-canonize": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", @@ -10749,12 +10791,12 @@ } }, "node_modules/ky": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", - "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky?sponsor=1" @@ -14644,7 +14686,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "bin/uuid" @@ -14866,14 +14908,14 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -15473,14 +15515,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -15492,13 +15534,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -15875,18 +15917,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -15896,15 +15939,15 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -16744,17 +16787,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -16794,7 +16837,6 @@ "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, "license": "BSD-2-Clause", "optional": true, "bin": { @@ -16916,6 +16958,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -16947,9 +16990,9 @@ } }, "node_modules/validator": { - "version": "13.15.26", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", - "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -17534,20 +17577,43 @@ "dev": true }, "node_modules/web-did-resolver": { - "version": "2.0.32", - "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", - "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.4.tgz", + "integrity": "sha512-PORpoA4P0I3m0cLJX2IIDZ0gMKgC1PjS8DuDeg9/JCdIlFiXrZCyTG1hxvw4a4vhDKr0sZKSZL1pQDXTgqLm8w==", "license": "Apache-2.0", "dependencies": { - "cross-fetch": "^4.1.0", - "did-resolver": "^4.1.0" + "cross-fetch": "^3.1.2", + "did-resolver": "^3.1.0" } }, - "node_modules/web-did-resolver/node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", - "license": "Apache-2.0" + "node_modules/web-did-resolver/node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/web-did-resolver/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } }, "node_modules/web-streams-polyfill": { "version": "3.3.3", @@ -17659,13 +17725,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", diff --git a/package.json b/package.json index 14387ef..25ab22e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@trustvc/trustvc-cli", - "version": "1.0.1", + "version": "1.0.2", "description": "CLI tool for TrustVC", "main": "dist/main.js", "types": "dist/main.d.ts", @@ -35,7 +35,7 @@ }, "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "^2.11.1", + "@trustvc/trustvc": "^2.14.1", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", diff --git a/src/utils/cli-options.ts b/src/utils/cli-options.ts index 2b68576..456bfba 100644 --- a/src/utils/cli-options.ts +++ b/src/utils/cli-options.ts @@ -163,7 +163,7 @@ export const promptNetworkSelection = async (): Promise => { { name: 'Local', value: NetworkCmdName.Local }, { name: 'Ethereum Mainnet', value: NetworkCmdName.Mainnet }, { name: 'Sepolia Testnet', value: NetworkCmdName.Sepolia }, - { name: 'Polygon Mainnet', value: NetworkCmdName.Matic }, + { name: 'Polygon Mainnet (POL)', value: NetworkCmdName.Pol }, { name: 'Polygon Amoy Testnet', value: NetworkCmdName.Amoy }, { name: 'XDC Network', value: NetworkCmdName.XDC }, { name: 'XDC Apothem Testnet', value: NetworkCmdName.XDCApothem }, @@ -293,7 +293,7 @@ export const getNetworkFromChainId = (chainId: number): string => { const chainIdMap: Record = { 1: 'mainnet', 11155111: 'sepolia', - 137: 'matic', + 137: 'pol', 80002: 'amoy', 101010: 'stability', 20180427: 'stabilitytestnet', @@ -526,7 +526,7 @@ export const shouldRunDryRun = (network: string): boolean => { const dryRunNetworks = [ NetworkCmdName.Mainnet, // Ethereum Mainnet NetworkCmdName.Sepolia, // Ethereum Sepolia Testnet - NetworkCmdName.Matic, // Polygon Mainnet + NetworkCmdName.Pol, // Polygon Mainnet (POL) NetworkCmdName.Amoy, // Polygon Amoy Testnet ]; return dryRunNetworks.includes(network as NetworkCmdName); diff --git a/src/utils/dryRun.ts b/src/utils/dryRun.ts index 01ef4ac..814d69c 100644 --- a/src/utils/dryRun.ts +++ b/src/utils/dryRun.ts @@ -44,8 +44,8 @@ export const dryRunMode = async ({ const spotRateETHUSD = await getSpotRate('ETH', 'USD'); const spotRateETHSGD = await getSpotRate('ETH', 'SGD'); - const spotRateMATICUSD = await getSpotRate('POL', 'USD'); - const spotRateMATICSGD = await getSpotRate('POL', 'SGD'); + const spotRatePOLUSD = await getSpotRate('POL', 'USD'); + const spotRatePOLSGD = await getSpotRate('POL', 'SGD'); const estimatedFeeUSD = convertWeiFiatDollars(gasCost, spotRateETHUSD); console.log( @@ -97,15 +97,15 @@ export const dryRunMode = async ({ 'priority fee price': convertWeiFiatDollars(maxPriorityCost, spotRateETHSGD), 'max fee price': convertWeiFiatDollars(maxCost, spotRateETHSGD), }, - MATICUSD: { - 'gas cost': convertWeiFiatDollars(gasCost, spotRateMATICUSD), - 'priority fee price': convertWeiFiatDollars(maxPriorityCost, spotRateMATICUSD), - 'max fee price': convertWeiFiatDollars(maxCost, spotRateMATICUSD), + POLUSD: { + 'gas cost': convertWeiFiatDollars(gasCost, spotRatePOLUSD), + 'priority fee price': convertWeiFiatDollars(maxPriorityCost, spotRatePOLUSD), + 'max fee price': convertWeiFiatDollars(maxCost, spotRatePOLUSD), }, - MATICSGD: { - 'gas cost': convertWeiFiatDollars(gasCost, spotRateMATICSGD), - 'priority fee price': convertWeiFiatDollars(maxPriorityCost, spotRateMATICSGD), - 'max fee price': convertWeiFiatDollars(maxCost, spotRateMATICSGD), + POLSGD: { + 'gas cost': convertWeiFiatDollars(gasCost, spotRatePOLSGD), + 'priority fee price': convertWeiFiatDollars(maxPriorityCost, spotRatePOLSGD), + 'max fee price': convertWeiFiatDollars(maxCost, spotRatePOLSGD), }, }); console.log(red('Please read the information above to understand the table')); diff --git a/src/utils/networks.ts b/src/utils/networks.ts index eb071d5..2302693 100644 --- a/src/utils/networks.ts +++ b/src/utils/networks.ts @@ -5,7 +5,7 @@ import { SUPPORTED_CHAINS, CHAIN_ID } from '@trustvc/trustvc'; // Re-export for use in other modules export { SUPPORTED_CHAINS, CHAIN_ID }; -export type networkCurrency = 'ETH' | 'MATIC' | 'XDC' | 'FREE' | 'ASTRON'; +export type networkCurrency = 'ETH' | 'POL' | 'XDC' | 'FREE' | 'ASTRON'; type SupportedNetwork = { explorer: string; @@ -20,7 +20,7 @@ export enum NetworkCmdName { Local = 'local', Mainnet = 'mainnet', Sepolia = 'sepolia', - Matic = 'matic', + Pol = 'pol', Amoy = 'amoy', XDC = 'xdc', XDCApothem = 'xdcapothem', @@ -64,7 +64,7 @@ const rpcUrls: { [key in NetworkCmdName]: string } = { [NetworkCmdName.Local]: 'http://127.0.0.1:8545', [NetworkCmdName.Mainnet]: 'homestead', // Special case for Infura [NetworkCmdName.Sepolia]: 'sepolia', // Special case for Infura - [NetworkCmdName.Matic]: 'matic', + [NetworkCmdName.Pol]: 'matic', [NetworkCmdName.Amoy]: 'matic-amoy', [NetworkCmdName.XDC]: 'https://rpc.ankr.com/xdc', [NetworkCmdName.XDCApothem]: 'https://rpc.apothem.network', @@ -78,11 +78,11 @@ const rpcUrls: { [key in NetworkCmdName]: string } = { const createProvider = (networkName: NetworkCmdName): (() => Provider) => { const rpcUrl = rpcUrls[networkName]; - // Use Infura provider for mainnet and sepolia + // Use Infura provider for mainnet, sepolia, and Polygon networks if ( networkName === NetworkCmdName.Mainnet || networkName === NetworkCmdName.Sepolia || - networkName === NetworkCmdName.Matic || + networkName === NetworkCmdName.Pol || networkName === NetworkCmdName.Amoy ) { return getProviderWithEnvOverride(networkName, defaultInfuraProvider(rpcUrl)); @@ -97,8 +97,13 @@ const buildSupportedNetwork = (): { [key in NetworkCmdName]: SupportedNetwork } const networks: Partial<{ [key in NetworkCmdName]: SupportedNetwork }> = {}; // Map SUPPORTED_CHAINS to our network structure + const libraryNameToCmdName: Partial> = { + matic: NetworkCmdName.Pol, + }; + Object.entries(SUPPORTED_CHAINS).forEach(([chainId, chainConfig]) => { - const networkName = chainConfig.name as NetworkCmdName; + const networkName = + libraryNameToCmdName[chainConfig.name] ?? (chainConfig.name as NetworkCmdName); // Only process networks that are in our NetworkCmdName enum if (Object.values(NetworkCmdName).includes(networkName)) { diff --git a/tests/commands/document-store/grant-role.test.ts b/tests/commands/document-store/grant-role.test.ts index d9b3589..064ddef 100644 --- a/tests/commands/document-store/grant-role.test.ts +++ b/tests/commands/document-store/grant-role.test.ts @@ -65,13 +65,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, }, CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, }, })); @@ -220,7 +220,7 @@ describe('document-store/grant-role', () => { (utils.promptAndReadDocument as any).mockResolvedValue(mockDocument); (utils.extractOADocumentInfo as any).mockResolvedValue({ documentStoreAddress: mockInputs.documentStoreAddress, - network: NetworkCmdName.Matic, + network: NetworkCmdName.Pol, }); const inquirer = await import('@inquirer/prompts'); diff --git a/tests/commands/document-store/issue.test.ts b/tests/commands/document-store/issue.test.ts index f1bb42d..7bf6616 100644 --- a/tests/commands/document-store/issue.test.ts +++ b/tests/commands/document-store/issue.test.ts @@ -58,13 +58,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, }, CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, }, })); @@ -390,7 +390,7 @@ describe('document-store/issue', () => { const networks = [ { name: NetworkCmdName.Mainnet, chainId: 1 }, { name: NetworkCmdName.Sepolia, chainId: 11155111 }, - { name: NetworkCmdName.Matic, chainId: 137 }, + { name: NetworkCmdName.Pol, chainId: 137 }, { name: NetworkCmdName.Amoy, chainId: 80002 }, { name: NetworkCmdName.XDC, chainId: 50 }, { name: NetworkCmdName.XDCApothem, chainId: 51 }, diff --git a/tests/commands/document-store/revoke-role.test.ts b/tests/commands/document-store/revoke-role.test.ts index 8a815e1..094cb98 100644 --- a/tests/commands/document-store/revoke-role.test.ts +++ b/tests/commands/document-store/revoke-role.test.ts @@ -65,13 +65,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, }, CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, }, })); @@ -220,7 +220,7 @@ describe('document-store/revoke-role', () => { (utils.promptAndReadDocument as any).mockResolvedValue(mockDocument); (utils.extractOADocumentInfo as any).mockResolvedValue({ documentStoreAddress: mockInputs.documentStoreAddress, - network: NetworkCmdName.Matic, + network: NetworkCmdName.Pol, }); const inquirer = await import('@inquirer/prompts'); diff --git a/tests/commands/document-store/revoke.test.ts b/tests/commands/document-store/revoke.test.ts index b5d88a4..9df3a63 100644 --- a/tests/commands/document-store/revoke.test.ts +++ b/tests/commands/document-store/revoke.test.ts @@ -58,13 +58,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, }, CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, }, })); @@ -390,7 +390,7 @@ describe('document-store/revoke', () => { const networks = [ { name: NetworkCmdName.Mainnet, chainId: 1 }, { name: NetworkCmdName.Sepolia, chainId: 11155111 }, - { name: NetworkCmdName.Matic, chainId: 137 }, + { name: NetworkCmdName.Pol, chainId: 137 }, { name: NetworkCmdName.Amoy, chainId: 80002 }, { name: NetworkCmdName.XDC, chainId: 50 }, { name: NetworkCmdName.XDCApothem, chainId: 51 }, diff --git a/tests/commands/document-store/transfer-ownership.test.ts b/tests/commands/document-store/transfer-ownership.test.ts index 7bba2f7..ebb0a85 100644 --- a/tests/commands/document-store/transfer-ownership.test.ts +++ b/tests/commands/document-store/transfer-ownership.test.ts @@ -58,13 +58,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, }, CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, }, })); @@ -207,7 +207,7 @@ describe('document-store/transfer-ownership', () => { (utils.promptAndReadDocument as any).mockResolvedValue(mockDocument); (utils.extractOADocumentInfo as any).mockResolvedValue({ documentStoreAddress: mockInputs.documentStoreAddress, - network: NetworkCmdName.Matic, + network: NetworkCmdName.Pol, }); (utils.promptAddress as any).mockResolvedValue(mockInputs.newOwner); diff --git a/tests/commands/oa/wrap.test.ts b/tests/commands/oa/wrap.test.ts index a82fd90..3d0172a 100644 --- a/tests/commands/oa/wrap.test.ts +++ b/tests/commands/oa/wrap.test.ts @@ -373,11 +373,12 @@ describe('oa-wrap', () => { describe('testing with OA v3 fixtures', () => { const RAW_OA_V3_DID_FILE = 'tests/fixtures/wrap/oa_v3/raw_oa_docs_v3/raw-dns-did.json'; const RAW_OA_V3_TXT_FILE = 'tests/fixtures/wrap/oa_v3/raw_oa_docs_v3/raw-dns-txt.json'; + const OA_V3_DEPRECATION_MESSAGE = + 'OA v3 is deprecated in TrustVC as of 1 October 2025. Please switch over to W3C VC.'; - it('should wrap documents in batch mode successfully', async () => { + it('should reject OA v3 documents in batch mode', async () => { const utils = await import('../../../src/utils'); const trustvc = await import('@trustvc/trustvc'); - const signale = await import('signale'); const actualUtils = await vi.importActual('../../../src/utils'); @@ -385,56 +386,21 @@ describe('oa-wrap', () => { await vi.importActual('@trustvc/trustvc'); const readMock = utils.readDocumentFile as MockedFunction; - const writeMock = utils.writeFile as MockedFunction; const wrapOADocumentsMock = trustvc.wrapOADocuments as MockedFunction; - const successMock = (signale.default as any).success as MockedFunction; readMock.mockImplementation(actualUtils.readDocumentFile as unknown as any); wrapOADocumentsMock.mockImplementation(actualTrustvc.wrapOADocuments as unknown as any); - const originalDidData = actualUtils.readDocumentFile(RAW_OA_V3_DID_FILE); - const originalTxtData = actualUtils.readDocumentFile(RAW_OA_V3_TXT_FILE); - - await wrapOA({ - mode: WrapMode.Batch, - docPaths: [RAW_OA_V3_DID_FILE, RAW_OA_V3_TXT_FILE], - pathToOutputDirectory: './out', - }); - - expect(wrapOADocumentsMock).toHaveBeenCalledTimes(1); - expect(wrapOADocumentsMock.mock.calls[0][0]).toHaveLength(2); - - const didCall = writeMock.mock.calls.find((c) => c[0] === 'out/raw-dns-did.json'); - const txtCall = writeMock.mock.calls.find((c) => c[0] === 'out/raw-dns-txt.json'); - expect(didCall).toBeTruthy(); - expect(txtCall).toBeTruthy(); - - const file1 = didCall![1] as any; - const file2 = txtCall![1] as any; - const proof1 = file1.proof; - const proof2 = file2.proof; - - const merkleRoot = proof1.merkleRoot as string; - expect(merkleRoot).toHaveLength(64); - expect(merkleRoot).toStrictEqual(proof1.merkleRoot); - expect(merkleRoot).toStrictEqual(proof2.merkleRoot); - expect(merkleRoot).not.toStrictEqual(proof1.targetHash); - expect(merkleRoot).not.toStrictEqual(proof2.targetHash); - expect(proof1.targetHash).not.toStrictEqual(proof2.targetHash); - - expect(actualTrustvc.getDocumentData(file1)).toStrictEqual(originalDidData); - expect(actualTrustvc.getDocumentData(file2)).toStrictEqual(originalTxtData); - - expect(successMock).toHaveBeenCalledWith( - 'Wrapped OpenAttestation document: out/raw-dns-did.json', - ); - expect(successMock).toHaveBeenCalledWith( - 'Wrapped OpenAttestation document: out/raw-dns-txt.json', - ); - expect(successMock).toHaveBeenCalledWith('All documents wrapped in batch mode'); + await expect( + wrapOA({ + mode: WrapMode.Batch, + docPaths: [RAW_OA_V3_DID_FILE, RAW_OA_V3_TXT_FILE], + pathToOutputDirectory: './out', + }), + ).rejects.toThrow(OA_V3_DEPRECATION_MESSAGE); }); - it('should wrap documents in individual mode with merkleRoot equal to targetHash', async () => { + it('should log errors and skip output when wrapping OA v3 documents individually', async () => { const utils = await import('../../../src/utils'); const trustvc = await import('@trustvc/trustvc'); const signale = await import('signale'); @@ -447,14 +413,11 @@ describe('oa-wrap', () => { const readMock = utils.readDocumentFile as MockedFunction; const writeMock = utils.writeFile as MockedFunction; const wrapOADocumentMock = trustvc.wrapOADocument as MockedFunction; - const successMock = (signale.default as any).success as MockedFunction; + const errorMock = (signale.default as any).error as MockedFunction; readMock.mockImplementation(actualUtils.readDocumentFile as unknown as any); wrapOADocumentMock.mockImplementation(actualTrustvc.wrapOADocument as unknown as any); - const originalDidData = actualUtils.readDocumentFile(RAW_OA_V3_DID_FILE); - const originalTxtData = actualUtils.readDocumentFile(RAW_OA_V3_TXT_FILE); - await wrapOA({ mode: WrapMode.Individual, docPaths: [RAW_OA_V3_DID_FILE, RAW_OA_V3_TXT_FILE], @@ -462,33 +425,14 @@ describe('oa-wrap', () => { }); expect(wrapOADocumentMock).toHaveBeenCalledTimes(2); - - const didCall = writeMock.mock.calls.find((c) => c[0] === 'out/raw-dns-did.json'); - const txtCall = writeMock.mock.calls.find((c) => c[0] === 'out/raw-dns-txt.json'); - expect(didCall).toBeTruthy(); - expect(txtCall).toBeTruthy(); - - const file1 = didCall![1] as any; - const file2 = txtCall![1] as any; - const proof1 = file1.proof; - const proof2 = file2.proof; - - expect(proof1.merkleRoot).toHaveLength(64); - expect(proof2.merkleRoot).toHaveLength(64); - expect(proof1.merkleRoot).toStrictEqual(proof1.targetHash); - expect(proof2.merkleRoot).toStrictEqual(proof2.targetHash); - expect(proof1.targetHash).not.toStrictEqual(proof2.targetHash); - - expect(actualTrustvc.getDocumentData(file1)).toStrictEqual(originalDidData); - expect(actualTrustvc.getDocumentData(file2)).toStrictEqual(originalTxtData); - - expect(successMock).toHaveBeenCalledWith( - 'Wrapped OpenAttestation document: out/raw-dns-did.json', + expect(writeMock).not.toHaveBeenCalled(); + expect(errorMock).toHaveBeenCalledWith( + `Error while wrapping OpenAttestation document: ${RAW_OA_V3_DID_FILE}`, ); - expect(successMock).toHaveBeenCalledWith( - 'Wrapped OpenAttestation document: out/raw-dns-txt.json', + expect(errorMock).toHaveBeenCalledWith( + `Error while wrapping OpenAttestation document: ${RAW_OA_V3_TXT_FILE}`, ); - expect(successMock).toHaveBeenCalledWith('All documents wrapped in individual mode'); + expect(errorMock).toHaveBeenCalledWith(OA_V3_DEPRECATION_MESSAGE); }); }); }); diff --git a/tests/commands/token-registry/deploy.test.ts b/tests/commands/token-registry/deploy.test.ts index b05a15d..485ad53 100644 --- a/tests/commands/token-registry/deploy.test.ts +++ b/tests/commands/token-registry/deploy.test.ts @@ -77,13 +77,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, }, CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, }, })); @@ -99,12 +99,12 @@ vi.mock('../../../src/utils', async (importOriginal) => { getEtherscanAddress: vi.fn(() => 'https://etherscan.io'), displayTransactionPrice: vi.fn(), getSupportedNetwork: vi.fn((network: string) => ({ - networkId: network === 'sepolia' ? 11155111 : network === 'matic' ? 137 : 1, + networkId: network === 'sepolia' ? 11155111 : network === 'pol' ? 137 : 1, })), supportedNetwork: { mainnet: { networkId: 1 }, sepolia: { networkId: 11155111 }, - matic: { networkId: 137 }, + pol: { networkId: 137 }, }, promptNetworkSelection: vi.fn(), promptAddress: vi.fn(), @@ -212,7 +212,7 @@ describe('token-registry/deploy', () => { registryName: 'Key Token Registry', registrySymbol: 'KTR', standalone: true, - network: NetworkCmdName.Matic, + network: NetworkCmdName.Pol, }; const utils = await import('../../../src/utils'); @@ -317,7 +317,7 @@ describe('token-registry/deploy', () => { const utils = await import('../../../src/utils'); (utils.performDryRunWithConfirmation as any).mockResolvedValue(true); (utils.getSupportedNetwork as any).mockImplementation((network: string) => ({ - networkId: network === 'sepolia' ? 11155111 : network === 'matic' ? 137 : 1, + networkId: network === 'sepolia' ? 11155111 : network === 'pol' ? 137 : 1, })); }); diff --git a/tests/commands/token-registry/mint.test.ts b/tests/commands/token-registry/mint.test.ts index 9d95492..bac2c54 100644 --- a/tests/commands/token-registry/mint.test.ts +++ b/tests/commands/token-registry/mint.test.ts @@ -54,13 +54,13 @@ vi.mock('@trustvc/trustvc', () => ({ name: 'matic', explorerUrl: 'https://polygonscan.com', rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, 80002: { name: 'amoy', explorerUrl: 'https://www.oklink.com/amoy', rpcUrl: 'https://rpc-amoy.polygon.technology', - nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + nativeCurrency: { symbol: 'POL', decimals: 18 }, }, 50: { name: 'xdc', @@ -102,7 +102,7 @@ vi.mock('@trustvc/trustvc', () => ({ CHAIN_ID: { mainnet: 1, sepolia: 11155111, - matic: 137, + pol: 137, amoy: 80002, xdc: 50, xdcapothem: 51, @@ -258,7 +258,7 @@ describe('token-registry/mint', () => { it('should return correct answers for valid inputs with direct private key', async () => { const mockInputs = { - network: NetworkCmdName.Matic, + network: NetworkCmdName.Pol, address: '0x1234567890123456789012345678901234567890', tokenId: '0xabcdef1234567890', beneficiary: '0x0987654321098765432109876543210987654321', @@ -449,7 +449,7 @@ describe('token-registry/mint', () => { NetworkCmdName.Local, NetworkCmdName.Mainnet, NetworkCmdName.Sepolia, - NetworkCmdName.Matic, + NetworkCmdName.Pol, NetworkCmdName.Amoy, NetworkCmdName.XDC, NetworkCmdName.XDCApothem, diff --git a/tests/commands/verify.amoy.test.ts b/tests/commands/verify.amoy.test.ts new file mode 100644 index 0000000..ca039bc --- /dev/null +++ b/tests/commands/verify.amoy.test.ts @@ -0,0 +1,103 @@ +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { readJsonFile } from '../../src/utils'; +import { SignedVerifiableCredential } from '@trustvc/trustvc'; + +const AMOY_FIXTURES_DIR = path.resolve(process.cwd(), 'tests/fixtures/amoy'); +const OA_AMOY_FIXTURE = path.join(AMOY_FIXTURES_DIR, 'oa-token-registry-amoy-testnet-v2.json'); +const W3C_AMOY_FIXTURE = path.join(AMOY_FIXTURES_DIR, 'w3c-transferable-record-amoy-testnet.json'); + +describe('Polygon Amoy (testnet) verify', () => { + // ─── OA v2 fixture structure (offline, no network) ─────────────────────── + + describe('OA v2 token registry fixture (structural)', () => { + it('fixture should be a valid wrapped OA v2 document', () => { + const doc = readJsonFile(OA_AMOY_FIXTURE, 'document'); + expect((doc as any).version).toBe('https://schema.openattestation.com/2.0/schema.json'); + expect((doc as any).signature).toBeDefined(); + expect((doc as any).signature.type).toBe('SHA3MerkleProof'); + }); + + it('fixture should target Polygon Amoy testnet (chainId 80002)', () => { + const doc = readJsonFile(OA_AMOY_FIXTURE, 'document') as any; + // data.network.chainId is UUID-encoded in wrapped OA v2 + expect(doc.data.network.chainId).toContain('80002'); + }); + + it('fixture should reference the correct Amoy token registry', () => { + const doc = readJsonFile(OA_AMOY_FIXTURE, 'document') as any; + expect(doc.data.issuers[0].tokenRegistry).toContain( + '0xa5f9a7106a599E4caAFacE6872da097aa802Cc64', + ); + }); + + it('fixture should have a valid SHA3MerkleProof signature with non-empty targetHash', () => { + const doc = readJsonFile(OA_AMOY_FIXTURE, 'document') as any; + expect(doc.signature.targetHash).toMatch(/^[a-f0-9]{64}$/); + expect(doc.signature.merkleRoot).toBe(doc.signature.targetHash); + }); + }); + + // ─── W3C fixture structure (offline, no network) ────────────────────────── + + describe('W3C transferable record fixture (structural)', () => { + it('fixture should be a W3C VC with TransferableRecords credentialStatus', () => { + const doc = readJsonFile(W3C_AMOY_FIXTURE, 'document') as any; + expect(doc['@context']).toBeDefined(); + expect(doc.type).toContain('VerifiableCredential'); + expect(doc.credentialStatus.type).toBe('TransferableRecords'); + }); + + it('fixture should target Polygon Amoy testnet (chain POL, chainId 80002)', () => { + const doc = readJsonFile(W3C_AMOY_FIXTURE, 'document') as any; + expect(doc.credentialStatus.tokenNetwork.chain).toBe('POL'); + expect(doc.credentialStatus.tokenNetwork.chainId).toBe(80002); + }); + + it('fixture should reference the correct Amoy token registry and token ID', () => { + const doc = readJsonFile(W3C_AMOY_FIXTURE, 'document') as any; + expect(doc.credentialStatus.tokenRegistry).toBe('0xa5f9a7106a599E4caAFacE6872da097aa802Cc64'); + expect(doc.credentialStatus.tokenId).toBe( + 'd320d1e7eaf6a0f9ec185c8b25470d027115ef2059e5b1bcb41cde09f799be75', + ); + }); + + it('fixture issuer should be did:web:trustvc.github.io:did:1', () => { + const doc = readJsonFile(W3C_AMOY_FIXTURE, 'document') as any; + expect(doc.issuer).toBe('did:web:trustvc.github.io:did:1'); + }); + + it('fixture should have a DataIntegrityProof', () => { + const doc = readJsonFile(W3C_AMOY_FIXTURE, 'document') as any; + expect(doc.proof.type).toBe('DataIntegrityProof'); + }); + }); + + // ─── Network routing (no live RPC needed) ──────────────────────────────── + + describe('network routing', () => { + it('chainId 80002 maps to NetworkCmdName.Amoy', async () => { + const { getSupportedNetworkNameFromId, getSupportedNetwork, NetworkCmdName } = + await import('../../src/utils/networks'); + expect(getSupportedNetworkNameFromId(80002)).toBe(NetworkCmdName.Amoy); + expect(getSupportedNetwork(NetworkCmdName.Amoy)).toBeDefined(); + }); + + it('AMOY_RPC env var overrides the default Infura provider for Polygon Amoy', async () => { + const customRpc = 'https://rpc-amoy.polygon.technology/'; + process.env.AMOY_RPC = customRpc; + + const { getSupportedNetwork, NetworkCmdName } = await import('../../src/utils/networks'); + const { JsonRpcProvider } = await import('ethers'); + const network = getSupportedNetwork(NetworkCmdName.Amoy); + const provider = network.provider(); + + delete process.env.AMOY_RPC; + + expect(provider).toBeInstanceOf(JsonRpcProvider); + expect((provider as any)._getConnection?.().url ?? (provider as any).connection?.url).toBe( + customRpc, + ); + }); + }); +}); diff --git a/tests/commands/verify.pol.test.ts b/tests/commands/verify.pol.test.ts new file mode 100644 index 0000000..4ce243c --- /dev/null +++ b/tests/commands/verify.pol.test.ts @@ -0,0 +1,107 @@ +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { readJsonFile } from '../../src/utils'; +import { SignedVerifiableCredential } from '@trustvc/trustvc'; + +const POL_FIXTURES_DIR = path.resolve(process.cwd(), 'tests/fixtures/pol'); +const OA_POL_FIXTURE = path.join(POL_FIXTURES_DIR, 'oa-token-registry-pol-mainnet-v2.json'); +const W3C_POL_FIXTURE = path.join(POL_FIXTURES_DIR, 'w3c-transferable-record-pol-mainnet.json'); + +describe('Polygon (POL) mainnet verify', () => { + // ─── Fixture structure (offline, no network) ────────────────────────────── + + describe('OA v2 token registry fixture (structural)', () => { + it('fixture should be a valid wrapped OA v2 document', () => { + const doc = readJsonFile(OA_POL_FIXTURE, 'document'); + expect((doc as any).version).toBe('https://schema.openattestation.com/2.0/schema.json'); + expect((doc as any).signature).toBeDefined(); + expect((doc as any).signature.type).toBe('SHA3MerkleProof'); + }); + + it('fixture should target POL mainnet (chainId 137)', () => { + const doc = readJsonFile(OA_POL_FIXTURE, 'document') as any; + // data.network.chainId is UUID-encoded in wrapped OA v2 + expect((doc as any).data.network.chainId).toContain('137'); + }); + + it('fixture should reference correct token registry', () => { + const doc = readJsonFile(OA_POL_FIXTURE, 'document') as any; + expect(doc.data.issuers[0].tokenRegistry).toContain( + '0x0961d9C2dA9a7105fDFC9DC4ec45951C024F88B0', + ); + }); + + it('fixture should have a valid SHA3MerkleProof signature with non-empty targetHash', () => { + const doc = readJsonFile(OA_POL_FIXTURE, 'document') as any; + expect(doc.signature.targetHash).toMatch(/^[a-f0-9]{64}$/); + expect(doc.signature.merkleRoot).toBe(doc.signature.targetHash); + }); + }); + + describe('W3C transferable record fixture (structural)', () => { + it('fixture should be a W3C VC with TransferableRecords credentialStatus', () => { + const doc = readJsonFile(W3C_POL_FIXTURE, 'document') as any; + expect(doc['@context']).toBeDefined(); + expect(doc.type).toContain('VerifiableCredential'); + expect(doc.credentialStatus.type).toBe('TransferableRecords'); + }); + + it('fixture should target POL mainnet (chainId 137)', () => { + const doc = readJsonFile(W3C_POL_FIXTURE, 'document') as any; + expect(doc.credentialStatus.tokenNetwork.chain).toBe('POL'); + expect(doc.credentialStatus.tokenNetwork.chainId).toBe(137); + }); + + it('fixture should reference correct token registry and token ID', () => { + const doc = readJsonFile(W3C_POL_FIXTURE, 'document') as any; + expect(doc.credentialStatus.tokenRegistry).toBe('0x0961d9C2dA9a7105fDFC9DC4ec45951C024F88B0'); + expect(doc.credentialStatus.tokenId).toBe( + '1174afa500e1b265450b55200cb16487e92e7c5410cff84b693eda59194b10fd', + ); + }); + + it('fixture issuer should be did:web:trustvc.github.io:did:1', () => { + const doc = readJsonFile(W3C_POL_FIXTURE, 'document') as any; + expect(doc.issuer).toBe('did:web:trustvc.github.io:did:1'); + }); + + it('fixture should have a DataIntegrityProof', () => { + const doc = readJsonFile(W3C_POL_FIXTURE, 'document') as any; + expect(doc.proof.type).toBe('DataIntegrityProof'); + }); + }); + + // ─── Network routing (no live RPC needed) ───────────────────────────────── + + describe('network routing', () => { + it('chainId 137 maps to NetworkCmdName.Pol', async () => { + const { getSupportedNetworkNameFromId, NetworkCmdName } = + await import('../../src/utils/networks'); + expect(getSupportedNetworkNameFromId(137)).toBe(NetworkCmdName.Pol); + }); + + it('getSupportedNetwork returns Polygon config for NetworkCmdName.Pol', async () => { + const { getSupportedNetwork, NetworkCmdName } = await import('../../src/utils/networks'); + const polNetwork = getSupportedNetwork(NetworkCmdName.Pol); + expect(polNetwork).toBeDefined(); + expect(polNetwork.networkId).toBe(137); + expect(polNetwork.currency).toBe('POL'); + }); + + it('POL_RPC env var overrides the default Infura provider for Polygon', async () => { + const customRpc = 'https://polygon-bor-rpc.publicnode.com'; + process.env.POL_RPC = customRpc; + + const { getSupportedNetwork, NetworkCmdName } = await import('../../src/utils/networks'); + const { JsonRpcProvider } = await import('ethers'); + const provider = getSupportedNetwork(NetworkCmdName.Pol).provider(); + + delete process.env.POL_RPC; + + expect(provider).toBeInstanceOf(JsonRpcProvider); + expect((provider as any)._getConnection?.().url ?? (provider as any).connection?.url).toBe( + customRpc, + ); + }); + }); +}); diff --git a/tests/fixtures/amoy/oa-token-registry-amoy-testnet-v2.json b/tests/fixtures/amoy/oa-token-registry-amoy-testnet-v2.json new file mode 100644 index 0000000..ea26b38 --- /dev/null +++ b/tests/fixtures/amoy/oa-token-registry-amoy-testnet-v2.json @@ -0,0 +1,34 @@ +{ + "version": "https://schema.openattestation.com/2.0/schema.json", + "data": { + "version": "e701574c-bce2-4e96-8c5c-cb9d02c4ce28:string:https://schema.openattestation.com/2.0/schema.json", + "$template": { + "name": "c1fe588b-da05-45af-afee-3680a9414b39:string:GOVTECH_DEMO", + "type": "f2779150-a9f7-48be-a4f4-7685ca9b6f33:string:EMBEDDED_RENDERER", + "url": "c3b6972d-e54a-43cf-83c4-11d2063207a6:string:https://demo-renderer.opencerts.io" + }, + "issuers": [ + { + "name": "14003050-4b55-47d2-9cc5-24e17b05275d:string:TrustVC Amoy Issuer", + "tokenRegistry": "ab2394fd-f6b9-4094-8f3c-37da1515abe7:string:0xa5f9a7106a599E4caAFacE6872da097aa802Cc64", + "identityProof": { + "type": "ef0308c9-0a7f-4fae-a38f-7d1f3797712b:string:DNS-TXT", + "location": "c8155f34-c97a-4745-a576-7e52eee1f5f0:string:example.tradetrust.io" + } + } + ], + "recipient": { + "name": "0f987694-19cf-4b29-a5ab-3aa7cde13246:string:TrustVC Amoy Test" + }, + "network": { + "chain": "f999cdb8-445e-4e0e-92b1-5d554bc3c852:string:POL", + "chainId": "a5a27920-e63b-49a9-b4df-2f2af37a8c24:string:80002" + } + }, + "signature": { + "type": "SHA3MerkleProof", + "targetHash": "8d4ddb4f0252c1d61f0b72ad585573317c2d3f9268ebbd6d785699e12ebbb077", + "proof": [], + "merkleRoot": "8d4ddb4f0252c1d61f0b72ad585573317c2d3f9268ebbd6d785699e12ebbb077" + } +} diff --git a/tests/fixtures/amoy/w3c-transferable-record-amoy-testnet.json b/tests/fixtures/amoy/w3c-transferable-record-amoy-testnet.json new file mode 100644 index 0000000..fce1b94 --- /dev/null +++ b/tests/fixtures/amoy/w3c-transferable-record-amoy-testnet.json @@ -0,0 +1,60 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://w3id.org/security/data-integrity/v2", + "https://trustvc.io/context/render-method-context-v2.json", + "https://trustvc.io/context/promissory-note.json", + "https://trustvc.io/context/transferable-records-context.json", + "https://trustvc.io/context/qrcode-context.json" + ], + "renderMethod": [ + { + "type": "EMBEDDED_RENDERER", + "templateName": "PROMISSORY_NOTE", + "id": "https://generic-templates.tradetrust.io" + } + ], + "credentialSubject": { + "type": ["PromissoryNote"], + "drawerCompanyName": "XYZ Exports Pvt. Ltd.", + "drawerCompanyNo": "CIN-XYZ1234567", + "drawerJurisdiction": "India", + "drawerWalletAddress": "0x433097a1C1b8a3e9188d8C54eCC057B1D69f1638", + "drawerPlaceOfIssue": "Mumbai, India", + "draweeCompanyName": "XYZ Imports Ltd.", + "draweeCompanyNo": "REG-XYZ9876543", + "draweeJurisdiction": "California, United States", + "draweeWalletAddress": "0xca93690bb57eeab273c796a9309246bc0fb93649", + "dueDate": "2025-06-19", + "currency": "USD", + "amount": "50,000.00", + "clause": "Payment to be made in full without set-off or counterclaim, subject to terms agreed between Drawer and Drawee.", + "signerName": "John Doe", + "signerPosition": "Chief Financial Officer", + "signerTimeStamp": "2025-06-10", + "logo": "data:image/png;base64,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", + "pNoteId": "PN-9081-2231-SGP", + "commitmentDate": "2025-12-10" + }, + "type": ["VerifiableCredential"], + "credentialStatus": { + "type": "TransferableRecords", + "tokenNetwork": { + "chain": "POL", + "chainId": 80002 + }, + "tokenRegistry": "0xa5f9a7106a599E4caAFacE6872da097aa802Cc64", + "tokenId": "d320d1e7eaf6a0f9ec185c8b25470d027115ef2059e5b1bcb41cde09f799be75" + }, + "issuer": "did:web:trustvc.github.io:did:1", + "validFrom": "2024-04-01T12:19:52Z", + "id": "urn:uuid:019ea8ea-2cf5-7662-9ab6-4b8b261174c7", + "proof": { + "type": "DataIntegrityProof", + "created": "2026-06-08T20:26:19Z", + "verificationMethod": "did:web:trustvc.github.io:did:1#multikey-1", + "cryptosuite": "ecdsa-sd-2023", + "proofPurpose": "assertionMethod", + "proofValue": "u2V0AhVhA2a6bF4PPP3Mnid815CspDt-DMcGPm-iDwkYPBY2KgbprArYR9urtjfaaarNzxxsnBVuLUVJRmgBJdPAKkPhp0lgjgCQCcxtBLaHQBHKdzPUjrOoAUVnAqpYInt6hFitn3f96aotYIPgjo4q0O9-JKXdEK5MyNbPcr2XTCY0MD2hJ_gWjp6hdmB9YQCP8qUh7sZnTA9ATmpuIjMPwVkUQTACNPWiM1LYUHlPMxSVOChUnWnCXL7DRs2ZcwbDkBzLjHOoDMi1JxdjnzJ9YQG_tUBTFL8R9cKH04hvAdaNi71BK8qoQqNNe0f_89R2yuWR1fFe2dtI9edydW6qiNvSwXtuCFAhRQOZqlt_8Q3lYQPob4-pdjgIMUnLjYP64LYKq45uwgd6XyXGwUO1l7W7GpO_kgAKuM99t1MXp6IB6A9XbRNYaCSiJAgCbyqodHbJYQNPsYqo-lf-CPvcv0fC2kOXvaFQsouhiuCVdWSYXEsVCvxw96-Z-lZm9ywHLl1ZTCefxgikLkcYnLod232LGVqJYQDdGVqY1bWtTC6A_knvz9l_JGLJlFE_VFg4Ke4_Ipmzfu9mBQU-47e_11FB9ksO4cvvTstFWuxpAEC_JP7RqRJ5YQA3cxqybEuYIqSRkyDvmSaYIdcLrOsNWXL2kI-24SvhplRJH5S44BVPK_cvVAtHXLtDurfqeHjrmRnC0Cid_0DdYQEi0vKYmHUQGVuJuvUpmtoWsPCiW3uXUhrQUzXqK02YpLwV9Rv7mpi8Ttf4ZKyB94sdTh6YIJ9I3-A9OXjQsvFxYQDAl3ueb3hT243goN3x8oZWZ10whyuR8FOGUCBH0OLHBBvFDGvYJxgGpoyTanZP3rda5KTGp8FwRg0GPWJYL4wRYQJxc7azJM-xLzBNvdaRkXo79nFW44uNVh5MdURrVr8o-ZtBcSEAih0M22Si56IHwJEOdEeBg7-gR7T5Id1ERSpZYQMIuWoTRj1efe2uYiZyf1Ls65uCjTmdLXlstDDgGNVSeZY25cKuxiFORPkWDzxYF-f8UMXzN933O3f-eeB5bnPNYQGbc5MuhppkPQMSTO720vxYfXNSTT9efTsnx6JViQGsyNKlk01Uq5Q7uEyAl60bBFIfOCvwS8Fi5wlSs_dPb-uFYQMbKw4rwwtb9a4DGVHMOJ5jfDQ4sdHFUY3OC3tFf5L8M_shEJSbj_b6_9eNAuZ2GYIrKXM_md3UiWYHQX73TIXdYQGPFJpDLxCtFLpwd1Zc9_yXpRhG1TKKX9yJZArFM8x0ZZwAHSMUXt6mqADMDR1kd3o1jT4WsKZ9am3pWugyDFtJYQA5iROJ_BPhMBm1gPmJF71XcIFhMRSbxq_EZIKHTN4zrNKvJth4_tPir8IQpES8DxuV_25bYvmUMTh2RA3XAMlxYQBenzrw26uucwbHZ7wo_QpkLQFroVPJhBbgPoOHyO9nwkm77jOagHUHapviZdyCCXF6e_zia4dWek5kB5DmcMglYQJO44U9o4BUZ59DFch5dYDIdk7nUSKAd4TUK9QTYQMjauUaNAxpFeuwZdAh8oSSfQ3chjFmg1jpn9kesq43xWQxYQABM0ACr639sNX4x3jH_NRkfxFbiKDQJ-DukfF8UYD_Y1aY-j47JcHpIJhu1WhafVCqKkrRvr0dZ3PymQZnt7LVYQCXMa2Z1j_p28XLE0SqvKae10V-q-dwc_hGI_Eyx_obbPEw02ErzOd4dMpUTffsIU3Tauc-UwNs7iK_FdJYzaBtYQOSssxQPNn1qMR_AHonbY_UPNYb6aY9ek4HMrh2FEUWBllKOO_-j5nRIs1M_e9yrmMaxPYJWi4wxpaFgR1SkXZhYQBGUhHcZ7fEHYGkCuWcofP8VNs_z2FifSzQ-U2pok0Mz4M6hZ1Kn-r6c6AD0KyJUZq7yARCa6ZVwJB2OoF9Wy0hYQI7QjPqTZoDArXYrSa21EN_5zmCn7yWeXzyyDe3bEsV0jTbuQ14sTj5-OCXsqf8PITGVbWp2cZgE6dBch4KRR7hYQLcw1Pcl94lXpeNzjPIg3jtPgklA9_R3fNthHSt1PHOkEznmowHnZgZWo-3C4oyeD8Lpt0ARBOYSqbUqLGk6mGtYQIrpRQ5AyxUYZGtEXvcMe1Vbyc7Tn1rRB7Ev6Z0h__iAum798w81mnJU5eIlyRwAyIQ0cwnGf6Zo74JcQyh4sH9YQIfhd4d0Y23Cufs2VQBHi86tlqMtrHk2RTJy455m_DzX0qm_nQty90WDKDC92A3rRxPqi_ZxX2c-ChLrPoxLja9YQF_6ODroXBzfXkm9MYcyQVZ0SsfLdPliMmy9gem22PV7fdrSNvPY0hiqs6qPlFuVt2zBNEpf03R6axXzV2iAJhpYQNXGgigVpkgO8BrYvQWvDMKslyi6oQwG3i2AjcdzxCot72c79Kj-54G1kMMZs1E5jbyYuYzTOuFcXUjbJp0taYpYQKTpzL3cXC7dXgGDN6ke18BJ6pRvSuTAqK1UqIbfq6PyP3pys3fm_O4xsbEvAJjXddMBEigQ3dQOoQiBPX1GRrVYQMD5sLp7muEOz0LBub6_bJDvJmOwL2duPrU3FVXN1po0pcddNcBCYB7XGPHK-ptrqGpVIX4jyxJprKLQR0bsyJZYQJBIZ6wZV0yCPzN7p9q6-qMOCb1wa5jIew9NnG9akwDMiAciLZuR5TE0NQoalY7m7aICiM8lbEVByAdddwECxJZYQJXbLhIt1YYHRxAygGPM2m-i7E98ySYHLZ99MdZ6SSMvP_FnakQMlDeHoN7Z5V9f9von_QoqS4mijhOhR5wsfKpYQKFsz3VVgvYOYtvs-6mwX97tTOv6OlYYwa5NTzptPz_tttNjbtqT_8D0cwCVWjlc4M4daOmjXZo7KmXtqDnh3WGCZy9pc3N1ZXJqL3ZhbGlkRnJvbQ" + } +} diff --git a/tests/fixtures/pol/oa-token-registry-pol-mainnet-v2.json b/tests/fixtures/pol/oa-token-registry-pol-mainnet-v2.json new file mode 100644 index 0000000..31cafa3 --- /dev/null +++ b/tests/fixtures/pol/oa-token-registry-pol-mainnet-v2.json @@ -0,0 +1,33 @@ +{ + "version": "https://schema.openattestation.com/2.0/schema.json", + "data": { + "$template": { + "name": "d08b56ed-9f91-44d8-8748-4ef17c10084e:string:GOVTECH_DEMO", + "type": "17fbeec8-9712-4e3a-bf17-dd74ba348644:string:EMBEDDED_RENDERER", + "url": "a1061e20-318c-4bde-89d5-1ec42ef1eea9:string:https://demo-renderer.opencerts.io" + }, + "issuers": [ + { + "name": "7c8c3632-df92-492d-84fa-bb59363c9cf0:string:TrustVC POL Issuer", + "tokenRegistry": "0a0be8f4-c4af-4ec2-8bd8-ef787f72ea0a:string:0x0961d9C2dA9a7105fDFC9DC4ec45951C024F88B0", + "identityProof": { + "type": "21a24a77-34fc-4d8a-9cd4-7678304ce11d:string:DNS-TXT", + "location": "e201feac-f6cc-466c-98ae-3cc35dd03891:string:example.tradetrust.io" + } + } + ], + "recipient": { + "name": "9847a1cf-8151-42d7-b240-607d7a0f2fb7:string:TrustVC POL Test" + }, + "network": { + "chain": "da056415-f675-49d8-942b-6c4c76bf664e:string:POL", + "chainId": "39922aa7-aaa1-49b8-a77c-d230eae018fb:string:137" + } + }, + "signature": { + "type": "SHA3MerkleProof", + "targetHash": "5382d7c3c19d4b5730537a234b01b2084fdd71c3196dd0f5df00b23d9756d8d0", + "proof": [], + "merkleRoot": "5382d7c3c19d4b5730537a234b01b2084fdd71c3196dd0f5df00b23d9756d8d0" + } +} diff --git a/tests/fixtures/pol/w3c-transferable-record-pol-mainnet.json b/tests/fixtures/pol/w3c-transferable-record-pol-mainnet.json new file mode 100644 index 0000000..6dfc33c --- /dev/null +++ b/tests/fixtures/pol/w3c-transferable-record-pol-mainnet.json @@ -0,0 +1,60 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://w3id.org/security/data-integrity/v2", + "https://trustvc.io/context/render-method-context-v2.json", + "https://trustvc.io/context/promissory-note.json", + "https://trustvc.io/context/transferable-records-context.json", + "https://trustvc.io/context/qrcode-context.json" + ], + "renderMethod": [ + { + "type": "EMBEDDED_RENDERER", + "templateName": "PROMISSORY_NOTE", + "id": "https://generic-templates.tradetrust.io" + } + ], + "credentialSubject": { + "type": ["PromissoryNote"], + "drawerCompanyName": "XYZ Exports Pvt. Ltd.", + "drawerCompanyNo": "CIN-XYZ1234567", + "drawerJurisdiction": "India", + "drawerWalletAddress": "0x433097a1C1b8a3e9188d8C54eCC057B1D69f1638", + "drawerPlaceOfIssue": "Mumbai, India", + "draweeCompanyName": "XYZ Imports Ltd.", + "draweeCompanyNo": "REG-XYZ9876543", + "draweeJurisdiction": "California, United States", + "draweeWalletAddress": "0xca93690bb57eeab273c796a9309246bc0fb93649", + "dueDate": "2025-06-19", + "currency": "USD", + "amount": "50,000.00", + "clause": "Payment to be made in full without set-off or counterclaim, subject to terms agreed between Drawer and Drawee.", + "signerName": "John Doe", + "signerPosition": "Chief Financial Officer", + "signerTimeStamp": "2025-06-10", + "logo": "data:image/png;base64,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", + "pNoteId": "PN-9081-2231-SGP", + "commitmentDate": "2025-12-10" + }, + "type": ["VerifiableCredential"], + "credentialStatus": { + "type": "TransferableRecords", + "tokenNetwork": { + "chain": "POL", + "chainId": 137 + }, + "tokenRegistry": "0x0961d9C2dA9a7105fDFC9DC4ec45951C024F88B0", + "tokenId": "1174afa500e1b265450b55200cb16487e92e7c5410cff84b693eda59194b10fd" + }, + "issuer": "did:web:trustvc.github.io:did:1", + "validFrom": "2024-04-01T12:19:52Z", + "id": "urn:uuid:019ea68d-006c-7887-9ea8-3f54f562ac65", + "proof": { + "type": "DataIntegrityProof", + "created": "2026-06-08T09:25:19Z", + "verificationMethod": "did:web:trustvc.github.io:did:1#multikey-1", + "cryptosuite": "ecdsa-sd-2023", + "proofPurpose": "assertionMethod", + "proofValue": "u2V0AhVhAHlKJtL9UV-_snL5rOlLyCznZu_oNyzOE3s6XAFR4USM0D68IJsm6qf5M01opyFXDW3Xn8mtLb6AZEgRWH6C4fVgjgCQD-WN_Q-KfWRbl6pQ5HB4u4khdD6xR1mPuWcTcLYNwPkhYIJy9GT0cT7-l_I9XOnoDDJyy5IV9LvUECuSSvNoluakUmB9YQDn8hL0e7mW-1DC0i74pcWcskNkMU82TgfA0P1eeJLFHdkuhd-HhqWH2wTd9CG48KJ0UvVkt3jzPXWHMhkkxzMRYQCnL8QQIZ-Ki2Cjf1_u43B3AM5BwAAXiC2NkfK6AhcWVoBnVtEBN2vBZc4pWJveWd_qVJU5ALqL3Dz1JmIAwkHlYQNfW5JmtYILhhIZufZ9j4FX9IA4x9hk0ULLhEenxAaYlfnYnewVsI3AvRdGmJc6QwL1PTR-hTVG3txGVL3SNWBtYQABtgC4W-r6VH649Et1xGg1NB2VE_ZshNSK2yQN1hDok36f6bwcAJ1n91y52u3XmpxOYyGmsPM8yp6udzO9YRwtYQAQz4UhnkiIQovoJHD6Y-kq3X2YegxXFTnh4zH_qNWvjhZVa0nx9CCDvBDpmlH0lWqSAkNiTTx0XWE298vAK54xYQGFfs4um2IWamhe_4da7qsInmTR5VZgIhqPlkfaQd4-Vw9INv8orNrqXOhIMssCG1MCAr1vnsM6zVq75fVnABP5YQA0idgyw13Uwb8N4e_CFH_kIX9M21lLmeZ_ZWA9z5HfsN8qxBEU4VeODqi97QjgRtVBKL4ijHXT1_-YZyZZByB5YQHcGLRUvnezhWKd8kDw2cn12hfnc6rLlyy3dXUDvUzfr6n3zUqCA_cDopBbmhtGIQTHMff4uuiiFnT0a9dRkC09YQKbQ0HIMNzM2IkbGp14_JouEXXhvR3rMCKb8y2S4QzrqrZZMbbTNQaoHvTi07DbEeZINZlfJa-OhtIt82ulauc1YQJGDTkF2B9txoMSEZqHn5dKuw5-XVxIt7c-FGeeMQ0cZ3bW3P5EorCyF3Vq3iCP2a8gGyndXbXRp0ZiJhxLp2y5YQGNf8SRVKhEMF5FSH4xgFokxbcp4Kl2T70gCfGVJigO_kjxyZt8H69gNDnNYSc8QzpkFKT3UxWz_tZSQ9Ia8IIJYQJx0MTX75Tw_qBhANFD_brQ6L-AzNBjm_OH5bh8gAVusyVhnDpmXY51gQrN6JyjqtLxaYtjY1cfDJwuC35atF8xYQHAl47bk03u2wlrCHigRI5e37vqpR1JDzegTysqwLWqduOWqgU948Rk2upFSrQyhmgFX7Fl7DtBuHo8ZpgMujUlYQChDnKQjbDqWalmDH8w8LX474u9CYIFWK4cQwBlKhBADVfKU1Qqica4w9bzA5GNfjB33CX9XUMplTJSowJEUr1FYQBkKA9cJV4Um_B88M2n5_baaiAPFznINZpMLK5EJgQ-0wUuvI50_t6K8bWegTer1fnQOSnAlfBtUcK8yYL_QOfJYQLlh6ZzWPSorsSl3JZm9rp2L_lxiTbY0DWY9pSJMMiA9EKQaTZkpZqeSKEmoT6Aq-eFAuTbwr906jhg4NprWI1RYQEghFR8i1Dc8TpbjkoLndak2DYuG1SxtPZgzVgp1BPyEj5GPyL4FL1a-ikORWgV-HVJMEfarAkSiarXyUgvNxMRYQHkm3JeRRLKAKaP6gAf657NnGmmA1uxzFQ4Gq--ypILf-bpWEE4cTvEWCqfQSD3am8bFOhUJXFB5Kw4UqcTsQMFYQP0klTeYpKIXTeZQfVGBu7TBu2ZAwpDQ2lVVP0mXhP84NSdKKq9sIhD2GczdN_WMe89fSLvOEFY89y_h2SEyWqNYQNkQsRlN7U6tNJClz7rTiRXBEYfJGcHr8DzOsbckVOcovkhLIXPQvza8k87XZVLbCQiM9EZjS-Qi_izstH7RBZ5YQP5o3vy24Z8-mdlf6gyILBobX49kkTJ_-K5QLVNRH49pbxMNri4y2TPRHK6dlH-RmqB0ODEJUtD22k2ctVpvZxlYQODUnQlNDHujgjU-zv2OKx8VULunh8F2Zc5a8zSe8et7nbYiHoR1zoJpny2FJNrcpaZsyCfYkFdMBY92-2fIMMVYQLriZAVY1yLNmVMmsvp1eNLJGuLhVbNW5Yeg0Q7MUDKiQWwfCIUAdpssw4NCzttMVc2BFOIUfLWeY2gOWZGeABJYQMFdZ5HH3AuukE_nIvGY3L7pCFj-fPC98peSXOrlSDndTpMD5YpAJ7llX1mu6eQh-3HM8pcXRyPMgIJ8Mts7brZYQCMMCir0KK66Cwn0PBloywyFio9K9FCVUNwm7EmR6cDET2f1eCMBuAWmogHnQq6Uaq9zbmPlh_61a2AX3plYA1NYQDTEXLX4HprsDgr6z9NQ4zsGughnID20MqLH8Ekcc-oaC-jePS9Oza-aF9AU83JPeYdixWUN_wIJzzp7HxPkCidYQOpN0b7tWiFYXRRF_WeNDkXzRKzUyx_AoysQSnjQ2tibBzdN0-YvGEkeHrxvurr1hh8K9YL4yNsaw7Xpx6CrjSJYQO9Q0rdzs8UlnYhVQYxFbEbmaJppeTTFYjH3rXZ9SmDvPTdkL57r8cqxHCPTpG1xgxL1fuYOrE__p7PZohCwiy1YQHJaNYwpgjeDOPO6Txoz0Q-jkVMDr9XUWM1qp-SL8JtLpqImZ9iw54uHKFxuMuETSSKXEN6ZnKlpbpLDM4FL3i1YQEUVVNdExM1KWU3orB-s5n50br-e7LubUo6FhZYghz1RFvSwFkGmtsqGOk67W0rtUd8TERoHjDq137ocHM4LRrNYQCG5DS_HAcrUXBI_eoxy1AJlKx9L4lY4VsNum6b4_F3lJJQ7wLor0NhbcpK3-0U-Iuf_J4_NKFiFwiQ9ZhE_Ll-CZy9pc3N1ZXJqL3ZhbGlkRnJvbQ" + } +}