From 1cbfe4e511bc408f50d73c597db34242e898a76c Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 3 Jun 2024 11:07:30 +0800 Subject: [PATCH 01/27] chore: upgrade oa dependencies to beta --- package-lock.json | 3045 +++++++++++++++++++++++---------------------- package.json | 5 +- 2 files changed, 1544 insertions(+), 1506 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03ead1d84..cf5a6bfd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,141 @@ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true }, + "@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "requires": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "requires": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-crypto/sha256-universal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-universal/-/sha256-universal-5.2.0.tgz", + "integrity": "sha512-fnBT+9QvcJLXHOuGAPSq3FNVxOsE2lvuJiRjJidaIyeabASmvJWzFEIw9xJaLBY7JPqtD9faMIGCVZv39IbXrg==", + "requires": { + "@aws-crypto/sha256-browser": "^5.2.0", + "@aws-sdk/hash-node": "^3.110.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "requires": { + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-sdk/hash-node": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.374.0.tgz", + "integrity": "sha512-5GmU64bwoQhkebMv7NzHa+Mw+p7ZmrKz9e3A6hKClxVGeZFE/+jME46gMuFYzO0iz3WqX4CCzUVOhNbS0x8EMQ==", + "requires": { + "@smithy/hash-node": "^1.0.1", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-sdk/types": { + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.577.0.tgz", + "integrity": "sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==", + "requires": { + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", + "requires": { + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -618,9 +753,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==" }, "@babel/helper-validator-identifier": { "version": "7.12.11", @@ -2272,6 +2407,16 @@ "stackframe": "^1.1.1" } }, + "@digitalbazaar/http-client": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", + "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", + "requires": { + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" + } + }, "@electron/asar": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.7.tgz", @@ -2292,65 +2437,51 @@ } }, "@emotion/babel-plugin": { - "version": "11.10.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz", - "integrity": "sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.17.12", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.0.13" + "stylis": "4.2.0" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.6" } }, - "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" - }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==" }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } }, "@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" } }, @@ -2359,154 +2490,139 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" }, "stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" } } }, "@emotion/cache": { - "version": "11.10.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", - "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", - "requires": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.0.13" + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" }, "dependencies": { "stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" } } }, "@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "requires": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.8.1" } }, "@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "@emotion/react": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz", - "integrity": "sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "requires": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.0", - "@emotion/cache": "^11.10.0", - "@emotion/serialize": "^1.1.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "dependencies": { "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" } } }, "@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "requires": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, "@emotion/sheet": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz", - "integrity": "sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "@emotion/styled": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.4.tgz", - "integrity": "sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "requires": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.0", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" }, "dependencies": { "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" } } }, "@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==" }, "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "@eslint/eslintrc": { "version": "0.4.3", @@ -2555,132 +2671,140 @@ } }, "@ethersproject/abi": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.1.2.tgz", - "integrity": "sha512-uMhoQVPX0UtfzTpekYQSEUcJGDgsJ25ifz+SV6PDETWaUFhcR8RNgb1QPTASP13inW8r6iy0/Xdq9D5hK2pNvA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "requires": { - "@ethersproject/address": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/hash": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/strings": "^5.1.0" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/abstract-provider": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz", - "integrity": "sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "requires": { - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/networks": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/transactions": "^5.1.0", - "@ethersproject/web": "^5.1.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, "@ethersproject/abstract-signer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz", - "integrity": "sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "requires": { - "@ethersproject/abstract-provider": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "@ethersproject/address": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.1.0.tgz", - "integrity": "sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "requires": { - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/rlp": "^5.1.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, "@ethersproject/base64": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.1.0.tgz", - "integrity": "sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "requires": { - "@ethersproject/bytes": "^5.1.0" + "@ethersproject/bytes": "^5.7.0" } }, "@ethersproject/basex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.1.0.tgz", - "integrity": "sha512-vBKr39bum7DDbOvkr1Sj19bRMEPA4FnST6Utt6xhDzI7o7L6QNkDn2yrCfP+hnvJGhZFKtLygWwqlTBZoBXYLg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/properties": "^5.1.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "@ethersproject/bignumber": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.1.1.tgz", - "integrity": "sha512-AVz5iqz7+70RIqoQTznsdJ6DOVBYciNlvO+AlQmPTB6ofCvoihI9bQdr6wljsX+d5W7Yc4nyvQvP4JMzg0Agig==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "bn.js": "^4.4.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + } } }, "@ethersproject/bytes": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.1.0.tgz", - "integrity": "sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "requires": { - "@ethersproject/logger": "^5.1.0" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/constants": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.1.0.tgz", - "integrity": "sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "requires": { - "@ethersproject/bignumber": "^5.1.0" + "@ethersproject/bignumber": "^5.7.0" } }, "@ethersproject/contracts": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.1.1.tgz", - "integrity": "sha512-6WwktLJ0DFWU8pDkgH4IGttQHhQN4SnwKFu9h+QYVe48VGWtbDu4W8/q/7QA1u/HWlWMrKxqawPiZUJj0UMvOw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "requires": { - "@ethersproject/abi": "^5.1.0", - "@ethersproject/abstract-provider": "^5.1.0", - "@ethersproject/abstract-signer": "^5.1.0", - "@ethersproject/address": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/transactions": "^5.1.0" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" } }, "@ethersproject/hash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.1.0.tgz", - "integrity": "sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "requires": { - "@ethersproject/abstract-signer": "^5.1.0", - "@ethersproject/address": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/strings": "^5.1.0" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/hdnode": { @@ -3089,32 +3213,25 @@ } }, "@ethersproject/keccak256": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.1.0.tgz", - "integrity": "sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "js-sha3": "0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - } + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, "@ethersproject/logger": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.1.0.tgz", - "integrity": "sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw==" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" }, "@ethersproject/networks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.1.0.tgz", - "integrity": "sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "requires": { - "@ethersproject/logger": "^5.1.0" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/pbkdf2": { @@ -3152,88 +3269,93 @@ } }, "@ethersproject/properties": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.1.0.tgz", - "integrity": "sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "requires": { - "@ethersproject/logger": "^5.1.0" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/providers": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.1.2.tgz", - "integrity": "sha512-GqsS8rd+eyd4eNkcNgzZ4l9IRULBPUZa7JPnv22k4MHflMobUseyhfbVnmoN5bVNNkOxjV1IPTw9i0sV1hwdpg==", - "requires": { - "@ethersproject/abstract-provider": "^5.1.0", - "@ethersproject/abstract-signer": "^5.1.0", - "@ethersproject/address": "^5.1.0", - "@ethersproject/basex": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/hash": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/networks": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/random": "^5.1.0", - "@ethersproject/rlp": "^5.1.0", - "@ethersproject/sha2": "^5.1.0", - "@ethersproject/strings": "^5.1.0", - "@ethersproject/transactions": "^5.1.0", - "@ethersproject/web": "^5.1.0", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", - "ws": "7.2.3" + "ws": "7.4.6" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + } } }, "@ethersproject/random": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.1.0.tgz", - "integrity": "sha512-+uuczLQZ4+no9cP6TCoCktXx0u2YbNaRT7lRkSt12d8263e702f0u+4JnnRO8Qmv5nylWJebnqCHzyxP+6mLqw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/rlp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.1.0.tgz", - "integrity": "sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/sha2": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.1.0.tgz", - "integrity": "sha512-+fNSeZRstOpdRJpdGUkRONFCaiAqWkc91zXgg76Nlp5ndBQE25Kk5yK8gCPG1aGnCrbariiPr5j9DmrYH78JCA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "hash.js": "1.1.3" - }, - "dependencies": { - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - } + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, "@ethersproject/signing-key": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.1.0.tgz", - "integrity": "sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.4" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + } } }, "@ethersproject/solidity": { @@ -3317,32 +3439,32 @@ } }, "@ethersproject/strings": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.1.0.tgz", - "integrity": "sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/logger": "^5.1.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/transactions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.1.1.tgz", - "integrity": "sha512-Nwgbp09ttIVN0OoUBatCXaHxR7grWPHbozJN8v7AXDLrl6nnOIBEMDh+yJTnosSQlFhcyjfTGGN+Mx6R8HdvMw==", - "requires": { - "@ethersproject/address": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/rlp": "^5.1.0", - "@ethersproject/signing-key": "^5.1.0" - } - }, - "@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "@ethersproject/units": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", @@ -3607,15 +3729,15 @@ } }, "@ethersproject/web": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.1.0.tgz", - "integrity": "sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "requires": { - "@ethersproject/base64": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/strings": "^5.1.0" + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/wordlists": { @@ -3815,6 +3937,11 @@ } } }, + "@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" + }, "@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -3857,61 +3984,66 @@ } }, "@govtechsg/decentralized-renderer-react-components": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@govtechsg/decentralized-renderer-react-components/-/decentralized-renderer-react-components-3.8.0.tgz", - "integrity": "sha512-TAfetKvPU8PCIDwvcael9ht7h6OvCNXei0EjeeOi/7zwCn2abCuiOKR9JVAuqEvEEesgZdcFpPhO1kul/7lFUw==", + "version": "3.17.0-beta.1", + "resolved": "https://registry.npmjs.org/@govtechsg/decentralized-renderer-react-components/-/decentralized-renderer-react-components-3.17.0-beta.1.tgz", + "integrity": "sha512-rwTYUT3/9g+LqS80GBCY4Yl4E4P4DDwsyewsZZN9sIG68jMT7Br2d7bDE/WdIa4CInvMDdGhuq86MQ8dgJgG4g==", "requires": { + "@aws-crypto/sha256-browser": "^5.2.0", "@babel/runtime-corejs3": "^7.15.4", - "@emotion/react": "^11.8.1", - "@emotion/styled": "^11.8.1", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@fortawesome/fontawesome-svg-core": "^1.2.35", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.14", - "@govtechsg/open-attestation": "^6.2.0", + "@govtechsg/open-attestation": "^6.10.0-beta.1", + "bs58": "^5.0.0", "crypto-browserify": "^3.12.0", "debug": "^4.3.1", + "handlebars": "^4.7.8", "penpal": "^5.3.0", "penpal-v4": "npm:penpal@^4.1.1", - "react-pdf": "^5.2.0", + "react-pdf": "^7.7.3", "stream-browserify": "^3.0.0", "typesafe-actions": "^5.1.0" }, "dependencies": { "@babel/runtime-corejs3": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", - "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.6.tgz", + "integrity": "sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==", "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.4" + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" } }, "core-js-pure": { - "version": "3.25.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz", - "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==" - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", + "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==" } } }, "@govtechsg/dnsprove": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@govtechsg/dnsprove/-/dnsprove-2.5.0.tgz", - "integrity": "sha512-aUrLPF1DeydxKRJsLW++vQoTGXkUoP8zbHwaUU63vFar7pBZ/1UIWr/QJlYGmyVgZ++eQlHeKaiC+Zp3ix2Qag==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@govtechsg/dnsprove/-/dnsprove-2.7.1.tgz", + "integrity": "sha512-OtDPQWfWzoLN09B8NM0Noya82AJ1M+kValqbKbMABN0GeRHgoNoGaeMvsh7oVT7pfGFMe7mwAskEQ4o1QF7H6w==", "requires": { - "axios": "^0.21.1", + "axios": "^1.6.3", "debug": "^4.3.1", - "runtypes": "^6.3.0" + "runtypes": "^6.7.0" + }, + "dependencies": { + "runtypes": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/runtypes/-/runtypes-6.7.0.tgz", + "integrity": "sha512-3TLdfFX8YHNFOhwHrSJza6uxVBmBrEjnNQlNXvXCdItS0Pdskfg5vVXUTWIN+Y23QR09jWpSl99UHkA83m4uWA==" + } } }, "@govtechsg/document-store": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@govtechsg/document-store/-/document-store-2.3.1.tgz", - "integrity": "sha512-sm0WtzIPl/JJ9xW3Bh6DhQ5hYg17smelGsQ6H19ctiUnP4ZzhIhwlgmuoQIz9iMIyarJxVim4un3f34mTijPlA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@govtechsg/document-store/-/document-store-2.6.1.tgz", + "integrity": "sha512-Jr8dGyr8wBXMOSbUURoYfmz9jKiK2ntbjEYyI06pze6jzyiYLZXcepKVyjNk9PC/mLIlDCZgQWmre7ixBZWWjQ==" }, "@govtechsg/jsonld": { "version": "0.1.1", @@ -3934,915 +4066,292 @@ } }, "@govtechsg/oa-verify": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-7.11.0.tgz", - "integrity": "sha512-Yv2xzzseQGp63cHVe7fDpGqoayHm33CMS47rzc6hXQcn0F6uT0n+hQKl6o5I3EQAnIvRxLRNzC2aydvlAAYriQ==", - "requires": { - "@govtechsg/dnsprove": "^2.5.0", - "@govtechsg/document-store": "^2.2.3", - "@govtechsg/open-attestation": "^6.2.0", - "@govtechsg/token-registry": "^2.5.3", - "axios": "^0.21.4", + "version": "9.3.0-beta.1", + "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-9.3.0-beta.1.tgz", + "integrity": "sha512-rl6k0CdzSObkMfXxCQeILnYAk3rJm3ffMLFSMv6QWvy/o3k0qvF7YDb2azLn1GvhVdC/6/t3Q80g1yND6qDINg==", + "requires": { + "@govtechsg/dnsprove": "^2.6.2", + "@govtechsg/open-attestation": "^6.10.0-beta.3", + "axios": "^1.6.2", "debug": "^4.3.1", - "did-resolver": "^3.1.0", - "ethers": "^5.1.4", - "ethr-did-resolver": "^4.3.3", + "did-resolver": "^4.1.0", + "ethers": "^5.7.2", + "ethr-did-resolver": "^8.1.2", "node-cache": "^5.1.2", "runtypes": "^6.3.0", - "web-did-resolver": "^2.0.4" + "web-did-resolver": "^2.0.27" + } + }, + "@govtechsg/open-attestation": { + "version": "6.10.0-beta.4", + "resolved": "https://registry.npmjs.org/@govtechsg/open-attestation/-/open-attestation-6.10.0-beta.4.tgz", + "integrity": "sha512-G6fKRbACS94i+HmRF9kYF791eEqg+Vj1nXaEtAb1IyusK+UmJ1dGFeNuNfmIE7w6ANrHaXSn+sdyvF7KX5drRA==", + "requires": { + "@aws-crypto/sha256-universal": "^5.2.0", + "@govtechsg/jsonld": "^0.1.0", + "ajv-formats": "^2.1.1", + "buffer": "^6.0.3", + "cross-fetch": "^3.1.5", + "debug": "^4.3.2", + "ethers": "^5.7.2", + "flatley": "^5.2.0", + "js-base64": "^3.6.1", + "js-sha3": "^0.8.0", + "jsonld": "^8.3.2", + "lodash": "^4.17.21", + "randombytes": "^2.1.0", + "runtypes": "^6.3.2", + "uuid": "^8.3.2", + "validator": "^13.7.0", + "zod": "^3.22.4" }, "dependencies": { - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "ms": "2.1.2" } }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@govtechsg/opencerts-verify": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@govtechsg/opencerts-verify/-/opencerts-verify-3.1.2.tgz", + "integrity": "sha512-KXi7ahm1JHjFYgVvUIhwRmt+EmZO3fr5eT/kqSyJvfYQhDnhMJmcRYg0UUKlgKGEWQd6MqHFCZIODy0VyG8aPw==", + "requires": { + "@govtechsg/oa-verify": "^7.11.0", + "@govtechsg/open-attestation": "^6.5.1", + "debug": "^4.3.1", + "node-fetch": "^2.6.1", + "runtypes": "^6.3.0" + }, + "dependencies": { + "@govtechsg/oa-verify": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-7.12.0.tgz", + "integrity": "sha512-kYepojF8xJjxCpy+tSpdwaRR3vz1+C+5rQZljzaaFLsFdzgNyVnD5DcYLy+GiEfq44HxrwckJWHO8ZtTBaYdPg==", + "requires": { + "@govtechsg/dnsprove": "^2.5.0", + "@govtechsg/document-store": "^2.2.3", + "@govtechsg/open-attestation": "^6.2.0", + "@govtechsg/token-registry": "^2.5.3", + "axios": "^0.21.4", + "debug": "^4.3.1", + "did-resolver": "^3.1.0", + "ethers": "^5.1.4", + "ethr-did-resolver": "^4.3.3", + "node-cache": "^5.1.2", + "runtypes": "^6.3.0", + "web-did-resolver": "^2.0.4" + } + }, + "@govtechsg/open-attestation": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/@govtechsg/open-attestation/-/open-attestation-6.9.3.tgz", + "integrity": "sha512-tBF1RCehXsINoIyBScXQ9YZYg18pQuSyqXkTv1vtjyjbXse9eebuJ7xahE88D4KFPfuFub1GBtXknOonFD+nQg==", + "requires": { + "@govtechsg/jsonld": "^0.1.0", + "ajv-formats": "^2.1.1", + "cross-fetch": "^3.1.5", + "debug": "^4.3.2", + "ethers": "^5.7.2", + "flatley": "^5.2.0", + "js-base64": "^3.6.1", + "js-sha3": "^0.8.0", + "lodash": "^4.17.21", + "runtypes": "^6.3.2", + "uuid": "^8.3.2", + "validator": "^13.7.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + } } }, - "@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "follow-redirects": "^1.14.0" } }, - "@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0" + "did-resolver": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-3.2.2.tgz", + "integrity": "sha512-Eeo2F524VM5N3W4GwglZrnul2y6TLTwMQP3In62JdG34NZoqihYyOZLk+5wUW8sSgvIYIcJM8Dlt3xsdKZZ3tg==" + }, + "ethr-did-resolver": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-4.3.5.tgz", + "integrity": "sha512-BQO7PQwuqqczK+4AWQhys/sgegDVIFr6+lSoSYXlIbG0oRH0l7PkSuf7VEFKclEJ3JlJ1t9kjDIdj7Ba7euTJg==", + "requires": { + "@ethersproject/abi": "^5.1.0", + "@ethersproject/abstract-signer": "^5.1.0", + "@ethersproject/address": "^5.1.0", + "@ethersproject/basex": "^5.1.0", + "@ethersproject/bignumber": "^5.1.0", + "@ethersproject/contracts": "^5.1.0", + "@ethersproject/providers": "^5.1.0", + "@ethersproject/transactions": "^5.1.0", + "did-resolver": "^3.1.0", + "ethr-did-registry": "^0.0.3", + "querystring": "^0.2.1" } }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@govtechsg/token-registry": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@govtechsg/token-registry/-/token-registry-2.6.1.tgz", + "integrity": "sha512-QnAIlYeGD4zHtYPiZ46SIe6hFc3HyMKvyBJIdlsFxHscMR4f8AENIyUS2AKhqJibCcN2beNJy/bPWlCAtHoT7w==" + }, + "@hapi/accept": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", + "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==", + "requires": { + "@hapi/boom": "9.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "requires": { - "@ethersproject/bignumber": "^5.7.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" } }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - } - } - }, - "@govtechsg/open-attestation": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@govtechsg/open-attestation/-/open-attestation-6.5.1.tgz", - "integrity": "sha512-rId128iZSh9sUGhBfp6sPFNxGkP7BIKlu4gIXcnGTQ6NDsPipvfuoog2Y6y4ny3Q+XFtXQJUkWxHYT0YctCd0w==", - "requires": { - "@govtechsg/jsonld": "^0.1.0", - "ajv": "^8.6.2", - "ajv-formats": "^2.1.0", - "cross-fetch": "^3.1.5", - "debug": "^4.3.2", - "ethers": "^5.4.3", - "flatley": "^5.2.0", - "js-base64": "^3.6.1", - "js-sha3": "^0.8.0", - "lodash": "^4.17.21", - "runtypes": "^6.3.2", - "uuid": "^8.3.2", - "validator": "^13.7.0" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.1.tgz", - "integrity": "sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ethers": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.1.tgz", - "integrity": "sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.1", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "runtypes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/runtypes/-/runtypes-6.6.0.tgz", - "integrity": "sha512-ddM7sgB3fyboDlBzEYFQ04L674sKjbs4GyW2W32N/5Ae47NRd/GyMASPC2PFw8drPHYGEcZ0mZ26r5RcB8msfQ==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - } - } - }, - "@govtechsg/opencerts-verify": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@govtechsg/opencerts-verify/-/opencerts-verify-3.1.2.tgz", - "integrity": "sha512-KXi7ahm1JHjFYgVvUIhwRmt+EmZO3fr5eT/kqSyJvfYQhDnhMJmcRYg0UUKlgKGEWQd6MqHFCZIODy0VyG8aPw==", - "requires": { - "@govtechsg/oa-verify": "^7.11.0", - "@govtechsg/open-attestation": "^6.5.1", - "debug": "^4.3.1", - "node-fetch": "^2.6.1", - "runtypes": "^6.3.0" - } - }, - "@govtechsg/token-registry": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@govtechsg/token-registry/-/token-registry-2.6.1.tgz", - "integrity": "sha512-QnAIlYeGD4zHtYPiZ46SIe6hFc3HyMKvyBJIdlsFxHscMR4f8AENIyUS2AKhqJibCcN2beNJy/bPWlCAtHoT7w==" - }, - "@hapi/accept": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", - "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/boom": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", - "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", - "requires": { - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "strip-ansi": { @@ -4854,6 +4363,23 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, "wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -4864,6 +4390,60 @@ "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } } } }, @@ -5215,6 +4795,151 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "optional": true + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "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==", + "optional": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "optional": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, "@miherlosev/esm": { "version": "3.2.26", "resolved": "https://registry.npmjs.org/@miherlosev/esm/-/esm-3.2.26.tgz", @@ -5424,6 +5149,120 @@ "@sinonjs/commons": "^1.7.0" } }, + "@smithy/hash-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.1.0.tgz", + "integrity": "sha512-yiNKDGMzrQjnpnbLfkYKo+HwIxmBAsv0AI++QIJwvhfkLpUTBylelkv6oo78/YqZZS6h+bGfl0gILJsKE2wAKQ==", + "requires": { + "@smithy/types": "^1.2.0", + "@smithy/util-buffer-from": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "requires": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", + "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "requires": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "requires": { + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@smithy/types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.0.0.tgz", + "integrity": "sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==", + "requires": { + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, "@testing-library/dom": { "version": "7.30.4", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.30.4.tgz", @@ -5683,9 +5522,9 @@ "dev": true }, "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "@types/prettier": { "version": "2.2.3", @@ -6018,8 +5857,15 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } }, "accepts": { "version": "1.3.7", @@ -6087,6 +5933,15 @@ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "requires": { + "debug": "4" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -6101,6 +5956,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6109,29 +5965,24 @@ } }, "ajv-formats": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", - "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "requires": { "ajv": "^8.0.0" }, "dependencies": { "ajv": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.1.tgz", - "integrity": "sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz", + "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==", "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -6139,11 +5990,6 @@ } } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -6236,7 +6082,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, "optional": true }, "are-we-there-yet": { @@ -6666,8 +6511,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -6727,17 +6571,29 @@ "dev": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" }, "dependencies": { "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } } } }, @@ -6954,8 +6810,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -7018,6 +6873,11 @@ } } }, + "base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -7179,7 +7039,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7289,6 +7148,14 @@ "node-releases": "^1.1.65" } }, + "bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "requires": { + "base-x": "^4.0.0" + } + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -7406,9 +7273,28 @@ "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==" }, "canonicalize": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.5.tgz", - "integrity": "sha512-mAjKJPIyP0xqqv6IAkvso07StOmz6cmGtNDg3pXCSzXVZOqka7StIkAhJl/zHOi4M2CgpYfD6aeRWbnrmtvBEA==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==" + }, + "canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "optional": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "dependencies": { + "nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "optional": true + } + } }, "capture-exit": { "version": "2.0.0", @@ -7518,6 +7404,12 @@ "readdirp": "~3.5.0" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true + }, "chrome-remote-interface": { "version": "0.32.2", "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.32.2.tgz", @@ -7655,6 +7547,11 @@ "mimic-response": "^1.0.0" } }, + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7703,6 +7600,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true + }, "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", @@ -7718,7 +7621,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -7742,8 +7644,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configstore": { "version": "5.0.1", @@ -7768,7 +7669,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, "optional": true }, "constants-browserify": { @@ -7882,9 +7782,9 @@ "dev": true }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -8237,6 +8137,23 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "requires": { + "mimic-response": "^2.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true + } + } + }, "dedent": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.4.0.tgz", @@ -8374,14 +8291,12 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, "optional": true }, "depd": { @@ -8389,6 +8304,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -8423,9 +8343,9 @@ "dev": true }, "did-resolver": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-3.2.2.tgz", - "integrity": "sha512-Eeo2F524VM5N3W4GwglZrnul2y6TLTwMQP3In62JdG34NZoqihYyOZLk+5wUW8sSgvIYIcJM8Dlt3xsdKZZ3tg==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", + "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" }, "didyoumean": { "version": "1.2.2", @@ -8615,13 +8535,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -9950,22 +9864,28 @@ "integrity": "sha512-4BPvMGkxAK9vTduCq6D5b8ZqjteD2cvDIPPriXP6nnmPhWKFSxypo+AFvyQ0omJGa0cGTR+dkdI/8jiF7U/qaw==" }, "ethr-did-resolver": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-4.3.5.tgz", - "integrity": "sha512-BQO7PQwuqqczK+4AWQhys/sgegDVIFr6+lSoSYXlIbG0oRH0l7PkSuf7VEFKclEJ3JlJ1t9kjDIdj7Ba7euTJg==", - "requires": { - "@ethersproject/abi": "^5.1.0", - "@ethersproject/abstract-signer": "^5.1.0", - "@ethersproject/address": "^5.1.0", - "@ethersproject/basex": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/contracts": "^5.1.0", - "@ethersproject/providers": "^5.1.0", - "@ethersproject/transactions": "^5.1.0", - "did-resolver": "^3.1.0", - "ethr-did-registry": "^0.0.3", - "querystring": "^0.2.1" - } + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-8.1.2.tgz", + "integrity": "sha512-dnbE3GItE1YHp/eavR11KbGDi8Il01H9GeH+wKgoSgE95pKBZufHyHYce/EK2k8VOmj6MJf8u/TIpPvxjCbK+A==", + "requires": { + "@ethersproject/abi": "^5.6.3", + "@ethersproject/abstract-signer": "^5.6.2", + "@ethersproject/address": "^5.6.1", + "@ethersproject/basex": "^5.6.1", + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/contracts": "^5.6.2", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/providers": "^5.6.8", + "@ethersproject/signing-key": "^5.6.2", + "@ethersproject/transactions": "^5.6.2", + "did-resolver": "^4.0.1" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, "eventemitter3": { "version": "4.0.7", @@ -10273,7 +10193,8 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -10299,6 +10220,15 @@ "bser": "2.1.1" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -10308,15 +10238,6 @@ "flat-cache": "^3.0.4" } }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, "file-selector": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", @@ -10544,6 +10465,14 @@ "mime-types": "^2.1.12" } }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -10576,11 +10505,30 @@ "dev": true, "optional": true }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.3", @@ -10974,7 +10922,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11056,6 +11003,18 @@ "pify": "^3.0.0" } }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -11136,7 +11095,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, "optional": true }, "has-value": { @@ -11392,6 +11350,16 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -11485,7 +11453,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -11676,8 +11643,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -12909,9 +12875,9 @@ "dev": true }, "js-base64": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.6.1.tgz", - "integrity": "sha512-Frdq2+tRRGLQUIQOgsIGSCd1VePCS2fsddTG5dTCqR0JHgltXWfsxnY0gIXPoMeRmdom6Oyq+UMOFg5suduOjQ==" + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" }, "js-md4": { "version": "0.3.2", @@ -13050,7 +13016,8 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -13072,6 +13039,17 @@ "minimist": "^1.2.0" } }, + "jsonld": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.2.tgz", + "integrity": "sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==", + "requires": { + "@digitalbazaar/http-client": "^3.4.1", + "canonicalize": "^1.0.1", + "lru-cache": "^6.0.0", + "rdf-canonize": "^3.4.0" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -13280,6 +13258,37 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "ky": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==" + }, + "ky-universal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", + "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", + "requires": { + "abort-controller": "^3.0.0", + "node-fetch": "^3.2.10" + }, + "dependencies": { + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + }, + "node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + } + } + }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -13345,23 +13354,6 @@ } } }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "dependencies": { - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - } - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -13456,9 +13448,9 @@ "dev": true }, "make-cancellable-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.1.0.tgz", - "integrity": "sha512-X5Opjm2xcZsOLuJ+Bnhb4t5yfu4ehlA3OKEYLtqUchgVzL/QaqW373ZUVxVHKwvJ38cmYuR4rAHD2yUvAIkTPA==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", + "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==" }, "make-dir": { "version": "3.1.0", @@ -13469,9 +13461,9 @@ } }, "make-event-props": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.3.0.tgz", - "integrity": "sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", + "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==" }, "makeerror": { "version": "1.0.11", @@ -13521,20 +13513,15 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "merge-class-names": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/merge-class-names/-/merge-class-names-1.4.2.tgz", - "integrity": "sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw==" - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.0.0.tgz", - "integrity": "sha512-WZ4S5wqD9FCR9hxkLgvcHJCBxzXzy3VVE6p8W2OzxRzB+hLRlcadGE2bW9xp2KSzk10rvp4y+pwwKO6JQVguMg==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", + "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==" }, "merge-stream": { "version": "2.0.0", @@ -13621,7 +13608,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -13637,6 +13623,27 @@ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -13773,6 +13780,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, "next": { "version": "11.1.4", "resolved": "https://registry.npmjs.org/next/-/next-11.1.4.tgz", @@ -14011,6 +14023,11 @@ "clone": "2.x" } }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -15117,7 +15134,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -15396,8 +15412,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -15444,6 +15459,12 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, + "path2d-polyfill": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", + "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", + "optional": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -15463,9 +15484,13 @@ } }, "pdfjs-dist": { - "version": "2.12.313", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz", - "integrity": "sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA==" + "version": "3.11.174", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz", + "integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==", + "requires": { + "canvas": "^2.11.2", + "path2d-polyfill": "^2.0.1" + } }, "penpal": { "version": "5.3.0", @@ -15882,6 +15907,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -16018,9 +16048,9 @@ } }, "rdf-canonize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.0.0.tgz", - "integrity": "sha512-LXRkhab1QaPJnhUIt1gtXXKswQCZ9zpflsSZFczG7mCLAkMvVjdqCGk9VXCUss0aOUeEyV2jtFxGcdX8DSkj9w==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", "requires": { "setimmediate": "^1.0.5" } @@ -16091,20 +16121,19 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-pdf": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-5.7.2.tgz", - "integrity": "sha512-hdDwvf007V0i2rPCqQVS1fa70CXut17SN3laJYlRHzuqcu8sLLjEoeXihty6c0Ev5g1mw31b8OT8EwRw1s8C4g==", - "requires": { - "@babel/runtime": "^7.0.0", - "file-loader": "^6.0.0", - "make-cancellable-promise": "^1.0.0", - "make-event-props": "^1.1.0", - "merge-class-names": "^1.1.1", - "merge-refs": "^1.0.0", - "pdfjs-dist": "2.12.313", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.7.3.tgz", + "integrity": "sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==", + "requires": { + "clsx": "^2.0.0", + "dequal": "^2.0.3", + "make-cancellable-promise": "^1.3.1", + "make-event-props": "^1.6.0", + "merge-refs": "^1.2.1", + "pdfjs-dist": "3.11.174", "prop-types": "^15.6.2", "tiny-invariant": "^1.0.0", - "tiny-warning": "^1.0.0" + "warning": "^4.0.0" } }, "react-qr-svg": { @@ -16313,6 +16342,11 @@ "regenerate": "^1.4.0" } }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", @@ -16844,23 +16878,6 @@ "object-assign": "^4.1.1" } }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - } - } - }, "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -16942,8 +16959,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-cookie-parser": { "version": "2.6.0", @@ -17033,16 +17049,25 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, "optional": true }, + "simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -17459,34 +17484,6 @@ } } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string.prototype.matchall": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", @@ -17733,23 +17730,6 @@ } } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - } - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -18176,6 +18156,34 @@ } } }, + "tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "optional": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true + } + } + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -19277,14 +19285,9 @@ } }, "tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "tmp": { "version": "0.0.28", @@ -19538,6 +19541,12 @@ "typescript-compare": "^0.0.2" } }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -19581,6 +19590,14 @@ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", "dev": true }, + "undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "requires": { + "@fastify/busboy": "^2.0.0" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -19886,9 +19903,9 @@ } }, "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==" }, "vary": { "version": "1.1.2", @@ -19938,6 +19955,14 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", @@ -19948,21 +19973,56 @@ } }, "web-did-resolver": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.21.tgz", - "integrity": "sha512-vKYz0s9spYfYrKhrF88F44lkofS1yj6TCF40+i077a7boru2BNROl5VZEIVL9jJRUDsNzvmVSKkq3kS8kZnB2Q==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.27.tgz", + "integrity": "sha512-YxQlNdeYBXLhVpMW62+TPlc6sSOiWyBYq7DNvY6FXmXOD9g0zLeShpq2uCKFFQV/WlSrBi/yebK/W5lMTDxMUQ==", "requires": { - "cross-fetch": "^3.1.5", + "cross-fetch": "^4.0.0", "did-resolver": "^4.0.0" }, "dependencies": { - "did-resolver": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.0.1.tgz", - "integrity": "sha512-eHs2VLKhcANmh08S87PKvOauIAmSOd7nb7AlhNxcvOyDAIGQY1UfbiqI1VOW5IDKvOO6aEWY+5edOt1qrCp1Eg==" + "cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "requires": { + "node-fetch": "^2.6.12" + } + }, + "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==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } } } }, + "web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -20182,7 +20242,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "optional": true, "requires": { "string-width": "^1.0.2 || 2" @@ -20192,21 +20251,18 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, "optional": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "optional": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -20217,7 +20273,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "optional": true, "requires": { "ansi-regex": "^3.0.0" @@ -20336,6 +20391,11 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -20364,39 +20424,10 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", @@ -20413,7 +20444,8 @@ "ws": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true }, "xdg-basedir": { "version": "4.0.0", @@ -20493,6 +20525,11 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" } } } diff --git a/package.json b/package.json index 6a8f74393..a3b30743f 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,10 @@ "type-check": "npx tsc --noEmit" }, "dependencies": { - "@govtechsg/decentralized-renderer-react-components": "^3.8.0", + "@govtechsg/decentralized-renderer-react-components": "^3.17.0-beta.1", "@govtechsg/oa-encryption": "^1.3.3", - "@govtechsg/open-attestation": "^6.5.1", + "@govtechsg/oa-verify": "^9.3.0-beta.1", + "@govtechsg/open-attestation": "^6.10.0-beta.4", "@govtechsg/opencerts-verify": "^3.1.2", "@types/google.analytics": "0.0.41", "@types/react-google-recaptcha": "^2.1.0", From 5427b463a9ad171be8b35d5086f84c950186fbf8 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 4 Jun 2024 02:45:15 +0800 Subject: [PATCH 02/27] fix: import errors after bundler --- .../CertificateVerifyBlock/CertificateVerifyBlock.tsx | 8 ++------ src/sagas/certificate.ts | 4 +++- src/services/fragment.ts | 8 ++++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx index 006fe8f52..6548ea890 100644 --- a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx +++ b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx @@ -1,9 +1,3 @@ -import { - utils, - ValidDnsDidVerificationStatus, - ValidDnsTxtVerificationStatus, - VerificationFragment, -} from "@govtechsg/oa-verify"; import { getData, v2, WrappedDocument, utils as oaUtils, v3 } from "@govtechsg/open-attestation"; import { getOpencertsRegistryVerifierFragment, @@ -13,6 +7,8 @@ import React, { useState } from "react"; import { WrappedOrSignedOpenCertsDocument } from "../../shared"; import { icons } from "../ViewerPageImages"; import { DetailedCertificateVerifyBlock } from "./DetailedCertificateVerifyBlock"; +import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; +const { utils, ValidDnsTxtVerificationStatus, ValidDnsDidVerificationStatus } = require("@govtechsg/oa-verify"); export const getV2IdentityVerificationText = ( verificationStatus: VerificationFragment[], diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index 9e64ab735..722e45638 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import { decryptString } from "@govtechsg/oa-encryption"; -import { VerificationFragment, utils as oaVerifyUtils, ErrorVerificationFragment } from "@govtechsg/oa-verify"; import { utils } from "@govtechsg/open-attestation"; import { isValid, verify } from "@govtechsg/opencerts-verify"; import { ethers } from "ethers"; @@ -41,6 +40,9 @@ import { generateLink } from "../services/link"; import { WrappedOrSignedOpenCertsDocument } from "../shared"; import { getLogger } from "../utils/logger"; import { opencertsGetData } from "../utils/utils"; +import type { ErrorVerificationFragment, VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; + +const { utils: oaVerifyUtils } = require("@govtechsg/oa-verify"); const { trace } = getLogger("saga:certificate"); const getProvider = (networkName: string, providerName: "infura" | "alchemy") => { diff --git a/src/services/fragment.ts b/src/services/fragment.ts index 76448187c..a9e1272aa 100644 --- a/src/services/fragment.ts +++ b/src/services/fragment.ts @@ -1,9 +1,9 @@ -import { +import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types"; +const { + utils, OpenAttestationEthereumDocumentStoreStatusCode, OpenAttestationEthereumTokenRegistryStatusCode, - VerificationFragment, - utils, -} from "@govtechsg/oa-verify"; +} = require("@govtechsg/oa-verify"); // this function check if the reason of the error is that the document store or token registry is invalid export const addressInvalid = (fragments: VerificationFragment[]): boolean => { From 04f2f7658e67a3d2dbe03eb2f2368caf11a52ec4 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 6 Jun 2024 17:30:43 +0800 Subject: [PATCH 03/27] feat: add v4 verification --- .../CertificateVerifyBlock.tsx | 17 ++++++++++++++--- .../DecentralisedRenderer.tsx | 13 ++++++++++++- src/sagas/certificate.ts | 15 +++++++++++---- src/services/fragment.ts | 2 ++ src/shared.ts | 4 ++-- src/utils/utils.ts | 15 ++++++++++++--- 6 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx index 6548ea890..cb25d5422 100644 --- a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx +++ b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx @@ -1,4 +1,5 @@ -import { getData, v2, WrappedDocument, utils as oaUtils, v3 } from "@govtechsg/open-attestation"; +import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; +import { getData, v2, WrappedDocument, utils as oaUtils, v3, v4 } from "@govtechsg/open-attestation"; import { getOpencertsRegistryVerifierFragment, OpencertsRegistryVerificationValidData, @@ -7,7 +8,7 @@ import React, { useState } from "react"; import { WrappedOrSignedOpenCertsDocument } from "../../shared"; import { icons } from "../ViewerPageImages"; import { DetailedCertificateVerifyBlock } from "./DetailedCertificateVerifyBlock"; -import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; +// eslint-disable-next-line @typescript-eslint/no-var-requires const { utils, ValidDnsTxtVerificationStatus, ValidDnsDidVerificationStatus } = require("@govtechsg/oa-verify"); export const getV2IdentityVerificationText = ( @@ -92,6 +93,14 @@ export const getV3IdentityVerificationText = (document: WrappedDocument { + // TODO: Update to return jsx? + return document.issuer.identityProof.identifier.toUpperCase(); +}; + interface SimpleVerifyBlockProps { detailedViewVisible: boolean; verificationStatus: VerificationFragment[]; @@ -114,7 +123,9 @@ const SimpleVerifyBlock: React.FunctionComponent = (prop
{oaUtils.isWrappedV2Document(props.document) ? getV2IdentityVerificationText(props.verificationStatus, props.document) - : getV3IdentityVerificationText(props.document)} + : oaUtils.isWrappedV3Document(props.document) + ? getV3IdentityVerificationText(props.document) + : getV4IdentityVerificationText(props.verificationStatus, props.document)}
diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index 6654f619b..8e52ef84f 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -121,6 +121,14 @@ const DecentralisedRenderer: React.FunctionComponent issuerId: `${certificateData.issuers.map((issuer) => issuer.id).join(",")}`, }, }); + } else if (utils.isSignedWrappedV4Document(rawDocument)) { + analyticsEvent({ + category: "CERTIFICATE_VIEWED", + options: { + documentId: (rawDocument?.credentialSubject.id as string) ?? undefined, + issuerId: rawDocument.issuer.id, + }, + }); } else { const certificateData = opencertsGetData(rawDocument); const storeAddresses = utils.getIssuerAddress(rawDocument); @@ -142,8 +150,11 @@ const DecentralisedRenderer: React.FunctionComponent certificateData, }); }); - } else { + } else if (utils.isWrappedV3Document(rawDocument)) { sendV3EventCertificateViewedDetailed({ certificateData: rawDocument }); + } else { + // TODO: Add V4 analytics events + // sendV4EventCertificateViewedDetailed(); } }, [rawDocument]); diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index 722e45638..f6c950740 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -1,7 +1,13 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ + import { decryptString } from "@govtechsg/oa-encryption"; +import type { + ErrorVerificationFragment, + VerificationBuilderOptions, + VerificationFragment, +} from "@govtechsg/oa-verify/dist/types/types/core"; import { utils } from "@govtechsg/open-attestation"; -import { isValid, verify } from "@govtechsg/opencerts-verify"; +import { isValid, registryVerifier } from "@govtechsg/opencerts-verify"; import { ethers } from "ethers"; import Router from "next/router"; import { call, put, select, takeEvery } from "redux-saga/effects"; @@ -40,9 +46,8 @@ import { generateLink } from "../services/link"; import { WrappedOrSignedOpenCertsDocument } from "../shared"; import { getLogger } from "../utils/logger"; import { opencertsGetData } from "../utils/utils"; -import type { ErrorVerificationFragment, VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; - -const { utils: oaVerifyUtils } = require("@govtechsg/oa-verify"); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { utils: oaVerifyUtils, verificationBuilder, openAttestationVerifiers } = require("@govtechsg/oa-verify"); const { trace } = getLogger("saga:certificate"); const getProvider = (networkName: string, providerName: "infura" | "alchemy") => { @@ -108,6 +113,8 @@ export function* verifyCertificate({ payload: certificate }: { payload: WrappedO yield put(verifyingCertificate()); const networkName = getNetworkName(certificate); const infuraProvider = getProvider(networkName, "infura"); + const verify = (builderOptions: VerificationBuilderOptions) => + verificationBuilder([...openAttestationVerifiers, registryVerifier], builderOptions); // https://github.com/redux-saga/redux-saga/issues/884 let fragments: VerificationFragment[] = yield call(verify({ provider: infuraProvider }), certificate); // manually call alchemy provider as backup if infura provider returns error fragment diff --git a/src/services/fragment.ts b/src/services/fragment.ts index a9e1272aa..d2fd00de8 100644 --- a/src/services/fragment.ts +++ b/src/services/fragment.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ + import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types"; const { utils, diff --git a/src/shared.ts b/src/shared.ts index 6453029dc..677bf54d9 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -1,4 +1,4 @@ -import { v2, v3 } from "@govtechsg/open-attestation"; +import { v2, v3, v4 } from "@govtechsg/open-attestation"; // for the moment we don't need to use specifically signer types and it raises an error in some methods that don't really expect signed document, so keeping it like this -export type WrappedOrSignedOpenCertsDocument = v2.WrappedDocument | v3.WrappedDocument; +export type WrappedOrSignedOpenCertsDocument = v2.WrappedDocument | v3.WrappedDocument | v4.WrappedDocument; diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 303579721..3ca4387fe 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -2,14 +2,23 @@ import { getData, utils } from "@govtechsg/open-attestation"; import { LEGACY_OPENCERTS_RENDERER } from "../config"; import { WrappedOrSignedOpenCertsDocument } from "../shared"; -export const opencertsGetData = (rawDocument: WrappedOrSignedOpenCertsDocument) => - utils.isWrappedV2Document(rawDocument) ? getData(rawDocument) : rawDocument; +export const opencertsGetData = (rawDocument: WrappedOrSignedOpenCertsDocument) => { + if (utils.isWrappedV2Document(rawDocument)) { + return getData(rawDocument); + } else if (utils.isWrappedV4Document(rawDocument)) { + return rawDocument.credentialSubject; + } else { + return rawDocument; + } +}; export const getTemplate = (rawDocument: WrappedOrSignedOpenCertsDocument) => { if (utils.isWrappedV2Document(rawDocument)) { const documentData = getData(rawDocument); return typeof documentData.$template === "object" ? documentData.$template.url : LEGACY_OPENCERTS_RENDERER; - } else { + } else if (utils.isWrappedV3Document(rawDocument)) { return rawDocument.openAttestationMetadata.template?.url; + } else { + return rawDocument.renderMethod?.find((method) => method.type === "OpenAttestationEmbeddedRenderer")?.id; } }; From f0b83cd581197a7071ccb2a1264e1be4356c9c34 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 7 Jun 2024 12:27:13 +0800 Subject: [PATCH 04/27] chore: add analytics for v4 --- src/components/Analytics/index.ts | 63 ++++++++++++++++++- .../DecentralisedRenderer.tsx | 9 ++- src/sagas/certificate.ts | 6 +- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/components/Analytics/index.ts b/src/components/Analytics/index.ts index 3ff86ab43..e6a7e1317 100644 --- a/src/components/Analytics/index.ts +++ b/src/components/Analytics/index.ts @@ -1,4 +1,4 @@ -import { v2, WrappedDocument, getData, v3, utils } from "@govtechsg/open-attestation"; +import { v2, WrappedDocument, getData, v3, utils, v4 } from "@govtechsg/open-attestation"; import { RegistryEntry } from "@govtechsg/opencerts-verify"; import { isEmpty, omitBy } from "lodash"; import ReactGA from "react-ga4"; @@ -145,6 +145,29 @@ export const sendV3EventCertificateViewedDetailed = ({ }); }; +export const sendV4EventCertificateViewedDetailed = ({ + certificateData, +}: { + certificateData: v4.OpenAttestationDocument; +}): void => { + const renderMethod = certificateData.renderMethod?.[0]; // Take first render method + + analyticsEvent({ + category: "CERTIFICATE_DETAILS", + nonInteraction: true, + options: { + documentId: certificateData.id ?? "", + documentName: certificateData.name ?? "", + issuedOn: (certificateData.credentialSubject.issuedOn as string) ?? "", + issuerName: certificateData.issuer.identityProof.identifier, + issuerId: certificateData.issuer.id ?? "", + rendererUrl: renderMethod?.id ?? "", + templateName: + renderMethod?.type === "OpenAttestationEmbeddedRenderer" ? renderMethod.templateName : renderMethod?.name ?? "", + }, + }); +}; + export function triggerV2ErrorLogging( rawCertificate: WrappedDocument, errors: string[] @@ -223,6 +246,26 @@ export function triggerV3ErrorLogging( }); } +export function triggerV4ErrorLogging(rawCertificate: v4.OpenAttestationDocument, errors: string[]): void { + const renderMethod = rawCertificate.renderMethod?.[0]; // Take first render method + const errorsList = errors.join(","); + + analyticsEvent({ + category: "CERTIFICATE_ERROR", + nonInteraction: true, + options: { + documentId: rawCertificate.id ?? "", + documentName: rawCertificate.name ?? "", + issuedOn: (rawCertificate.credentialSubject.issuedOn as string) ?? "", + issuerName: rawCertificate.issuer.identityProof.identifier, + errors: errorsList, + rendererUrl: renderMethod?.id ?? "", + templateName: + renderMethod?.type === "OpenAttestationEmbeddedRenderer" ? renderMethod.templateName : renderMethod?.name ?? "", + }, + }); +} + export function triggerV2RendererTimeoutLogging(rawCertificate: WrappedDocument): void { const certificate: v2.OpenAttestationDocument & { name?: string; issuedOn?: string } = getData(rawCertificate); @@ -289,3 +332,21 @@ export function triggerV3RendererTimeoutLogging(rawCertificate: WrappedDocument< }, }); } + +export function triggerV4RendererTimeoutLogging(rawCertificate: v4.OpenAttestationDocument): void { + const renderMethod = rawCertificate.renderMethod?.[0]; // Take first render method + + analyticsEvent({ + category: "CERTIFICATE_RENDERER_TIMEOUT", + nonInteraction: true, + options: { + documentId: rawCertificate.id ?? "", + documentName: rawCertificate.name ?? "", + issuedOn: (rawCertificate.credentialSubject.issuedOn as string) ?? "", + issuerName: rawCertificate.issuer.identityProof.identifier, + rendererUrl: renderMethod?.id ?? "", + templateName: + renderMethod?.type === "OpenAttestationEmbeddedRenderer" ? renderMethod.templateName : renderMethod?.name ?? "", + }, + }); +} diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index 8e52ef84f..feb7bdacd 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -14,8 +14,10 @@ import { analyticsEvent, sendV2EventCertificateViewedDetailed, sendV3EventCertificateViewedDetailed, + sendV4EventCertificateViewedDetailed, triggerV2RendererTimeoutLogging, triggerV3RendererTimeoutLogging, + triggerV4RendererTimeoutLogging, } from "../Analytics"; import { MutiTabsContainer } from "../MultiTabs"; @@ -95,8 +97,10 @@ const DecentralisedRenderer: React.FunctionComponent // CERTIFICATE_RENDERER_TIMEOUT event if (utils.isWrappedV2Document(rawDocument)) { triggerV2RendererTimeoutLogging(rawDocument); - } else { + } else if (utils.isWrappedV3Document(rawDocument)) { triggerV3RendererTimeoutLogging(rawDocument); + } else { + triggerV4RendererTimeoutLogging(rawDocument); } } }, @@ -153,8 +157,7 @@ const DecentralisedRenderer: React.FunctionComponent } else if (utils.isWrappedV3Document(rawDocument)) { sendV3EventCertificateViewedDetailed({ certificateData: rawDocument }); } else { - // TODO: Add V4 analytics events - // sendV4EventCertificateViewedDetailed(); + sendV4EventCertificateViewedDetailed({ certificateData: rawDocument }); } }, [rawDocument]); diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index f6c950740..3349a415b 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -12,7 +12,7 @@ import { ethers } from "ethers"; import Router from "next/router"; import { call, put, select, takeEvery } from "redux-saga/effects"; import "isomorphic-fetch"; -import { triggerV2ErrorLogging, triggerV3ErrorLogging } from "../components/Analytics"; +import { triggerV2ErrorLogging, triggerV3ErrorLogging, triggerV4ErrorLogging } from "../components/Analytics"; import { NETWORK_NAME, IS_MAINNET } from "../config"; import { @@ -156,8 +156,10 @@ export function* verifyCertificate({ payload: certificate }: { payload: WrappedO if (errors.length > 0) { if (utils.isWrappedV2Document(certificate)) { triggerV2ErrorLogging(certificate, errors); - } else { + } else if (utils.isWrappedV3Document(certificate)) { triggerV3ErrorLogging(certificate, errors); + } else { + triggerV4ErrorLogging(certificate, errors); } } } From 38cc35162cdc4894bf63520f28dcdd07ba438edf Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 11 Jun 2024 11:29:17 +0800 Subject: [PATCH 05/27] feat: add svg renderer --- .../DecentralisedRenderer.tsx | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index feb7bdacd..158dc4295 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -2,11 +2,12 @@ import { FrameActions, FrameConnector, HostActions, + SvgRenderer, print, renderDocument, selectTemplate, } from "@govtechsg/decentralized-renderer-react-components"; -import { getData, obfuscateDocument, utils, v2 } from "@govtechsg/open-attestation"; +import { getData, obfuscateDocument, utils, v2, v4 } from "@govtechsg/open-attestation"; import React, { Ref, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"; import { WrappedOrSignedOpenCertsDocument } from "../../shared"; import { getTemplate, opencertsGetData } from "../../utils/utils"; @@ -31,6 +32,17 @@ type Dispatch = (action: HostActions) => void; // giving scrollbar a default width as there are no perfect ways to get it const SCROLLBAR_WIDTH = 20; +const isSvgRenderMethod = (document: WrappedOrSignedOpenCertsDocument) => { + if (!utils.isWrappedV4Document(document)) { + console.log("Not v4"); + return false; + } else { + const docAsV4 = document as v4.OpenAttestationDocument; + console.log(docAsV4.renderMethod); + return docAsV4.renderMethod?.find((method) => method.type === "SvgRenderingTemplate2023") !== undefined; + } +}; + const DecentralisedRenderer: React.FunctionComponent = ({ rawDocument, updateObfuscatedCertificate, @@ -44,6 +56,9 @@ const DecentralisedRenderer: React.FunctionComponent const [templates, setTemplates] = useState<{ id: string; label: string }[]>([]); const [lastSelected, setLastSelected] = useState(""); + const isSvg = isSvgRenderMethod(rawDocument); + const svgRef = useRef(null); + useImperativeHandle(forwardedRef, () => ({ print() { if (toFrame.current) { @@ -176,20 +191,28 @@ const DecentralisedRenderer: React.FunctionComponent

If you want to print the certificate, please click on the highlighted button above.

- {!toFrame.current && !rendererTimeout && ( + {!toFrame.current && !rendererTimeout && !isSvg && (
Loading Renderer...
)}
- + {isSvg ? ( + + ) : ( + + )}
); From 6e19f6c6831e62a4f963ce1cfbdbc7fe8a912ec1 Mon Sep 17 00:00:00 2001 From: Lucas Date: Wed, 12 Jun 2024 00:29:13 +0800 Subject: [PATCH 06/27] fix: v4 obfuscation --- .../DecentralisedRenderer.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index 158dc4295..60d545f64 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -31,14 +31,13 @@ interface DecentralisedRendererProps { type Dispatch = (action: HostActions) => void; // giving scrollbar a default width as there are no perfect ways to get it const SCROLLBAR_WIDTH = 20; +const CREDENTIAL_SUBJECT_PREFIX = "credentialSubject."; const isSvgRenderMethod = (document: WrappedOrSignedOpenCertsDocument) => { if (!utils.isWrappedV4Document(document)) { - console.log("Not v4"); return false; } else { const docAsV4 = document as v4.OpenAttestationDocument; - console.log(docAsV4.renderMethod); return docAsV4.renderMethod?.find((method) => method.type === "SvgRenderingTemplate2023") !== undefined; } }; @@ -93,7 +92,9 @@ const DecentralisedRenderer: React.FunctionComponent // adding SCROLLBAR_WIDTH in case the frame content overflow horizontally, which will cause scrollbars to appear setHeight(action.payload + SCROLLBAR_WIDTH); } else if (action.type === "OBFUSCATE") { - const field = action.payload; + const field = utils.isWrappedV4Document(documentRef.current) + ? CREDENTIAL_SUBJECT_PREFIX + action.payload + : action.payload; // https://github.com/microsoft/TypeScript/issues/14107 overload does not support union :/ const updatedDocument = utils.isWrappedV2Document(documentRef.current) ? obfuscateDocument(documentRef.current, field) From 38ddef5885a5bbafb6e4206bd339b809668b15f2 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 13 Jun 2024 13:08:07 +0800 Subject: [PATCH 07/27] fix: axios issue --- jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.config.js b/jest.config.js index 8230db32c..8fc04e7da 100644 --- a/jest.config.js +++ b/jest.config.js @@ -9,6 +9,7 @@ module.exports = { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/_mocks_/fileMock.js", "\\.(css|sass|scss)$": "/_mocks_/styleMock.js", + axios: "axios/dist/node/axios.cjs", }, testResultsProcessor: "jest-sonar-reporter", watchPlugins: ["jest-watch-typeahead/filename", "jest-watch-typeahead/testname"], From 79aa54eb50565e9916d8695e401821f6768aeed0 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 13 Jun 2024 14:17:21 +0800 Subject: [PATCH 08/27] fix: jest --- _mocks_/node-process-stub.js | 5 +++++ jest.config.js | 1 + .../CertificateVerifyBlock/CertificateVerifyBlock.tsx | 1 - .../DecentralisedTemplateRenderer/DecentralisedRenderer.tsx | 3 ++- 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 _mocks_/node-process-stub.js diff --git a/_mocks_/node-process-stub.js b/_mocks_/node-process-stub.js new file mode 100644 index 000000000..179efb6cd --- /dev/null +++ b/_mocks_/node-process-stub.js @@ -0,0 +1,5 @@ +module.exports = { + versions: { + node: "14.17.0", + }, +}; diff --git a/jest.config.js b/jest.config.js index 8fc04e7da..5b91aae8b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -10,6 +10,7 @@ module.exports = { "/_mocks_/fileMock.js", "\\.(css|sass|scss)$": "/_mocks_/styleMock.js", axios: "axios/dist/node/axios.cjs", + "node:process": "/_mocks_/node-process-stub", }, testResultsProcessor: "jest-sonar-reporter", watchPlugins: ["jest-watch-typeahead/filename", "jest-watch-typeahead/testname"], diff --git a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx index cb25d5422..953bfb0c1 100644 --- a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx +++ b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx @@ -97,7 +97,6 @@ export const getV4IdentityVerificationText = ( verificationStatus: VerificationFragment[], document: v4.WrappedDocument ): string => { - // TODO: Update to return jsx? return document.issuer.identityProof.identifier.toUpperCase(); }; diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index 60d545f64..e152b4ae6 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -32,13 +32,14 @@ type Dispatch = (action: HostActions) => void; // giving scrollbar a default width as there are no perfect ways to get it const SCROLLBAR_WIDTH = 20; const CREDENTIAL_SUBJECT_PREFIX = "credentialSubject."; +const SVG_RENDERER_TYPE = "SvgRenderingTemplate2023"; const isSvgRenderMethod = (document: WrappedOrSignedOpenCertsDocument) => { if (!utils.isWrappedV4Document(document)) { return false; } else { const docAsV4 = document as v4.OpenAttestationDocument; - return docAsV4.renderMethod?.find((method) => method.type === "SvgRenderingTemplate2023") !== undefined; + return docAsV4.renderMethod?.find((method) => method.type === SVG_RENDERER_TYPE) !== undefined; } }; From fea7839a82d84e5ce18c2491287c9b90d5172ab4 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 13 Jun 2024 23:53:41 +0800 Subject: [PATCH 09/27] fix: build --- .circleci/config.yml | 2 +- src/components/CertificateViewer.tsx | 4 ++-- .../DecentralisedRenderer.tsx | 17 +++++++++-------- src/sagas/certificate.ts | 11 ++++++++--- src/utils/utils.ts | 4 +++- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bfc7ff218..5df7e8725 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,7 +17,7 @@ workflows: jobs: build_registry: docker: - - image: "circleci/node:lts-browsers" + - image: "circleci/node:14.18.2-browsers" steps: - checkout - run: diff --git a/src/components/CertificateViewer.tsx b/src/components/CertificateViewer.tsx index 21d32d9e4..db8302150 100644 --- a/src/components/CertificateViewer.tsx +++ b/src/components/CertificateViewer.tsx @@ -1,5 +1,5 @@ import { VerificationFragment } from "@govtechsg/oa-verify"; -import { utils, v2, v3, OpenAttestationDocument } from "@govtechsg/open-attestation"; +import { utils, v2, v3, v4, OpenAttestationDocument } from "@govtechsg/open-attestation"; import dynamic from "next/dynamic"; import React from "react"; import { connect } from "react-redux"; @@ -26,7 +26,7 @@ const ForwardedRefDecentralisedRenderer = React.forwardRef< } >((props, ref) => ); -const isObfuscated = (document: v3.WrappedDocument | v2.WrappedDocument) => { +const isObfuscated = (document: v3.WrappedDocument | v2.WrappedDocument | v4.WrappedDocument) => { try { return utils.isObfuscated(document); } catch (e) { diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index e152b4ae6..22598012d 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -7,7 +7,7 @@ import { renderDocument, selectTemplate, } from "@govtechsg/decentralized-renderer-react-components"; -import { getData, obfuscateDocument, utils, v2, v4 } from "@govtechsg/open-attestation"; +import { getData, obfuscateDocument, utils, v2, v3, v4 } from "@govtechsg/open-attestation"; import React, { Ref, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"; import { WrappedOrSignedOpenCertsDocument } from "../../shared"; import { getTemplate, opencertsGetData } from "../../utils/utils"; @@ -142,22 +142,23 @@ const DecentralisedRenderer: React.FunctionComponent issuerId: `${certificateData.issuers.map((issuer) => issuer.id).join(",")}`, }, }); - } else if (utils.isSignedWrappedV4Document(rawDocument)) { + } else if (utils.isSignedWrappedV3Document(rawDocument)) { + const certificateData = opencertsGetData(rawDocument) as v3.OpenAttestationDocument; + const storeAddresses = utils.getIssuerAddress(rawDocument); analyticsEvent({ category: "CERTIFICATE_VIEWED", options: { - documentId: (rawDocument?.credentialSubject.id as string) ?? undefined, - issuerId: rawDocument.issuer.id, + documentId: certificateData?.id ?? undefined, + documentStore: `${Array.isArray(storeAddresses) ? storeAddresses.join(",") : storeAddresses}`, }, }); } else { - const certificateData = opencertsGetData(rawDocument); - const storeAddresses = utils.getIssuerAddress(rawDocument); + const rawDocumentAsv4 = rawDocument as v4.OpenAttestationDocument; analyticsEvent({ category: "CERTIFICATE_VIEWED", options: { - documentId: certificateData?.id ?? undefined, - documentStore: `${Array.isArray(storeAddresses) ? storeAddresses.join(",") : storeAddresses}`, + documentId: (rawDocumentAsv4?.credentialSubject.id as string) ?? undefined, + issuerId: rawDocumentAsv4.issuer.id, }, }); } diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index 3349a415b..f1a027174 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -6,7 +6,7 @@ import type { VerificationBuilderOptions, VerificationFragment, } from "@govtechsg/oa-verify/dist/types/types/core"; -import { utils } from "@govtechsg/open-attestation"; +import { utils, v2, v3 } from "@govtechsg/open-attestation"; import { isValid, registryVerifier } from "@govtechsg/opencerts-verify"; import { ethers } from "ethers"; import Router from "next/router"; @@ -78,8 +78,10 @@ const getProvider = (networkName: string, providerName: "infura" | "alchemy") => } }; +// TODO: Need to update if we ever want to support v4 document store issuance const getNetworkName = (certificate: WrappedOrSignedOpenCertsDocument) => { - const data = opencertsGetData(certificate); + if (utils.isWrappedV4Document(certificate)) return ""; + const data = opencertsGetData(certificate) as v2.OpenAttestationDocument | v3.WrappedDocument; if (IS_MAINNET) { switch (data.network?.chainId) { @@ -111,7 +113,10 @@ const fragmentsHaveCallException = (fragments: VerificationFragment[]) => { export function* verifyCertificate({ payload: certificate }: { payload: WrappedOrSignedOpenCertsDocument }) { try { yield put(verifyingCertificate()); - const networkName = getNetworkName(certificate); + let networkName = ""; + if (!utils.isWrappedV4Document(certificate)) { + networkName = getNetworkName(certificate); + } const infuraProvider = getProvider(networkName, "infura"); const verify = (builderOptions: VerificationBuilderOptions) => verificationBuilder([...openAttestationVerifiers, registryVerifier], builderOptions); diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 3ca4387fe..9a048a7ff 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -6,7 +6,9 @@ export const opencertsGetData = (rawDocument: WrappedOrSignedOpenCertsDocument) if (utils.isWrappedV2Document(rawDocument)) { return getData(rawDocument); } else if (utils.isWrappedV4Document(rawDocument)) { - return rawDocument.credentialSubject; + // Flattens the credentialSubject field so that the renderer can directly call document.ABC + const flattenedV4 = { ...rawDocument.credentialSubject, ...rawDocument }; + return flattenedV4; } else { return rawDocument; } From dfaf083f46c431a3c6f7d0986cddd83b996c34a8 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 13 Jun 2024 23:56:39 +0800 Subject: [PATCH 10/27] fix: build again --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5df7e8725..963480340 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,7 +25,7 @@ jobs: command: npm run build:registry build: docker: - - image: "circleci/node:lts-browsers" + - image: "circleci/node:14.18.2-browsers" steps: - checkout - run: From 160b2ec92f0215c44fea91bca5b29a6ea96040c4 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 14 Jun 2024 12:00:32 +0800 Subject: [PATCH 11/27] test: integration --- .../DecentralisedTemplateRenderer/DecentralisedRenderer.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx index 22598012d..6945fb57c 100644 --- a/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx +++ b/src/components/DecentralisedTemplateRenderer/DecentralisedRenderer.tsx @@ -133,7 +133,7 @@ const DecentralisedRenderer: React.FunctionComponent // send analytics on which document has been displayed useEffect(() => { // CERTIFICATE_VIEWED event - if (utils.isSignedWrappedV2Document(rawDocument)) { + if (utils.isWrappedV2Document(rawDocument)) { const certificateData = getData(rawDocument); analyticsEvent({ category: "CERTIFICATE_VIEWED", @@ -142,7 +142,7 @@ const DecentralisedRenderer: React.FunctionComponent issuerId: `${certificateData.issuers.map((issuer) => issuer.id).join(",")}`, }, }); - } else if (utils.isSignedWrappedV3Document(rawDocument)) { + } else if (utils.isWrappedV3Document(rawDocument)) { const certificateData = opencertsGetData(rawDocument) as v3.OpenAttestationDocument; const storeAddresses = utils.getIssuerAddress(rawDocument); analyticsEvent({ From 5e380277fc951941fca17f3191e81d4050274015 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 14 Jun 2024 15:03:06 +0800 Subject: [PATCH 12/27] test: increase timeouts --- src/components/tests/did-dns-verified.spec.js | 2 +- src/components/tests/dns-registry-verified.spec.js | 2 +- src/components/tests/dns-verified.spec.js | 4 ++-- src/components/tests/download-certificate.spec.js | 2 +- .../tests/load-action-encrypted-certificate.spec.js | 2 +- src/components/tests/load-action-plain-certificate.spec.js | 2 +- .../tests/multi-dns-verified-certificate-store.spec.js | 2 +- src/components/tests/multi-dns-verified.spec.js | 2 +- src/components/tests/multi-registry-verified.spec.js | 2 +- src/components/tests/obfuscated-document-verified.spec.js | 2 +- src/components/tests/registry-verified.spec.js | 2 +- src/components/tests/unverified-issuer.spec.js | 2 +- src/components/tests/verified-unverified-issuer.spec.js | 2 +- src/integration/v3/did-dns-verified.spec.js | 2 +- src/sagas/sagatests/integration-alternate-network.spec.js | 2 +- src/sagas/sagatests/integration-contract-not-found.spec.js | 2 +- src/sagas/sagatests/integration-invalidstore.spec.js | 2 +- src/sagas/sagatests/integration-merkle.spec.js | 2 +- src/sagas/sagatests/integration-multiple-invalidstore.spec.js | 2 +- src/sagas/sagatests/integration-server-error.spec.js | 2 +- src/sagas/sagatests/integration-tampered.spec.js | 2 +- src/sagas/sagatests/integration-unissued.spec.js | 2 +- 22 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/components/tests/did-dns-verified.spec.js b/src/components/tests/did-dns-verified.spec.js index aa62a30c6..e68c7424b 100644 --- a/src/components/tests/did-dns-verified.spec.js +++ b/src/components/tests/did-dns-verified.spec.js @@ -8,7 +8,7 @@ fixture("DID-DNS Certificate Rendering").page`http://localhost:3000`.beforeEach( const Document = "./fixture/dns-did-signed.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/dns-registry-verified.spec.js b/src/components/tests/dns-registry-verified.spec.js index 5020d9e9c..0241edf8d 100644 --- a/src/components/tests/dns-registry-verified.spec.js +++ b/src/components/tests/dns-registry-verified.spec.js @@ -8,7 +8,7 @@ fixture("DNS and Registry Verified for Certificate Rendering").page`http://local const Document = "./fixture/sample-registry-dns-verified.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/dns-verified.spec.js b/src/components/tests/dns-verified.spec.js index 5037baf6d..b8bd1aedf 100644 --- a/src/components/tests/dns-verified.spec.js +++ b/src/components/tests/dns-verified.spec.js @@ -18,8 +18,8 @@ fixture("DNS Certificate Rendering").page`http://localhost:3000`.beforeEach(asyn const Document = "./fixture/sample-dns-verified.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status"); -const InvalidMessage = Selector(".invalid"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const RenderedCertificate = Selector("#certificate-dropzone"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/download-certificate.spec.js b/src/components/tests/download-certificate.spec.js index 3185acc91..eb1592875 100644 --- a/src/components/tests/download-certificate.spec.js +++ b/src/components/tests/download-certificate.spec.js @@ -18,7 +18,7 @@ fixture("Download Certificate").page`http://localhost:3000` const Document1 = "./fixture/sample-dns-verified.json"; const Document2 = "./fixture/sample-dns-verified-special-characters.json"; -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const DownloadLink = Selector("a").withAttribute("download"); const DownloadButton = Selector("#btn-download"); diff --git a/src/components/tests/load-action-encrypted-certificate.spec.js b/src/components/tests/load-action-encrypted-certificate.spec.js index 01dd8810e..24354ff88 100644 --- a/src/components/tests/load-action-encrypted-certificate.spec.js +++ b/src/components/tests/load-action-encrypted-certificate.spec.js @@ -8,7 +8,7 @@ fixture("Load action from encrypted certificate").page`http://localhost:3000`.be const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const CertificateDropzone = Selector("#certificate-dropzone"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/load-action-plain-certificate.spec.js b/src/components/tests/load-action-plain-certificate.spec.js index 506d54174..607aa379d 100644 --- a/src/components/tests/load-action-plain-certificate.spec.js +++ b/src/components/tests/load-action-plain-certificate.spec.js @@ -8,7 +8,7 @@ fixture("Load action from plain certificate").page`http://localhost:3000`.before const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const CertificateDropzone = Selector("#certificate-dropzone"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/multi-dns-verified-certificate-store.spec.js b/src/components/tests/multi-dns-verified-certificate-store.spec.js index 985da1810..1052f6965 100644 --- a/src/components/tests/multi-dns-verified-certificate-store.spec.js +++ b/src/components/tests/multi-dns-verified-certificate-store.spec.js @@ -9,7 +9,7 @@ fixture("Multiple DNS Verified for Certificate Rendering using certificate store const Document = "./fixture/sample-multidns-verified-certificate-store.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/multi-dns-verified.spec.js b/src/components/tests/multi-dns-verified.spec.js index 788124743..71144d224 100644 --- a/src/components/tests/multi-dns-verified.spec.js +++ b/src/components/tests/multi-dns-verified.spec.js @@ -8,7 +8,7 @@ fixture("Multiple DNS Verified for Certificate Rendering").page`http://localhost const Document = "./fixture/sample-multidns-verified.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/multi-registry-verified.spec.js b/src/components/tests/multi-registry-verified.spec.js index faf5a2db2..578201072 100644 --- a/src/components/tests/multi-registry-verified.spec.js +++ b/src/components/tests/multi-registry-verified.spec.js @@ -6,7 +6,7 @@ fixture("Multiple Registry Verified for Certificate Rendering").page`http://loca }); const Document = "./fixture/sample-multiregistry-verified.json"; -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/obfuscated-document-verified.spec.js b/src/components/tests/obfuscated-document-verified.spec.js index e419a8595..f466c5c84 100644 --- a/src/components/tests/obfuscated-document-verified.spec.js +++ b/src/components/tests/obfuscated-document-verified.spec.js @@ -7,7 +7,7 @@ fixture("Obfuscate Note Rendering").page`http://localhost:3000`.beforeEach(async const Document = "./fixture/obfuscated-document.json"; const IframeBlock = Selector("#iframe"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const SampleTemplate = Selector("#rendered-certificate"); const ObfuscationNote = Selector("#obfuscation-note"); diff --git a/src/components/tests/registry-verified.spec.js b/src/components/tests/registry-verified.spec.js index dae938f8b..ddb0a8f07 100644 --- a/src/components/tests/registry-verified.spec.js +++ b/src/components/tests/registry-verified.spec.js @@ -9,7 +9,7 @@ const Document = "./fixture/registry-verified.json"; const IframeBlock = Selector("#iframe"); const TranscriptButton = Selector("[data-testid='transcript']"); const MediaButton = Selector("[data-testid='media']"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const SampleTemplate = Selector("#rendered-certificate"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/unverified-issuer.spec.js b/src/components/tests/unverified-issuer.spec.js index 4cf1a75e3..d52919f73 100644 --- a/src/components/tests/unverified-issuer.spec.js +++ b/src/components/tests/unverified-issuer.spec.js @@ -8,7 +8,7 @@ fixture("Unverified Certificate Rendering").page`http://localhost:3000`.beforeEa const Certificate = "./fixture/unverified-issuer.json"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/verified-unverified-issuer.spec.js b/src/components/tests/verified-unverified-issuer.spec.js index 61e9e3717..4df7e8bca 100644 --- a/src/components/tests/verified-unverified-issuer.spec.js +++ b/src/components/tests/verified-unverified-issuer.spec.js @@ -10,7 +10,7 @@ fixture("Any one of DNS or Registry Verified for Certificate Rendering").page`ht const Document = "./fixture/verified-unverified-issuer.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/integration/v3/did-dns-verified.spec.js b/src/integration/v3/did-dns-verified.spec.js index f0903859d..99db4e201 100644 --- a/src/integration/v3/did-dns-verified.spec.js +++ b/src/integration/v3/did-dns-verified.spec.js @@ -8,7 +8,7 @@ fixture("DID-DNS Certificate Rendering").page`http://localhost:3000`.beforeEach( const Document = "./fixture/dns-did-signed.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-alternate-network.spec.js b/src/sagas/sagatests/integration-alternate-network.spec.js index 43b1d33eb..e1249aae7 100644 --- a/src/sagas/sagatests/integration-alternate-network.spec.js +++ b/src/sagas/sagatests/integration-alternate-network.spec.js @@ -9,7 +9,7 @@ const Certificate = "./sample-amoy.opencert"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-contract-not-found.spec.js b/src/sagas/sagatests/integration-contract-not-found.spec.js index 15a4f0471..ff6323ac7 100644 --- a/src/sagas/sagatests/integration-contract-not-found.spec.js +++ b/src/sagas/sagatests/integration-contract-not-found.spec.js @@ -8,7 +8,7 @@ fixture("Contract Not Found").page`http://localhost:3000`.beforeEach(async () => const Certificate = "./sample-mainnet.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-invalidstore.spec.js b/src/sagas/sagatests/integration-invalidstore.spec.js index 075e9cc4d..e78f15aae 100644 --- a/src/sagas/sagatests/integration-invalidstore.spec.js +++ b/src/sagas/sagatests/integration-invalidstore.spec.js @@ -8,7 +8,7 @@ fixture("Invalid Store Cert").page`http://localhost:3000`.beforeEach(async () => const Certificate = "./invalidstore.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-merkle.spec.js b/src/sagas/sagatests/integration-merkle.spec.js index 023debe15..15fd6fb6d 100644 --- a/src/sagas/sagatests/integration-merkle.spec.js +++ b/src/sagas/sagatests/integration-merkle.spec.js @@ -10,7 +10,7 @@ const Certificate2 = "./wrong-merkle-incorrect-length.opencert"; const Certificate3 = "./wrong-merkle-arrayify-value.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-multiple-invalidstore.spec.js b/src/sagas/sagatests/integration-multiple-invalidstore.spec.js index a483f6603..a34c0b365 100644 --- a/src/sagas/sagatests/integration-multiple-invalidstore.spec.js +++ b/src/sagas/sagatests/integration-multiple-invalidstore.spec.js @@ -8,7 +8,7 @@ fixture("Multiple Invalid Stores Cert").page`http://localhost:3000`.beforeEach(a const Certificate = "./multipleinvalidstores.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-server-error.spec.js b/src/sagas/sagatests/integration-server-error.spec.js index c2d38c406..d12988aec 100644 --- a/src/sagas/sagatests/integration-server-error.spec.js +++ b/src/sagas/sagatests/integration-server-error.spec.js @@ -28,7 +28,7 @@ const RenderedCertificate = Selector("#certificate-dropzone"); const DropzoneViewWrapper = Selector("[data-testid='dropzone-view-wrapper']"); const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status"); +const StatusButton = Selector("#certificate-status", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-tampered.spec.js b/src/sagas/sagatests/integration-tampered.spec.js index 233994dc4..9c8656b6c 100644 --- a/src/sagas/sagatests/integration-tampered.spec.js +++ b/src/sagas/sagatests/integration-tampered.spec.js @@ -8,7 +8,7 @@ fixture("Tampered Cert").page`http://localhost:3000`.beforeEach(async () => { const Certificate = "./tampered.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-unissued.spec.js b/src/sagas/sagatests/integration-unissued.spec.js index 31ac8022d..f10ffce44 100644 --- a/src/sagas/sagatests/integration-unissued.spec.js +++ b/src/sagas/sagatests/integration-unissued.spec.js @@ -8,7 +8,7 @@ fixture("Unissued Cert").page`http://localhost:3000`.beforeEach(async () => { const Certificate = "./unissued.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid"); +const InvalidMessage = Selector(".invalid", { timeout: 30000 }); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); From 9be5011e5dac000eb740399f197b1ddb57673036 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 14 Jun 2024 15:27:22 +0800 Subject: [PATCH 13/27] test: decrease chrome instances --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a3b30743f..d50416206 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe -c 4 chrome:headless src/**/*.spec.js", + "integration:headless": "testcafe -c 2 chrome:headless src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, From e58740be9ef51ac7df9dd11cd2b9ea0ecf33d0d5 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 14 Jun 2024 16:10:07 +0800 Subject: [PATCH 14/27] test: use just one chrome instance --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d50416206..f6997f63a 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe -c 2 chrome:headless src/**/*.spec.js", + "integration:headless": "testcafe chrome:headless src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, From 2b126505c9ff9000648d3f0fa5b05850b51cb5ac Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 14 Jun 2024 16:52:22 +0800 Subject: [PATCH 15/27] test: set resource class to large --- .circleci/config.yml | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 963480340..37a81bdb8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,7 @@ jobs: name: build registry command: npm run build:registry build: + resource_class: large docker: - image: "circleci/node:14.18.2-browsers" steps: diff --git a/package.json b/package.json index f6997f63a..d50416206 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe chrome:headless src/**/*.spec.js", + "integration:headless": "testcafe -c 2 chrome:headless src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, From 2109db4350b63b819a968bac2fc3820923a3ef6e Mon Sep 17 00:00:00 2001 From: david tjokroaminoto Date: Fri, 14 Jun 2024 17:00:44 +0800 Subject: [PATCH 16/27] chore: upgrade docker image --- .circleci/config.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 37a81bdb8..f726ccb06 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,23 +1,23 @@ workflows: version: 2 -# uncomment to get build registry -# nightly: -# triggers: -# - schedule: -# cron: "0 0 * * *" -# filters: -# branches: -# only: -# - master -# jobs: -# - build_registry + # uncomment to get build registry + # nightly: + # triggers: + # - schedule: + # cron: "0 0 * * *" + # filters: + # branches: + # only: + # - master + # jobs: + # - build_registry commit: jobs: - build jobs: build_registry: docker: - - image: "circleci/node:14.18.2-browsers" + - image: "cimg/node:14.21.3-browsers" steps: - checkout - run: @@ -26,7 +26,7 @@ jobs: build: resource_class: large docker: - - image: "circleci/node:14.18.2-browsers" + - image: "cimg/node:14.21.3-browsers" steps: - checkout - run: From 0519249f430b281ce2a24ab45ac21d3ca2c7e2c8 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 14 Jun 2024 17:02:53 +0800 Subject: [PATCH 17/27] test: revert to 4 instances --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d50416206..a3b30743f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe -c 2 chrome:headless src/**/*.spec.js", + "integration:headless": "testcafe -c 4 chrome:headless src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, From eb33374c5895633d58de408469d36232bd432782 Mon Sep 17 00:00:00 2001 From: david tjokroaminoto Date: Fri, 14 Jun 2024 17:06:10 +0800 Subject: [PATCH 18/27] fix: ci --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index f726ccb06..793dc8f17 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -29,6 +29,7 @@ jobs: - image: "cimg/node:14.21.3-browsers" steps: - checkout + - browser-tools/install-browser-tools - run: name: install command: npm ci From 3bad2f2d26f1968b5ad0e4b51257ff6c9d02b6e0 Mon Sep 17 00:00:00 2001 From: david tjokroaminoto Date: Fri, 14 Jun 2024 17:08:00 +0800 Subject: [PATCH 19/27] fix: wf --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 793dc8f17..5b2c9ba20 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,5 @@ +version: 2.1 workflows: - version: 2 # uncomment to get build registry # nightly: # triggers: @@ -14,6 +14,8 @@ workflows: commit: jobs: - build +orbs: + browser-tools: circleci/browser-tools@1.4.8 jobs: build_registry: docker: From 5b8956ae5a38f7604f6ab24dd36b13c6fe19c835 Mon Sep 17 00:00:00 2001 From: david tjokroaminoto Date: Fri, 14 Jun 2024 17:15:02 +0800 Subject: [PATCH 20/27] fix: integration --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a3b30743f..8687f32fa 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe -c 4 chrome:headless src/**/*.spec.js", + "integration:headless": "testcafe -c 4 'chrome --headless=new' src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, @@ -226,4 +226,4 @@ } ] } -} +} \ No newline at end of file From 2a22ad31c4fc2cedbd42f117c34b2979054c8218 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sat, 15 Jun 2024 17:49:14 +0800 Subject: [PATCH 21/27] test: use selector command option --- package.json | 4 ++-- src/components/tests/did-dns-verified.spec.js | 2 +- src/components/tests/dns-registry-verified.spec.js | 2 +- src/components/tests/dns-verified.spec.js | 4 ++-- src/components/tests/download-certificate.spec.js | 2 +- .../tests/load-action-encrypted-certificate.spec.js | 2 +- src/components/tests/load-action-plain-certificate.spec.js | 2 +- .../tests/multi-dns-verified-certificate-store.spec.js | 2 +- src/components/tests/multi-dns-verified.spec.js | 2 +- src/components/tests/multi-registry-verified.spec.js | 2 +- src/components/tests/obfuscated-document-verified.spec.js | 2 +- src/components/tests/registry-verified.spec.js | 2 +- src/components/tests/unverified-issuer.spec.js | 2 +- src/components/tests/verified-unverified-issuer.spec.js | 2 +- src/integration/v3/did-dns-verified.spec.js | 2 +- src/sagas/sagatests/integration-alternate-network.spec.js | 2 +- src/sagas/sagatests/integration-contract-not-found.spec.js | 2 +- src/sagas/sagatests/integration-invalidstore.spec.js | 2 +- src/sagas/sagatests/integration-merkle.spec.js | 2 +- src/sagas/sagatests/integration-multiple-invalidstore.spec.js | 2 +- src/sagas/sagatests/integration-server-error.spec.js | 2 +- src/sagas/sagatests/integration-tampered.spec.js | 2 +- src/sagas/sagatests/integration-unissued.spec.js | 2 +- 23 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 8687f32fa..d67fdb9d9 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe -c 4 'chrome --headless=new' src/**/*.spec.js", + "integration:headless": "testcafe -c 4 'chrome --headless=new' --selector-timeout 600000 src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, @@ -226,4 +226,4 @@ } ] } -} \ No newline at end of file +} diff --git a/src/components/tests/did-dns-verified.spec.js b/src/components/tests/did-dns-verified.spec.js index e68c7424b..aa62a30c6 100644 --- a/src/components/tests/did-dns-verified.spec.js +++ b/src/components/tests/did-dns-verified.spec.js @@ -8,7 +8,7 @@ fixture("DID-DNS Certificate Rendering").page`http://localhost:3000`.beforeEach( const Document = "./fixture/dns-did-signed.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/dns-registry-verified.spec.js b/src/components/tests/dns-registry-verified.spec.js index 0241edf8d..5020d9e9c 100644 --- a/src/components/tests/dns-registry-verified.spec.js +++ b/src/components/tests/dns-registry-verified.spec.js @@ -8,7 +8,7 @@ fixture("DNS and Registry Verified for Certificate Rendering").page`http://local const Document = "./fixture/sample-registry-dns-verified.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/dns-verified.spec.js b/src/components/tests/dns-verified.spec.js index b8bd1aedf..5037baf6d 100644 --- a/src/components/tests/dns-verified.spec.js +++ b/src/components/tests/dns-verified.spec.js @@ -18,8 +18,8 @@ fixture("DNS Certificate Rendering").page`http://localhost:3000`.beforeEach(asyn const Document = "./fixture/sample-dns-verified.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); +const InvalidMessage = Selector(".invalid"); const RenderedCertificate = Selector("#certificate-dropzone"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/download-certificate.spec.js b/src/components/tests/download-certificate.spec.js index eb1592875..3185acc91 100644 --- a/src/components/tests/download-certificate.spec.js +++ b/src/components/tests/download-certificate.spec.js @@ -18,7 +18,7 @@ fixture("Download Certificate").page`http://localhost:3000` const Document1 = "./fixture/sample-dns-verified.json"; const Document2 = "./fixture/sample-dns-verified-special-characters.json"; -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const DownloadLink = Selector("a").withAttribute("download"); const DownloadButton = Selector("#btn-download"); diff --git a/src/components/tests/load-action-encrypted-certificate.spec.js b/src/components/tests/load-action-encrypted-certificate.spec.js index 24354ff88..01dd8810e 100644 --- a/src/components/tests/load-action-encrypted-certificate.spec.js +++ b/src/components/tests/load-action-encrypted-certificate.spec.js @@ -8,7 +8,7 @@ fixture("Load action from encrypted certificate").page`http://localhost:3000`.be const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const CertificateDropzone = Selector("#certificate-dropzone"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/load-action-plain-certificate.spec.js b/src/components/tests/load-action-plain-certificate.spec.js index 607aa379d..506d54174 100644 --- a/src/components/tests/load-action-plain-certificate.spec.js +++ b/src/components/tests/load-action-plain-certificate.spec.js @@ -8,7 +8,7 @@ fixture("Load action from plain certificate").page`http://localhost:3000`.before const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const CertificateDropzone = Selector("#certificate-dropzone"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/multi-dns-verified-certificate-store.spec.js b/src/components/tests/multi-dns-verified-certificate-store.spec.js index 1052f6965..985da1810 100644 --- a/src/components/tests/multi-dns-verified-certificate-store.spec.js +++ b/src/components/tests/multi-dns-verified-certificate-store.spec.js @@ -9,7 +9,7 @@ fixture("Multiple DNS Verified for Certificate Rendering using certificate store const Document = "./fixture/sample-multidns-verified-certificate-store.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/multi-dns-verified.spec.js b/src/components/tests/multi-dns-verified.spec.js index 71144d224..788124743 100644 --- a/src/components/tests/multi-dns-verified.spec.js +++ b/src/components/tests/multi-dns-verified.spec.js @@ -8,7 +8,7 @@ fixture("Multiple DNS Verified for Certificate Rendering").page`http://localhost const Document = "./fixture/sample-multidns-verified.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/multi-registry-verified.spec.js b/src/components/tests/multi-registry-verified.spec.js index 578201072..faf5a2db2 100644 --- a/src/components/tests/multi-registry-verified.spec.js +++ b/src/components/tests/multi-registry-verified.spec.js @@ -6,7 +6,7 @@ fixture("Multiple Registry Verified for Certificate Rendering").page`http://loca }); const Document = "./fixture/sample-multiregistry-verified.json"; -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/obfuscated-document-verified.spec.js b/src/components/tests/obfuscated-document-verified.spec.js index f466c5c84..e419a8595 100644 --- a/src/components/tests/obfuscated-document-verified.spec.js +++ b/src/components/tests/obfuscated-document-verified.spec.js @@ -7,7 +7,7 @@ fixture("Obfuscate Note Rendering").page`http://localhost:3000`.beforeEach(async const Document = "./fixture/obfuscated-document.json"; const IframeBlock = Selector("#iframe"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const SampleTemplate = Selector("#rendered-certificate"); const ObfuscationNote = Selector("#obfuscation-note"); diff --git a/src/components/tests/registry-verified.spec.js b/src/components/tests/registry-verified.spec.js index ddb0a8f07..dae938f8b 100644 --- a/src/components/tests/registry-verified.spec.js +++ b/src/components/tests/registry-verified.spec.js @@ -9,7 +9,7 @@ const Document = "./fixture/registry-verified.json"; const IframeBlock = Selector("#iframe"); const TranscriptButton = Selector("[data-testid='transcript']"); const MediaButton = Selector("[data-testid='media']"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const SampleTemplate = Selector("#rendered-certificate"); const validateTextContent = async (t, component, texts) => diff --git a/src/components/tests/unverified-issuer.spec.js b/src/components/tests/unverified-issuer.spec.js index d52919f73..4cf1a75e3 100644 --- a/src/components/tests/unverified-issuer.spec.js +++ b/src/components/tests/unverified-issuer.spec.js @@ -8,7 +8,7 @@ fixture("Unverified Certificate Rendering").page`http://localhost:3000`.beforeEa const Certificate = "./fixture/unverified-issuer.json"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/components/tests/verified-unverified-issuer.spec.js b/src/components/tests/verified-unverified-issuer.spec.js index 4df7e8bca..61e9e3717 100644 --- a/src/components/tests/verified-unverified-issuer.spec.js +++ b/src/components/tests/verified-unverified-issuer.spec.js @@ -10,7 +10,7 @@ fixture("Any one of DNS or Registry Verified for Certificate Rendering").page`ht const Document = "./fixture/verified-unverified-issuer.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#rendered-certificate"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/integration/v3/did-dns-verified.spec.js b/src/integration/v3/did-dns-verified.spec.js index 99db4e201..f0903859d 100644 --- a/src/integration/v3/did-dns-verified.spec.js +++ b/src/integration/v3/did-dns-verified.spec.js @@ -8,7 +8,7 @@ fixture("DID-DNS Certificate Rendering").page`http://localhost:3000`.beforeEach( const Document = "./fixture/dns-did-signed.json"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-alternate-network.spec.js b/src/sagas/sagatests/integration-alternate-network.spec.js index e1249aae7..43b1d33eb 100644 --- a/src/sagas/sagatests/integration-alternate-network.spec.js +++ b/src/sagas/sagatests/integration-alternate-network.spec.js @@ -9,7 +9,7 @@ const Certificate = "./sample-amoy.opencert"; const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-contract-not-found.spec.js b/src/sagas/sagatests/integration-contract-not-found.spec.js index ff6323ac7..15a4f0471 100644 --- a/src/sagas/sagatests/integration-contract-not-found.spec.js +++ b/src/sagas/sagatests/integration-contract-not-found.spec.js @@ -8,7 +8,7 @@ fixture("Contract Not Found").page`http://localhost:3000`.beforeEach(async () => const Certificate = "./sample-mainnet.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-invalidstore.spec.js b/src/sagas/sagatests/integration-invalidstore.spec.js index e78f15aae..075e9cc4d 100644 --- a/src/sagas/sagatests/integration-invalidstore.spec.js +++ b/src/sagas/sagatests/integration-invalidstore.spec.js @@ -8,7 +8,7 @@ fixture("Invalid Store Cert").page`http://localhost:3000`.beforeEach(async () => const Certificate = "./invalidstore.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-merkle.spec.js b/src/sagas/sagatests/integration-merkle.spec.js index 15fd6fb6d..023debe15 100644 --- a/src/sagas/sagatests/integration-merkle.spec.js +++ b/src/sagas/sagatests/integration-merkle.spec.js @@ -10,7 +10,7 @@ const Certificate2 = "./wrong-merkle-incorrect-length.opencert"; const Certificate3 = "./wrong-merkle-arrayify-value.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-multiple-invalidstore.spec.js b/src/sagas/sagatests/integration-multiple-invalidstore.spec.js index a34c0b365..a483f6603 100644 --- a/src/sagas/sagatests/integration-multiple-invalidstore.spec.js +++ b/src/sagas/sagatests/integration-multiple-invalidstore.spec.js @@ -8,7 +8,7 @@ fixture("Multiple Invalid Stores Cert").page`http://localhost:3000`.beforeEach(a const Certificate = "./multipleinvalidstores.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-server-error.spec.js b/src/sagas/sagatests/integration-server-error.spec.js index d12988aec..c2d38c406 100644 --- a/src/sagas/sagatests/integration-server-error.spec.js +++ b/src/sagas/sagatests/integration-server-error.spec.js @@ -28,7 +28,7 @@ const RenderedCertificate = Selector("#certificate-dropzone"); const DropzoneViewWrapper = Selector("[data-testid='dropzone-view-wrapper']"); const IframeBlock = Selector("#iframe"); const SampleTemplate = Selector("#root"); -const StatusButton = Selector("#certificate-status", { timeout: 30000 }); +const StatusButton = Selector("#certificate-status"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-tampered.spec.js b/src/sagas/sagatests/integration-tampered.spec.js index 9c8656b6c..233994dc4 100644 --- a/src/sagas/sagatests/integration-tampered.spec.js +++ b/src/sagas/sagatests/integration-tampered.spec.js @@ -8,7 +8,7 @@ fixture("Tampered Cert").page`http://localhost:3000`.beforeEach(async () => { const Certificate = "./tampered.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); diff --git a/src/sagas/sagatests/integration-unissued.spec.js b/src/sagas/sagatests/integration-unissued.spec.js index f10ffce44..31ac8022d 100644 --- a/src/sagas/sagatests/integration-unissued.spec.js +++ b/src/sagas/sagatests/integration-unissued.spec.js @@ -8,7 +8,7 @@ fixture("Unissued Cert").page`http://localhost:3000`.beforeEach(async () => { const Certificate = "./unissued.opencert"; const RenderedCertificate = Selector("#certificate-dropzone"); -const InvalidMessage = Selector(".invalid", { timeout: 30000 }); +const InvalidMessage = Selector(".invalid"); const validateTextContent = async (t, component, texts) => texts.reduce(async (prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); From b406b571e0e7de0094e633a53ce31832aa405eee Mon Sep 17 00:00:00 2001 From: Lucas Date: Sat, 15 Jun 2024 19:39:58 +0800 Subject: [PATCH 22/27] fix: network bug --- package.json | 2 +- src/sagas/certificate.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d67fdb9d9..0f065c152 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "serve-static": "http-server out -s -p 3000", "integration": "testcafe chrome src/**/*.spec.js --ts-config-path ./tsconfig.json", "integration:single": "testcafe chrome -L --app \"npm run serve-static\"", - "integration:headless": "testcafe -c 4 'chrome --headless=new' --selector-timeout 600000 src/**/*.spec.js", + "integration:headless": "testcafe -c 3 'chrome --headless=new' --selector-timeout 300000 src/**/*.spec.js", "integration:watch": "nodemon --exec \"npm run integration\" --watch src", "type-check": "npx tsc --noEmit" }, diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index f1a027174..7bbdf132d 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -113,7 +113,7 @@ const fragmentsHaveCallException = (fragments: VerificationFragment[]) => { export function* verifyCertificate({ payload: certificate }: { payload: WrappedOrSignedOpenCertsDocument }) { try { yield put(verifyingCertificate()); - let networkName = ""; + let networkName = NETWORK_NAME; if (!utils.isWrappedV4Document(certificate)) { networkName = getNetworkName(certificate); } @@ -169,6 +169,7 @@ export function* verifyCertificate({ payload: certificate }: { payload: WrappedO } } } catch (e) { + console.log("ERRR", e); yield put(verifyingCertificateErrored(e.message)); } } From ad65daf4134a92e976df49bb1ad74221cff1e091 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 20 Jun 2024 12:06:25 +0800 Subject: [PATCH 23/27] chore: upgrade oa-verify --- next.config.js | 2 +- package-lock.json | 6 +++--- package.json | 2 +- .../CertificateVerifyBlock/CertificateVerifyBlock.tsx | 3 +-- src/sagas/certificate.ts | 10 ++++++---- src/services/fragment.ts | 8 +++----- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/next.config.js b/next.config.js index aacd32999..f703c767a 100644 --- a/next.config.js +++ b/next.config.js @@ -28,7 +28,7 @@ module.exports = withBundleAnalyzer({ INFURA_API_KEY: process.env.INFURA_API_KEY || "84842078b09946638c03157f83405213", // ethers package default api key, feel free to change ALCHEMY_API_KEY: process.env.ALCHEMY_API_KEY || "FK1x9CdE8NStKjVt236D_LP7B6MMCFOs", // default key works on ropsten TRUSTED_TLDS: process.env.TRUSTED_TLDS || "gov.sg,edu.sg", - GA4_TAG_ID: process.env.GA4_TAG_ID, + GA4_TAG_ID: process.env.GA4_TAG_ID || "G-JP12T2F01V", }, // Variables passed to both server and client publicRuntimeConfig: { diff --git a/package-lock.json b/package-lock.json index cf5a6bfd0..f91e1b5a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4066,9 +4066,9 @@ } }, "@govtechsg/oa-verify": { - "version": "9.3.0-beta.1", - "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-9.3.0-beta.1.tgz", - "integrity": "sha512-rl6k0CdzSObkMfXxCQeILnYAk3rJm3ffMLFSMv6QWvy/o3k0qvF7YDb2azLn1GvhVdC/6/t3Q80g1yND6qDINg==", + "version": "9.3.0-beta.2", + "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-9.3.0-beta.2.tgz", + "integrity": "sha512-otsAVhD2RTo9JXZtXcfcddiTz64Ce5ehr1zcIbvRrh29WQi6CxPvUa6DX7oiMuI7+frrL0hu4LFRrxqScewP2Q==", "requires": { "@govtechsg/dnsprove": "^2.6.2", "@govtechsg/open-attestation": "^6.10.0-beta.3", diff --git a/package.json b/package.json index 0f065c152..328548b54 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "dependencies": { "@govtechsg/decentralized-renderer-react-components": "^3.17.0-beta.1", "@govtechsg/oa-encryption": "^1.3.3", - "@govtechsg/oa-verify": "^9.3.0-beta.1", + "@govtechsg/oa-verify": "^9.3.0-beta.2", "@govtechsg/open-attestation": "^6.10.0-beta.4", "@govtechsg/opencerts-verify": "^3.1.2", "@types/google.analytics": "0.0.41", diff --git a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx index 953bfb0c1..4391026dd 100644 --- a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx +++ b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx @@ -1,3 +1,4 @@ +import { utils, ValidDnsTxtVerificationStatus, ValidDnsDidVerificationStatus } from "@govtechsg/oa-verify"; import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; import { getData, v2, WrappedDocument, utils as oaUtils, v3, v4 } from "@govtechsg/open-attestation"; import { @@ -8,8 +9,6 @@ import React, { useState } from "react"; import { WrappedOrSignedOpenCertsDocument } from "../../shared"; import { icons } from "../ViewerPageImages"; import { DetailedCertificateVerifyBlock } from "./DetailedCertificateVerifyBlock"; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { utils, ValidDnsTxtVerificationStatus, ValidDnsDidVerificationStatus } = require("@govtechsg/oa-verify"); export const getV2IdentityVerificationText = ( verificationStatus: VerificationFragment[], diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index 7bbdf132d..e2134960d 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -1,10 +1,12 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import { decryptString } from "@govtechsg/oa-encryption"; +import { utils as oaVerifyUtils, openAttestationVerifiers, verificationBuilder } from "@govtechsg/oa-verify"; import type { ErrorVerificationFragment, VerificationBuilderOptions, VerificationFragment, + Verifier, } from "@govtechsg/oa-verify/dist/types/types/core"; import { utils, v2, v3 } from "@govtechsg/open-attestation"; import { isValid, registryVerifier } from "@govtechsg/opencerts-verify"; @@ -46,8 +48,6 @@ import { generateLink } from "../services/link"; import { WrappedOrSignedOpenCertsDocument } from "../shared"; import { getLogger } from "../utils/logger"; import { opencertsGetData } from "../utils/utils"; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { utils: oaVerifyUtils, verificationBuilder, openAttestationVerifiers } = require("@govtechsg/oa-verify"); const { trace } = getLogger("saga:certificate"); const getProvider = (networkName: string, providerName: "infura" | "alchemy") => { @@ -118,8 +118,10 @@ export function* verifyCertificate({ payload: certificate }: { payload: WrappedO networkName = getNetworkName(certificate); } const infuraProvider = getProvider(networkName, "infura"); - const verify = (builderOptions: VerificationBuilderOptions) => - verificationBuilder([...openAttestationVerifiers, registryVerifier], builderOptions); + const verify = (builderOptions: VerificationBuilderOptions) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return verificationBuilder([...openAttestationVerifiers, registryVerifier] as Verifier[], builderOptions); + }; // https://github.com/redux-saga/redux-saga/issues/884 let fragments: VerificationFragment[] = yield call(verify({ provider: infuraProvider }), certificate); // manually call alchemy provider as backup if infura provider returns error fragment diff --git a/src/services/fragment.ts b/src/services/fragment.ts index d2fd00de8..c29cb2447 100644 --- a/src/services/fragment.ts +++ b/src/services/fragment.ts @@ -1,11 +1,9 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ - -import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types"; -const { +import { utils, OpenAttestationEthereumDocumentStoreStatusCode, OpenAttestationEthereumTokenRegistryStatusCode, -} = require("@govtechsg/oa-verify"); +} from "@govtechsg/oa-verify"; +import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types"; // this function check if the reason of the error is that the document store or token registry is invalid export const addressInvalid = (fragments: VerificationFragment[]): boolean => { From 84afe91596d09656e413367bc1555231e38fc36b Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 20 Jun 2024 14:51:28 +0800 Subject: [PATCH 24/27] chore: add tests --- src/integration/v4/fixtures/v4_batched.json | 107 +++++++++++++++++ .../v4/fixtures/v4_data_obfuscated.json | 108 ++++++++++++++++++ .../v4/fixtures/v4_embedded_renderer.json | 104 +++++++++++++++++ src/integration/v4/fixtures/v4_svg.json | 55 +++++++++ src/integration/v4/v4-verified.spec.js | 64 +++++++++++ src/sagas/certificate.ts | 1 - 6 files changed, 438 insertions(+), 1 deletion(-) create mode 100644 src/integration/v4/fixtures/v4_batched.json create mode 100644 src/integration/v4/fixtures/v4_data_obfuscated.json create mode 100644 src/integration/v4/fixtures/v4_embedded_renderer.json create mode 100644 src/integration/v4/fixtures/v4_svg.json create mode 100644 src/integration/v4/v4-verified.spec.js diff --git a/src/integration/v4/fixtures/v4_batched.json b/src/integration/v4/fixtures/v4_batched.json new file mode 100644 index 000000000..cf2f377f4 --- /dev/null +++ b/src/integration/v4/fixtures/v4_batched.json @@ -0,0 +1,107 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://schemata.openattestation.com/com/openattestation/4.0/alpha-context.json" + ], + "name": "Govtech Demo Certificate V4", + "type": ["VerifiableCredential", "OpenAttestationCredential"], + "issuer": { + "id": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733", + "type": "OpenAttestationIssuer", + "name": "Government Technology Agency of Singapore (GovTech)", + "identityProof": { + "identityProofType": "DNS-DID", + "identifier": "example.openattestation.com" + } + }, + "validFrom": "2021-03-08T12:00:00+08:00", + "credentialSubject": { + "id": "53b75bbe", + "recipient": { + "name": "Your Name 1", + "nric": "SXXXXXXXY", + "course": "Govtech Demo" + }, + "issuedOn": "2019-05-29T00:00:00+08:00", + "admissionDate": "2017-08-01T00:00:00+08:00", + "graduationDate": "2022-08-01T00:00:00+08:00", + "transcript": [ + { + "name": "Introduction to Programming", + "grade": "A+", + "courseCredit": "3", + "courseCode": "CS 1110", + "examinationDate": "2017-12-01T00:00:00+08:00", + "semester": "1" + }, + { + "name": "Object Oriented Programming in Java", + "grade": "A+", + "courseCredit": "4", + "courseCode": "CS 2110", + "examinationDate": "2017-12-01T00:00:00+08:00", + "semester": "1" + }, + { + "name": "Microeconomics", + "grade": "A+", + "courseCredit": "4", + "courseCode": "ECON 3030", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + }, + { + "name": "Macroeconomics", + "grade": "A", + "courseCredit": "4", + "courseCode": "ECON 3040", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + }, + { + "name": "Econometrics", + "grade": "A-", + "courseCredit": "4", + "courseCode": "ECON 3120", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + } + ], + "additionalData": { + "merit": "Y", + "studentId": "123456", + "transcriptId": "001", + "certSignatories": [ + { + "signature": "data:image/png;base64,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", + "name": "John Demo", + "position": "Dean of Demos", + "organisation": "Govtech" + } + ] + } + }, + "renderMethod": [ + { + "id": "https://demo-renderer.opencerts.io", + "type": "OpenAttestationEmbeddedRenderer", + "templateName": "GOVTECH_DEMO" + } + ], + "proof": { + "type": "OpenAttestationMerkleProofSignature2018", + "proofPurpose": "assertionMethod", + "targetHash": "d3ba170ed4bc65aa2a7701608be560c1cd5e15108dfe6e23864141d7fc8c55b4", + "proofs": [ + "a1463499397aa186a23de09fa3c8941322bbbd72f49c55480ee9e63a380bd055", + "e932efcccf278061c6f8b74c4728e8cd43bd259579e5205a1d3d73211cb8a1e2" + ], + "merkleRoot": "ba2299e80a18f46db2ab092981c0b8c9ea432a5fedc085a765a0ca1ee6b5893a", + "salts": "W3sidmFsdWUiOiJhM2UwNGIzNzYyZmZhODRhZjljMzgwZGQxODEyMmQxODUxNjg4MTUzOTE1MWEzNzg0OGJiMzVkZWYyMjE3MDJmIiwicGF0aCI6IkBjb250ZXh0WzBdIn0seyJ2YWx1ZSI6IjViOWFjZTAzOTk1MDk2Y2E4MDM4NGYwMDI0MDA0MmVmYTI4MjlmMTQxZWI5ZTViMzI1ZGExM2U0MWM4ZDcwNDMiLCJwYXRoIjoiQGNvbnRleHRbMV0ifSx7InZhbHVlIjoiMTM1ZWNhNTc4MTVmMGQ1NjU1ODRjOTk2MzMxZWQ2MTc5MWE3ZDczMTgxYzllOGU1OGZhODUzNjdkNmRkOWI1MyIsInBhdGgiOiJuYW1lIn0seyJ2YWx1ZSI6IjY2ODMwYjc0ZGRkYWNkZWJjMjRlNWU5YzQyZTAyYjgxNDdiNjdlNWQyMDJlNDc1MjUxMDUzYmQ2ZWZiNDJkYTkiLCJwYXRoIjoidHlwZVswXSJ9LHsidmFsdWUiOiIyNjA1ODYzNDJhYTZhMDU1NWZjMDBiZTcwMzk1MTQ4MTFjZjUxZGRlZWJkNTlmODhlZjM3MmE0MzQwMWE1NDg0IiwicGF0aCI6InR5cGVbMV0ifSx7InZhbHVlIjoiZjE3NzI3MTE3MWJlMDBmMzgyOGUxNzk2YjE0MTkyNDY5NGQ0MzM0MTcwMTA1MTkzZTI5Y2VkNmYyY2RmZjZmMiIsInBhdGgiOiJpc3N1ZXIuaWQifSx7InZhbHVlIjoiZTY2Y2Q1MDEwOGU1ZDg0Mjc0YTk4M2FiMDE0MGU2MGI0NTI3ZDQ2ZWE1NTc2N2I2YTA5NzY2ZTFlZDA4Zjk3ZSIsInBhdGgiOiJpc3N1ZXIudHlwZSJ9LHsidmFsdWUiOiJjMWMyOGU5OGYwODBmN2YzMzJkNjNjMmY5YTVkMDIxZjYwODIxMTFiOGZkNjFlOGY0ZTgwMWUwYWMwODc4NjhiIiwicGF0aCI6Imlzc3Vlci5uYW1lIn0seyJ2YWx1ZSI6IjM2NDQ5MjIyMDNhM2FhY2FiMmE3NGIzMDBkYTE3ZTJhZDcyNDc1YTBkZDgxZTViMTg2NzE0ZjBkYWUxYzY0MjAiLCJwYXRoIjoiaXNzdWVyLmlkZW50aXR5UHJvb2YuaWRlbnRpdHlQcm9vZlR5cGUifSx7InZhbHVlIjoiYjI5MjM2OTVmOTUzY2E0MjZkNWQyOGY0NWFlODQ1OWM5ZjU0ZTQxYWIyZTNhN2E0YjE2MWVmOWE5NDM4ZWVjOSIsInBhdGgiOiJpc3N1ZXIuaWRlbnRpdHlQcm9vZi5pZGVudGlmaWVyIn0seyJ2YWx1ZSI6IjgyODE5ODcwYzFhNGI3MGFjYzdmNjc3Nzg2OGQ5YzIzYjU3YTFkZjVkZTNjY2NhY2M2OTc1NjdkMGQ3ZjVlMGYiLCJwYXRoIjoidmFsaWRGcm9tIn0seyJ2YWx1ZSI6ImU4Y2M5OGUzMzI1NjkzNzkxOTRjMjhhNmRhYTZiMTRjYmMwNmM2NTk0OWYxODAyYjc3NzIwMjg2ZDM0YmE0NjciLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuaWQifSx7InZhbHVlIjoiZGMzMjE3ZGJkMmRjMTZjMGNkNjA2MGNiMjBlZWIyZmExZWJmNTkwNzU3NzhmYzAyYjU0MGU0MjliNWIyNDRiNyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5yZWNpcGllbnQubmFtZSJ9LHsidmFsdWUiOiJmMmE2MzNiMDdjOGIyNzQwMGJlZmE4NjhjZWNmYTE5YjZiZjhlYmVmNjU4OGY1MTFlNjU4ZWQyNDIyMDAyMjZkIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnJlY2lwaWVudC5ucmljIn0seyJ2YWx1ZSI6ImE0ZGQ2NjZlNDM1MTQ3YmE0OTM0M2FmYzA3OWExYWQ1MzZiMzNkNDFiYmY1MjE0ZWNhOTM4MjRiOGE1ZTYwOTYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QucmVjaXBpZW50LmNvdXJzZSJ9LHsidmFsdWUiOiJiNWY5YTE3ZjgzOTYzODdhZmI1NjM0OWJiYjA5YzgwNDY5NmQyNDkyNDgzMmM1YTEyYjE4ZjZiNjFjNzJkMmIwIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lmlzc3VlZE9uIn0seyJ2YWx1ZSI6IjUyYWFiYzAyYjMwZGY4ZGQ3NmZmOWZjODJkOWI5OTU1N2U0NmJmMjg0ZmMyY2ZjYjE5NzQwN2Y4ZDgwZGRkMGUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRtaXNzaW9uRGF0ZSJ9LHsidmFsdWUiOiIyN2RkMjY2NmRjOWM1YTAwZTFkNTgzZThhYzIzNjYzYmI2ZTkwZWVhMWFkODk0NDQyYzBmYzczY2E2Y2RlZTU4IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmdyYWR1YXRpb25EYXRlIn0seyJ2YWx1ZSI6IjM3YzIxYzg2NTA0OTRiMTk3MjI2MzBiZTFkZTY3ZGRiZTU4M2M4NjJkMmQxMDU3MTI0YjQzYTEyMGI4OWY3NzAiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5uYW1lIn0seyJ2YWx1ZSI6ImQ1YzExY2IzNDM1MGJkMzllNTA5ODdjNzEyMzg0MjU0YjIwNTIyOTRmOGQ0OWIzZGFhOWFhYmJmNjBmNzEzZTciLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5ncmFkZSJ9LHsidmFsdWUiOiI2Mzg0NTU1ZWI5ZTc5NDcxNmQ3ZTM0ZGMzNGVkZWRkMzhmYzgyMWQ4NjBjNjdlZjkyYjUwZWU4MmYyM2JiMDZhIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMF0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6IjJiOWFmNGY5YzM2OWU2OTJmZjJjOGFkOTFkOWI4N2QxYTY5MmE2MjM0M2U0YWU4Nzg1ZjczNmQ1NjM1MjBjZmYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6ImJiNWFlN2IzMjFmOWUwMDdmMWZmNTVjYmIzYzhhZDIwZGQ5OWQyZjUxY2M5YzNhNzNkMDk2YzhkYjA3YWU1YTkiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiOThmNTU2YzBmYzU5ZTAwY2EyMzNlYzQzYTkxMGY0MDIyZDAzODM3ZTBhMjc2NjExZThjNmJmMDI0MTBjMTZlYiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzBdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6ImRlMWJlNjQyMjBhNjc4YWQxZGU0NWIxYWQ4MjEyMWM5ZDFkNmIxMDg5YmJjYzQ4NjJiNzgxNjBlMTcxMGYxMjAiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5uYW1lIn0seyJ2YWx1ZSI6ImFkNDlkN2FiOGJlZDczZDZmMDdmOTNjZDNkYmE3ZTY5ODZjYmY5MTIyMDc3MjJmM2ZjNTRlYTgwZDBlNDNjZTUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5ncmFkZSJ9LHsidmFsdWUiOiIzNmJkYWMxM2E1NzljZTcxZDUzOTRmOTU4MzBjOWI5MjcxNjE0NTFhMWE2YmQxZGNmMjZkYjYxMzZlZDZjODlhIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMV0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6ImIzOTRhOWQ2ZDQ4OWE1YjQyOWM1YzI1MTFmZTZjMTA5NDIxN2MxZTE3MTk0ZjUxNDZiZDc1YzgyZGFiODRmYTUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6ImJhMjBmNTIxMTU3NDRmYmQwNWY1YTRlMTNhZjQxOTIxMWIyYzllZTE3YTM2YmI0Yzc5ODIwOGViNmZlNGJmYTAiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiYjM5NmQ3ZDkyM2EwOWViMjQwODdiNDJkMjAyYmZhZDQ5MmM3NTYxMzg0NWU4ZDI0YmU5ZDhiYjI1MmEwYzViOSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzFdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6IjVhZjQ0ZGYzN2U1YzA2OThmMDZiNGM3Yjg5NmJmYTczNmY1Y2E5NjU3NWM5ZTc5M2MzYjQ3MWMwNTBmNmVkMTkiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5uYW1lIn0seyJ2YWx1ZSI6IjU2OWE2MzQ0YjhmNDEzMTllYzQzMmRjODhjNTA2OTkwZjNlNmMxOGUwMGVjOGQxMDMyMGQ4NWU4YmM2MTZjOTEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5ncmFkZSJ9LHsidmFsdWUiOiJkZDJlY2IzODQ0ZmUxYzVjZTY4NWE2MDNjYmEzMTMyNGM0OGI3ZWMwNGUwYTJkMTkzNzVhMGM2YjRkMGZlZTM4IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMl0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6IjU5N2M4M2Q4YzM4ODg2ZDI2ZTFkZjA4MDlkYzg4MWI2ZjdkNjU4YTMyMmZiMmEyZjcyZDRiMzBjYzZkM2UzODIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6ImJhZTRlYjlmYWExOWYwYWUzMTI4ZmEzOWYyMTg2ZDEyMDFkZGJmOWZhNjg3M2E1MjYyZmQyZTc5ZDEzZjZhNjgiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiMWE3NGZkNzA0MTEyYWNkY2QzNGZkMTY3NWIxNGI1NjEyMTMyODk2MDQ4ODcwNWIzNjgxNDFmMDNkYjNkZDJmNCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzJdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6IjI2YzZjMDkyMDYzMWZjMWZiYWQzZTMyMzI1Mjc1ZjIyMzdlMDIyN2M2ZmFlNjRjYTNmYWY4ZDI2ZDA2ZWY0YTgiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5uYW1lIn0seyJ2YWx1ZSI6ImJiYWFmZmFmNTcxYzQwNTQxMzUwZThjYmRjOTY2OTFmOTZhOGJhOTIyMTBjZjU0YTZiNjg4ODUyYzEwZDM3NTEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5ncmFkZSJ9LHsidmFsdWUiOiI2ZDQyOWVhODJlOWQyOWMxNDMxNDNjOWJiODAzOGM3M2VkMWVkMTZhYjU1Y2NjN2Y1YjUwMzk1ZDg2OWE1MDY3IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbM10uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6IjllYjcyYTIxZDczNzE1NGQ5YTg3ZDQ5YjdlM2EzY2Q0MDI5N2NiNGY2ZmY1NWU3YTYxNWU1NDE5NjE3YTkyNGIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6IjBkNGNlOWY2ODc3NDU1M2E4MWJiNDgzODExMmNkNjBlY2QzMTU5MzRiMjgzZTA4MTU1YWE1ZmI5YTFkMjRkMjYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiYjhjZWVjMjM4MzY0YjRmOTM0OGIwMGI1NTU0ZDg1NDQ3MjMxNTI5OTdlM2ZmYTg4YmU4NmE5MmEwY2FlMDhiNiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzNdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6IjQ2N2RkYzFlMzcxNmIwZTZiMjc0MTRjMDY5YzdmZDcwZTM4YjdjNGFlNmMyMjhjOGQ2OWUwZWI2MDlmNDk1NzYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5uYW1lIn0seyJ2YWx1ZSI6IjlhOGQ4YTc0YTE4NmRmYmQ1Njc1ZDdjNjZjYjFmOWQ2YzcwNjU4NGJmMDgwMDJmYjQ2MmVkNGI5YWY1ZDU2NTkiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5ncmFkZSJ9LHsidmFsdWUiOiI1MDJlZTk0MjM5NTdmMmRiM2QxYzU3Y2U0NzE1NjA5ZjQ3OGUwMzI1OTBmNDZiM2VmOWFhN2ExYWEyMDQyZDQxIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbNF0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6IjVjYWZlZDk0MzU2ZmUzZjk3ZmY2YjBiN2M4MDEzYWY1Yzk5MWVjNjA3MTc3MGI5ZDRkN2Y2MDQ0Y2JmZDc5NmYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6Ijc4YWFhODU5MmJmODNlNGRmYTY5MGNlMTY0N2U1ZjNmZGNhZjUyY2I3YTY2NTg1ODI1ZDI5M2FiZDUwMzU1YzEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiMzQ3MzdkY2Q3ZDM5ZTlkZmQyYzQ3NjBkZWRiNzJmZGJiMzFhNTdkMzczM2FlOTc2ODBiYzRlNDBkZWEzYThlOCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzRdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6IjdlZjhkY2VkMzA5ZTg5MWE5NGIzZGFlMzY4MWUzZjYxZDgwMjYwZTJmNjY4ZmFjNzU2YzljYWM5MTMzYzA1ZDUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRkaXRpb25hbERhdGEubWVyaXQifSx7InZhbHVlIjoiYTg5OTRiZmE5MDI5MmY4NmM2MTFkYWIxMTczMTlmNWJkOGRjOTcyMGRhZTYxNjAzY2MxNWRiY2Q5MDM4ZmU5NSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5zdHVkZW50SWQifSx7InZhbHVlIjoiMGFlOTRiMTUyYjY1NmNlNDg1NjRhNzU3YzdhMDQzMzljMmY5NTRlNzg4MWNjMjZjZGEzMWExY2RkY2RkMTk1YiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS50cmFuc2NyaXB0SWQifSx7InZhbHVlIjoiYmYzMGRhMmRjZjg4NGRlYmMxZjE2NjZjZmRlOWQ1NzI0NTQwYWY5ZDI0NWRjODkxYTdkZGFlMjcwMzBjMzE0ZCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0uc2lnbmF0dXJlIn0seyJ2YWx1ZSI6ImU4OTkwNmE5MDUzMTI3YjEzODFmODQ5NjhhZjIzMTU3ZjE4ZTZjOWRkNWJjMDM4ZWQzZmUxMjIzMWYzNWZiMzAiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRkaXRpb25hbERhdGEuY2VydFNpZ25hdG9yaWVzWzBdLm5hbWUifSx7InZhbHVlIjoiOGZiZGE3MmU3OWIxN2FhNDZjYTY1YzY3ODU0ZDYxNzA3ZWViNjViNThjNTI0ZDZmOTFhNDA5MDg5ZmY1Yzg0YSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0ucG9zaXRpb24ifSx7InZhbHVlIjoiNmEzMTM0N2RjN2NhNTAxMWQzMDAyYWNhNjMyY2QwYWFlM2IzOTlmMWZkNjRhNjliZjdkODY3MjJlN2RlM2VjMyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0ub3JnYW5pc2F0aW9uIn0seyJ2YWx1ZSI6Ijc1ZTY4M2NmZTNhOWI4ZDMzNGRmZDcwNWUzOTAzZTBkNjI4MTY0YTU3YmVlOGI4ODRjM2E2NzUwZjM5NWVjMDQiLCJwYXRoIjoicmVuZGVyTWV0aG9kWzBdLmlkIn0seyJ2YWx1ZSI6IjBmYzdjZjU0YzYxNzRlZTIxNzliOGY3ZmE4YWY0MjVjMjA0MmNmM2NjN2Y0Njc5MGYyYWI3NWMyOTVkMzNhOWIiLCJwYXRoIjoicmVuZGVyTWV0aG9kWzBdLnR5cGUifSx7InZhbHVlIjoiYWVlNGJlNGRhNTY2YzM3YjE2ZTk0NTAyYzExN2EwOGYwYTEzYTZkN2QzNWFmOTIwYmZjOTQ3YzkzMDM2ZTVmZSIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0udGVtcGxhdGVOYW1lIn1d", + "privacy": { + "obfuscated": [] + }, + "key": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733#controller", + "signature": "0x2ac411517c62b89adcb01dbbc3f5c930be9803cb60cce4990deea3aa40f44ae03fe3da39ff94180909e70bfff2b55f0a3a8aeec4eef33d3565e2f0ccc3f572561c" + } +} diff --git a/src/integration/v4/fixtures/v4_data_obfuscated.json b/src/integration/v4/fixtures/v4_data_obfuscated.json new file mode 100644 index 000000000..86c52256e --- /dev/null +++ b/src/integration/v4/fixtures/v4_data_obfuscated.json @@ -0,0 +1,108 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://schemata.openattestation.com/com/openattestation/4.0/alpha-context.json" + ], + "name": "Govtech Demo Certificate V4", + "type": [ + "VerifiableCredential", + "OpenAttestationCredential" + ], + "issuer": { + "id": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733", + "type": "OpenAttestationIssuer", + "name": "Government Technology Agency of Singapore (GovTech)", + "identityProof": { + "identityProofType": "DNS-DID", + "identifier": "example.openattestation.com" + } + }, + "validFrom": "2021-03-08T12:00:00+08:00", + "credentialSubject": { + "id": "53b75bbe", + "recipient": { + "name": "Your Name", + "nric": "SXXXXXXXY", + "course": "Govtech Demo" + }, + "issuedOn": "2019-05-29T00:00:00+08:00", + "admissionDate": "2017-08-01T00:00:00+08:00", + "graduationDate": "2022-08-01T00:00:00+08:00", + "transcript": [ + { + "name": "Introduction to Programming", + "courseCode": "CS 1110", + "examinationDate": "2017-12-01T00:00:00+08:00" + }, + { + "name": "Object Oriented Programming in Java", + "grade": "A+", + "courseCredit": "4", + "courseCode": "CS 2110", + "examinationDate": "2017-12-01T00:00:00+08:00", + "semester": "1" + }, + { + "name": "Microeconomics", + "grade": "A+", + "courseCredit": "4", + "courseCode": "ECON 3030", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + }, + { + "name": "Macroeconomics", + "grade": "A", + "courseCredit": "4", + "courseCode": "ECON 3040", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + }, + { + "name": "Econometrics", + "grade": "A-", + "courseCredit": "4", + "courseCode": "ECON 3120", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + } + ], + "additionalData": { + "merit": "Y", + "studentId": "123456", + "transcriptId": "001", + "certSignatories": [ + { + "signature": "data:image/png;base64,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", + "name": "John Demo", + "position": "Dean of Demos", + "organisation": "Govtech" + } + ] + } + }, + "proof": { + "type": "OpenAttestationMerkleProofSignature2018", + "proofPurpose": "assertionMethod", + "targetHash": "1da50a7166985f20ea2f620bb4a753ad09b84c95ef6f33ce9270695e6ff117c2", + "proofs": [], + "merkleRoot": "1da50a7166985f20ea2f620bb4a753ad09b84c95ef6f33ce9270695e6ff117c2", + "salts": "W3sidmFsdWUiOiIxZmQ2MmIyYjJkYTc0ZGRiZjAwNjAwYzM3NDVjNTBjNGEyNTljOWJhODc5YzY0NTZjNTQ0ZTRiNzBmZmU3NjIyIiwicGF0aCI6IkBjb250ZXh0WzBdIn0seyJ2YWx1ZSI6ImZhZmMzOGJiMDYzMjBhNjUyYzg3YmE4ZGM2MTRmMzg4Yjc0OTRkMDVkOWU0MTg0YmY1MDNjN2E0YmQ2NDk3YTMiLCJwYXRoIjoiQGNvbnRleHRbMV0ifSx7InZhbHVlIjoiZDgxODlmNWM4ZGUzMDc4ZGVmNGE4ODFlNTI1YzNkZjhmNjgwMjZkMGIwZTA3ZGRkOWNiODlkMzJkYTJmMDg2OCIsInBhdGgiOiJuYW1lIn0seyJ2YWx1ZSI6IjI1NzQ0N2I3ZDY3ZDNiMzJiMGZjZmVjOGYzMWRmOWFlMjNkYWJhYmJkNjZjMzE5M2ExOTkwZDkwOGE4M2NhM2IiLCJwYXRoIjoidHlwZVswXSJ9LHsidmFsdWUiOiI1MDdiOGJkOTEyYzgwYjFhNTliN2MwMzFjNWRiNGU4ODhlNDg2YjMyOWUzMGFjYTFmN2M2OTg2NzY1MGY5OTFiIiwicGF0aCI6InR5cGVbMV0ifSx7InZhbHVlIjoiM2Q3MzUxY2U3MTVjZjYyOGMxZDk0MWU3YzNhYmY3Njk1NDE3ZmZiODZjMmJlNGU4NmQ1ZWM0NmFmMDI0ZWMxZCIsInBhdGgiOiJpc3N1ZXIuaWQifSx7InZhbHVlIjoiOWRmZGM1MWFkZTRlMGI1YjdlYmZlMjBhOGNlOTg0NjFhNDE2YTE4MDM3ZDgzNmQ1ZWRmY2Y3Zjg1YjFlM2FmNCIsInBhdGgiOiJpc3N1ZXIudHlwZSJ9LHsidmFsdWUiOiJjNmU2MzNkMmY2NDRjNDEwNWZhMGE3ZTYwZmQzZTk5NmZhNzI4ZjI2NGVhMzljNjUzNjY5ZjJkM2ViNjIxZTcxIiwicGF0aCI6Imlzc3Vlci5uYW1lIn0seyJ2YWx1ZSI6IjBmZmJiZjFjNTExNWZiNTQ3MGJjNjQwMWFkMTlkYTdmMDNlYjEyNTI2NTY2YzQ3ZWIwNGViZDlkNzQ3NjNlNWIiLCJwYXRoIjoiaXNzdWVyLmlkZW50aXR5UHJvb2YuaWRlbnRpdHlQcm9vZlR5cGUifSx7InZhbHVlIjoiMWJkYjdmNzFhNzE0ZjZiZTUxMWVkOTJjM2U3M2EwMTM1YWI0NDE0OTY2ZTllOGZiNTA1YzJkOThjMWE0NDMxZCIsInBhdGgiOiJpc3N1ZXIuaWRlbnRpdHlQcm9vZi5pZGVudGlmaWVyIn0seyJ2YWx1ZSI6IjkwOGJkMzU2NmViNTU3MmM1ZTg2YjU0NzJmMzAxNzI0N2M4NmNmYjcxNDA2ODkyMTY0ZDUzY2U3NzQ0ZDBkMTciLCJwYXRoIjoidmFsaWRGcm9tIn0seyJ2YWx1ZSI6IjQ2ZGMwM2Y2N2E2ZGI1M2VhOGUwNzNkOGU2NDYzYmU0ZmE5ODBmODdmNzBkZjExZjczODBjZDc5YzI3MmQyZTgiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuaWQifSx7InZhbHVlIjoiMjZjZDk5MGRiOTc5ZmNlN2I3YzQ1NDhhYmIyMjU4NTJhNjJhOTVmNmM5ZjM5NDEwNTRiOGJkNjkwOWZhOWI1YyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5yZWNpcGllbnQubmFtZSJ9LHsidmFsdWUiOiI2ZjU3MGZjMjUwMmEzZDcwMzFhODRlM2JlOGYyNGQwNDNkMzMwYTdhYjBhOGJmYTRlZTMzZDc3NDBhZWU0ZGMwIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnJlY2lwaWVudC5ucmljIn0seyJ2YWx1ZSI6ImJlY2RiNWM2ZWM5ZjQxMWEwM2YxYmMxYmY4ZjQ2ODNmMTM3NDY5NDJhYTZiNWE0YzYyODNhYWRiOTNiNTk0ODUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QucmVjaXBpZW50LmNvdXJzZSJ9LHsidmFsdWUiOiJhOTNiNTUyZjI2YTkzYWNjNGJmZDRjZjUyNGExZjVmZTQ0NDMxN2MwNmJmODRmNTQwMmJkNmE2ZjYxNTE3MWNjIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lmlzc3VlZE9uIn0seyJ2YWx1ZSI6IjE0MmZhMGZkOWQ4NzE5NzVjYmJmN2I4ZWMzYzQyZmEzYzYzOGUxZTA5MzM4ZDA4Y2NlZTVjZmQ5OTQyZjFkNmYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRtaXNzaW9uRGF0ZSJ9LHsidmFsdWUiOiJiNmMwNTNmOGNkOGMwNGJhN2EyZTEzNzg0MmRlN2ExN2MyYmM0NDExYjY3MmUyNjlmNzU5MDQ2YTI4MzU2NmI0IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmdyYWR1YXRpb25EYXRlIn0seyJ2YWx1ZSI6IjBlZTE1MGFhMDc2M2I4MzM2ZjRiZDYwODQwZWViNWIyZjM1NzE3ZDdkMGI1MmViOTRiYzBkM2RhZWI5Y2M1MjYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5uYW1lIn0seyJ2YWx1ZSI6IjQ4Y2FkY2QzMWJiZGIwYjc5MWE1OGI4ZTExODhkOWZlYmU2NDE4NDYxYjZlMDJhZmY1MTU2Njg3YmYxNjI1YzciLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6Ijk2MDg0MDI0Nzc5MTRkNDEzYmY4ZTVlM2YwNmZiZDBhNTdjOTNjYmU3MDgyMDQyNjVmNGRkOGRhNTUzYWQ1YmEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiNWQzODhlNWNkMTUwNDVhYTcxMDBmNDUxMWZmZmM5YTQwYjE2N2MxMDZjY2JhYzliN2UxYjQ1NWE0ZmVkOGU0MSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzFdLm5hbWUifSx7InZhbHVlIjoiNTUxM2JmNmQ3MTE2NmM0M2M4ODYyMGNmOWY4MTFjZTZkZTY3YmJiZmM3Y2YyMWRhNzFkMWIxNmY4YTA5M2QyMiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzFdLmdyYWRlIn0seyJ2YWx1ZSI6ImQ1NTFkOWM5MWY1OTA5OWFiYzQyOWY3MDZhZmEyZTU4NGVmZGQ2NTM0OWZhYjAxMTJiZTE4NDYyZDk3NTQzZTUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5jb3Vyc2VDcmVkaXQifSx7InZhbHVlIjoiYTEyYTc4N2RmZjk4ZmFkNzNjOWQ3ODQ3ZTU0NzRlMTQ2NGRmNjVmNDQ4YzVmODNlNzE3MDJiNjNlMGUyZmNhNiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzFdLmNvdXJzZUNvZGUifSx7InZhbHVlIjoiNzE1MTY5MjY1NjliYjU1OGI1NGFjMDI1NmNiOWIxNTM0NTdlZTFiN2M1MGQ2M2JkZTg3MmFhNzMzZDdiNTM2NCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzFdLmV4YW1pbmF0aW9uRGF0ZSJ9LHsidmFsdWUiOiI0ZDhlNmIxOTFkZTljYjljYjQxNWY5YTAxZGY1NWExODc5Nzc4ZTNiYmIyNjBkMzBmODI5OWZmOTQ4Y2YxMDg1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMV0uc2VtZXN0ZXIifSx7InZhbHVlIjoiM2M1ZTIyODRjZTU5MzNkNjEyMTc0MTVjNzhmZWJiMjk4NmM1ZWEwYWRmNmU4Mzg2MTU4YjkyYjFjYWRjM2I5OCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzJdLm5hbWUifSx7InZhbHVlIjoiZTZhYjdiZjEwOGQ2NWIxNjUzOWZhZWJkMGE3NWU0OTk1Y2QwZmNmYjg4MWJkZDQ0NWYxODMzN2ZlMTg0MTJhMyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzJdLmdyYWRlIn0seyJ2YWx1ZSI6IjNhM2ZmNzdkMTM5M2EyZTczNmJiYjc2Y2U2NGJiZDQzMDdmZGE3Zjg3ODI5OGY3N2NmOWRiNmRhYzlmZDJkZTQiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5jb3Vyc2VDcmVkaXQifSx7InZhbHVlIjoiYzAyNzMwOGM5ZTdlMWY3ZjIxZWVlYzA3MzdkODNhMGYyNjgyNmIzMTRlOTI4MmRlMDUyMWY3YWQ2OWQyMjQ1NSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzJdLmNvdXJzZUNvZGUifSx7InZhbHVlIjoiOWFjNjdiZDc5YzMxODliNGI3OTA0Y2ZkZTI0NmY5YzA4MzA2OTdmNzcxYTNkOThiZWM3YjExNjFhYjRlMDVkMSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzJdLmV4YW1pbmF0aW9uRGF0ZSJ9LHsidmFsdWUiOiIxZDkxOTRmODQxNmYyMDkxOWYzOGRiMTRjM2IxZDhjYzBjMzgxMjE4NTRhYjYxNzZhZDg0YmY0MjBjNjE5MTJhIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMl0uc2VtZXN0ZXIifSx7InZhbHVlIjoiYjM4OGFlYjI5ODU4M2JhNmUxNDY2ZmU0NzVkZDRhM2RkYzgzZmYxNjcwYzI1YjYzMjE3NWUyZjNmMmU1NTRmZSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzNdLm5hbWUifSx7InZhbHVlIjoiYTJmZTZiMjBjZjBlOTEwMmZmZWY3MzkwNGFhMzc0MTBiZDNiY2Y4MWNiNDM5MDI2YTIwYWM2NDRkMWExMTBkMSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzNdLmdyYWRlIn0seyJ2YWx1ZSI6ImQyYWZhNWY5NDc0ZDQ2NjIzNDI5NjlkOGViNGUxMGQ3NDkzODEwM2ZjMjU0ZDBkZGE4MDQ3ZTQ5NGVjZWNmOGYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5jb3Vyc2VDcmVkaXQifSx7InZhbHVlIjoiYTk0MWU1ZDdkYWJhMDY4M2NkZWFlM2JlYWUzYmI2ZmEyMjk3ZmMzYmUzNGY4YTZiZDhmNGJmODc5ZjM1YzQ2ZiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzNdLmNvdXJzZUNvZGUifSx7InZhbHVlIjoiMzBhN2E0ODU4NTY0NGQwYmRkZGZmYWNmYjk3NWEyMmY3YmM2M2YxNTQzNjJkYTJhMDQ0NTNkYWE3NzM2ZGEyZCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzNdLmV4YW1pbmF0aW9uRGF0ZSJ9LHsidmFsdWUiOiI5ZjMwZWQ5OTg4MTUxNDMwZmY5MDI4YWNjNGNhODUxZGVlYjEzMmYwNjI0ZDlmNjg4Y2NkM2Y0MGE0OTkwZDMxIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbM10uc2VtZXN0ZXIifSx7InZhbHVlIjoiY2ZlMDQ3YTc5ZmQ1ZTU3YWFlMWEyZmM2MGVlYzBhYWE5Yzg3MDZiYWZhY2Q0OGUwNTBhNzFlYjhjZjdkOWZhYiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzRdLm5hbWUifSx7InZhbHVlIjoiMGQzN2ZiZTQ0OWU5Y2IxNjE3NTRmYmIzZjFiMmZiZDYxZGZhY2EzNjFjYTk1MDk2MzAzZTcwZjZkOWUxMTlhMiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzRdLmdyYWRlIn0seyJ2YWx1ZSI6IjIzMWEzMTgxMWY4MGMzMTA4NWNmNmYyMTA3NTE1ZGViMTc3OThiZjFjMTQ1MDE1OGE2MDNhM2VjMzJkMjkxOTAiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5jb3Vyc2VDcmVkaXQifSx7InZhbHVlIjoiYjNjYTZlZDZkMTk5ZDFlMmQxMmU2ZTQwZWI5M2Q2ZGUwZDRlNTc3OTk4ZjNkY2M5YTk2NzcyOTFiNDQ2NWNkMSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzRdLmNvdXJzZUNvZGUifSx7InZhbHVlIjoiYTA0NGUzNjJiMTY5MWJmYWNmYTAyZTlhN2RmMWRmODgxZWYwN2M5YzVjMzQyOTBkZTIwMDgyYzZjYjI3N2RhMCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzRdLmV4YW1pbmF0aW9uRGF0ZSJ9LHsidmFsdWUiOiJlNzQ1ZmVhMDJmZDkwOWMwMDA2OGMxZTliNTM1NTcxYTYxOWI1MzdjMzJlMjc5N2I3ZjM5ZWNlYmU4OTVjMDZjIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbNF0uc2VtZXN0ZXIifSx7InZhbHVlIjoiOTQxOThhNTE3NWYzODg4ZmFjYjM3ODY1MDBmM2I0YzM1YmViZWI2OWNkZmM1OTgxM2RlODA1YWFhOTNkNGU3NSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5tZXJpdCJ9LHsidmFsdWUiOiI5ZTY4YWNjZDAxNTVmNzA3N2ZjOWQxMzE2NmFiNmVkM2Q3ZTZhZjJiYjQ1YzQ3MjBhNDRiZmYwYmM3ZjU3NmU0IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFkZGl0aW9uYWxEYXRhLnN0dWRlbnRJZCJ9LHsidmFsdWUiOiI2NWNmNTA4ZGFlMTE2ZDc1MWNjYzczY2E4ZGVlZWM3YmFmZmY5Yzk4MjE3MTI0NzExMGE5YThhMmI3YjMxYWZjIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFkZGl0aW9uYWxEYXRhLnRyYW5zY3JpcHRJZCJ9LHsidmFsdWUiOiI2NmIxNThhZjQyNTljOTNhMjYzNDFmMTAxMzkyZGE1ODkwNmQ5NDZhNmM4ZmM1MGIwODNlYjJhNTY2ZWNkNDhmIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFkZGl0aW9uYWxEYXRhLmNlcnRTaWduYXRvcmllc1swXS5zaWduYXR1cmUifSx7InZhbHVlIjoiZTdjNWJiYzFkYzdhYWNiZjZjMmEwMGQ2Y2I5MTQ5NDk5YmVmMzg5YjRkZjU3MGQ4M2JlZTdjOTA2ODhlMTAwZSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0ubmFtZSJ9LHsidmFsdWUiOiIyYmEyNGUyOTcyMjQ2ZTU2MzkwZjBlYmQyM2ZiMzNmMGZmMjVjNjBlMDU3ZWJiYmU2N2ZlMDEwYTFjZTY4MDQ2IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFkZGl0aW9uYWxEYXRhLmNlcnRTaWduYXRvcmllc1swXS5wb3NpdGlvbiJ9LHsidmFsdWUiOiI0ZGU2OTcwMjM3NTM0NjkxMjIyMGVlNGU4OTU0YTEwZGJlYzEwZjYyYjdkOWIxNGRiMmE1MjUzZmFlMDNmMjIyIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFkZGl0aW9uYWxEYXRhLmNlcnRTaWduYXRvcmllc1swXS5vcmdhbmlzYXRpb24ifSx7InZhbHVlIjoiNDE2MjdiMzQzNTFhMTFiZmU1NGExZGRmYmY1M2U3MTQ5MmVmMTY3OTM4MDFiMjQ4MzJhZjVjMzFjMWM5NzlkYiIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0uaWQifSx7InZhbHVlIjoiOTcyOWY4YmVkMzUzOGYwNTk3NTU4ZmI0YmFmMmUyZGFhNGQwZjcwNmEyMjg2MDdlOTliOTM4OTI0ZjFkOTQ3ZCIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0udHlwZSJ9LHsidmFsdWUiOiIwYjIzZDUxYzhhN2ZmMTAzNDAzMDFjNDg3YWVjZDI1MmY3NWJmNGQwZjY1Y2U1ZDFhYTIxZDliNzEzNTNiZTgyIiwicGF0aCI6InJlbmRlck1ldGhvZFswXS50ZW1wbGF0ZU5hbWUifV0=", + "privacy": { + "obfuscated": [ + "7e9a8fda1f0bb8511070ef105896301e9f7d4e827ce31aafcf72cdeb0dd77653", + "c6182de606c55943e846a692cf3cf857df601e2887333f1ba611e35a79c53439", + "1ffab33bf351271252b4d223caf171829cc3a376423a8d75b6176d985a56cfbf" + ] + }, + "key": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733#controller", + "signature": "0xf744e39fe8968cfdc280378f8703e80b374958d0d5948615a21eea4d95988b163965c08c9a01ea7d6f1c5ac652b2a31b9109cf7bf1b54b395544f4d931d9489a1b" + }, + "renderMethod": [ + { + "id": "https://demo-renderer.opencerts.io", + "type": "OpenAttestationEmbeddedRenderer", + "templateName": "GOVTECH_DEMO" + } + ] +} \ No newline at end of file diff --git a/src/integration/v4/fixtures/v4_embedded_renderer.json b/src/integration/v4/fixtures/v4_embedded_renderer.json new file mode 100644 index 000000000..36313874f --- /dev/null +++ b/src/integration/v4/fixtures/v4_embedded_renderer.json @@ -0,0 +1,104 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://schemata.openattestation.com/com/openattestation/4.0/alpha-context.json" + ], + "name": "Govtech Demo Certificate V4", + "type": ["VerifiableCredential", "OpenAttestationCredential"], + "issuer": { + "id": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733", + "type": "OpenAttestationIssuer", + "name": "Government Technology Agency of Singapore (GovTech)", + "identityProof": { + "identityProofType": "DNS-DID", + "identifier": "example.openattestation.com" + } + }, + "validFrom": "2021-03-08T12:00:00+08:00", + "credentialSubject": { + "id": "53b75bbe", + "recipient": { + "name": "Your Name", + "nric": "SXXXXXXXY", + "course": "Govtech Demo" + }, + "issuedOn": "2019-05-29T00:00:00+08:00", + "admissionDate": "2017-08-01T00:00:00+08:00", + "graduationDate": "2022-08-01T00:00:00+08:00", + "transcript": [ + { + "name": "Introduction to Programming", + "grade": "A+", + "courseCredit": "3", + "courseCode": "CS 1110", + "examinationDate": "2017-12-01T00:00:00+08:00", + "semester": "1" + }, + { + "name": "Object Oriented Programming in Java", + "grade": "A+", + "courseCredit": "4", + "courseCode": "CS 2110", + "examinationDate": "2017-12-01T00:00:00+08:00", + "semester": "1" + }, + { + "name": "Microeconomics", + "grade": "A+", + "courseCredit": "4", + "courseCode": "ECON 3030", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + }, + { + "name": "Macroeconomics", + "grade": "A", + "courseCredit": "4", + "courseCode": "ECON 3040", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + }, + { + "name": "Econometrics", + "grade": "A-", + "courseCredit": "4", + "courseCode": "ECON 3120", + "examinationDate": "2018-05-01T00:00:00+08:00", + "semester": "2" + } + ], + "additionalData": { + "merit": "Y", + "studentId": "123456", + "transcriptId": "001", + "certSignatories": [ + { + "signature": "data:image/png;base64,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", + "name": "John Demo", + "position": "Dean of Demos", + "organisation": "Govtech" + } + ] + } + }, + "renderMethod": [ + { + "id": "https://demo-renderer.opencerts.io", + "type": "OpenAttestationEmbeddedRenderer", + "templateName": "GOVTECH_DEMO" + } + ], + "proof": { + "type": "OpenAttestationMerkleProofSignature2018", + "proofPurpose": "assertionMethod", + "targetHash": "1da50a7166985f20ea2f620bb4a753ad09b84c95ef6f33ce9270695e6ff117c2", + "proofs": [], + "merkleRoot": "1da50a7166985f20ea2f620bb4a753ad09b84c95ef6f33ce9270695e6ff117c2", + "salts": "W3sidmFsdWUiOiIxZmQ2MmIyYjJkYTc0ZGRiZjAwNjAwYzM3NDVjNTBjNGEyNTljOWJhODc5YzY0NTZjNTQ0ZTRiNzBmZmU3NjIyIiwicGF0aCI6IkBjb250ZXh0WzBdIn0seyJ2YWx1ZSI6ImZhZmMzOGJiMDYzMjBhNjUyYzg3YmE4ZGM2MTRmMzg4Yjc0OTRkMDVkOWU0MTg0YmY1MDNjN2E0YmQ2NDk3YTMiLCJwYXRoIjoiQGNvbnRleHRbMV0ifSx7InZhbHVlIjoiZDgxODlmNWM4ZGUzMDc4ZGVmNGE4ODFlNTI1YzNkZjhmNjgwMjZkMGIwZTA3ZGRkOWNiODlkMzJkYTJmMDg2OCIsInBhdGgiOiJuYW1lIn0seyJ2YWx1ZSI6IjI1NzQ0N2I3ZDY3ZDNiMzJiMGZjZmVjOGYzMWRmOWFlMjNkYWJhYmJkNjZjMzE5M2ExOTkwZDkwOGE4M2NhM2IiLCJwYXRoIjoidHlwZVswXSJ9LHsidmFsdWUiOiI1MDdiOGJkOTEyYzgwYjFhNTliN2MwMzFjNWRiNGU4ODhlNDg2YjMyOWUzMGFjYTFmN2M2OTg2NzY1MGY5OTFiIiwicGF0aCI6InR5cGVbMV0ifSx7InZhbHVlIjoiM2Q3MzUxY2U3MTVjZjYyOGMxZDk0MWU3YzNhYmY3Njk1NDE3ZmZiODZjMmJlNGU4NmQ1ZWM0NmFmMDI0ZWMxZCIsInBhdGgiOiJpc3N1ZXIuaWQifSx7InZhbHVlIjoiOWRmZGM1MWFkZTRlMGI1YjdlYmZlMjBhOGNlOTg0NjFhNDE2YTE4MDM3ZDgzNmQ1ZWRmY2Y3Zjg1YjFlM2FmNCIsInBhdGgiOiJpc3N1ZXIudHlwZSJ9LHsidmFsdWUiOiJjNmU2MzNkMmY2NDRjNDEwNWZhMGE3ZTYwZmQzZTk5NmZhNzI4ZjI2NGVhMzljNjUzNjY5ZjJkM2ViNjIxZTcxIiwicGF0aCI6Imlzc3Vlci5uYW1lIn0seyJ2YWx1ZSI6IjBmZmJiZjFjNTExNWZiNTQ3MGJjNjQwMWFkMTlkYTdmMDNlYjEyNTI2NTY2YzQ3ZWIwNGViZDlkNzQ3NjNlNWIiLCJwYXRoIjoiaXNzdWVyLmlkZW50aXR5UHJvb2YuaWRlbnRpdHlQcm9vZlR5cGUifSx7InZhbHVlIjoiMWJkYjdmNzFhNzE0ZjZiZTUxMWVkOTJjM2U3M2EwMTM1YWI0NDE0OTY2ZTllOGZiNTA1YzJkOThjMWE0NDMxZCIsInBhdGgiOiJpc3N1ZXIuaWRlbnRpdHlQcm9vZi5pZGVudGlmaWVyIn0seyJ2YWx1ZSI6IjkwOGJkMzU2NmViNTU3MmM1ZTg2YjU0NzJmMzAxNzI0N2M4NmNmYjcxNDA2ODkyMTY0ZDUzY2U3NzQ0ZDBkMTciLCJwYXRoIjoidmFsaWRGcm9tIn0seyJ2YWx1ZSI6IjQ2ZGMwM2Y2N2E2ZGI1M2VhOGUwNzNkOGU2NDYzYmU0ZmE5ODBmODdmNzBkZjExZjczODBjZDc5YzI3MmQyZTgiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuaWQifSx7InZhbHVlIjoiMjZjZDk5MGRiOTc5ZmNlN2I3YzQ1NDhhYmIyMjU4NTJhNjJhOTVmNmM5ZjM5NDEwNTRiOGJkNjkwOWZhOWI1YyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5yZWNpcGllbnQubmFtZSJ9LHsidmFsdWUiOiI2ZjU3MGZjMjUwMmEzZDcwMzFhODRlM2JlOGYyNGQwNDNkMzMwYTdhYjBhOGJmYTRlZTMzZDc3NDBhZWU0ZGMwIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnJlY2lwaWVudC5ucmljIn0seyJ2YWx1ZSI6ImJlY2RiNWM2ZWM5ZjQxMWEwM2YxYmMxYmY4ZjQ2ODNmMTM3NDY5NDJhYTZiNWE0YzYyODNhYWRiOTNiNTk0ODUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QucmVjaXBpZW50LmNvdXJzZSJ9LHsidmFsdWUiOiJhOTNiNTUyZjI2YTkzYWNjNGJmZDRjZjUyNGExZjVmZTQ0NDMxN2MwNmJmODRmNTQwMmJkNmE2ZjYxNTE3MWNjIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lmlzc3VlZE9uIn0seyJ2YWx1ZSI6IjE0MmZhMGZkOWQ4NzE5NzVjYmJmN2I4ZWMzYzQyZmEzYzYzOGUxZTA5MzM4ZDA4Y2NlZTVjZmQ5OTQyZjFkNmYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRtaXNzaW9uRGF0ZSJ9LHsidmFsdWUiOiJiNmMwNTNmOGNkOGMwNGJhN2EyZTEzNzg0MmRlN2ExN2MyYmM0NDExYjY3MmUyNjlmNzU5MDQ2YTI4MzU2NmI0IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmdyYWR1YXRpb25EYXRlIn0seyJ2YWx1ZSI6IjBlZTE1MGFhMDc2M2I4MzM2ZjRiZDYwODQwZWViNWIyZjM1NzE3ZDdkMGI1MmViOTRiYzBkM2RhZWI5Y2M1MjYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5uYW1lIn0seyJ2YWx1ZSI6IjI5MmVhYzQwMzJhY2RhMTc1OGM0YzQ2ZWJmOGU4NTE1YzhiMWI2ODMxNjlmNDJlODViYWI1YzE4YmNkNWJiZjciLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5ncmFkZSJ9LHsidmFsdWUiOiI0Yzc0NTcwNmY2Zjc5YTQ5ODdiZjg3YjFjZjUzYzUxOTAyNTMxNDE5ZjAzNzhkNGE1YTAxMjRkY2YzYmVhN2NmIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMF0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6IjQ4Y2FkY2QzMWJiZGIwYjc5MWE1OGI4ZTExODhkOWZlYmU2NDE4NDYxYjZlMDJhZmY1MTU2Njg3YmYxNjI1YzciLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6Ijk2MDg0MDI0Nzc5MTRkNDEzYmY4ZTVlM2YwNmZiZDBhNTdjOTNjYmU3MDgyMDQyNjVmNGRkOGRhNTUzYWQ1YmEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFswXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiOTQ3ODZmZmUyZTdkZWE1ODUxMGVhOTEzZTk4ZWZmZWNiZGUyMmRhZmY3ODUxMmNlZjExY2ZkMDljMzM3YzJmMSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzBdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6IjVkMzg4ZTVjZDE1MDQ1YWE3MTAwZjQ1MTFmZmZjOWE0MGIxNjdjMTA2Y2NiYWM5YjdlMWI0NTVhNGZlZDhlNDEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5uYW1lIn0seyJ2YWx1ZSI6IjU1MTNiZjZkNzExNjZjNDNjODg2MjBjZjlmODExY2U2ZGU2N2JiYmZjN2NmMjFkYTcxZDFiMTZmOGEwOTNkMjIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5ncmFkZSJ9LHsidmFsdWUiOiJkNTUxZDljOTFmNTkwOTlhYmM0MjlmNzA2YWZhMmU1ODRlZmRkNjUzNDlmYWIwMTEyYmUxODQ2MmQ5NzU0M2U1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMV0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6ImExMmE3ODdkZmY5OGZhZDczYzlkNzg0N2U1NDc0ZTE0NjRkZjY1ZjQ0OGM1ZjgzZTcxNzAyYjYzZTBlMmZjYTYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6IjcxNTE2OTI2NTY5YmI1NThiNTRhYzAyNTZjYjliMTUzNDU3ZWUxYjdjNTBkNjNiZGU4NzJhYTczM2Q3YjUzNjQiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsxXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiNGQ4ZTZiMTkxZGU5Y2I5Y2I0MTVmOWEwMWRmNTVhMTg3OTc3OGUzYmJiMjYwZDMwZjgyOTlmZjk0OGNmMTA4NSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzFdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6IjNjNWUyMjg0Y2U1OTMzZDYxMjE3NDE1Yzc4ZmViYjI5ODZjNWVhMGFkZjZlODM4NjE1OGI5MmIxY2FkYzNiOTgiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5uYW1lIn0seyJ2YWx1ZSI6ImU2YWI3YmYxMDhkNjViMTY1MzlmYWViZDBhNzVlNDk5NWNkMGZjZmI4ODFiZGQ0NDVmMTgzMzdmZTE4NDEyYTMiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5ncmFkZSJ9LHsidmFsdWUiOiIzYTNmZjc3ZDEzOTNhMmU3MzZiYmI3NmNlNjRiYmQ0MzA3ZmRhN2Y4NzgyOThmNzdjZjlkYjZkYWM5ZmQyZGU0IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbMl0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6ImMwMjczMDhjOWU3ZTFmN2YyMWVlZWMwNzM3ZDgzYTBmMjY4MjZiMzE0ZTkyODJkZTA1MjFmN2FkNjlkMjI0NTUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6IjlhYzY3YmQ3OWMzMTg5YjRiNzkwNGNmZGUyNDZmOWMwODMwNjk3Zjc3MWEzZDk4YmVjN2IxMTYxYWI0ZTA1ZDEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFsyXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiMWQ5MTk0Zjg0MTZmMjA5MTlmMzhkYjE0YzNiMWQ4Y2MwYzM4MTIxODU0YWI2MTc2YWQ4NGJmNDIwYzYxOTEyYSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzJdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6ImIzODhhZWIyOTg1ODNiYTZlMTQ2NmZlNDc1ZGQ0YTNkZGM4M2ZmMTY3MGMyNWI2MzIxNzVlMmYzZjJlNTU0ZmUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5uYW1lIn0seyJ2YWx1ZSI6ImEyZmU2YjIwY2YwZTkxMDJmZmVmNzM5MDRhYTM3NDEwYmQzYmNmODFjYjQzOTAyNmEyMGFjNjQ0ZDFhMTEwZDEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5ncmFkZSJ9LHsidmFsdWUiOiJkMmFmYTVmOTQ3NGQ0NjYyMzQyOTY5ZDhlYjRlMTBkNzQ5MzgxMDNmYzI1NGQwZGRhODA0N2U0OTRlY2VjZjhmIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbM10uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6ImE5NDFlNWQ3ZGFiYTA2ODNjZGVhZTNiZWFlM2JiNmZhMjI5N2ZjM2JlMzRmOGE2YmQ4ZjRiZjg3OWYzNWM0NmYiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6IjMwYTdhNDg1ODU2NDRkMGJkZGRmZmFjZmI5NzVhMjJmN2JjNjNmMTU0MzYyZGEyYTA0NDUzZGFhNzczNmRhMmQiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFszXS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiOWYzMGVkOTk4ODE1MTQzMGZmOTAyOGFjYzRjYTg1MWRlZWIxMzJmMDYyNGQ5ZjY4OGNjZDNmNDBhNDk5MGQzMSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzNdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6ImNmZTA0N2E3OWZkNWU1N2FhZTFhMmZjNjBlZWMwYWFhOWM4NzA2YmFmYWNkNDhlMDUwYTcxZWI4Y2Y3ZDlmYWIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5uYW1lIn0seyJ2YWx1ZSI6IjBkMzdmYmU0NDllOWNiMTYxNzU0ZmJiM2YxYjJmYmQ2MWRmYWNhMzYxY2E5NTA5NjMwM2U3MGY2ZDllMTE5YTIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5ncmFkZSJ9LHsidmFsdWUiOiIyMzFhMzE4MTFmODBjMzEwODVjZjZmMjEwNzUxNWRlYjE3Nzk4YmYxYzE0NTAxNThhNjAzYTNlYzMyZDI5MTkwIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LnRyYW5zY3JpcHRbNF0uY291cnNlQ3JlZGl0In0seyJ2YWx1ZSI6ImIzY2E2ZWQ2ZDE5OWQxZTJkMTJlNmU0MGViOTNkNmRlMGQ0ZTU3Nzk5OGYzZGNjOWE5Njc3MjkxYjQ0NjVjZDEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5jb3Vyc2VDb2RlIn0seyJ2YWx1ZSI6ImEwNDRlMzYyYjE2OTFiZmFjZmEwMmU5YTdkZjFkZjg4MWVmMDdjOWM1YzM0MjkwZGUyMDA4MmM2Y2IyNzdkYTAiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QudHJhbnNjcmlwdFs0XS5leGFtaW5hdGlvbkRhdGUifSx7InZhbHVlIjoiZTc0NWZlYTAyZmQ5MDljMDAwNjhjMWU5YjUzNTU3MWE2MTliNTM3YzMyZTI3OTdiN2YzOWVjZWJlODk1YzA2YyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC50cmFuc2NyaXB0WzRdLnNlbWVzdGVyIn0seyJ2YWx1ZSI6Ijk0MTk4YTUxNzVmMzg4OGZhY2IzNzg2NTAwZjNiNGMzNWJlYmViNjljZGZjNTk4MTNkZTgwNWFhYTkzZDRlNzUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRkaXRpb25hbERhdGEubWVyaXQifSx7InZhbHVlIjoiOWU2OGFjY2QwMTU1ZjcwNzdmYzlkMTMxNjZhYjZlZDNkN2U2YWYyYmI0NWM0NzIwYTQ0YmZmMGJjN2Y1NzZlNCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5zdHVkZW50SWQifSx7InZhbHVlIjoiNjVjZjUwOGRhZTExNmQ3NTFjY2M3M2NhOGRlZWVjN2JhZmZmOWM5ODIxNzEyNDcxMTBhOWE4YTJiN2IzMWFmYyIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS50cmFuc2NyaXB0SWQifSx7InZhbHVlIjoiNjZiMTU4YWY0MjU5YzkzYTI2MzQxZjEwMTM5MmRhNTg5MDZkOTQ2YTZjOGZjNTBiMDgzZWIyYTU2NmVjZDQ4ZiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0uc2lnbmF0dXJlIn0seyJ2YWx1ZSI6ImU3YzViYmMxZGM3YWFjYmY2YzJhMDBkNmNiOTE0OTQ5OWJlZjM4OWI0ZGY1NzBkODNiZWU3YzkwNjg4ZTEwMGUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuYWRkaXRpb25hbERhdGEuY2VydFNpZ25hdG9yaWVzWzBdLm5hbWUifSx7InZhbHVlIjoiMmJhMjRlMjk3MjI0NmU1NjM5MGYwZWJkMjNmYjMzZjBmZjI1YzYwZTA1N2ViYmJlNjdmZTAxMGExY2U2ODA0NiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0ucG9zaXRpb24ifSx7InZhbHVlIjoiNGRlNjk3MDIzNzUzNDY5MTIyMjBlZTRlODk1NGExMGRiZWMxMGY2MmI3ZDliMTRkYjJhNTI1M2ZhZTAzZjIyMiIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5hZGRpdGlvbmFsRGF0YS5jZXJ0U2lnbmF0b3JpZXNbMF0ub3JnYW5pc2F0aW9uIn0seyJ2YWx1ZSI6IjQxNjI3YjM0MzUxYTExYmZlNTRhMWRkZmJmNTNlNzE0OTJlZjE2NzkzODAxYjI0ODMyYWY1YzMxYzFjOTc5ZGIiLCJwYXRoIjoicmVuZGVyTWV0aG9kWzBdLmlkIn0seyJ2YWx1ZSI6Ijk3MjlmOGJlZDM1MzhmMDU5NzU1OGZiNGJhZjJlMmRhYTRkMGY3MDZhMjI4NjA3ZTk5YjkzODkyNGYxZDk0N2QiLCJwYXRoIjoicmVuZGVyTWV0aG9kWzBdLnR5cGUifSx7InZhbHVlIjoiMGIyM2Q1MWM4YTdmZjEwMzQwMzAxYzQ4N2FlY2QyNTJmNzViZjRkMGY2NWNlNWQxYWEyMWQ5YjcxMzUzYmU4MiIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0udGVtcGxhdGVOYW1lIn1d", + "privacy": { + "obfuscated": [] + }, + "key": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733#controller", + "signature": "0xf744e39fe8968cfdc280378f8703e80b374958d0d5948615a21eea4d95988b163965c08c9a01ea7d6f1c5ac652b2a31b9109cf7bf1b54b395544f4d931d9489a1b" + } +} diff --git a/src/integration/v4/fixtures/v4_svg.json b/src/integration/v4/fixtures/v4_svg.json new file mode 100644 index 000000000..fb70280e9 --- /dev/null +++ b/src/integration/v4/fixtures/v4_svg.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://schemata.openattestation.com/com/openattestation/4.0/alpha-context.json" + ], + "name": "SVG Test Certificate V4", + "type": ["VerifiableCredential", "OpenAttestationCredential"], + "issuer": { + "id": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733", + "type": "OpenAttestationIssuer", + "name": "Government Technology Agency of Singapore (GovTech)", + "identityProof": { + "identityProofType": "DNS-DID", + "identifier": "example.openattestation.com" + } + }, + "validFrom": "2021-03-08T12:00:00+08:00", + "credentialSubject": { + "message": "OA SVG example document", + "course": { + "name": "SVG Basics Workshop", + "fromDate": "01/01/2024", + "endDate": "16/01/2024" + }, + "recipient": { + "name": "TAN CHEN CHEN" + }, + "official": { + "name": "John Wick", + "position": "SVG Grandmaster", + "signature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeoAAAB8CAQAAAAMLDtbAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAADEAAAABAAwXU4cAAAAJdnBBZwAAAokAAACMACzEPncAACu1SURBVHja7Z13nNTU2oCfbexSdukorgiCooAUC4rfVUHEggUErFevotj12nu5dlQUu1hAUKyoCIgKigURFQRsgCJKkd5ZYHfZNvN+f5wzs8lMkmmZybLMMz/LJpnk5Mw5yXvemkGi5JFPA3LIIZsc/FRRSRXl7KCYyoTPniZNmhjJiOnoZrRlX/ZlH/ZgD1rQlHxyHI4vZwcbWcda1rGKP1nEcvxe33KaNLWbyJM6kw4cQTcOohMtEr5eOYuZy2xmsQCf1zefJk1txH5SZ3E4x9OLw8i32OtjLSvYRik7KWUnO6kkl1zqkEsuuTSmGc1oSp7t+Uv4lqlM5U+vu2A3IZfmNKEJjcjVi6UyiimhhPWsoMLr5qVxD6tJvT/HczzH0tC0dS1+CtnEdaxgJaupiur8DWjGnuzH/vqfxmFHLGMSbzHX646ohWTQlm50ZT/a0JqWDg9wP6tZyhLm8SO/pSd4bSKDo3me5Yjhs4wxXE9vmgJjEYTOCV2jKSdwL1PZarqKsIh72MfrDqgl1OFo/sfXbA/p4+g+ZcxmGL0cdSVpajSBp3cPzuZMCoPbS/iGz/icRYZjj2AWMIKrXbluB47kGPrSPLitig8Ynn5nJ0BT+jOIXtTTf1fxG3NYyj8s5x/WI8EjM8klh3wa05h86tKMlrSjIx2DC6btTGMy4yn2+qbSxE4+w0xv5z95guOoY3nsPIRt1Hfx6pkcwcMsMVx/On287pJdkHoMZhqVug+LmcgtHE3dmM+Tw+HcxFdUBM80hmNitJGk8ZxMFusf8Cfu4EDHYy9GEAYnoRVH8DzbghN7Cgd53S27EF15niLdcxsYTT8H9WS0FHAGb1Cqz7qYC8ny+jbTxMJV/Mit7BvFkQ0oQfgiSe2oz+XM18OoipE09bpjdgF68bnusXLeoReZrp69EdeyMDixz09P7NrJmwg+9kra+TPoz2w9jNYzyOvbrdGcyA+6p5Zwm0E34Ta9+VFf51d6eH3TadznRAThxiRf5VT+0MNoHM28vuUaSWc+0z00j9OSvubN4Byt9/DxKNle33wad8liLcLspF8nm6v0OnFN+u0QQmNewYcg/MzpKbtqHZ7Uj5Fv0wuj2sZLCP4kCuDVFDJZW04He33TNYiBrNVr3IEp10oP0rbvP1Py+6dJGX0RhMtTdLUhWgP7lMsqoF2TJryPIOzkXnI9aUF7/kYQ/kgvi2oTuWxH+CRl1+vKXwjCmN1+Wh/JPwjCVPbzsBX7aK+GKWnrdW3ifYSdLthCo6UR3yAIo3brYXQTFQhFnOt1QziYMgThIq8bksY9LkMQjkvhFXN5D0F4aTed1jm8jiDMoa3XTQHgTgRhZdpuXXvYD0EYmtJrZvImgnCH1zfvAQ35EkF41sZ5N/XUYx2CcILXDUkp7XmC771uRPL4JyVmLTNZfIjg280GEuzBfIQSBnrdEBNPIQhPeN2MlHIjgtDa62YkizEIVTRI8VXr8C3CZtp4ffspZA9+R9hc42z1xyMIn3ndjJTShCqEIV43I1moVXXPlF93T9Yg/LTbxPqqKb2Sjl43JIy9EaQ2C6OWfIfwiteNSBYHIwi3enDl/6MK4W6vOyAl5PMLwqIamTyiOYIww+tmpJjna/M9Z1OKMN6Taw9DKOMAr7sg6WQzFWGJC8kek0Fb7Ttg3/qaotRzk+sRNnjdiOTxHcJKT65cl8UIM2q9cWskwibae90MGwYhCNdY7svnYn7lBa+bmAT+jSAUeNqGOrRL1qmfRhCPPIBVpFitVVgAcCXCTv7P62bY8hyC2KgsW+hwk5qlr3eDMxHEw+VQF16hiD+SdXr1zDrdo5v7GmFVHMl6dhW6UYavBk+KHDYgfGu7/1u2c4+raa9qBmchiEdZeToxKZgZ6JDkXEI5oDziye1BDwThFo+unmzyWZxy557YuBBBOMN2//4h6aVrC2pSH2mxp2VSr5vHI8H8cwu4z5Ag1GU2JzGxUWS+RliXQv/zVDIS4ecarGjKYwXCr7uhk+h/EIRDTdu6cDdz8CfR7NianxCECl6jU3JvcDrCuuRewoH+CMKVnl1fsTc3uq6H74mfshqdeFElSzjW62Z4gPJ5V9n8cjiOZ1gWFInvStI1e7MRQXg9Fb5sLyIITZJ/IUsyWYnwu0dXV7RhPcI6Grl4zjz+RLjZ0/ty5jQdMbc7osZ8K87hbVM5io28liRXrAuoQljNKam5wf8iCEel5mIWPIwgHOPZ9WGG/knvdPGc9yL8WIMjx7tRhPBHLVSCRcMUBAmublUOmMc5Omm/17n4EH5Kna9CHwTh0lRdLowDEIRXIxzVmkcZy/lJ6PYzgz/sfNfO2YIdnj4oI7E/6xG21ejFQXI4mIeCyTBVAsaZ3BohS36iDKQSYaat0jEJY3svnWbIOxYibHH0A+/PDv0jTHBZrZPBfAQfExEkikR8DdkzirO+gDAhuZ2WAB1YgVDJ8R624SBe5Acmp0xCy6AHj7PUMJ2LGc+FcSdz2oPJ3GdZRzaUruxE+NuipKQiSWO7yOM4HSWA2xfpOVkXj6lyXUiGUxCEJ/V/T4xw9N4s4OeIP2VbKhAOS03nxUwPNiP4uTCKY+tzPLeHaIkTJ5N7guWAyuiS9DtuwLOsMkznEgThPpujo/OaeCyoanuGF+lre1wBixF22Gq7kza2f/DMVVRxLILwqM3ebuxEEK4nn5kIOwzvyj0SvvZ0hA0UUIhEDDAp1Mn6Ii0VXvTUSBiJcQj+KP34Dk+CPjiD0Trl4bP6/ZRs8rRnnFDGePozEEH4j83RjzM1CnF8ijaKNaYcQZhFd8vjxiGIbSlKp7GdIKM99oTNpQxhls2+BQjCaAA64Ee4X+/rwnb+l9CVOyAI1wGwEWGSw7EFuiWvRniWN6UUqdE1SQZzcZRH5uGPS0Nej24cx3F0sciV+giCMJws4FeEiqiE2OhpYPHAWkYlUxisV7W3Ioit6+5MhFLOj3CVFQjCqRzGnwTKJYVPXSX/zbZZLTuN7YS5DUHo5mrXxsZchJ2WFSMeRBCWB4u6TkP4G4AsFqFqf4RPsit5l+uicPsYirBJn3t68MxWZOpn8/CI57wHYWMNdjmJjY0IH8VwfHNuYZYWJpWGeRbnGfb/Cx/Ch/qvoQjCSY5nLKRbDOk0erIUYUDI1j4mbclrCGIr5R3LJwg+znS4SgN9d5cA0CtYNsk8JXP0hD/c5iz2Y9sFzvbU/xuU75VYrDtaUBzStusRhM4AdGc1gvBNyLQ+QnfxZxH0iRksN4j9oxEqbFUV9yAI7wHQxEGqUZVPRnjYl+7yB8LUKI/N5SG9XjV/jJaVLxDKgvXCeuOcJe8c/eAWZrF3xOtnMgw/EnHxMxdhq+MRzyFsdVCiddatuk7/naUfT+bcBDchCJ/bnMN5bCfMEaYGesGtWpgJRfk8GcPZVVsv03+11I53U01vxleCw8nZq/woBAmun+7GPl7tYKoQ/qY+UIcZrLYN0jguinfPrsR8hClRHdk9WFdzA2O4hFPox+W8yl8Gp55M/sdXvBT8uwFVCN/ZnPEe06NhXgTdcA7vIggrODMYztuMtxkXEvaaTRmRcr3UZTvisLTrq9t0mWHbfdpE1jd4jg045RWKNLYTZA/PjVrKVnxVyNb6utK10fSSF6KqasqvCML44E+eyzaEr9mIUGxrSACV/2Je8C8Vr3awxXFZzEXw65/nZv2DTrT0wnscodSjqhvJYCHC+1Ecd6ZWGP3DpTEtPRYglFlKVJfqfp7NM1qd5KTcq89UvRirb9j2O4KwzSQAq7dsJD3BRJz8HANtM668M/gCQVinx4VKFbbYtr2Rx3aClKZEC2lPb0uF/uX6CW1mI8KXhr9bsBhBeEj/rSK/zuYCBOE222tmss4kLv0Lu2S5Six6Tv+VwfnaQLLMInRuGsJPHvak26xCeDniUVfiQ/DzdMweam9R7YVtpDWlCD5dFkpJcktsz5LBJwjCW6bHQ+DdKfxuSMWhgjki1XsdhiC27iL36kltVoe20qUg1QNDFXK+x+YM0Y3thPjD46F4qGlaBvgubEUG8AsSEl6uzPs+egGBKdg0ole5EpSrnev3x9rQUcgOhLWm4dqY8ahaWKFi+Fzc9EzznlJHMVTxb/wIxRZLkqMiLkTUoifcP0D17336r2ytPbHLxaoE9ekmB6ZM1iNM1PqaDsHtT4S9Ia24A0FsbeiBuqFHhGy/Vj9GOtFGH2FXWCnasZ0AUxC2uHWyODjEQne4F36E7WHP/tmE55e6EuXmmYVSeKln+iOmNXMoryD8YPi7kc2bfQTWcWQ34UeoDBnK0xF8tSandFMEiWAAO4oyhO0W0ckdKccfwVlWKWlD0yl1QhBWGQR5NW0ftzxHH3wIa0L02WqFei03hAjKnyNIxLjpWywnbYBResqGvsnr6/CQ9/SI/Cu4xxxcHOXYTsxvdDnQ2ENLtVoPn0NXw7Z+ZACTKQk51gdIyLaXmAccxAXAXsAKAJ1Q0TouJpuBwDjDliIqIGyd3IohwBKLNdhwLsVPNuNMT/25QCYv15Lkx0rjvNrhiBaMJ5dKTjE9IBX3UYcMWwFUoYZ9m5CtSugeTkVwywcAWhYzk6dLLl7MetN2tTRaqsdK9fTpAmxmbYQ7V2ambTZ7lWV9Xdj+EkYCMFBXSpumt+cwKe6xHTfKUp3kwG0HTtZPPuMkey9E4R9gLlbx38or7VeUCPMOAJlsRfjY8op9EfwhmSdWWyhQVJDev23afTuCsN7w3O+q7+TDWjGtTw0RXcP5CDuPqebaAdJHK4fvF6BijI3ksBWhOKTIxDKEKgtHFVVvIzwfqhKRu2tr8OBgq5SgHgkln9nZspXPgtXqt51JYx9Yc7+e0NiOE6U8SGWpPDOX6E7wGzym1yHstHAsWWOjU1SrlCNZb9DkT0TYZinFjCU88/MvVLtFKAopR1hh6RajeD/s532HgAmmm2f96RZXIPgcdPkXIwhjLfddGRzaznXTtiF8atqiHtCvhRynDFahfmAN2IC1e6VyMenI26bVuNKkPB/xzj9G2GlrRJtpWvGbWWyY1IHH2fr4xnZi4rcSRhL3pI6XwJsug2H6/9qyB/AdO0OOzKYF8I/FOV4E4CyaAZv0tllAgYUE0ogzgLdDtm6AkDitIdQBXqDKtuVXsxXobcjzdQ3LATiEOYyoIdUt42U/4B/KbfbmMxT4QwvLofQHNrEDIrhcroYQNw+lXAv9dX4BCAsWvZbmwGMW7zclQFfQHagMKi+V6iuyKrMDsBCfzV61ULV2cam26m8IRlS8TmJjOy4OQhBucOt0MTNSi7HVIssAG7VVd4PRwIyyT2/G6HTS21LHqBJDlIXZsN8K0VxnshyhNEJWmKsRhKWGt3lbHfihhM/x9N9l7dYf4eRPNtRBvqtHGcJEXePUKWvmNIRlpi1zELaHWbvPINybIptVCCssvfGVxKRq0FTHII5BEMu1uZG6+HCyZS9D2GGzwDo5+NtXyx+NdXXRGMe2G29q1yJEYuYwYJ12PnmWAgJP1HBfI6VL/dHiHOV8QkDRFVCwzEXAwhByKfBRmKvgRsxv6hNoDYyLYBcYxWpgX4MWfCmHBtd4mQxkIut5g/M97N94aQ+27hP7cAPwoY1d9URygS+1Y63Tu3oN5jd1PboBnxuUZIqV+qpGTqcQeCTsnQfobcpYVl2DRjlhLo1w3weQiVJ6WtGa1sBsKi33/hz8v2rj1FatdYh3bMdJucUqJlXUpVK/EZSpYATwJkJV0NW9mhkO1r8zgs/Iat+0vxAWhhyn1lUnh33/PoQyw98fRGXRhLsIdfgD6MsvJqWJICzgZS6kQw1Oc2QkiwqEK2z2voVQahtqoZxK2lGHIoS1Di6ewxHEYPJRK+pwZ0mVzGOOads3CFssRgkE7NEzEXYaHFW3IZRH7P8hjopjZVufaPvtLfrXNvdcYmM7LlYQveO+2ygf7JuAuszRYsq3CL+FHdkFJ9e75sHJU21ZVdHDjUzHfY6w1OKHVW4rAeNHHiUI66PIRtFWK/nCdRLHMdmUCSvwKWE2o7mNgXRzOfDQTVROeOvcJIfhx76udR7bERYASvPr5A2vMntWh2sob63wREuZVITohtWi8TGb8yovtArEsDpvhiD8GfHORyJsti0IpRZXH9h++1v9K5sXJomN7biYjRgEh9Ryr+G5uBerEUrZhvBu2JHvWzwBjfylu/Os4JbwUJFu2LkJDjZpLFUs7HNEg8p6dYHlvqYMZpKOyLH+rOYrXuR6TqZdjcrBrXrAOlZpMkKZrQuHkpnuNZzlTdurKB/paivuFwhFlu/SFQh+g37iaYQqW4PZeQScRKtdfw8PWevaMR9hss2+XoSbX80EXFP2D9me2NiOg0lIRIN8svgd0e4iAN0p1Z1yX8hxVyAIaxxS/4/T36wWrVVaxWGGYyYgFFt69Z6OUB1X/lJUKhXF6IgPgGyO5HY+MqXVsfpUsJSvGM3/uJCetHEwpiWfG7CrDdkZP04+4aqwjMqknsMWhJIQq3M1g0zyQA4lSNBpw4x601XbE1Y7TtDeukeXGB4Qyn8tkkGrAT7sCzy/q8/7lu33H9JHhDtzJTK24+BlhEpPKlCqqBlj8oG+OuLnW66mm353NeUZ/Ag+ejucKxDVWi0yNsZvEnaORhCetvy2egYHzr+K6OOtbovyDQDQguO5lheYxhJL0dz88bGS73iHR7mSE2iX0kn+EnZuGmMRfLbmuj2owBhLMNpBjgn0ekCW+j8EuzJQk1GeCIqOCPZJiQK+/ML1hm0qwvn2CPetWmSdGaUwmF1trO33r0EQS+VdImM7Dh5AiCabpvsMRfCHqAcuCll/TtfBd5EipIfoo4wBlCo0U3lj57EIodjGIq8Ec5Xxoj1C9JnGzkfiWr5ksS/Hcw3P8wUrdYC/86eSv/mMEVxHnyTXfYKvEMtCti0ox85TDwLBENVeZicg2CcLUCvjgM/e7Rg9scy8jCCcpv9SjjH25sZsKhC2m96XKl1gpIjlWxEqbB7njwV/iTdsv68WH8tt9sYwthN9giu/2T3YnOB5YqUBlwOfh6RxWQv4tdhULxgNW8xFDuoJqHY6Md7Fl3QBBnM/8BwHAA+GeAkHKAICRjFlBvs6yrtQT+XYfwMfy1gWFDbrcwDtaKM/rS3DGLNpZ6hrvJWFLGQh8/jJpLd3hwPAMsrtMuqAIdWBmUwuA0oNq+gvWceeHMderLE4Xv1WgeWQilm3Niap5WHgxXM0MNfB3LgHfuBrtpu2VV/RnsOBRZYuN025AlhHJi0c3IDV+Yts9sY7tuPgzBhWkG5yY5giC9Sz7kcOZwwr8SFUsJDHHX2IFUfpZ57RGUGZ9LfRRl9rlq0yqiFCIKr76Zj6Q/XeLy73TXO6cwY38zwfsyCYHdpuLT6PF7mITq6Zy1QeLqtKW4sRVtj2onpPjTZtU2armyyPr0O1K0YW2xA22pxZqdQCLlIrcM4Yp7Tu5kDGT4nGSLnMVrgermWQRYjB9h2KUsd949A/8YztODgGs9Y4NdRhFVapZS6kOmlDBrlRr/WV/1BxyNZZCAF/tfWOpcYrEJ4E4DOEyAF6Aa6OYU0dP005lEHcxLN8xgpbYb2Ij7jehWzah9j0gDK9PGr7PZWEz3z9bo4Pve0E8pSpuHq79EkqvOQBAPY2Ce1WrfdrnYTRHqwswc7Vsurgw9pffW92IvxFDvOw144HVvt26RpjGNvuiN8pq/WjuZFCsFgnZ0PQ30tsfY/DUT4+m0K2XsI3NKEFUMIAg549nI3spcW7fYGSqO0BKnPH8iT31mY2G3Jl1OdAOnAgnTnMlFmtIadxGrCCyUziawe/dWfaA2UWPtXKsjDR5lu96QFMCbHD/sJvdKErB2nbtZlN5GvxWyk4f7A5t/o1lHOvipJfZNv6J/VkyaSLIfm0ki4qcKINmWC5ULifPOB2KikGB/FbvVS22+yNYWwnKnR5Man34R5gooXDnJ9oKyWYUQ74oeLbArozGyjh1AgJ5zYE+6AlGELcI6FWRrOiPt4NSpjHm9xNfwrZi348wKcmA9Q+XM3nrObpOCtstEeJuKH0ArbaOjMq23S49lqplax11ZsIaDKUu8ZXNudWE62J4d/LbY4cQE/ge/xgSnSgJrVdmIaireFaRg7mQuALxgMl4JCJTZ2/2GZvvGM7LsoRW+VHcvgQodjSMHIhsWWbDnCwg/h2YBR1k6ai/KAyEUf9rpm6Wn9ZE/KddOZGPg1zdfmJITEPpJE2GutNDgsNpee2Ui+2pAphleXLZ7L+TjbbEUpsp0sWVcFf9xwEsZFPC1iJUEknfsHszvmjrZ6gGuWCFFo0KYdfEMq0Q8k4xMFHuyWCvbddDGM7cfVI9VsqNZzNAOAWS+f6SghJYBAdauBaazcXhYnl4awCWoM2Z5REPF5xGnnAD+4FzSXAfJ7kZJpwLEMNifoOZhSruN8xt2ooLcGiGFNzmoKFkyNAJk+AjUJsLV8ChZbr2bX6aj3IB76zFY99bAC91CgCsFlaDGdv4EUWMhPoaZgbSux17oUG+l7MPEJX4G4tve0AhzxBfsD+TR3D2E58Uq8nlZO6La8A03QUdChFQMc47kkJZZEnrx3LgAY00WvzaF02Vam515LTUXFRwXTuYj+OYmTQtNKE/7Gch6NOWtUSNXjNKDXjGstvXEJn4A2bFJZKn3y2xZ61qGGu3DnthO/AddWEWAVYZwA4k0uAddwLzAAaGZJVrDbcgx3qtzfnfx/MTcDUoLZ9G9hmGg2MG7tXQhFRj+1da1Ln8C4FbLLN5LwOyIsjXkX9yPFP6uUA7E8VOyHK4d+RvsBaBw8j7/iOy2jJOUzRa+MC7uQvLolqtOwJlIZtVW6MVgO2kGFAsW3lxgkUAwMtHpUrgQa0pj/g7BuwFmhKLvAXPqBj2BEH6rzZl7AV+AIfGAymq/UxTig5zxgB/h9GAf9wQVDDsBmnSa307Ttt9sYwtnetSf0C3aniLNtamypWJZI9MTNs2qmI5fgdaFSwfgdU/onospY8RgYwNAnOH+5QxjhOpiOvak1rC0YyO4py802wmtRKNG4etj2DV2gI3GmbprCUD4HmFitatQAbQBdgjW0UMwQkhL2Acn6GoHdZgL2YQj4wkk8A2MJsMES6KxenI3FCWbYDD4JcHuF1sthKX4MCdiNQ11b/rRaBdpM63rEdF48iSEoKu90T4kZoxSLEURCDQqaHOTGOMDh6xoNKiTsMFTPjCwnZtGKgVkTVpOgqOwoZGSxdV86dEdpchlVQg+qh8JgrFWk3zfHlooJrXgnbvieCsDbY9/aoSGaVTOAhhC2m9XFLXUXyT0PwiIp1D/jgtdd3b63S7EdLIEO35FpO4kZd4m4b/zIdqXKXNMcalZz4XNu7iG9sx4XKjxy5DFmiKO1iJD37iwhVDgqF09iEUB7y86jooETc4tdo3e41UTnjtGUrQpllsZ6ayQE6LEIQpjtmpSvDurDqMoTikPfIBfgRVkbIcpfJKoSNFjrr1cE2OWe0PRdB9LpcBWxUJ//ppsvLFunoMIVyBKl+OKlCPA9bnPvf+NjCaQTCdY2hsaGuPEdbONhUczyC2FZbi3dsx4WqJXVI4idy5FwqEd6OuFxQgXPWT6s8ntHd/WFICMpchMTqBn6GCjfcBx/h2UzM7M0SBImygHvNYWAwAHSNQ6r9MqyDFNW7b6ThF1RlDbaZMltbM8zGTTOQgXVyhO8rB8xALPwk/Z3WtGOYjnjbHhZdNd/kLKritHaEZWy5Hh/CFg4Fshhh8Nf7zGL6qQeKXeIHFcJ7CnbEN7bjorpeY45t7GuiDMGHMD4K/7cMFiD4LFZgPXR501IuCtu3BkESygX2OIKwD4FAP/ug9R76zfBAkvoqmRQwNiiGn2FzTHjqXkW+jnubx3X05WKdLnerbTULI531AyEU5S/uj+jc2gRj4Gx7XTi3OoB1VZh92SyyQ309Rn4xCM+tmIAgbDa80jpwEy/wgE2hnzz82Fcu+bfNoytAfGM7DvbUOZznspBKWw1mYlyLH+GjKNftp2phyvguOYhx+BCElRZ+UhlUIfgTcpk9i0Do30FUIfi4zUIh0pSndVztfUnpqVRwji7n5rNJ8bsIu8Tye+tpXf1ZEFIu1p5fEDaF/UJZfMrWiDW7ALZiTLs10BSRPsFS/G+LH2Oy/1P0CNrI/QzkYt6iDEGYE0Npe5W52672iCrN6ORhHvvYjpo8unM5L/G9rgBU/YlU6DN2snTc02sxTLmn9HP4ZU7lWK7iq6BQZL0abKKft4mwD4LwLBAI0xBW8DSn0o48GtCGsxir81fs4BzX+ymVdAimMr7EYq+qvdHR8pt5PMx2/d2V3ByDelWJvydGfXwo0xGTk093vqCSKmY4iLtfIJQa/AmH6EQF1R8fz8aYxvlHxMbHIjpiHdsR2ZNBPMUcm5R4P/BqAvpjaxrqQiWPxfStDB61iEVaw5U2K3Kl20y0auBqJBgocKl+ilt9JkdwYtgVaKrjlqrCjEOBVAcP2363Hr0ZQLcYs+W0wk8iNZjvQ/CHLA9zI0xIFRhrVPodxLjgxC5lbBQGvlDexz6aLBpiHdu25HIcj/Nb2DT+hXE8oKsuux6oDXTgd4Qqro3ju//H+7o8dyW/MoqBDm8FlQpnRgxnt0KVaQmIk/vySvCdFPjs5D1TGfNdmfp6WpeEafBV5cltrvsuzEbYHHelMRUiHFuBqBzWImwOSTqRxxGczJFxZgV7lNASBLETy9i2IJ+zec8QZl/CHEZzAyfRxvCknYkkIdLoAooRNtMngXM0oiCKN0IjruITizyNsaFSE91l2JLLKdzLm4znHR5kQNLUiN7QgO8Jte4qVGT09y4nMVYGo75xfrsOpYTW6YiMSpLkZgWaCxD8rkRbRTe2QzphABOCQuRCRjHE1vP0PUT71LpFfZ107rddqKZUA3ZgLqNT22nGcoTwbB/HagFxKYNc7A1VF3JM3N+fhsQQFKsooAhho4vFmg9DEC9KIB7Ic7q21GbeYXDEPB5PIVS56Bt1tFbEvG6Zbavm8qyt8qi20k2r/kJX1vcGZbuH4zqvNT8jbI1bAFcVUmP1RXgYIZBfxQ3q40dSrSjtwyf49fqvX5QdeAuCxBXyGE5dnsaPUOTgLldTack2hK02mt/aySX6nRy6wjxPO6qcEddZrVGWY2PZo07cwJQo1Wf5lGBl63amEZsQSl30mFyG8KCLvWKBUSo/hOH0AlbzNCPDqt3bcx5vAj2YnXBrTuUZ2gLfc17Sk/wkgyGMAjbzAJNZTSMK6Ua+NnTVVj7jBGB4WAhpFj3ozAdxx74pk5Eff/DfbZkJvMlgWtCHPvTRgY6ltIgqhv1prqOCzjGWqPkvzwLjXXs8TeB0voii0poL1GOUfkPfGfMyXiUxTzT5YFtt4dzBtbtIITgr7g8zN5S7uCKrWWTRgL04Vbs+ePWpoojZfMy7vMozPMydXMvFnMUJdGd/mhukzZaUInwZ4+jK1sWRTnep1+5A2J7cEa7e1HWZySHAQgZFUQYslEJWAQ9G5dljTSNu5zrygE+50jHFX83nNB43hQbAwGAWyJpHAYUU0pImNKExTWhMY/KpQy51qEMdcmw0rJlkRTUwyymlnDIqqKSSKv3OBRVhLICQRWbwk0E2OSGfRJVtJRRRRBGXM4AHgftj9OfrxVdksIaOMUiv9vTmS6BLFAXs40b9ZEO5A5hLb4ucFdGwmSZMZEBc383jv9xBY2AZtzhkRd6VOJLDaQlsYAlzbPJ9eENT9mM/9qMdhRRS6KKZbSoL2MhmtrCNbexgB8WU6BQ98ZNLb/pxmkljs5qp/MkycqinP3WD/82ngAIKyLco+dqdX/mJg4BrYgxQfJErgNdc8azOp4hMLrcIJXUNNamX0YYqDjRkp4qN6fRkSRwZR+pyKbdSCBQzlCdjSOqbJnpa0pWudKE9+zlGegtFbA5OyyJ2UEwxO9jJTsrYSTkVlFNBBT58VOFD8CNAKbn0jyvloz1NOZV+nBB87FQxm6ncRgNm24RLmMmigAIa0pCGNKIhDXmV9XRgNvnAcO6wKf5uRT4LaQX8x6EKZ/QspCNvc56rvWWBz+DiGA/PEpr+PDL53KYT5VcwIqEIqTRW7M25DOcLNtisRTfxExN4nju4kOPpyp4JGCX/xs1A0gIuYIophmoUZ+g0QF8jlMVt1gI4XSd8WKDTIEVHT6oQdkQdgOLECIRNyU+PsR6hMoFa9JciCN2jPr4dT2lHtyrGxBTlkiYS7bmE11lmMY3X8BUvcQP96eyyB8CXRK4JGQ1Z9OfDYOE3YSEP0920qlf1SROL3h8UrEC5hAc4IspHxJ0I/rhclkNR+U+OSfxEzrypu3CvOL+vgtAjVQUEyKIvH2l9aTljXHnypQEoYBBjWBcykSuYyyiu5qiY0vzGymSEuxM8xz48YKjCPZebLV8y/RASL7F+rI5pDzg/RxPflMHrhjL0iZBPGZLMNbWisxZ2NjAkLtGmDmVIxLyY7RkaTECznSdccldJU4+zmRQSFriJCdxED3eLkdvyCYFSdfFxIh8HDWNLeDDEemCkOUIi0VoBGjIqmHetMuWZ4iYgFCXfX3JIUCRZxZ1xZDmaiVim11e04kZd5UAQFnG9Q6LUNLHQief1QibwZp7B3XRPsaV/CtXJgmIjm/8wX7d9By9GyNgJsBYxVAZLhAN4i0rEg2IKgxDEFVE+AoebgitncTc9YrAQqqLa4eL7/tzMzGAEaAXvu131fjemJ9NM0/lTLooij2kymI/E4dabyxU6JERYyDVRRnXNRGyLyMVOC66zzKiWXLJZhbAiFXJUFpcGc1qoTzEzeIKzo4iVUmud6joKufRhmM7BqD4/cJUbKdHSAHAY3xj6dj5XJXXN7EwGpUiMkeLZXMpKrSr9IEKVKjOvIUh8WT5qELchiEXd1qSQST/GW+Tt2MRnPMkl/Mtm8DTDj/AceRzNHUzV0TvqM4+7EtCspwmlMa8GZR8/45OvR43AvgiiSxdFQwZns1ivZl/TpeOi554YLS01k/qsZkSy5CprJ8D6HMdJnKTrJ4eynuWsYi3b2UYFkEEDCriKepSSbcjCUM5MPmZCjSgAV3voyRu00v//KXfzs9cN4nJeYhEdojz6cJ6nO1DJ6zzioIex41zeBk7VtTR2XRq64nQaB/tzIc8z2yHjltWngjkM56TUVdPdjbgyqCVe6pKBJXEmIVG6XTZjJH4EP2PjztSmUt67kgp39yaHrgzkJl7gU35mMWvYFjQImD8fcUx6MieN+4L9/EyM/nvJozGliEUCwnDOZwuCMCcqN087lE/EVV7f9u5BQ3wI47xuRi3mmqCN383UA4lyM8KGiN4NzRiPIKzj4lgza4XQxRX3kzRR8jNiW7swTaL01IL3phpVgSubpURO6Hey9nQb7YJ/QncE4VKvb3x3QaXd33VSBe5K5Gl9cVEcuaaTyZUIVY62jQzuxo+w3lDvORFUkbmLEz9RmmhQ5Vkv8LoZtZIrtOh9utcNMdGA9YhjOGJ9PkAQZrrmFKwKHJ2S+InSRIOyVcea2i1NNMxDEN7wuhkhvIBQyYG2+/fU1bNGJRQsaUaVTk6kQmmamFhI4uVr0oTTRPte7Zv4qVzkRAThcdv9rfgLQbjX1au+hCAeucPuloxAEENJsTTuoFI7Tve6GSYKWYOw0jYhUmPtJJxI9JYVsxCKvL753Ym+vMFltTZ7pnecmYQ3XmLU5yeEKtvCq5l8heB+yd5cnRE0TZpdHKWCrDm1P+rwCYJ9peVA4v13XL/yyQjmSpRp0uySHJeq+NuoyOVjBOF926jt/SlHWO5yiTyAsQie1KJKk8ZdVEn757xuBgD5TEUQZjhUd1beYwNdv3ZzyhAWeN0FadIkTgabkbgTOLvJPtpI9Z2Db9i++BAWJuHqwxGEC73uhDRp3OANhFiLprtPb+3u+aVjfq3bkqTWa6vf07tPseA0tZq+CMK3CQZDJEI2Q7X3+RgHwRvQ4rnbqRsy+ArBb6tvT5Nml+NnBOFyj65+mPZpq+S6iMcuiTETSnTcjiAM9+j+06RJAr11VdIjUn7lhjyj39F/cFgUxxchiMtR9YPwI8wy5NVJk6YWoNREG1Jq0MnlBjbpfDbDo5yo611/U3enFGEVLVN452nSpIBsbR8uSlGqwVwuD6bw/dghwX4os1xW6h3EOoQtdErJXadJk1Lq8rl+a96e5HT9jbmFNcEExH1i+q6SKB5zqSXHUoRQ5MGyI02alJDDq3qqTU9a+OGhvBpM8byEy2IuStMJQdjsSha18yhH2MShSbrXNGlqBBcEK4a+QjtXz9yaO1gQTG44gwFxygOTEIRHEmxNXZ7Ej/CHy3eZJk0NpBVv6XT+Pj7i5IRTEGRwCPdqo5US799M6N3Yiu0IvoRsyv/SCZw+T8dOp9ldOJQPgjnAtzCaM+KIY8/hYP7LB2w0JHmexX9pkXDrzsGPUBSVCSycJjyFD8HPU2n/sTS7F215yFBe3s98xnAdx9LaYSo04ED6cTMjmWMqf1vBNK6ljWttU84iW+kX4/ca8YBeXqzw3C12F8U7t8M07pDB4ZzCSRxiUmj5WMMWiiiiCj9+8mhAfZqyZ1g45E5+ZgbTmUmJyy27hwcAYQR3R5mrpCVXcJ0OFRnLtV4VpkmTpmZQn17cwuvMMdWrtv7sZBGTGMZguiS14PoQXbBpI7dHWBwUcC4TqQwuAbwu+rdLk35T10YKaMWeNKEJ9alDDlBJJSVsZQsbWM2mlLWkK2/TEYByvmQqc1jIjuDeLNrQicPoSY+gA+hf3MX7XndgmjRp7Mnheu1oGvhsYwl/8Cfrg4o+0Zr8KZyeVMkhTZo0LpHHxXxjU1JRdKjIQy4q6XZz0uJ3mlTRlF70oDP70oL6ZFDCJv7hD+Ywg2VeN6428f+zem0pSBJbegAAAABJRU5ErkJggg==" + }, + "agencyName": "The High Table" + }, + "renderMethod": [ + { + "id": "https://raw.githubusercontent.com/yapyuyou/yapyuyou/main/test.svg", + "type": "SvgRenderingTemplate2023", + "name": "SVG Test Cert" + } + ], + "proof": { + "type": "OpenAttestationMerkleProofSignature2018", + "proofPurpose": "assertionMethod", + "targetHash": "6d6fb0d6f5081ef0c14e4242ef930606513ab1aa04e97f3553850aaff94946ed", + "proofs": [], + "merkleRoot": "6d6fb0d6f5081ef0c14e4242ef930606513ab1aa04e97f3553850aaff94946ed", + "salts": "W3sidmFsdWUiOiJmNWM1NjU1MWNkYjdjMTFkZWY1ZGMxMTI2MjNiZDUzYTQ5ZjhiZDU4ZjQyZTNhNDQ1YzMxODVhZjg3ZDJjYTMwIiwicGF0aCI6IkBjb250ZXh0WzBdIn0seyJ2YWx1ZSI6ImMwNDA0YzViNTI0YzQ0MmU1NWIxYmQ0YmE0Y2NhOTRhZjY0N2I3YjVjZTU3OTVkNmQ2NzUxNTRkMGE0MjUyMTciLCJwYXRoIjoiQGNvbnRleHRbMV0ifSx7InZhbHVlIjoiMjNiNDdhMTQ4NzAwYmZkZmI5OWVlZTg2NjAyNDE5MWM4YmRhYzFkY2I1YmViNTM5MTRiMDM0MzFmYjZjMDRkMSIsInBhdGgiOiJuYW1lIn0seyJ2YWx1ZSI6ImZiMzFjYTM4M2NkODM3M2NhMDVlMGQ2OWNkYzdhM2RhYzJhMjkwMjA1OGE2ODkyNzNhNTBiN2YzYTJmNWE2MmEiLCJwYXRoIjoidHlwZVswXSJ9LHsidmFsdWUiOiJmOTI1OTNmYzc2ZjNiMGQyN2ZkNDI3ZDNjMDNkNDUyZTFlY2Y3MjZhMWY1ZGEyNTIwYTQxODAxNzY1YTM2M2M0IiwicGF0aCI6InR5cGVbMV0ifSx7InZhbHVlIjoiMmJjZmQ4ZWZiNmU4ZTllYjIzODUyNGM5MTVkN2I4Mjc2NDc1MTQ3ZWQ3MjI4ZDU4YWEwZjZhMjAyZGFjYjhlNCIsInBhdGgiOiJpc3N1ZXIuaWQifSx7InZhbHVlIjoiZjdjOWI0NDE3YTlmM2Y1ODQ2MDExODdlNTUzYmU0M2YzOTNiYWM2MjBhODdkZWMyM2NmYTYxNzViZGQ1ZjRmNCIsInBhdGgiOiJpc3N1ZXIudHlwZSJ9LHsidmFsdWUiOiJlNmE2ZDdiMmQxZTNjNzAyNmIwYjMzZTViYTYwYzBmNTlkNjQ2OGMwYmU0MWRlNGQ4MTc2YzFmY2UyYTRkZTJlIiwicGF0aCI6Imlzc3Vlci5uYW1lIn0seyJ2YWx1ZSI6IjJhYTIyYTUzZDcyZWNkZjg4YjMzMDQxMGU3NWQ1NzExMDI2MjdkNjMzNTg2YTM5NGUxMzRkMjk3ZjhkNTFhYjgiLCJwYXRoIjoiaXNzdWVyLmlkZW50aXR5UHJvb2YuaWRlbnRpdHlQcm9vZlR5cGUifSx7InZhbHVlIjoiNGRiNmUzMzhhNjUwODYxMDI5MjI1YTFiZWQwMGZhZTJlNTRiMGRjZDYzZGY0MTA1NzA2OWNjNmJhNWMyY2RlYiIsInBhdGgiOiJpc3N1ZXIuaWRlbnRpdHlQcm9vZi5pZGVudGlmaWVyIn0seyJ2YWx1ZSI6Ijc3YzU0NTE3NmI4OGY2MTNlYWQ5MjdiMTAxNTI2NTE1MTliZjYwODQyYzQzZDhmYTFkMDM0OGY3NTAxNzAzODAiLCJwYXRoIjoidmFsaWRGcm9tIn0seyJ2YWx1ZSI6ImUyMTlmZjE0YTRmNDZmODAwMWEzYzk2NzkzZWY3ZDJhNTcwMjZiNTIyMWY3MTEwYmMyNzUzMjk3MWNmZGMzNWMiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QubWVzc2FnZSJ9LHsidmFsdWUiOiJhYjI4NjIzODU2ZTdiYTMxZjZkMWE5MmZhNzQ5MGY1YTg0ODRhMWRkYzFlYjZkMTg0NjUxZTExNzM3OGRjOWE4IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmNvdXJzZS5uYW1lIn0seyJ2YWx1ZSI6ImRjOWE2NGQxYjViMWRkYzA1OTM4MzBjOGIxNDdmNzlmYjY5NDQxYmMzOWQ0N2U5NjYxOWQyNGU3ZGQwYTM2MGIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuY291cnNlLmZyb21EYXRlIn0seyJ2YWx1ZSI6ImY5ZjQ4MjU2YjdjNzExMjFhY2FhZWYyZjljM2EwZWM4NjdhMGI3MmFmN2E4OTE2ZGI0YmVmYTQxOTQyYmRhNjEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuY291cnNlLmVuZERhdGUifSx7InZhbHVlIjoiMTVkYmFkMjcxODQwY2QzZTZhNDdlNzhmODViYjNlY2U5YmU3MmQyZTkwZjhmOTIwZDA5YzQzOGE0ZGIyN2NiNCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5yZWNpcGllbnQubmFtZSJ9LHsidmFsdWUiOiI1NTgyY2ZjYmRiZTczM2ViODlkMWU5ZjM3YTczNDg3OTkzNzc0YWRlYzk5YWNmOWYxYWUyZTg0YjdkNGE2NjY1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lm9mZmljaWFsLm5hbWUifSx7InZhbHVlIjoiOWFlOGY4NTVlNmVjM2RlN2E2MDM4MjkwODc2ODhkYTJlYjUwZWI5ZTg3ZTIyYTQ0ZmE5NmVmNDY3YzczODJkNSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5vZmZpY2lhbC5wb3NpdGlvbiJ9LHsidmFsdWUiOiI3ZDc4MjUwZGEyZjVjNmM4Y2I3NjczMTBmNjk5NmY0NmM0OTRiMmE4MTliNTFmNTIyODY0YzVhOTJkNmY3ZmNkIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lm9mZmljaWFsLnNpZ25hdHVyZSJ9LHsidmFsdWUiOiIyODEwMzYxMGQ0ZjhlZDVlODhiNzhiNGVhM2JiZDIyZWQ1M2VhNTE2ZDJmMGYwMjc2MDkwMjNjYjg4MDFlM2I1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFnZW5jeU5hbWUifSx7InZhbHVlIjoiZDJmM2VhY2E2ZTgwOGM3Yzg1MGQxZGQ5NzU4YzJhMzU1NTNhNjkzZmU2M2QxNjlmYzFkNWI5MGFhZDIzYzJjYiIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0uaWQifSx7InZhbHVlIjoiOGQxNDZhZjlhOTEyYjZlM2RkZmFlNTRkNGZkZDk1MjdiOTljZDdmMDIzZTRjYjA1Y2I3MzE1OGMxMjIzNDU2NSIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0udHlwZSJ9LHsidmFsdWUiOiJmYThmOWY0M2YzNjdkZDU0NjQxOGEwZThhYWEwNzhhMDk4N2E0NWZlNTBmNjQ3YzFlMjUxNjI3ZjI3ODBjZmEwIiwicGF0aCI6InJlbmRlck1ldGhvZFswXS5uYW1lIn1d", + "privacy": { + "obfuscated": [] + }, + "key": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733#controller", + "signature": "0x6c64f3405236c55d9ba90bf600f36cbd7f34a86db24a92a62aabd1dacc96fd566493af704bb73f38d0bf260ec2198ad0c65793e9e22933add4a912dffd994ab01c" + } +} diff --git a/src/integration/v4/v4-verified.spec.js b/src/integration/v4/v4-verified.spec.js new file mode 100644 index 000000000..047d9c539 --- /dev/null +++ b/src/integration/v4/v4-verified.spec.js @@ -0,0 +1,64 @@ +import { Selector } from "testcafe"; +import { waitForReact } from "testcafe-react-selectors"; + +fixture("OA v4 DID-DNS Certificate Rendering").page`http://localhost:3000`.beforeEach(async () => { + await waitForReact(); +}); + +const EmbeddedRendererDoc = "./fixtures/v4_embedded_renderer.json"; +const IframeBlock = Selector("#iframe"); +const SampleTemplate = Selector("#root"); +const StatusButton = Selector("#certificate-status"); + +const validateTextContent = async (t, component, texts) => + texts.reduce(async (_prev, curr) => t.expect(component.textContent).contains(curr), Promise.resolve()); + +test("Sample v4 document using embedded renderer is rendered correctly when dns is verified", async (t) => { + await t.setFilesToUpload("input[type=file]", [EmbeddedRendererDoc]); + + await validateTextContent(t, StatusButton, ["EXAMPLE.OPENATTESTATION.COM"]); + + await t.switchToIframe(IframeBlock); + + await validateTextContent(t, SampleTemplate, ["OpenCerts Demo", "Your Name"]); +}); + +const SvgRendererDoc = "./fixtures/v4_svg.json"; +const ImgElement = Selector('img[title="Svg Renderer Image"]'); + +test("Sample v4 document using svg renderer is rendered correctly when dns is verified", async (t) => { + await t.setFilesToUpload("input[type=file]", [SvgRendererDoc]); + + await validateTextContent(t, StatusButton, ["EXAMPLE.OPENATTESTATION.COM"]); + + await ImgElement.with({ visibilityCheck: true })(); +}); + +const BatchedDoc = "./fixtures/v4_batched.json"; + +test("Sample batched and signed v4 document is rendered correctly when dns is verified", async (t) => { + await t.setFilesToUpload("input[type=file]", [BatchedDoc]); + + await validateTextContent(t, StatusButton, ["EXAMPLE.OPENATTESTATION.COM"]); + + await t.switchToIframe(IframeBlock); + + await validateTextContent(t, SampleTemplate, ["OpenCerts Demo", "Your Name 1"]); +}); + +const ObfuscatedDoc = "./fixtures/v4_data_obfuscated.json"; +const ObfuscationNote = Selector("#obfuscation-note"); + +test("Sample obfuscated v4 document is rendered correctly when dns is verified", async (t) => { + await t.setFilesToUpload("input[type=file]", [ObfuscatedDoc]); + + await validateTextContent(t, StatusButton, ["EXAMPLE.OPENATTESTATION.COM"]); + + await validateTextContent(t, ObfuscationNote, [ + "The owner of this certificate have chosen not to share certain information in the certificate with you. Please note that this does not affect the authenticity of the certificate.", + ]); + + await t.switchToIframe(IframeBlock); + + await validateTextContent(t, SampleTemplate, ["OpenCerts Demo", "Your Name"]); +}); diff --git a/src/sagas/certificate.ts b/src/sagas/certificate.ts index e2134960d..259cac062 100644 --- a/src/sagas/certificate.ts +++ b/src/sagas/certificate.ts @@ -171,7 +171,6 @@ export function* verifyCertificate({ payload: certificate }: { payload: WrappedO } } } catch (e) { - console.log("ERRR", e); yield put(verifyingCertificateErrored(e.message)); } } From 95ff14b5b7647860936d812784b7009b587dff7c Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 20 Jun 2024 16:28:03 +0800 Subject: [PATCH 25/27] chore: replace remote svg --- src/integration/v4/fixtures/v4_svg.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/integration/v4/fixtures/v4_svg.json b/src/integration/v4/fixtures/v4_svg.json index fb70280e9..a22ae62a1 100644 --- a/src/integration/v4/fixtures/v4_svg.json +++ b/src/integration/v4/fixtures/v4_svg.json @@ -3,7 +3,7 @@ "https://www.w3.org/ns/credentials/v2", "https://schemata.openattestation.com/com/openattestation/4.0/alpha-context.json" ], - "name": "SVG Test Certificate V4", + "name": "Govtech Demo Certificate V4", "type": ["VerifiableCredential", "OpenAttestationCredential"], "issuer": { "id": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733", @@ -34,22 +34,22 @@ }, "renderMethod": [ { - "id": "https://raw.githubusercontent.com/yapyuyou/yapyuyou/main/test.svg", + "id": " AGENCY OF TESTING TESTING INSTITUTE OF SINGAPORE conducted by {{course.endDate}} {{official.name}} {{official.position}} {{agencyName}} CERTIFICATE OF COMPLETION awarded to {{recipient.name}} for successfully completing {{course.name}} {{course.fromDate}} - {{course.endDate}} ", "type": "SvgRenderingTemplate2023", - "name": "SVG Test Cert" + "name": "SVG Demo" } ], "proof": { "type": "OpenAttestationMerkleProofSignature2018", "proofPurpose": "assertionMethod", - "targetHash": "6d6fb0d6f5081ef0c14e4242ef930606513ab1aa04e97f3553850aaff94946ed", + "targetHash": "c90769e2725632698df8d80c67e7cda5ee27f73a6d300c2b6c6e2bebe09f9913", "proofs": [], - "merkleRoot": "6d6fb0d6f5081ef0c14e4242ef930606513ab1aa04e97f3553850aaff94946ed", - "salts": "W3sidmFsdWUiOiJmNWM1NjU1MWNkYjdjMTFkZWY1ZGMxMTI2MjNiZDUzYTQ5ZjhiZDU4ZjQyZTNhNDQ1YzMxODVhZjg3ZDJjYTMwIiwicGF0aCI6IkBjb250ZXh0WzBdIn0seyJ2YWx1ZSI6ImMwNDA0YzViNTI0YzQ0MmU1NWIxYmQ0YmE0Y2NhOTRhZjY0N2I3YjVjZTU3OTVkNmQ2NzUxNTRkMGE0MjUyMTciLCJwYXRoIjoiQGNvbnRleHRbMV0ifSx7InZhbHVlIjoiMjNiNDdhMTQ4NzAwYmZkZmI5OWVlZTg2NjAyNDE5MWM4YmRhYzFkY2I1YmViNTM5MTRiMDM0MzFmYjZjMDRkMSIsInBhdGgiOiJuYW1lIn0seyJ2YWx1ZSI6ImZiMzFjYTM4M2NkODM3M2NhMDVlMGQ2OWNkYzdhM2RhYzJhMjkwMjA1OGE2ODkyNzNhNTBiN2YzYTJmNWE2MmEiLCJwYXRoIjoidHlwZVswXSJ9LHsidmFsdWUiOiJmOTI1OTNmYzc2ZjNiMGQyN2ZkNDI3ZDNjMDNkNDUyZTFlY2Y3MjZhMWY1ZGEyNTIwYTQxODAxNzY1YTM2M2M0IiwicGF0aCI6InR5cGVbMV0ifSx7InZhbHVlIjoiMmJjZmQ4ZWZiNmU4ZTllYjIzODUyNGM5MTVkN2I4Mjc2NDc1MTQ3ZWQ3MjI4ZDU4YWEwZjZhMjAyZGFjYjhlNCIsInBhdGgiOiJpc3N1ZXIuaWQifSx7InZhbHVlIjoiZjdjOWI0NDE3YTlmM2Y1ODQ2MDExODdlNTUzYmU0M2YzOTNiYWM2MjBhODdkZWMyM2NmYTYxNzViZGQ1ZjRmNCIsInBhdGgiOiJpc3N1ZXIudHlwZSJ9LHsidmFsdWUiOiJlNmE2ZDdiMmQxZTNjNzAyNmIwYjMzZTViYTYwYzBmNTlkNjQ2OGMwYmU0MWRlNGQ4MTc2YzFmY2UyYTRkZTJlIiwicGF0aCI6Imlzc3Vlci5uYW1lIn0seyJ2YWx1ZSI6IjJhYTIyYTUzZDcyZWNkZjg4YjMzMDQxMGU3NWQ1NzExMDI2MjdkNjMzNTg2YTM5NGUxMzRkMjk3ZjhkNTFhYjgiLCJwYXRoIjoiaXNzdWVyLmlkZW50aXR5UHJvb2YuaWRlbnRpdHlQcm9vZlR5cGUifSx7InZhbHVlIjoiNGRiNmUzMzhhNjUwODYxMDI5MjI1YTFiZWQwMGZhZTJlNTRiMGRjZDYzZGY0MTA1NzA2OWNjNmJhNWMyY2RlYiIsInBhdGgiOiJpc3N1ZXIuaWRlbnRpdHlQcm9vZi5pZGVudGlmaWVyIn0seyJ2YWx1ZSI6Ijc3YzU0NTE3NmI4OGY2MTNlYWQ5MjdiMTAxNTI2NTE1MTliZjYwODQyYzQzZDhmYTFkMDM0OGY3NTAxNzAzODAiLCJwYXRoIjoidmFsaWRGcm9tIn0seyJ2YWx1ZSI6ImUyMTlmZjE0YTRmNDZmODAwMWEzYzk2NzkzZWY3ZDJhNTcwMjZiNTIyMWY3MTEwYmMyNzUzMjk3MWNmZGMzNWMiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QubWVzc2FnZSJ9LHsidmFsdWUiOiJhYjI4NjIzODU2ZTdiYTMxZjZkMWE5MmZhNzQ5MGY1YTg0ODRhMWRkYzFlYjZkMTg0NjUxZTExNzM3OGRjOWE4IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmNvdXJzZS5uYW1lIn0seyJ2YWx1ZSI6ImRjOWE2NGQxYjViMWRkYzA1OTM4MzBjOGIxNDdmNzlmYjY5NDQxYmMzOWQ0N2U5NjYxOWQyNGU3ZGQwYTM2MGIiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuY291cnNlLmZyb21EYXRlIn0seyJ2YWx1ZSI6ImY5ZjQ4MjU2YjdjNzExMjFhY2FhZWYyZjljM2EwZWM4NjdhMGI3MmFmN2E4OTE2ZGI0YmVmYTQxOTQyYmRhNjEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuY291cnNlLmVuZERhdGUifSx7InZhbHVlIjoiMTVkYmFkMjcxODQwY2QzZTZhNDdlNzhmODViYjNlY2U5YmU3MmQyZTkwZjhmOTIwZDA5YzQzOGE0ZGIyN2NiNCIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5yZWNpcGllbnQubmFtZSJ9LHsidmFsdWUiOiI1NTgyY2ZjYmRiZTczM2ViODlkMWU5ZjM3YTczNDg3OTkzNzc0YWRlYzk5YWNmOWYxYWUyZTg0YjdkNGE2NjY1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lm9mZmljaWFsLm5hbWUifSx7InZhbHVlIjoiOWFlOGY4NTVlNmVjM2RlN2E2MDM4MjkwODc2ODhkYTJlYjUwZWI5ZTg3ZTIyYTQ0ZmE5NmVmNDY3YzczODJkNSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5vZmZpY2lhbC5wb3NpdGlvbiJ9LHsidmFsdWUiOiI3ZDc4MjUwZGEyZjVjNmM4Y2I3NjczMTBmNjk5NmY0NmM0OTRiMmE4MTliNTFmNTIyODY0YzVhOTJkNmY3ZmNkIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lm9mZmljaWFsLnNpZ25hdHVyZSJ9LHsidmFsdWUiOiIyODEwMzYxMGQ0ZjhlZDVlODhiNzhiNGVhM2JiZDIyZWQ1M2VhNTE2ZDJmMGYwMjc2MDkwMjNjYjg4MDFlM2I1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFnZW5jeU5hbWUifSx7InZhbHVlIjoiZDJmM2VhY2E2ZTgwOGM3Yzg1MGQxZGQ5NzU4YzJhMzU1NTNhNjkzZmU2M2QxNjlmYzFkNWI5MGFhZDIzYzJjYiIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0uaWQifSx7InZhbHVlIjoiOGQxNDZhZjlhOTEyYjZlM2RkZmFlNTRkNGZkZDk1MjdiOTljZDdmMDIzZTRjYjA1Y2I3MzE1OGMxMjIzNDU2NSIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0udHlwZSJ9LHsidmFsdWUiOiJmYThmOWY0M2YzNjdkZDU0NjQxOGEwZThhYWEwNzhhMDk4N2E0NWZlNTBmNjQ3YzFlMjUxNjI3ZjI3ODBjZmEwIiwicGF0aCI6InJlbmRlck1ldGhvZFswXS5uYW1lIn1d", + "merkleRoot": "c90769e2725632698df8d80c67e7cda5ee27f73a6d300c2b6c6e2bebe09f9913", + "salts": "W3sidmFsdWUiOiIwZWNkMjcxNWJiMGI4ZjZkODE4MWNiODlmNWU0ZWE5NTg1ZmQ0ZWFiZTg0NWFmYTdlN2I0NjkwZjc5YTNjMjExIiwicGF0aCI6IkBjb250ZXh0WzBdIn0seyJ2YWx1ZSI6ImQyNDcxM2E0Yzg0NDZkMzlkYjdhZjE0ZjI2MmY4MmM2NTdjMmQ4NmNkNTAwMWYxZWIyZDA2NjM1OTk4ZjQ4YWMiLCJwYXRoIjoiQGNvbnRleHRbMV0ifSx7InZhbHVlIjoiNGQ2OTYyOWY4ZmMwODUyODllODA4NDcyZGYyODVhODEzNmQ2MzhiOWQ0OGEyZjFmOWI1NDU3ZTFlNDYxODkxMCIsInBhdGgiOiJuYW1lIn0seyJ2YWx1ZSI6ImJjY2VjNDEyZmZhMmExMGYwNmJhMzgwNWQ3YjQxNjA0MzVmMzU3YmMyZmFmZTJiODQ3OTg0OGQzNTNhZDg1OGUiLCJwYXRoIjoidHlwZVswXSJ9LHsidmFsdWUiOiIyNTNiYTJiMzBkZmQwYTIzYmVmZDQ3NTExMGZhYWUzNmUwYjY2YjFiMDRhYzc3ZjgzZjdlN2ZjMTdkOTM3MmViIiwicGF0aCI6InR5cGVbMV0ifSx7InZhbHVlIjoiZjY4ZGViOWUzYzhjMGQ3NDMxYmRhMDMxYmNlZDI3OWY0ZGNmNDAwYjgzYjQzZmY1NmRkYWI2YTIzNzFmZTdmNiIsInBhdGgiOiJpc3N1ZXIuaWQifSx7InZhbHVlIjoiOTZhN2M1YjM5MjBjNjFjYmZjZjE5YTFlOTA3ZGIxMTgxMzc3YmNiODM5ODIwMmMxMTcyMGYzMmMxZjU5ZjVkNCIsInBhdGgiOiJpc3N1ZXIudHlwZSJ9LHsidmFsdWUiOiJlMWJhMTRhNTc3Mjc5NWEwMGI3Yzg3MGVkMTYwZDNmOWE2MjUyMWI2MzcxNDYxNmY3MDg1NTA3ZDUwOWFjMzY4IiwicGF0aCI6Imlzc3Vlci5uYW1lIn0seyJ2YWx1ZSI6IjBkMDRkZTU5YzkxMmY5MjM3NTE4NjdmZTQ3NzBjMjEyMWFiODk5ODBiNTA3MGE3NTQ1OGI0YzRiZDUyMmMyZTAiLCJwYXRoIjoiaXNzdWVyLmlkZW50aXR5UHJvb2YuaWRlbnRpdHlQcm9vZlR5cGUifSx7InZhbHVlIjoiZmE2MDc0YWMxOGUzY2IyZjExYWEwOTA0OWU3OWRhOGUyMTQ2YmE2NjA5NWYzMTM2ZGJmMTM4ZGEzZWMzOWZkYSIsInBhdGgiOiJpc3N1ZXIuaWRlbnRpdHlQcm9vZi5pZGVudGlmaWVyIn0seyJ2YWx1ZSI6ImEyMTBjYjg4NDY5Y2Q5YWFmYWFlOTAzY2Y1OWM2ZWI5MjcyMDU4OGJkNThiNzk3OGUyMDc4NTcxZTFhZTI0ZmEiLCJwYXRoIjoidmFsaWRGcm9tIn0seyJ2YWx1ZSI6IjVkMGNkZmQ4ZmI1MmUyZTg5NTllNjg4OGMyNTg0NjM3ZmEwYzljMmRkYWZiYTUzN2QxODUyNjQ5MzUyOThiYzEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QubWVzc2FnZSJ9LHsidmFsdWUiOiI2ZTk2YWY1OWZiYjA4MzQ3YmVlMGRjMDIyMjAwYjdjN2ViNzkzNzI5ZmE4NmE4YzA0MzkxNDU2N2Q4YzlmNWE0IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmNvdXJzZS5uYW1lIn0seyJ2YWx1ZSI6IjViMzk5Nzk2ZGE2Zjg5M2U5ZWU4ZDZkY2FkNTMxYjZjNGFiN2UzMGE5MzY5MzQ5MGFhNGQwNDIxZjQ4ODZlYTUiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuY291cnNlLmZyb21EYXRlIn0seyJ2YWx1ZSI6IjA3M2MzNTM2ZTEzNzZkNmE5NmUwNjZlOGQzMDI4ZjRlOTllMDBkNGQ2ZjZjZDMwYTJlMjIyMThlN2EyNDg2OWEiLCJwYXRoIjoiY3JlZGVudGlhbFN1YmplY3QuY291cnNlLmVuZERhdGUifSx7InZhbHVlIjoiZGQxMjRjZTQzNDA1OTBkMjZjODc5YWExYTlhYmExOTBiZjA4MWMwNjU3ZTlmN2JkYzc2NjMwYzRmYzFkMmY1OSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5yZWNpcGllbnQubmFtZSJ9LHsidmFsdWUiOiI3ZGI0ZTMwZmI4NWM5YmRjOGU0ZGQ4ZDA4ZDRjY2Q3YTNmMDc0YTQ4ZDg1MThlZmZkNmIyN2NhMDJlYWNlNmExIiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lm9mZmljaWFsLm5hbWUifSx7InZhbHVlIjoiZThhMjgxN2RiYTM3ZTUyZTA0NGYyNjIyMmEyODYwY2FmYmE5NzY3YzQ5ZDcwMzZhYTliN2Y0MzVhZDNkYzU0MSIsInBhdGgiOiJjcmVkZW50aWFsU3ViamVjdC5vZmZpY2lhbC5wb3NpdGlvbiJ9LHsidmFsdWUiOiI4MWY4NTU2ZDRiMjg4OTM0NDYzYTEwOGJlMzlmMmMxOWZjN2NhMDk1ODE5MjQ5NDAzNTAxYzczMGE0ZjMzYjE3IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0Lm9mZmljaWFsLnNpZ25hdHVyZSJ9LHsidmFsdWUiOiIzNzYzYjgxMzgzZGMzNTE0NjZlNTllOTQ4ZGQzNjBiM2RhMGMzZWEwYTY2NDU0NmQzMmExZDZhMTVkMTZlNTc1IiwicGF0aCI6ImNyZWRlbnRpYWxTdWJqZWN0LmFnZW5jeU5hbWUifSx7InZhbHVlIjoiOTNkMzRiNDAyZGY0ZjM1ZTkwNzMwMjI5OTFlZGU2ODE5OWRjZThiNjZmM2M4YTQxY2NiMjY5NTZlYzc4NzNkZCIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0uaWQifSx7InZhbHVlIjoiMmMwNTljMjk2YTM0Y2YyMTczMjRiNDYyNjA0YzJhMTM5MTk4MDkyZDI0OGZkZDc0YzdhNzZmODNjMzRhYjZkYSIsInBhdGgiOiJyZW5kZXJNZXRob2RbMF0udHlwZSJ9LHsidmFsdWUiOiI1NjA4MDE2OWE2Mjg0NjRjMjhjZDgxZWQ1YmY4ODFjNDkxY2I4ZjAyMTMwZWQ2YmRkMzIyZTYyYzc5MGFkMmZlIiwicGF0aCI6InJlbmRlck1ldGhvZFswXS5uYW1lIn1d", "privacy": { "obfuscated": [] }, "key": "did:ethr:0x1245e5b64d785b25057f7438f715f4aa5d965733#controller", - "signature": "0x6c64f3405236c55d9ba90bf600f36cbd7f34a86db24a92a62aabd1dacc96fd566493af704bb73f38d0bf260ec2198ad0c65793e9e22933add4a912dffd994ab01c" + "signature": "0x356ad3fe4a5f7f1400107b25c558ef8497ced4f32dc15121cd9ca988c2e650673ca1b7120a2caed8d1dd652c101fb05c471de0d47dc25636117b3c4ef5c8b8081c" } } From b4c488dd90c37c3810a6988a47996172e7785eea Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Mon, 24 Jun 2024 13:32:13 +0800 Subject: [PATCH 26/27] refactor: import types from the root --- .../CertificateVerifyBlock/CertificateVerifyBlock.tsx | 8 ++++++-- src/services/fragment.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx index 4391026dd..df4056f27 100644 --- a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx +++ b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx @@ -1,5 +1,9 @@ -import { utils, ValidDnsTxtVerificationStatus, ValidDnsDidVerificationStatus } from "@govtechsg/oa-verify"; -import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types/types/core"; +import { + utils, + ValidDnsTxtVerificationStatus, + ValidDnsDidVerificationStatus, + VerificationFragment, +} from "@govtechsg/oa-verify"; import { getData, v2, WrappedDocument, utils as oaUtils, v3, v4 } from "@govtechsg/open-attestation"; import { getOpencertsRegistryVerifierFragment, diff --git a/src/services/fragment.ts b/src/services/fragment.ts index c29cb2447..96c8cc3cf 100644 --- a/src/services/fragment.ts +++ b/src/services/fragment.ts @@ -2,8 +2,8 @@ import { utils, OpenAttestationEthereumDocumentStoreStatusCode, OpenAttestationEthereumTokenRegistryStatusCode, + VerificationFragment, } from "@govtechsg/oa-verify"; -import type { VerificationFragment } from "@govtechsg/oa-verify/dist/types"; // this function check if the reason of the error is that the document store or token registry is invalid export const addressInvalid = (fragments: VerificationFragment[]): boolean => { From 56fb3fe0cbc828f11400ce8c1c40bc361973765c Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Mon, 24 Jun 2024 13:37:20 +0800 Subject: [PATCH 27/27] refactor: revert order of imports to reduce line changes --- .../CertificateVerifyBlock/CertificateVerifyBlock.tsx | 2 +- src/services/fragment.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx index df4056f27..05dc6fecd 100644 --- a/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx +++ b/src/components/CertificateVerifyBlock/CertificateVerifyBlock.tsx @@ -1,7 +1,7 @@ import { utils, - ValidDnsTxtVerificationStatus, ValidDnsDidVerificationStatus, + ValidDnsTxtVerificationStatus, VerificationFragment, } from "@govtechsg/oa-verify"; import { getData, v2, WrappedDocument, utils as oaUtils, v3, v4 } from "@govtechsg/open-attestation"; diff --git a/src/services/fragment.ts b/src/services/fragment.ts index 96c8cc3cf..76448187c 100644 --- a/src/services/fragment.ts +++ b/src/services/fragment.ts @@ -1,8 +1,8 @@ import { - utils, OpenAttestationEthereumDocumentStoreStatusCode, OpenAttestationEthereumTokenRegistryStatusCode, VerificationFragment, + utils, } from "@govtechsg/oa-verify"; // this function check if the reason of the error is that the document store or token registry is invalid