Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Add IDX as user identity provider
Sebastian Martinez committed 4 years ago
commit dcdec8c8e1ba98b5a6473d21f8698c1a411fb4de
parent 73a213f234655dd500e54798e5bc93e96c14432c
9 files changed +771 -21
modified 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",
modified 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",
modified 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 @@
        <Registrations {config} session={$session} />
        <Orgs {config} />
        <Users {config} />
+
        <IDX {config} />
        <Projects {config} />
        <Resolver {config} />
      </Router>
added src/base/idx/Link.svelte
@@ -0,0 +1,27 @@
+
<script lang="ts">
+
  import { onMount } from 'svelte';
+
  import type { Config } from '@app/config';
+
  import { Caip10Link } from '@ceramicnetwork/stream-caip10-link';
+
  import { EthereumAuthProvider } from '@ceramicnetwork/blockchain-utils-linking';
+

+
  export let did: string;
+
  export let caip10: string;
+
  export let config: Config;
+
  
+
  onMount(async () => {
+
    if (config.signer) {
+
      const address = await config.signer.getAddress();
+
      const ethAuthProvider = new EthereumAuthProvider(
+
        // TODO: Using the window.ethereum provider here since the config provider is throwing error.
+
        window.ethereum, address
+
      );
+

+
      const accountLink = await Caip10Link.fromAccount(config.ceramic.client, caip10.toLowerCase());
+
      await accountLink.setDid(
+
        did,
+
        ethAuthProvider
+
      );
+

+
    }
+
  });
+
</script>
added src/base/idx/Routes.svelte
@@ -0,0 +1,11 @@
+
<script lang="ts">
+
  import { Route } from "svelte-routing";
+
  import Link from '@app/base/idx/Link.svelte';
+
  import type { Config } from '@app/config';
+

+
  export let config: Config;
+
</script>
+

+
<Route path="/idx/:did/link/:caip10" let:params>
+
  <Link {config} did={params.did} caip10={params.caip10} />
+
</Route>
modified src/config.json
@@ -65,6 +65,7 @@
    },
    "tokens": []
  },
+
  "ceramic": { "api": "https://ceramic-clay.3boxlabs.com" },
  "radicle": { "api": "" },
  "abi": {
    "registrar": [
modified 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,
modified src/session.ts
@@ -36,7 +36,7 @@ export interface Store extends Readable<State> {
  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);
modified 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<strin
  return config.provider.resolveName(`${label}.${config.registrar.domain}`);
}

+
export async function lookupAddress(address: string, config: Config): Promise<Profile>  {
+
  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<BasicProfile | null> {
+
  return config.idx.client.get<BasicProfile>("basicProfile", caip10);
+
}
+

+
// Resolves an ENS profile or return null
+
export async function resolveEnsProfile(address: string, config: Config): Promise<Registration | null> {
+
  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<boolean> {
  if (! config.safe.api) return false;