From dcdec8c8e1ba98b5a6473d21f8698c1a411fb4de Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Sat, 19 Jun 2021 00:18:03 -0300 Subject: [PATCH] Add IDX as user identity provider Signed-off-by: Sebastian Martinez --- package-lock.json | 672 ++++++++++++++++++++++++++++++++++++- package.json | 5 + src/App.svelte | 2 + src/base/idx/Link.svelte | 27 ++ src/base/idx/Routes.svelte | 11 + src/config.json | 1 + src/config.ts | 9 + src/session.ts | 16 +- src/utils.ts | 49 +++ 9 files changed, 771 insertions(+), 21 deletions(-) create mode 100644 src/base/idx/Link.svelte create mode 100644 src/base/idx/Routes.svelte diff --git a/package-lock.json b/package-lock.json index 7184a9fb7..e33129b9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,11 @@ "packages": { "": { "dependencies": { + "@ceramicnetwork/blockchain-utils-linking": "^1.0.2", + "@ceramicnetwork/http-client": "^1.0.6", + "@ceramicnetwork/stream-caip10-link": "^1.0.6", + "@ceramicstudio/idx": "^0.12.1", + "@ceramicstudio/idx-constants": "^1.0.0", "@gnosis.pm/safe-core-sdk": "^0.2.0", "@gnosis.pm/safe-core-sdk-types": "^0.1.1", "@gnosis.pm/safe-service-client": "^0.1.0-alpha.0", @@ -137,6 +142,107 @@ "node": ">=4" } }, + "node_modules/@ceramicnetwork/blockchain-utils-linking": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/blockchain-utils-linking/-/blockchain-utils-linking-1.0.2.tgz", + "integrity": "sha512-+TPYJ8BvHWhJ/Nla0CD+Gsln/+ofXYozVzJZLa+0TXU24viqRNtoQlI1rk7ta4OmgR/mvWbRtUC4kuiMOrnPlQ==", + "dependencies": { + "@stablelib/sha256": "^1.0.0", + "caip": "~0.9.2", + "uint8arrays": "^2.0.5" + } + }, + "node_modules/@ceramicnetwork/common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/common/-/common-1.0.6.tgz", + "integrity": "sha512-AxM9Ubgy7m7gxyTCJPKc+MvXtHnJDUE8u2+m36/TtSIYBlwIJOnEajz8SVys3qLZq37TdlT06l0cLLaTfYF3Wg==", + "dependencies": { + "@ceramicnetwork/streamid": "^1.0.2", + "@overnightjs/logger": "^1.2.0", + "cids": "~1.1.6", + "cross-fetch": "^3.1.4", + "flat": "^5.0.2", + "lodash.clonedeep": "^4.5.0", + "logfmt": "^1.3.2", + "rxjs": "^7.0.0", + "uint8arrays": "^2.0.5" + } + }, + "node_modules/@ceramicnetwork/http-client": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-1.0.6.tgz", + "integrity": "sha512-ahmFCNEzQ8BpyPa5g+vHYo3/gyzz3e5AGnGs7NVeY2e28YoZdnNw5z1X2pHK/eD4WIN+mVViM81TQk9mprKstQ==", + "dependencies": { + "@ceramicnetwork/common": "^1.0.6", + "@ceramicnetwork/stream-caip10-link": "^1.0.6", + "@ceramicnetwork/stream-tile": "^1.0.6", + "@ceramicnetwork/streamid": "^1.0.2", + "query-string": "7.0.0", + "rxjs": "^7.0.0" + } + }, + "node_modules/@ceramicnetwork/stream-caip10-link": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-1.0.6.tgz", + "integrity": "sha512-VNxRrto2n3fMXt798H3rrhHUp+bvWtKNDUhSfWbcl57iEnmXq6GN1jUw3U+t7iPxd6Irp3Qx2dIq9j0tz3iHOQ==", + "dependencies": { + "@ceramicnetwork/common": "^1.0.6", + "@ceramicnetwork/streamid": "^1.0.2", + "caip": "~0.9.2" + } + }, + "node_modules/@ceramicnetwork/stream-tile": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-1.0.6.tgz", + "integrity": "sha512-iK89zC38YH2A/V10uvZUi09T+LI9O9pUFnxit+7nZ+iL3oqAYTC8RRXWg0JuREb46Xk2jYzueWAPSdyNdV7CCg==", + "dependencies": { + "@ceramicnetwork/common": "^1.0.6", + "@ceramicnetwork/streamid": "^1.0.2", + "@stablelib/random": "^1.0.0", + "fast-json-patch": "^2.2.1", + "uint8arrays": "^2.0.5" + } + }, + "node_modules/@ceramicnetwork/streamid": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/streamid/-/streamid-1.0.2.tgz", + "integrity": "sha512-Ctolu7oYA4uqpfCEOde189kZcvkIvrLeUdV40oTQYNu7/APNp1p9S6eRy4wk1Z3eFLwTWvwjzDHpdIW4pdioPA==", + "dependencies": { + "cids": "~1.1.6", + "multibase": "~4.0.2", + "typescript-memoize": "^1.0.0-alpha.4", + "uint8arrays": "^2.0.5", + "varint": "^6.0.0" + } + }, + "node_modules/@ceramicnetwork/streamid/node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, + "node_modules/@ceramicstudio/idx": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@ceramicstudio/idx/-/idx-0.12.1.tgz", + "integrity": "sha512-i6mDb514CeKmHWSYPOXqMQKGYiBFwuyD2Q+j1EEOfjZ0Q/S/9Dlpqlj09PrUYKupVaXDVTndDBNJLpiCYZ9YmQ==", + "dependencies": { + "@ceramicnetwork/stream-caip10-link": "^1.0.0", + "@ceramicnetwork/stream-tile": "^1.0.0", + "@ceramicstudio/idx-constants": "^1.0.0", + "caip": "^0.9.2", + "cross-fetch": "^3.1.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ceramicstudio/idx-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ceramicstudio/idx-constants/-/idx-constants-1.0.0.tgz", + "integrity": "sha512-bBCnOSABGmHOBkF1XZoyHrf5ZMv5Mv8RODY6I3uAT35DzkNojymcITUTSlmZsMqDXmvaa4INV5xSXP/lX3YErQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", @@ -888,6 +994,16 @@ "node": ">= 8" } }, + "node_modules/@overnightjs/logger": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@overnightjs/logger/-/logger-1.2.1.tgz", + "integrity": "sha512-ssLUjjj/DXl6m4oydyA6vgVHyJcis4Ui0hS7+EyOxZVMXbiVZeGOficfJfgELTNqTbHLmTb3TBVyJspNDkqbLw==", + "deprecated": "OvernightJS/logger has been deprecated in favor of jet-logger", + "dependencies": { + "colors": "^1.3.3", + "util": "^0.11.1" + } + }, "node_modules/@rollup/pluginutils": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", @@ -910,6 +1026,48 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "dependencies": { + "@stablelib/int": "^1.0.1" + } + }, + "node_modules/@stablelib/hash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" + }, + "node_modules/@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" + }, + "node_modules/@stablelib/random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.1.tgz", + "integrity": "sha512-zOh+JHX3XG9MSfIB0LZl/YwPP9w3o6WBiJkZvjPoKKu5LKFW4OLV71vMxWp9qG5T43NaWyn0QQTWgqCdO+yOBQ==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/sha256": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz", + "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" + }, "node_modules/@stardazed/streams": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@stardazed/streams/-/streams-3.1.0.tgz", @@ -985,9 +1143,9 @@ "integrity": "sha512-lbhSN1rht/tQ+dSWxawCzGgTfxe9DB31iLgiT1ZVT5lshpam/nyOA1m3tKHRoNPctB2ukSL22JZI5Fr+WI/zYg==" }, "node_modules/@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" }, "node_modules/@types/pbkdf2": { "version": "3.1.0", @@ -1355,9 +1513,9 @@ } }, "node_modules/blakejs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", + "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" }, "node_modules/bn.js": { "version": "4.12.0", @@ -1450,6 +1608,11 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "node_modules/caip": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/caip/-/caip-0.9.2.tgz", + "integrity": "sha512-o4aIUSR9lkn7B9lIw8Xgkj+hDh+S1PtsBphoSqP2Dt95gRWPniaqEpnPwiUEhaPQr84JzWIEm4Cck3lMZtIkTA==" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1496,6 +1659,21 @@ "fsevents": "~2.3.1" } }, + "node_modules/cids": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.7.tgz", + "integrity": "sha512-dlh+K0hMwFAFFjWQ2ZzxOhgGVNVREPdmk8cqHFui2U4sOodcemLMxdE5Ujga4cDcDQhWfldEPThkfu6KWBt1eA==", + "dependencies": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1529,6 +1707,14 @@ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "devOptional": true }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1569,6 +1755,14 @@ "sha.js": "^2.4.8" } }, + "node_modules/cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1600,6 +1794,14 @@ } } }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, "node_modules/dedent-js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", @@ -2059,6 +2261,22 @@ "node": ">=8" } }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, "node_modules/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", @@ -2104,6 +2322,22 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -2517,8 +2751,7 @@ "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -2532,6 +2765,18 @@ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, + "node_modules/logfmt": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/logfmt/-/logfmt-1.3.2.tgz", + "integrity": "sha512-U0lelcaGWEfEITZQXs8y5HrJp2xa0BJ+KDfkkLJRmuKbQIEVGNv145FbaNekY4ZYHJSBBx8NLJitaPtRqLEkxQ==", + "dependencies": { + "split": "0.2.x", + "through": "2.3.x" + }, + "bin": { + "logfmt": "bin/logfmt" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -2649,6 +2894,15 @@ "npm": ">=6.0.0" } }, + "node_modules/multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dependencies": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, "node_modules/multihashes": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", @@ -2695,6 +2949,14 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/node-gyp-build": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", @@ -2866,6 +3128,23 @@ "node": ">=6" } }, + "node_modules/query-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.0.tgz", + "integrity": "sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3051,6 +3330,19 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.1.0.tgz", + "integrity": "sha512-gCFO5iHIbRPwznl6hAYuwNFld8W4S2shtSJIqG27ReWXo9IWrCyEICxUA+6vJHwSR/OakoenC4QsDxq50tzYmw==", + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3195,12 +3487,39 @@ "node": ">=0.10.0" } }, + "node_modules/split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "engines": { + "node": ">=4" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3462,6 +3781,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3536,6 +3860,11 @@ "node": ">=4.2.0" } }, + "node_modules/typescript-memoize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typescript-memoize/-/typescript-memoize-1.0.1.tgz", + "integrity": "sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w==" + }, "node_modules/uint8arrays": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", @@ -3553,11 +3882,24 @@ "punycode": "^2.1.0" } }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -3757,6 +4099,103 @@ } } }, + "@ceramicnetwork/blockchain-utils-linking": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/blockchain-utils-linking/-/blockchain-utils-linking-1.0.2.tgz", + "integrity": "sha512-+TPYJ8BvHWhJ/Nla0CD+Gsln/+ofXYozVzJZLa+0TXU24viqRNtoQlI1rk7ta4OmgR/mvWbRtUC4kuiMOrnPlQ==", + "requires": { + "@stablelib/sha256": "^1.0.0", + "caip": "~0.9.2", + "uint8arrays": "^2.0.5" + } + }, + "@ceramicnetwork/common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/common/-/common-1.0.6.tgz", + "integrity": "sha512-AxM9Ubgy7m7gxyTCJPKc+MvXtHnJDUE8u2+m36/TtSIYBlwIJOnEajz8SVys3qLZq37TdlT06l0cLLaTfYF3Wg==", + "requires": { + "@ceramicnetwork/streamid": "^1.0.2", + "@overnightjs/logger": "^1.2.0", + "cids": "~1.1.6", + "cross-fetch": "^3.1.4", + "flat": "^5.0.2", + "lodash.clonedeep": "^4.5.0", + "logfmt": "^1.3.2", + "rxjs": "^7.0.0", + "uint8arrays": "^2.0.5" + } + }, + "@ceramicnetwork/http-client": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-1.0.6.tgz", + "integrity": "sha512-ahmFCNEzQ8BpyPa5g+vHYo3/gyzz3e5AGnGs7NVeY2e28YoZdnNw5z1X2pHK/eD4WIN+mVViM81TQk9mprKstQ==", + "requires": { + "@ceramicnetwork/common": "^1.0.6", + "@ceramicnetwork/stream-caip10-link": "^1.0.6", + "@ceramicnetwork/stream-tile": "^1.0.6", + "@ceramicnetwork/streamid": "^1.0.2", + "query-string": "7.0.0", + "rxjs": "^7.0.0" + } + }, + "@ceramicnetwork/stream-caip10-link": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-1.0.6.tgz", + "integrity": "sha512-VNxRrto2n3fMXt798H3rrhHUp+bvWtKNDUhSfWbcl57iEnmXq6GN1jUw3U+t7iPxd6Irp3Qx2dIq9j0tz3iHOQ==", + "requires": { + "@ceramicnetwork/common": "^1.0.6", + "@ceramicnetwork/streamid": "^1.0.2", + "caip": "~0.9.2" + } + }, + "@ceramicnetwork/stream-tile": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-1.0.6.tgz", + "integrity": "sha512-iK89zC38YH2A/V10uvZUi09T+LI9O9pUFnxit+7nZ+iL3oqAYTC8RRXWg0JuREb46Xk2jYzueWAPSdyNdV7CCg==", + "requires": { + "@ceramicnetwork/common": "^1.0.6", + "@ceramicnetwork/streamid": "^1.0.2", + "@stablelib/random": "^1.0.0", + "fast-json-patch": "^2.2.1", + "uint8arrays": "^2.0.5" + } + }, + "@ceramicnetwork/streamid": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ceramicnetwork/streamid/-/streamid-1.0.2.tgz", + "integrity": "sha512-Ctolu7oYA4uqpfCEOde189kZcvkIvrLeUdV40oTQYNu7/APNp1p9S6eRy4wk1Z3eFLwTWvwjzDHpdIW4pdioPA==", + "requires": { + "cids": "~1.1.6", + "multibase": "~4.0.2", + "typescript-memoize": "^1.0.0-alpha.4", + "uint8arrays": "^2.0.5", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + } + } + }, + "@ceramicstudio/idx": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@ceramicstudio/idx/-/idx-0.12.1.tgz", + "integrity": "sha512-i6mDb514CeKmHWSYPOXqMQKGYiBFwuyD2Q+j1EEOfjZ0Q/S/9Dlpqlj09PrUYKupVaXDVTndDBNJLpiCYZ9YmQ==", + "requires": { + "@ceramicnetwork/stream-caip10-link": "^1.0.0", + "@ceramicnetwork/stream-tile": "^1.0.0", + "@ceramicstudio/idx-constants": "^1.0.0", + "caip": "^0.9.2", + "cross-fetch": "^3.1.4" + } + }, + "@ceramicstudio/idx-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ceramicstudio/idx-constants/-/idx-constants-1.0.0.tgz", + "integrity": "sha512-bBCnOSABGmHOBkF1XZoyHrf5ZMv5Mv8RODY6I3uAT35DzkNojymcITUTSlmZsMqDXmvaa4INV5xSXP/lX3YErQ==" + }, "@eslint/eslintrc": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", @@ -4196,6 +4635,15 @@ "fastq": "^1.6.0" } }, + "@overnightjs/logger": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@overnightjs/logger/-/logger-1.2.1.tgz", + "integrity": "sha512-ssLUjjj/DXl6m4oydyA6vgVHyJcis4Ui0hS7+EyOxZVMXbiVZeGOficfJfgELTNqTbHLmTb3TBVyJspNDkqbLw==", + "requires": { + "colors": "^1.3.3", + "util": "^0.11.1" + } + }, "@rollup/pluginutils": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", @@ -4214,6 +4662,48 @@ } } }, + "@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "requires": { + "@stablelib/int": "^1.0.1" + } + }, + "@stablelib/hash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" + }, + "@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" + }, + "@stablelib/random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.1.tgz", + "integrity": "sha512-zOh+JHX3XG9MSfIB0LZl/YwPP9w3o6WBiJkZvjPoKKu5LKFW4OLV71vMxWp9qG5T43NaWyn0QQTWgqCdO+yOBQ==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/sha256": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz", + "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" + }, "@stardazed/streams": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@stardazed/streams/-/streams-3.1.0.tgz", @@ -4276,9 +4766,9 @@ "integrity": "sha512-lbhSN1rht/tQ+dSWxawCzGgTfxe9DB31iLgiT1ZVT5lshpam/nyOA1m3tKHRoNPctB2ukSL22JZI5Fr+WI/zYg==" }, "@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" }, "@types/pbkdf2": { "version": "3.1.0", @@ -4518,9 +5008,9 @@ "dev": true }, "blakejs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", + "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" }, "bn.js": { "version": "4.12.0", @@ -4596,6 +5086,11 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "caip": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/caip/-/caip-0.9.2.tgz", + "integrity": "sha512-o4aIUSR9lkn7B9lIw8Xgkj+hDh+S1PtsBphoSqP2Dt95gRWPniaqEpnPwiUEhaPQr84JzWIEm4Cck3lMZtIkTA==" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4628,6 +5123,17 @@ "readdirp": "~3.5.0" } }, + "cids": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.7.tgz", + "integrity": "sha512-dlh+K0hMwFAFFjWQ2ZzxOhgGVNVREPdmk8cqHFui2U4sOodcemLMxdE5Ujga4cDcDQhWfldEPThkfu6KWBt1eA==", + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -4658,6 +5164,11 @@ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "devOptional": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4695,6 +5206,14 @@ "sha.js": "^2.4.8" } }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4715,6 +5234,11 @@ "ms": "2.1.2" } }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, "dedent-js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", @@ -5081,6 +5605,21 @@ "picomatch": "^2.2.1" } }, + "fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + } + } + }, "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", @@ -5120,6 +5659,16 @@ "to-regex-range": "^5.0.1" } }, + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -5423,8 +5972,7 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, "lodash.merge": { "version": "4.6.2", @@ -5438,6 +5986,15 @@ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, + "logfmt": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/logfmt/-/logfmt-1.3.2.tgz", + "integrity": "sha512-U0lelcaGWEfEITZQXs8y5HrJp2xa0BJ+KDfkkLJRmuKbQIEVGNv145FbaNekY4ZYHJSBBx8NLJitaPtRqLEkxQ==", + "requires": { + "split": "0.2.x", + "through": "2.3.x" + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -5530,6 +6087,15 @@ "@multiformats/base-x": "^4.0.1" } }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, "multihashes": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", @@ -5566,6 +6132,11 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, "node-gyp-build": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", @@ -5689,6 +6260,17 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "query-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.0.tgz", + "integrity": "sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA==", + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5806,6 +6388,21 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.1.0.tgz", + "integrity": "sha512-gCFO5iHIbRPwznl6hAYuwNFld8W4S2shtSJIqG27ReWXo9IWrCyEICxUA+6vJHwSR/OakoenC4QsDxq50tzYmw==", + "requires": { + "tslib": "~2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5901,12 +6498,30 @@ "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", "devOptional": true }, + "split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "requires": { + "through": "2" + } + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6067,6 +6682,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6118,6 +6738,11 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" }, + "typescript-memoize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typescript-memoize/-/typescript-memoize-1.0.1.tgz", + "integrity": "sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w==" + }, "uint8arrays": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", @@ -6135,6 +6760,21 @@ "punycode": "^2.1.0" } }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 00fb4b276..f4a1d0e65 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,11 @@ "vite-plugin-rewrite-all": "^0.1.2" }, "dependencies": { + "@ceramicnetwork/blockchain-utils-linking": "^1.0.2", + "@ceramicnetwork/http-client": "^1.0.6", + "@ceramicnetwork/stream-caip10-link": "^1.0.6", + "@ceramicstudio/idx": "^0.12.1", + "@ceramicstudio/idx-constants": "^1.0.0", "@gnosis.pm/safe-core-sdk": "^0.2.0", "@gnosis.pm/safe-core-sdk-types": "^0.1.1", "@gnosis.pm/safe-service-client": "^0.1.0-alpha.0", diff --git a/src/App.svelte b/src/App.svelte index bd04be8b7..df9f7aa18 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -8,6 +8,7 @@ import Registrations from '@app/base/registrations/Routes.svelte'; import Orgs from '@app/base/orgs/Routes.svelte'; import Users from '@app/base/users/Routes.svelte'; + import IDX from "@app/base/idx/Routes.svelte"; import Projects from '@app/base/projects/Routes.svelte'; import Resolver from '@app/base/resolver/Routes.svelte'; import Header from '@app/Header.svelte'; @@ -65,6 +66,7 @@ + diff --git a/src/base/idx/Link.svelte b/src/base/idx/Link.svelte new file mode 100644 index 000000000..9cbc293dc --- /dev/null +++ b/src/base/idx/Link.svelte @@ -0,0 +1,27 @@ + diff --git a/src/base/idx/Routes.svelte b/src/base/idx/Routes.svelte new file mode 100644 index 000000000..3ee8f7771 --- /dev/null +++ b/src/base/idx/Routes.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/config.json b/src/config.json index 20b4b4501..0676cac65 100644 --- a/src/config.json +++ b/src/config.json @@ -65,6 +65,7 @@ }, "tokens": [] }, + "ceramic": { "api": "https://ceramic-clay.3boxlabs.com" }, "radicle": { "api": "" }, "abi": { "registrar": [ diff --git a/src/config.ts b/src/config.ts index 522e64176..575fcc8c3 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,6 +1,8 @@ import { ethers } from "ethers"; import type { TypedDataSigner } from '@ethersproject/abstract-signer'; import SafeServiceClient from "@gnosis.pm/safe-service-client"; +import CeramicClient from "@ceramicnetwork/http-client"; +import { IDX } from "@ceramicstudio/idx"; import config from "@app/config.json"; declare global { @@ -27,6 +29,8 @@ export class Config { }; abi: { [contract: string]: string[] }; seed: { api?: string }; + idx: { client: IDX }; + ceramic: { client: CeramicClient }; tokens: string[]; token: ethers.Contract; @@ -42,6 +46,9 @@ export class Config { throw `Network ${network.name} is not supported`; } + const ceramic = new CeramicClient(config.ceramic.api); + const idx = new IDX({ ceramic }); + this.network = network; this.seed = { api }; this.registrar = cfg.registrar; @@ -56,6 +63,8 @@ export class Config { this.signer = signer; this.gasLimits = gasLimits; this.abi = config.abi; + this.idx = { client: idx }; + this.ceramic = { client: ceramic }; this.tokens = cfg.tokens; this.token = new ethers.Contract( this.radToken.address, diff --git a/src/session.ts b/src/session.ts index daefb7c1e..b834b77fa 100644 --- a/src/session.ts +++ b/src/session.ts @@ -36,7 +36,7 @@ export interface Store extends Readable { setTxSigning(): void; setTxPending(tx: TransactionResponse): void; setTxConfirmed(tx: TransactionReceipt): void; - setChangedAccount([address]: string[]): void; + setChangedAccount(address: string): void; } export const loadState = (initial: State): Store => { @@ -154,7 +154,8 @@ export const loadState = (initial: State): Store => { } }); }, - setChangedAccount: ([address]: string[]) => { + + setChangedAccount: (address: string) => { store.update(s => { switch (s.connection) { case Connection.Connected: @@ -164,7 +165,7 @@ export const loadState = (initial: State): Store => { disconnectWallet(); } else { s.session.address = address; - window.localStorage.setItem("session", JSON.stringify({ address, tokenBalance: s.session.tokenBalance, tx: s.session.tx })); + window.localStorage.setItem("session", JSON.stringify({ ...s.session })); } return s; default: @@ -183,10 +184,15 @@ export const session = derived(state, s => { return null; }); -window.ethereum?.on('chainChanged', () => location.reload()); +window.ethereum?.on('chainChanged', () => { + // We disconnect the wallet to avoid out of sync state + // between the account address and IDX DIDs + disconnectWallet(); + location.reload(); +}); // Updates state when user changes accounts -window.ethereum?.on("accountsChanged", async (address: string[]) => { +window.ethereum?.on("accountsChanged", async ([address]: string) => { const config = await getConfig(); state.setChangedAccount(address); state.refreshBalance(config); diff --git a/src/utils.ts b/src/utils.ts index c5ad068c9..e77754aba 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -5,6 +5,14 @@ import multihashes from 'multihashes'; import EthersSafe from "@gnosis.pm/safe-core-sdk"; import type { Config } from '@app/config'; import { assert } from '@app/error'; +import type { Registration } from "@app/base/registrations/registrar"; +import { getRegistration } from '@app/base/registrations/registrar'; +import type { BasicProfile } from "@ceramicstudio/idx-constants"; + +export interface Profile { + ens: Registration | null; + idx: BasicProfile | null; +} export enum AddressType { Contract, @@ -34,6 +42,10 @@ export function formatBalance(n: BigNumber): string { return ethers.utils.commify(parseFloat(ethers.utils.formatUnits(n)).toFixed(2)); } +export function formatCAIP10Address(address: string, protocol: string, impl: number): string { + return `${address.toLowerCase()}@${protocol}:${impl.toString()}`; +} + export function formatAddress(addr: string): string { return formatHash(ethers.utils.getAddress(addr)); } @@ -73,6 +85,11 @@ export function isUrl(input: string): boolean { return /^https?:\/\//.test(input); } +// Check whether the input is a DID +export function isDid(input: string): boolean { + return /^did:[a-zA-Z0-9]+:[a-zA-Z0-9]+$/.test(input); +} + // Check whether the input is an Ethereum address. export function isAddress(input: string): boolean { return ethers.utils.isAddress(input); @@ -182,6 +199,38 @@ export async function resolveLabel(label: string, config: Config): Promise { + const profile: Profile = { ens: null, idx: null }; + + try { + const [ens, idx] = await Promise.allSettled([ + resolveEnsProfile(address, config), + resolveIdxProfile(formatCAIP10Address(address, "eip155", config.network.chainId), config) + ]); + + if (ens.status == "fulfilled") profile.ens = ens.value; + if (idx.status == "fulfilled") profile.idx = idx.value; + } catch (error) { + console.error(error); + } + + return profile; +} + +// Resolves an IDX profile or return null +export async function resolveIdxProfile(caip10: string, config: Config): Promise { + return config.idx.client.get("basicProfile", caip10); +} + +// Resolves an ENS profile or return null +export async function resolveEnsProfile(address: string, config: Config): Promise { + const label = await config.provider.lookupAddress(address); + if (label && await resolveLabel(parseEnsLabel(label, config), config)) { + return await getRegistration(label, config); + } + return null; +} + // Check whether a Gnosis Safe exists at an address. export async function isSafe(address: string, config: Config): Promise { if (! config.safe.api) return false;