Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Add WalletConnect support
Alexis Sellier committed 4 years ago
commit 400a2df0a4e30dedf92288fad50a3777f877fcdd
parent 767355b78239f7deaf7b6b98f58097c327c1d0a5
15 files changed +2277 -110
modified package-lock.json
@@ -10,17 +10,25 @@
        "@ceramicnetwork/stream-caip10-link": "^1.0.6",
        "@ceramicstudio/idx": "^0.12.1",
        "@ceramicstudio/idx-constants": "^1.0.0",
+
        "@ethersproject/abstract-provider": "^5.4.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",
        "@stardazed/streams": "^3.1.0",
        "@types/marked": "^2.0.3",
+
        "@walletconnect/client": "^1.4.2-rc.2",
+
        "@walletconnect/signer-connection": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2",
        "buffer": "^6.0.3",
+
        "eip1193-provider": "1.0.1",
        "ethereum-blockies": "^0.1.1",
        "ethers": "^5.0.31",
+
        "eventemitter3": "4.0.7",
        "marked": "^2.0.7",
        "multibase": "^4.0.4",
        "multihashes": "^4.0.2",
+
        "pure-svg-code": "^1.0.6",
        "svelte": "^3.32.3",
        "svelte-preprocess": "^4.7.2",
        "svelte-routing": "^1.6.0"
@@ -290,9 +298,9 @@
      }
    },
    "node_modules/@ethersproject/abstract-provider": {
-
      "version": "5.3.0",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz",
-
      "integrity": "sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==",
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz",
+
      "integrity": "sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==",
      "funding": [
        {
          "type": "individual",
@@ -304,13 +312,289 @@
        }
      ],
      "dependencies": {
-
        "@ethersproject/bignumber": "^5.3.0",
-
        "@ethersproject/bytes": "^5.3.0",
-
        "@ethersproject/logger": "^5.3.0",
-
        "@ethersproject/networks": "^5.3.0",
-
        "@ethersproject/properties": "^5.3.0",
-
        "@ethersproject/transactions": "^5.3.0",
-
        "@ethersproject/web": "^5.3.0"
+
        "@ethersproject/bignumber": "^5.4.0",
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "@ethersproject/networks": "^5.4.0",
+
        "@ethersproject/properties": "^5.4.0",
+
        "@ethersproject/transactions": "^5.4.0",
+
        "@ethersproject/web": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/address": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+
      "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bignumber": "^5.4.0",
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/keccak256": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "@ethersproject/rlp": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/base64": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz",
+
      "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bytes": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/bignumber": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+
      "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "bn.js": "^4.11.9"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/bytes": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+
      "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/logger": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/constants": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+
      "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bignumber": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/keccak256": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+
      "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bytes": "^5.4.0",
+
        "js-sha3": "0.5.7"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/logger": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+
      "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ]
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/networks": {
+
      "version": "5.4.1",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.1.tgz",
+
      "integrity": "sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/logger": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/properties": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+
      "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/logger": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/rlp": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+
      "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/signing-key": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+
      "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "@ethersproject/properties": "^5.4.0",
+
        "bn.js": "^4.11.9",
+
        "elliptic": "6.5.4",
+
        "hash.js": "1.1.7"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/strings": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+
      "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/constants": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/transactions": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+
      "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/address": "^5.4.0",
+
        "@ethersproject/bignumber": "^5.4.0",
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/constants": "^5.4.0",
+
        "@ethersproject/keccak256": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "@ethersproject/properties": "^5.4.0",
+
        "@ethersproject/rlp": "^5.4.0",
+
        "@ethersproject/signing-key": "^5.4.0"
+
      }
+
    },
+
    "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/web": {
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz",
+
      "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/base64": "^5.4.0",
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "@ethersproject/properties": "^5.4.0",
+
        "@ethersproject/strings": "^5.4.0"
      }
    },
    "node_modules/@ethersproject/abstract-signer": {
@@ -954,6 +1238,39 @@
        "axios": "^0.21.1"
      }
    },
+
    "node_modules/@json-rpc-tools/provider": {
+
      "version": "1.7.6",
+
      "resolved": "https://registry.npmjs.org/@json-rpc-tools/provider/-/provider-1.7.6.tgz",
+
      "integrity": "sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA==",
+
      "dependencies": {
+
        "@json-rpc-tools/utils": "^1.7.6",
+
        "axios": "^0.21.0",
+
        "safe-json-utils": "^1.1.1",
+
        "ws": "^7.4.0"
+
      }
+
    },
+
    "node_modules/@json-rpc-tools/provider/node_modules/safe-json-utils": {
+
      "version": "1.1.1",
+
      "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.1.1.tgz",
+
      "integrity": "sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ=="
+
    },
+
    "node_modules/@json-rpc-tools/types": {
+
      "version": "1.7.6",
+
      "resolved": "https://registry.npmjs.org/@json-rpc-tools/types/-/types-1.7.6.tgz",
+
      "integrity": "sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ==",
+
      "dependencies": {
+
        "keyvaluestorage-interface": "^1.0.0"
+
      }
+
    },
+
    "node_modules/@json-rpc-tools/utils": {
+
      "version": "1.7.6",
+
      "resolved": "https://registry.npmjs.org/@json-rpc-tools/utils/-/utils-1.7.6.tgz",
+
      "integrity": "sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw==",
+
      "dependencies": {
+
        "@json-rpc-tools/types": "^1.7.6",
+
        "@pedrouid/environment": "^1.0.1"
+
      }
+
    },
    "node_modules/@multiformats/base-x": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz",
@@ -1004,6 +1321,37 @@
        "util": "^0.11.1"
      }
    },
+
    "node_modules/@pedrouid/environment": {
+
      "version": "1.0.1",
+
      "resolved": "https://registry.npmjs.org/@pedrouid/environment/-/environment-1.0.1.tgz",
+
      "integrity": "sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug=="
+
    },
+
    "node_modules/@pedrouid/iso-crypto": {
+
      "version": "1.1.0",
+
      "resolved": "https://registry.npmjs.org/@pedrouid/iso-crypto/-/iso-crypto-1.1.0.tgz",
+
      "integrity": "sha512-twi+tW67XT0BSOv4rsegnGo4TQMhfFswS/GY3KhrjFiNw3z9x+cMkfO+itNe1JZghQxsxHuhifvfsnG814g1hQ==",
+
      "dependencies": {
+
        "@pedrouid/iso-random": "^1.1.0",
+
        "aes-js": "^3.1.2",
+
        "enc-utils": "^3.0.0",
+
        "hash.js": "^1.1.7"
+
      }
+
    },
+
    "node_modules/@pedrouid/iso-crypto/node_modules/aes-js": {
+
      "version": "3.1.2",
+
      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+
      "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+
    },
+
    "node_modules/@pedrouid/iso-random": {
+
      "version": "1.2.1",
+
      "resolved": "https://registry.npmjs.org/@pedrouid/iso-random/-/iso-random-1.2.1.tgz",
+
      "integrity": "sha512-C35NqYMmLsg61WDiEup4OwjRhgfZIcK4BL+Qg49xowHUJ+f7/LFZCO+TGuQqoXFAj1beKIOpUN33f0fqV7zneQ==",
+
      "dependencies": {
+
        "@pedrouid/environment": "^1.0.1",
+
        "enc-utils": "^3.0.0",
+
        "randombytes": "^2.1.0"
+
      }
+
    },
    "node_modules/@rollup/pluginutils": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
@@ -1340,15 +1688,189 @@
      "integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==",
      "dev": true,
      "dependencies": {
-
        "@typescript-eslint/types": "4.26.1",
-
        "eslint-visitor-keys": "^2.0.0"
+
        "@typescript-eslint/types": "4.26.1",
+
        "eslint-visitor-keys": "^2.0.0"
+
      },
+
      "engines": {
+
        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+
      },
+
      "funding": {
+
        "type": "opencollective",
+
        "url": "https://opencollective.com/typescript-eslint"
+
      }
+
    },
+
    "node_modules/@walletconnect/client": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/client/-/client-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-bQiPecdPya+ECRGZeQiypCbHEzf7KryjZ3gnohzQf5jQYyl9v8+kwz0XxM99wYb4hImD09u3+Y908d7u+TH7LA==",
+
      "dependencies": {
+
        "@walletconnect/core": "^1.4.2-rc.2",
+
        "@walletconnect/iso-crypto": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2"
+
      }
+
    },
+
    "node_modules/@walletconnect/core": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-k2PPZ900g6EAzlcMSmLpWs7a/X0QdfWFx6ZToVcj9tDZvF65Kdax+KCgnNrjf002JeYotnzk9Ar6m54YrcGF8w==",
+
      "dependencies": {
+
        "@walletconnect/socket-transport": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2"
+
      }
+
    },
+
    "node_modules/@walletconnect/iso-crypto": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-bMflG0y802REw6oOiq+KDp+RfeoPq4HNiUW0daxgaMYTGka0SmHILV97Ycp/zfID+C+Xqc8CRtTe0iSWnJQVAw==",
+
      "dependencies": {
+
        "@pedrouid/iso-crypto": "^1.0.0",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2"
+
      }
+
    },
+
    "node_modules/@walletconnect/mobile-registry": {
+
      "version": "1.4.0",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz",
+
      "integrity": "sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==",
+
      "deprecated": "Deprecated in favor of dynamic registry available from: https://github.com/walletconnect/walletconnect-registry"
+
    },
+
    "node_modules/@walletconnect/rpc-connection": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/rpc-connection/-/rpc-connection-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-VP/2KidDCVnqZzK5Q22iP9mM3q0RGCbyrjqbr+kPR68QFwRxyxRPxMC2xYqBWbYqqxlrMyKJKNItE/tKhs2Vuw==",
+
      "dependencies": {
+
        "@walletconnect/client": "^1.4.2-rc.2",
+
        "@walletconnect/qrcode-modal": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2",
+
        "eventemitter3": "4.0.7"
+
      }
+
    },
+
    "node_modules/@walletconnect/rpc-connection/node_modules/@walletconnect/browser-utils": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-aiD+0D1D+DtYkVmmepGllPs5KOXHs/JpQwlcTXvQ5qFSAaowIof3CV8ESBolJxvprbbVNRUrVT8X0+WZaI8ZyA==",
+
      "dependencies": {
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "detect-browser": "5.2.0",
+
        "safe-json-utils": "1.0.0",
+
        "window-getters": "1.0.0",
+
        "window-metadata": "1.0.0"
+
      }
+
    },
+
    "node_modules/@walletconnect/rpc-connection/node_modules/@walletconnect/qrcode-modal": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-v/eLP3aZSkuiZWqlwZAJCSMGT7AWpIGjVJyZ2PoBajTWVDZXOPz3mdgxfeOKIFKckvPM9HzN39nP4aIyhktG3g==",
+
      "dependencies": {
+
        "@walletconnect/browser-utils": "^1.4.2-rc.2",
+
        "@walletconnect/mobile-registry": "^1.4.0",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "copy-to-clipboard": "^3.3.1",
+
        "preact": "10.4.1",
+
        "qrcode": "1.4.4"
+
      }
+
    },
+
    "node_modules/@walletconnect/signer-connection": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/signer-connection/-/signer-connection-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-zEQaekzhNxdEwa2IWEHTWyAkx6mm42pJIsaL7OQwrWlQWQKaPSxhr5NWgAD11YUVazyV+yujqWOt2zHaKRfsQw==",
+
      "dependencies": {
+
        "@json-rpc-tools/types": "^1.7.2",
+
        "@json-rpc-tools/utils": "^1.7.2",
+
        "@walletconnect/client": "^1.4.2-rc.2",
+
        "@walletconnect/rpc-connection": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "eventemitter3": "4.0.7"
+
      }
+
    },
+
    "node_modules/@walletconnect/socket-transport": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-OjF+MZLZceKBBq+62HIy2wYDENXT2SU2IKD8jy57hJ56FVCB5gxCbHjALrukvE2EOUZoxrTYUZXUyy6bbcsiLA==",
+
      "dependencies": {
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2",
+
        "ws": "7.3.0"
+
      }
+
    },
+
    "node_modules/@walletconnect/socket-transport/node_modules/ws": {
+
      "version": "7.3.0",
+
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
+
      "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==",
+
      "engines": {
+
        "node": ">=8.3.0"
+
      },
+
      "peerDependencies": {
+
        "bufferutil": "^4.0.1",
+
        "utf-8-validate": "^5.0.2"
+
      },
+
      "peerDependenciesMeta": {
+
        "bufferutil": {
+
          "optional": true
+
        },
+
        "utf-8-validate": {
+
          "optional": true
+
        }
+
      }
+
    },
+
    "node_modules/@walletconnect/types": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-a+F8/2k9hmWQgT22fPycrzOMWLWffh6ybMTD15UaiqQ7Jdj1Eyl9dnl3pbmtLd8AV5hnIkIZJuI+6ItaoHBT6g=="
+
    },
+
    "node_modules/@walletconnect/utils": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-qXc8L+8AbIZFltd+sC3Gd76jGBJgVpyRNGYCN9BTQSY+ULRXkclYDDrXZ2dVFzFc1FVI3Fb2fvnX5Ha1L+27Ug==",
+
      "dependencies": {
+
        "@json-rpc-tools/utils": "^1.7.2",
+
        "@walletconnect/browser-utils": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "bn.js": "4.11.8",
+
        "enc-utils": "3.0.0",
+
        "js-sha3": "0.8.0",
+
        "query-string": "6.13.5"
+
      }
+
    },
+
    "node_modules/@walletconnect/utils/node_modules/@walletconnect/browser-utils": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-aiD+0D1D+DtYkVmmepGllPs5KOXHs/JpQwlcTXvQ5qFSAaowIof3CV8ESBolJxvprbbVNRUrVT8X0+WZaI8ZyA==",
+
      "dependencies": {
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "detect-browser": "5.2.0",
+
        "safe-json-utils": "1.0.0",
+
        "window-getters": "1.0.0",
+
        "window-metadata": "1.0.0"
+
      }
+
    },
+
    "node_modules/@walletconnect/utils/node_modules/bn.js": {
+
      "version": "4.11.8",
+
      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+
      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+
    },
+
    "node_modules/@walletconnect/utils/node_modules/js-sha3": {
+
      "version": "0.8.0",
+
      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+
      "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+
    },
+
    "node_modules/@walletconnect/utils/node_modules/query-string": {
+
      "version": "6.13.5",
+
      "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz",
+
      "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==",
+
      "dependencies": {
+
        "decode-uri-component": "^0.2.0",
+
        "split-on-first": "^1.0.0",
+
        "strict-uri-encode": "^2.0.0"
      },
      "engines": {
-
        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+
        "node": ">=6"
      },
      "funding": {
-
        "type": "opencollective",
-
        "url": "https://opencollective.com/typescript-eslint"
+
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/acorn": {
@@ -1402,6 +1924,14 @@
        "node": ">=6"
      }
    },
+
    "node_modules/ansi-regex": {
+
      "version": "4.1.0",
+
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+
      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -1603,6 +2133,30 @@
        "ieee754": "^1.2.1"
      }
    },
+
    "node_modules/buffer-alloc": {
+
      "version": "1.2.0",
+
      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+
      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+
      "dependencies": {
+
        "buffer-alloc-unsafe": "^1.1.0",
+
        "buffer-fill": "^1.0.0"
+
      }
+
    },
+
    "node_modules/buffer-alloc-unsafe": {
+
      "version": "1.1.0",
+
      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+
      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+
    },
+
    "node_modules/buffer-fill": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+
      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
+
    },
+
    "node_modules/buffer-from": {
+
      "version": "1.1.1",
+
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+
      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+
    },
    "node_modules/buffer-xor": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
@@ -1622,6 +2176,14 @@
        "node": ">=6"
      }
    },
+
    "node_modules/camelcase": {
+
      "version": "5.3.1",
+
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+
      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/chalk": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
@@ -1683,6 +2245,16 @@
        "safe-buffer": "^5.0.1"
      }
    },
+
    "node_modules/cliui": {
+
      "version": "5.0.0",
+
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+
      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+
      "dependencies": {
+
        "string-width": "^3.1.0",
+
        "strip-ansi": "^5.2.0",
+
        "wrap-ansi": "^5.1.0"
+
      }
+
    },
    "node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1730,6 +2302,14 @@
        "node": ">=0.8"
      }
    },
+
    "node_modules/copy-to-clipboard": {
+
      "version": "3.3.1",
+
      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
+
      "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
+
      "dependencies": {
+
        "toggle-selection": "^1.0.6"
+
      }
+
    },
    "node_modules/create-hash": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
@@ -1794,6 +2374,14 @@
        }
      }
    },
+
    "node_modules/decamelize": {
+
      "version": "1.2.0",
+
      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+
      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+
      "engines": {
+
        "node": ">=0.10.0"
+
      }
+
    },
    "node_modules/decode-uri-component": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -1813,6 +2401,11 @@
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
      "dev": true
    },
+
    "node_modules/detect-browser": {
+
      "version": "5.2.0",
+
      "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz",
+
      "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA=="
+
    },
    "node_modules/detect-indent": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
@@ -1821,6 +2414,11 @@
        "node": ">=8"
      }
    },
+
    "node_modules/dijkstrajs": {
+
      "version": "1.0.2",
+
      "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
+
      "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
+
    },
    "node_modules/dir-glob": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -1845,6 +2443,14 @@
        "node": ">=6.0.0"
      }
    },
+
    "node_modules/eip1193-provider": {
+
      "version": "1.0.1",
+
      "resolved": "https://registry.npmjs.org/eip1193-provider/-/eip1193-provider-1.0.1.tgz",
+
      "integrity": "sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g==",
+
      "dependencies": {
+
        "@json-rpc-tools/provider": "^1.5.5"
+
      }
+
    },
    "node_modules/elliptic": {
      "version": "6.5.4",
      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
@@ -1865,6 +2471,15 @@
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
      "dev": true
    },
+
    "node_modules/enc-utils": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/enc-utils/-/enc-utils-3.0.0.tgz",
+
      "integrity": "sha512-e57t/Z2HzWOLwOp7DZcV0VMEY8t7ptWwsxyp6kM2b2zrk6JqIpXxzkruHAMiBsy5wg9jp/183GdiRXCvBtzsYg==",
+
      "dependencies": {
+
        "is-typedarray": "1.0.0",
+
        "typedarray-to-buffer": "3.1.5"
+
      }
+
    },
    "node_modules/enquirer": {
      "version": "2.3.6",
      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
@@ -2216,6 +2831,30 @@
        "@ethersproject/wordlists": "5.3.0"
      }
    },
+
    "node_modules/ethers/node_modules/@ethersproject/abstract-provider": {
+
      "version": "5.3.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz",
+
      "integrity": "sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==",
+
      "funding": [
+
        {
+
          "type": "individual",
+
          "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+
        },
+
        {
+
          "type": "individual",
+
          "url": "https://www.buymeacoffee.com/ricmoo"
+
        }
+
      ],
+
      "dependencies": {
+
        "@ethersproject/bignumber": "^5.3.0",
+
        "@ethersproject/bytes": "^5.3.0",
+
        "@ethersproject/logger": "^5.3.0",
+
        "@ethersproject/networks": "^5.3.0",
+
        "@ethersproject/properties": "^5.3.0",
+
        "@ethersproject/transactions": "^5.3.0",
+
        "@ethersproject/web": "^5.3.0"
+
      }
+
    },
    "node_modules/ethjs-util": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
@@ -2229,6 +2868,11 @@
        "npm": ">=3"
      }
    },
+
    "node_modules/eventemitter3": {
+
      "version": "4.0.7",
+
      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+
      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+
    },
    "node_modules/evp_bytestokey": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
@@ -2330,6 +2974,17 @@
        "node": ">=0.10.0"
      }
    },
+
    "node_modules/find-up": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+
      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+
      "dependencies": {
+
        "locate-path": "^3.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/flat": {
      "version": "5.0.2",
      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
@@ -2408,6 +3063,14 @@
      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
      "dev": true
    },
+
    "node_modules/get-caller-file": {
+
      "version": "2.0.5",
+
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+
      "engines": {
+
        "node": "6.* || 8.* || >= 10.*"
+
      }
+
    },
    "node_modules/glob": {
      "version": "7.1.7",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
@@ -2644,6 +3307,14 @@
        "node": ">=0.10.0"
      }
    },
+
    "node_modules/is-fullwidth-code-point": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+
      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+
      "engines": {
+
        "node": ">=4"
+
      }
+
    },
    "node_modules/is-glob": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
@@ -2674,6 +3345,16 @@
        "node": ">=0.12.0"
      }
    },
+
    "node_modules/is-typedarray": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+
      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+
    },
+
    "node_modules/isarray": {
+
      "version": "2.0.5",
+
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+
      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+
    },
    "node_modules/isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -2729,6 +3410,11 @@
        "node": ">=10.0.0"
      }
    },
+
    "node_modules/keyvaluestorage-interface": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz",
+
      "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g=="
+
    },
    "node_modules/levn": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -2742,6 +3428,18 @@
        "node": ">= 0.8.0"
      }
    },
+
    "node_modules/locate-path": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+
      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+
      "dependencies": {
+
        "p-locate": "^3.0.0",
+
        "path-exists": "^3.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -3002,6 +3700,39 @@
        "node": ">= 0.8.0"
      }
    },
+
    "node_modules/p-limit": {
+
      "version": "2.3.0",
+
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+
      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+
      "dependencies": {
+
        "p-try": "^2.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sponsors/sindresorhus"
+
      }
+
    },
+
    "node_modules/p-locate": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+
      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+
      "dependencies": {
+
        "p-limit": "^2.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
+
    "node_modules/p-try": {
+
      "version": "2.2.0",
+
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/parent-module": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -3023,6 +3754,14 @@
        "tslib": "^2.0.3"
      }
    },
+
    "node_modules/path-exists": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+
      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+
      "engines": {
+
        "node": ">=4"
+
      }
+
    },
    "node_modules/path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -3083,6 +3822,14 @@
        "url": "https://github.com/sponsors/jonschlinkert"
      }
    },
+
    "node_modules/pngjs": {
+
      "version": "3.4.0",
+
      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+
      "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+
      "engines": {
+
        "node": ">=4.0.0"
+
      }
+
    },
    "node_modules/postcss": {
      "version": "8.3.5",
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
@@ -3101,6 +3848,15 @@
        "url": "https://opencollective.com/postcss/"
      }
    },
+
    "node_modules/preact": {
+
      "version": "10.4.1",
+
      "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz",
+
      "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==",
+
      "funding": {
+
        "type": "opencollective",
+
        "url": "https://opencollective.com/preact"
+
      }
+
    },
    "node_modules/prelude-ls": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -3128,6 +3884,54 @@
        "node": ">=6"
      }
    },
+
    "node_modules/pure-svg-code": {
+
      "version": "1.0.6",
+
      "resolved": "https://registry.npmjs.org/pure-svg-code/-/pure-svg-code-1.0.6.tgz",
+
      "integrity": "sha512-uxq2BMTdnKW7jDghpLJrczCd9KDOdyghFtEEpfomqMJkUM83/N+W7sFJPJ3AxBf0mJ3xtxAycl6NW8p6F53jEw=="
+
    },
+
    "node_modules/qrcode": {
+
      "version": "1.4.4",
+
      "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz",
+
      "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==",
+
      "dependencies": {
+
        "buffer": "^5.4.3",
+
        "buffer-alloc": "^1.2.0",
+
        "buffer-from": "^1.1.1",
+
        "dijkstrajs": "^1.0.1",
+
        "isarray": "^2.0.1",
+
        "pngjs": "^3.3.0",
+
        "yargs": "^13.2.4"
+
      },
+
      "bin": {
+
        "qrcode": "bin/qrcode"
+
      },
+
      "engines": {
+
        "node": ">=4"
+
      }
+
    },
+
    "node_modules/qrcode/node_modules/buffer": {
+
      "version": "5.7.1",
+
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+
      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+
      "funding": [
+
        {
+
          "type": "github",
+
          "url": "https://github.com/sponsors/feross"
+
        },
+
        {
+
          "type": "patreon",
+
          "url": "https://www.patreon.com/feross"
+
        },
+
        {
+
          "type": "consulting",
+
          "url": "https://feross.org/support"
+
        }
+
      ],
+
      "dependencies": {
+
        "base64-js": "^1.3.1",
+
        "ieee754": "^1.1.13"
+
      }
+
    },
    "node_modules/query-string": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.0.tgz",
@@ -3210,6 +4014,14 @@
        "url": "https://github.com/sponsors/mysticatea"
      }
    },
+
    "node_modules/require-directory": {
+
      "version": "2.1.1",
+
      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+
      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+
      "engines": {
+
        "node": ">=0.10.0"
+
      }
+
    },
    "node_modules/require-from-string": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -3219,6 +4031,11 @@
        "node": ">=0.10.0"
      }
    },
+
    "node_modules/require-main-filename": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+
      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+
    },
    "node_modules/require-relative": {
      "version": "0.8.7",
      "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
@@ -3362,6 +4179,11 @@
        }
      ]
    },
+
    "node_modules/safe-json-utils": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.0.0.tgz",
+
      "integrity": "sha512-n0hJm6BgX8wk3G+AS8MOQnfcA8dfE6ZMUfwkHUNx69YxPlU3HDaZTHXWto35Z+C4mOjK1odlT95WutkGC+0Idw=="
+
    },
    "node_modules/scrypt-js": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
@@ -3396,6 +4218,11 @@
        "node": ">=10"
      }
    },
+
    "node_modules/set-blocking": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+
      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+
    },
    "node_modules/setimmediate": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -3528,6 +4355,35 @@
        "safe-buffer": "~5.2.0"
      }
    },
+
    "node_modules/string-width": {
+
      "version": "3.1.0",
+
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+
      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+
      "dependencies": {
+
        "emoji-regex": "^7.0.1",
+
        "is-fullwidth-code-point": "^2.0.0",
+
        "strip-ansi": "^5.1.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
+
    "node_modules/string-width/node_modules/emoji-regex": {
+
      "version": "7.0.3",
+
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+
      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+
    },
+
    "node_modules/strip-ansi": {
+
      "version": "5.2.0",
+
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+
      "dependencies": {
+
        "ansi-regex": "^4.1.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/strip-hex-prefix": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
@@ -3798,6 +4654,11 @@
        "node": ">=8.0"
      }
    },
+
    "node_modules/toggle-selection": {
+
      "version": "1.0.6",
+
      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+
      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
+
    },
    "node_modules/tslib": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
@@ -3848,6 +4709,14 @@
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
+
    "node_modules/typedarray-to-buffer": {
+
      "version": "3.1.5",
+
      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+
      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+
      "dependencies": {
+
        "is-typedarray": "^1.0.0"
+
      }
+
    },
    "node_modules/typescript": {
      "version": "4.2.4",
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
@@ -3972,6 +4841,24 @@
        "node": ">= 8"
      }
    },
+
    "node_modules/which-module": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+
    },
+
    "node_modules/window-getters": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/window-getters/-/window-getters-1.0.0.tgz",
+
      "integrity": "sha512-xyvEFq3x+7dCA7NFhqOmTMk0fPmmAzCUYL2svkw2LGBaXXQLRP0lFnfXHzysri9WZNMkzp/FD1u0w2Qc7Co+JA=="
+
    },
+
    "node_modules/window-metadata": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/window-metadata/-/window-metadata-1.0.0.tgz",
+
      "integrity": "sha512-eYoXsZ9X4J+6xZgbHhNAatSR5bCtT409q8B+2Ol9ySx7qsdtgVZcNfox4qszFmKlGsFtT2b1Tcmcy69bRMObcg==",
+
      "dependencies": {
+
        "window-getters": "^1.0.0"
+
      }
+
    },
    "node_modules/word-wrap": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -3981,6 +4868,43 @@
        "node": ">=0.10.0"
      }
    },
+
    "node_modules/wrap-ansi": {
+
      "version": "5.1.0",
+
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+
      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+
      "dependencies": {
+
        "ansi-styles": "^3.2.0",
+
        "string-width": "^3.0.0",
+
        "strip-ansi": "^5.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
+
    "node_modules/wrap-ansi/node_modules/ansi-styles": {
+
      "version": "3.2.1",
+
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+
      "dependencies": {
+
        "color-convert": "^1.9.0"
+
      },
+
      "engines": {
+
        "node": ">=4"
+
      }
+
    },
+
    "node_modules/wrap-ansi/node_modules/color-convert": {
+
      "version": "1.9.3",
+
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+
      "dependencies": {
+
        "color-name": "1.1.3"
+
      }
+
    },
+
    "node_modules/wrap-ansi/node_modules/color-name": {
+
      "version": "1.1.3",
+
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+
    },
    "node_modules/wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -4007,11 +4931,42 @@
        }
      }
    },
+
    "node_modules/y18n": {
+
      "version": "4.0.3",
+
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+
      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+
    },
    "node_modules/yallist": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
+
    },
+
    "node_modules/yargs": {
+
      "version": "13.3.2",
+
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+
      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+
      "dependencies": {
+
        "cliui": "^5.0.0",
+
        "find-up": "^3.0.0",
+
        "get-caller-file": "^2.0.1",
+
        "require-directory": "^2.1.1",
+
        "require-main-filename": "^2.0.0",
+
        "set-blocking": "^2.0.0",
+
        "string-width": "^3.0.0",
+
        "which-module": "^2.0.0",
+
        "y18n": "^4.0.0",
+
        "yargs-parser": "^13.1.2"
+
      }
+
    },
+
    "node_modules/yargs-parser": {
+
      "version": "13.1.2",
+
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+
      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+
      "dependencies": {
+
        "camelcase": "^5.0.0",
+
        "decamelize": "^1.2.0"
+
      }
    }
  },
  "dependencies": {
@@ -4230,17 +5185,155 @@
      }
    },
    "@ethersproject/abstract-provider": {
-
      "version": "5.3.0",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz",
-
      "integrity": "sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==",
-
      "requires": {
-
        "@ethersproject/bignumber": "^5.3.0",
-
        "@ethersproject/bytes": "^5.3.0",
-
        "@ethersproject/logger": "^5.3.0",
-
        "@ethersproject/networks": "^5.3.0",
-
        "@ethersproject/properties": "^5.3.0",
-
        "@ethersproject/transactions": "^5.3.0",
-
        "@ethersproject/web": "^5.3.0"
+
      "version": "5.4.0",
+
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz",
+
      "integrity": "sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==",
+
      "requires": {
+
        "@ethersproject/bignumber": "^5.4.0",
+
        "@ethersproject/bytes": "^5.4.0",
+
        "@ethersproject/logger": "^5.4.0",
+
        "@ethersproject/networks": "^5.4.0",
+
        "@ethersproject/properties": "^5.4.0",
+
        "@ethersproject/transactions": "^5.4.0",
+
        "@ethersproject/web": "^5.4.0"
+
      },
+
      "dependencies": {
+
        "@ethersproject/address": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+
          "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+
          "requires": {
+
            "@ethersproject/bignumber": "^5.4.0",
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/keccak256": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0",
+
            "@ethersproject/rlp": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/base64": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz",
+
          "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==",
+
          "requires": {
+
            "@ethersproject/bytes": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/bignumber": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+
          "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+
          "requires": {
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0",
+
            "bn.js": "^4.11.9"
+
          }
+
        },
+
        "@ethersproject/bytes": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+
          "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+
          "requires": {
+
            "@ethersproject/logger": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/constants": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+
          "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+
          "requires": {
+
            "@ethersproject/bignumber": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/keccak256": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+
          "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+
          "requires": {
+
            "@ethersproject/bytes": "^5.4.0",
+
            "js-sha3": "0.5.7"
+
          }
+
        },
+
        "@ethersproject/logger": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+
          "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+
        },
+
        "@ethersproject/networks": {
+
          "version": "5.4.1",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.1.tgz",
+
          "integrity": "sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==",
+
          "requires": {
+
            "@ethersproject/logger": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/properties": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+
          "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+
          "requires": {
+
            "@ethersproject/logger": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/rlp": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+
          "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+
          "requires": {
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/signing-key": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+
          "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+
          "requires": {
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0",
+
            "@ethersproject/properties": "^5.4.0",
+
            "bn.js": "^4.11.9",
+
            "elliptic": "6.5.4",
+
            "hash.js": "1.1.7"
+
          }
+
        },
+
        "@ethersproject/strings": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+
          "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+
          "requires": {
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/constants": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/transactions": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+
          "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+
          "requires": {
+
            "@ethersproject/address": "^5.4.0",
+
            "@ethersproject/bignumber": "^5.4.0",
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/constants": "^5.4.0",
+
            "@ethersproject/keccak256": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0",
+
            "@ethersproject/properties": "^5.4.0",
+
            "@ethersproject/rlp": "^5.4.0",
+
            "@ethersproject/signing-key": "^5.4.0"
+
          }
+
        },
+
        "@ethersproject/web": {
+
          "version": "5.4.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz",
+
          "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==",
+
          "requires": {
+
            "@ethersproject/base64": "^5.4.0",
+
            "@ethersproject/bytes": "^5.4.0",
+
            "@ethersproject/logger": "^5.4.0",
+
            "@ethersproject/properties": "^5.4.0",
+
            "@ethersproject/strings": "^5.4.0"
+
          }
+
        }
      }
    },
    "@ethersproject/abstract-signer": {
@@ -4604,6 +5697,41 @@
        "axios": "^0.21.1"
      }
    },
+
    "@json-rpc-tools/provider": {
+
      "version": "1.7.6",
+
      "resolved": "https://registry.npmjs.org/@json-rpc-tools/provider/-/provider-1.7.6.tgz",
+
      "integrity": "sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA==",
+
      "requires": {
+
        "@json-rpc-tools/utils": "^1.7.6",
+
        "axios": "^0.21.0",
+
        "safe-json-utils": "^1.1.1",
+
        "ws": "^7.4.0"
+
      },
+
      "dependencies": {
+
        "safe-json-utils": {
+
          "version": "1.1.1",
+
          "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.1.1.tgz",
+
          "integrity": "sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ=="
+
        }
+
      }
+
    },
+
    "@json-rpc-tools/types": {
+
      "version": "1.7.6",
+
      "resolved": "https://registry.npmjs.org/@json-rpc-tools/types/-/types-1.7.6.tgz",
+
      "integrity": "sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ==",
+
      "requires": {
+
        "keyvaluestorage-interface": "^1.0.0"
+
      }
+
    },
+
    "@json-rpc-tools/utils": {
+
      "version": "1.7.6",
+
      "resolved": "https://registry.npmjs.org/@json-rpc-tools/utils/-/utils-1.7.6.tgz",
+
      "integrity": "sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw==",
+
      "requires": {
+
        "@json-rpc-tools/types": "^1.7.6",
+
        "@pedrouid/environment": "^1.0.1"
+
      }
+
    },
    "@multiformats/base-x": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz",
@@ -4644,6 +5772,39 @@
        "util": "^0.11.1"
      }
    },
+
    "@pedrouid/environment": {
+
      "version": "1.0.1",
+
      "resolved": "https://registry.npmjs.org/@pedrouid/environment/-/environment-1.0.1.tgz",
+
      "integrity": "sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug=="
+
    },
+
    "@pedrouid/iso-crypto": {
+
      "version": "1.1.0",
+
      "resolved": "https://registry.npmjs.org/@pedrouid/iso-crypto/-/iso-crypto-1.1.0.tgz",
+
      "integrity": "sha512-twi+tW67XT0BSOv4rsegnGo4TQMhfFswS/GY3KhrjFiNw3z9x+cMkfO+itNe1JZghQxsxHuhifvfsnG814g1hQ==",
+
      "requires": {
+
        "@pedrouid/iso-random": "^1.1.0",
+
        "aes-js": "^3.1.2",
+
        "enc-utils": "^3.0.0",
+
        "hash.js": "^1.1.7"
+
      },
+
      "dependencies": {
+
        "aes-js": {
+
          "version": "3.1.2",
+
          "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+
          "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+
        }
+
      }
+
    },
+
    "@pedrouid/iso-random": {
+
      "version": "1.2.1",
+
      "resolved": "https://registry.npmjs.org/@pedrouid/iso-random/-/iso-random-1.2.1.tgz",
+
      "integrity": "sha512-C35NqYMmLsg61WDiEup4OwjRhgfZIcK4BL+Qg49xowHUJ+f7/LFZCO+TGuQqoXFAj1beKIOpUN33f0fqV7zneQ==",
+
      "requires": {
+
        "@pedrouid/environment": "^1.0.1",
+
        "enc-utils": "^3.0.0",
+
        "randombytes": "^2.1.0"
+
      }
+
    },
    "@rollup/pluginutils": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
@@ -4893,6 +6054,165 @@
        "eslint-visitor-keys": "^2.0.0"
      }
    },
+
    "@walletconnect/client": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/client/-/client-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-bQiPecdPya+ECRGZeQiypCbHEzf7KryjZ3gnohzQf5jQYyl9v8+kwz0XxM99wYb4hImD09u3+Y908d7u+TH7LA==",
+
      "requires": {
+
        "@walletconnect/core": "^1.4.2-rc.2",
+
        "@walletconnect/iso-crypto": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2"
+
      }
+
    },
+
    "@walletconnect/core": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-k2PPZ900g6EAzlcMSmLpWs7a/X0QdfWFx6ZToVcj9tDZvF65Kdax+KCgnNrjf002JeYotnzk9Ar6m54YrcGF8w==",
+
      "requires": {
+
        "@walletconnect/socket-transport": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2"
+
      }
+
    },
+
    "@walletconnect/iso-crypto": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-bMflG0y802REw6oOiq+KDp+RfeoPq4HNiUW0daxgaMYTGka0SmHILV97Ycp/zfID+C+Xqc8CRtTe0iSWnJQVAw==",
+
      "requires": {
+
        "@pedrouid/iso-crypto": "^1.0.0",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2"
+
      }
+
    },
+
    "@walletconnect/mobile-registry": {
+
      "version": "1.4.0",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz",
+
      "integrity": "sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw=="
+
    },
+
    "@walletconnect/rpc-connection": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/rpc-connection/-/rpc-connection-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-VP/2KidDCVnqZzK5Q22iP9mM3q0RGCbyrjqbr+kPR68QFwRxyxRPxMC2xYqBWbYqqxlrMyKJKNItE/tKhs2Vuw==",
+
      "requires": {
+
        "@walletconnect/client": "^1.4.2-rc.2",
+
        "@walletconnect/qrcode-modal": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2",
+
        "eventemitter3": "4.0.7"
+
      },
+
      "dependencies": {
+
        "@walletconnect/browser-utils": {
+
          "version": "1.4.2-rc.2",
+
          "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.4.2-rc.2.tgz",
+
          "integrity": "sha512-aiD+0D1D+DtYkVmmepGllPs5KOXHs/JpQwlcTXvQ5qFSAaowIof3CV8ESBolJxvprbbVNRUrVT8X0+WZaI8ZyA==",
+
          "requires": {
+
            "@walletconnect/types": "^1.4.2-rc.2",
+
            "detect-browser": "5.2.0",
+
            "safe-json-utils": "1.0.0",
+
            "window-getters": "1.0.0",
+
            "window-metadata": "1.0.0"
+
          }
+
        },
+
        "@walletconnect/qrcode-modal": {
+
          "version": "1.4.2-rc.2",
+
          "resolved": "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.4.2-rc.2.tgz",
+
          "integrity": "sha512-v/eLP3aZSkuiZWqlwZAJCSMGT7AWpIGjVJyZ2PoBajTWVDZXOPz3mdgxfeOKIFKckvPM9HzN39nP4aIyhktG3g==",
+
          "requires": {
+
            "@walletconnect/browser-utils": "^1.4.2-rc.2",
+
            "@walletconnect/mobile-registry": "^1.4.0",
+
            "@walletconnect/types": "^1.4.2-rc.2",
+
            "copy-to-clipboard": "^3.3.1",
+
            "preact": "10.4.1",
+
            "qrcode": "1.4.4"
+
          }
+
        }
+
      }
+
    },
+
    "@walletconnect/signer-connection": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/signer-connection/-/signer-connection-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-zEQaekzhNxdEwa2IWEHTWyAkx6mm42pJIsaL7OQwrWlQWQKaPSxhr5NWgAD11YUVazyV+yujqWOt2zHaKRfsQw==",
+
      "requires": {
+
        "@json-rpc-tools/types": "^1.7.2",
+
        "@json-rpc-tools/utils": "^1.7.2",
+
        "@walletconnect/client": "^1.4.2-rc.2",
+
        "@walletconnect/rpc-connection": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "eventemitter3": "4.0.7"
+
      }
+
    },
+
    "@walletconnect/socket-transport": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-OjF+MZLZceKBBq+62HIy2wYDENXT2SU2IKD8jy57hJ56FVCB5gxCbHjALrukvE2EOUZoxrTYUZXUyy6bbcsiLA==",
+
      "requires": {
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "@walletconnect/utils": "^1.4.2-rc.2",
+
        "ws": "7.3.0"
+
      },
+
      "dependencies": {
+
        "ws": {
+
          "version": "7.3.0",
+
          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
+
          "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==",
+
          "requires": {}
+
        }
+
      }
+
    },
+
    "@walletconnect/types": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-a+F8/2k9hmWQgT22fPycrzOMWLWffh6ybMTD15UaiqQ7Jdj1Eyl9dnl3pbmtLd8AV5hnIkIZJuI+6ItaoHBT6g=="
+
    },
+
    "@walletconnect/utils": {
+
      "version": "1.4.2-rc.2",
+
      "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.4.2-rc.2.tgz",
+
      "integrity": "sha512-qXc8L+8AbIZFltd+sC3Gd76jGBJgVpyRNGYCN9BTQSY+ULRXkclYDDrXZ2dVFzFc1FVI3Fb2fvnX5Ha1L+27Ug==",
+
      "requires": {
+
        "@json-rpc-tools/utils": "^1.7.2",
+
        "@walletconnect/browser-utils": "^1.4.2-rc.2",
+
        "@walletconnect/types": "^1.4.2-rc.2",
+
        "bn.js": "4.11.8",
+
        "enc-utils": "3.0.0",
+
        "js-sha3": "0.8.0",
+
        "query-string": "6.13.5"
+
      },
+
      "dependencies": {
+
        "@walletconnect/browser-utils": {
+
          "version": "1.4.2-rc.2",
+
          "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.4.2-rc.2.tgz",
+
          "integrity": "sha512-aiD+0D1D+DtYkVmmepGllPs5KOXHs/JpQwlcTXvQ5qFSAaowIof3CV8ESBolJxvprbbVNRUrVT8X0+WZaI8ZyA==",
+
          "requires": {
+
            "@walletconnect/types": "^1.4.2-rc.2",
+
            "detect-browser": "5.2.0",
+
            "safe-json-utils": "1.0.0",
+
            "window-getters": "1.0.0",
+
            "window-metadata": "1.0.0"
+
          }
+
        },
+
        "bn.js": {
+
          "version": "4.11.8",
+
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+
          "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+
        },
+
        "js-sha3": {
+
          "version": "0.8.0",
+
          "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+
          "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+
        },
+
        "query-string": {
+
          "version": "6.13.5",
+
          "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz",
+
          "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==",
+
          "requires": {
+
            "decode-uri-component": "^0.2.0",
+
            "split-on-first": "^1.0.0",
+
            "strict-uri-encode": "^2.0.0"
+
          }
+
        }
+
      }
+
    },
    "acorn": {
      "version": "7.4.1",
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
@@ -4929,6 +6249,11 @@
      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
      "dev": true
    },
+
    "ansi-regex": {
+
      "version": "4.1.0",
+
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+
      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+
    },
    "ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -5081,6 +6406,30 @@
        "ieee754": "^1.2.1"
      }
    },
+
    "buffer-alloc": {
+
      "version": "1.2.0",
+
      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+
      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+
      "requires": {
+
        "buffer-alloc-unsafe": "^1.1.0",
+
        "buffer-fill": "^1.0.0"
+
      }
+
    },
+
    "buffer-alloc-unsafe": {
+
      "version": "1.1.0",
+
      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+
      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+
    },
+
    "buffer-fill": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+
      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
+
    },
+
    "buffer-from": {
+
      "version": "1.1.1",
+
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+
      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+
    },
    "buffer-xor": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
@@ -5097,6 +6446,11 @@
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
      "dev": true
    },
+
    "camelcase": {
+
      "version": "5.3.1",
+
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+
      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+
    },
    "chalk": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
@@ -5143,6 +6497,16 @@
        "safe-buffer": "^5.0.1"
      }
    },
+
    "cliui": {
+
      "version": "5.0.0",
+
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+
      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+
      "requires": {
+
        "string-width": "^3.1.0",
+
        "strip-ansi": "^5.2.0",
+
        "wrap-ansi": "^5.1.0"
+
      }
+
    },
    "color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -5181,6 +6545,14 @@
      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
      "dev": true
    },
+
    "copy-to-clipboard": {
+
      "version": "3.3.1",
+
      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
+
      "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
+
      "requires": {
+
        "toggle-selection": "^1.0.6"
+
      }
+
    },
    "create-hash": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
@@ -5234,6 +6606,11 @@
        "ms": "2.1.2"
      }
    },
+
    "decamelize": {
+
      "version": "1.2.0",
+
      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+
      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+
    },
    "decode-uri-component": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -5250,11 +6627,21 @@
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
      "dev": true
    },
+
    "detect-browser": {
+
      "version": "5.2.0",
+
      "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz",
+
      "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA=="
+
    },
    "detect-indent": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
      "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA=="
    },
+
    "dijkstrajs": {
+
      "version": "1.0.2",
+
      "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
+
      "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
+
    },
    "dir-glob": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5273,6 +6660,14 @@
        "esutils": "^2.0.2"
      }
    },
+
    "eip1193-provider": {
+
      "version": "1.0.1",
+
      "resolved": "https://registry.npmjs.org/eip1193-provider/-/eip1193-provider-1.0.1.tgz",
+
      "integrity": "sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g==",
+
      "requires": {
+
        "@json-rpc-tools/provider": "^1.5.5"
+
      }
+
    },
    "elliptic": {
      "version": "6.5.4",
      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
@@ -5293,6 +6688,15 @@
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
      "dev": true
    },
+
    "enc-utils": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/enc-utils/-/enc-utils-3.0.0.tgz",
+
      "integrity": "sha512-e57t/Z2HzWOLwOp7DZcV0VMEY8t7ptWwsxyp6kM2b2zrk6JqIpXxzkruHAMiBsy5wg9jp/183GdiRXCvBtzsYg==",
+
      "requires": {
+
        "is-typedarray": "1.0.0",
+
        "typedarray-to-buffer": "3.1.5"
+
      }
+
    },
    "enquirer": {
      "version": "2.3.6",
      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
@@ -5565,6 +6969,22 @@
        "@ethersproject/wallet": "5.3.0",
        "@ethersproject/web": "5.3.0",
        "@ethersproject/wordlists": "5.3.0"
+
      },
+
      "dependencies": {
+
        "@ethersproject/abstract-provider": {
+
          "version": "5.3.0",
+
          "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz",
+
          "integrity": "sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==",
+
          "requires": {
+
            "@ethersproject/bignumber": "^5.3.0",
+
            "@ethersproject/bytes": "^5.3.0",
+
            "@ethersproject/logger": "^5.3.0",
+
            "@ethersproject/networks": "^5.3.0",
+
            "@ethersproject/properties": "^5.3.0",
+
            "@ethersproject/transactions": "^5.3.0",
+
            "@ethersproject/web": "^5.3.0"
+
          }
+
        }
      }
    },
    "ethjs-util": {
@@ -5576,6 +6996,11 @@
        "strip-hex-prefix": "1.0.0"
      }
    },
+
    "eventemitter3": {
+
      "version": "4.0.7",
+
      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+
      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+
    },
    "evp_bytestokey": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
@@ -5664,6 +7089,14 @@
      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
      "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs="
    },
+
    "find-up": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+
      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+
      "requires": {
+
        "locate-path": "^3.0.0"
+
      }
+
    },
    "flat": {
      "version": "5.0.2",
      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
@@ -5715,6 +7148,11 @@
      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
      "dev": true
    },
+
    "get-caller-file": {
+
      "version": "2.0.5",
+
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+
    },
    "glob": {
      "version": "7.1.7",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
@@ -5885,6 +7323,11 @@
      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
      "dev": true
    },
+
    "is-fullwidth-code-point": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+
      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+
    },
    "is-glob": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
@@ -5905,6 +7348,16 @@
      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
      "dev": true
    },
+
    "is-typedarray": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+
      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+
    },
+
    "isarray": {
+
      "version": "2.0.5",
+
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+
      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+
    },
    "isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -5953,6 +7406,11 @@
        "node-gyp-build": "^4.2.0"
      }
    },
+
    "keyvaluestorage-interface": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz",
+
      "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g=="
+
    },
    "levn": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -5963,6 +7421,15 @@
        "type-check": "~0.4.0"
      }
    },
+
    "locate-path": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+
      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+
      "requires": {
+
        "p-locate": "^3.0.0",
+
        "path-exists": "^3.0.0"
+
      }
+
    },
    "lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -6171,6 +7638,27 @@
        "word-wrap": "^1.2.3"
      }
    },
+
    "p-limit": {
+
      "version": "2.3.0",
+
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+
      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+
      "requires": {
+
        "p-try": "^2.0.0"
+
      }
+
    },
+
    "p-locate": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+
      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+
      "requires": {
+
        "p-limit": "^2.0.0"
+
      }
+
    },
+
    "p-try": {
+
      "version": "2.2.0",
+
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+
    },
    "parent-module": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -6189,6 +7677,11 @@
        "tslib": "^2.0.3"
      }
    },
+
    "path-exists": {
+
      "version": "3.0.0",
+
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+
      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+
    },
    "path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -6231,6 +7724,11 @@
      "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
      "dev": true
    },
+
    "pngjs": {
+
      "version": "3.4.0",
+
      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+
      "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
+
    },
    "postcss": {
      "version": "8.3.5",
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
@@ -6242,6 +7740,11 @@
        "source-map-js": "^0.6.2"
      }
    },
+
    "preact": {
+
      "version": "10.4.1",
+
      "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz",
+
      "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q=="
+
    },
    "prelude-ls": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -6260,6 +7763,36 @@
      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
      "dev": true
    },
+
    "pure-svg-code": {
+
      "version": "1.0.6",
+
      "resolved": "https://registry.npmjs.org/pure-svg-code/-/pure-svg-code-1.0.6.tgz",
+
      "integrity": "sha512-uxq2BMTdnKW7jDghpLJrczCd9KDOdyghFtEEpfomqMJkUM83/N+W7sFJPJ3AxBf0mJ3xtxAycl6NW8p6F53jEw=="
+
    },
+
    "qrcode": {
+
      "version": "1.4.4",
+
      "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz",
+
      "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==",
+
      "requires": {
+
        "buffer": "^5.4.3",
+
        "buffer-alloc": "^1.2.0",
+
        "buffer-from": "^1.1.1",
+
        "dijkstrajs": "^1.0.1",
+
        "isarray": "^2.0.1",
+
        "pngjs": "^3.3.0",
+
        "yargs": "^13.2.4"
+
      },
+
      "dependencies": {
+
        "buffer": {
+
          "version": "5.7.1",
+
          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+
          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+
          "requires": {
+
            "base64-js": "^1.3.1",
+
            "ieee754": "^1.1.13"
+
          }
+
        }
+
      }
+
    },
    "query-string": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.0.tgz",
@@ -6310,12 +7843,22 @@
      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
      "dev": true
    },
+
    "require-directory": {
+
      "version": "2.1.1",
+
      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+
      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+
    },
    "require-from-string": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
      "dev": true
    },
+
    "require-main-filename": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+
      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+
    },
    "require-relative": {
      "version": "0.8.7",
      "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
@@ -6408,6 +7951,11 @@
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
    },
+
    "safe-json-utils": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.0.0.tgz",
+
      "integrity": "sha512-n0hJm6BgX8wk3G+AS8MOQnfcA8dfE6ZMUfwkHUNx69YxPlU3HDaZTHXWto35Z+C4mOjK1odlT95WutkGC+0Idw=="
+
    },
    "scrypt-js": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
@@ -6432,6 +7980,11 @@
        "lru-cache": "^6.0.0"
      }
    },
+
    "set-blocking": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+
      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+
    },
    "setimmediate": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -6530,6 +8083,31 @@
        "safe-buffer": "~5.2.0"
      }
    },
+
    "string-width": {
+
      "version": "3.1.0",
+
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+
      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+
      "requires": {
+
        "emoji-regex": "^7.0.1",
+
        "is-fullwidth-code-point": "^2.0.0",
+
        "strip-ansi": "^5.1.0"
+
      },
+
      "dependencies": {
+
        "emoji-regex": {
+
          "version": "7.0.3",
+
          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+
          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+
        }
+
      }
+
    },
+
    "strip-ansi": {
+
      "version": "5.2.0",
+
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+
      "requires": {
+
        "ansi-regex": "^4.1.0"
+
      }
+
    },
    "strip-hex-prefix": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
@@ -6696,6 +8274,11 @@
        "is-number": "^7.0.0"
      }
    },
+
    "toggle-selection": {
+
      "version": "1.0.6",
+
      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+
      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
+
    },
    "tslib": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
@@ -6733,6 +8316,14 @@
      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
      "dev": true
    },
+
    "typedarray-to-buffer": {
+
      "version": "3.1.5",
+
      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+
      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+
      "requires": {
+
        "is-typedarray": "^1.0.0"
+
      }
+
    },
    "typescript": {
      "version": "4.2.4",
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
@@ -6830,12 +8421,63 @@
        "isexe": "^2.0.0"
      }
    },
+
    "which-module": {
+
      "version": "2.0.0",
+
      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+
    },
+
    "window-getters": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/window-getters/-/window-getters-1.0.0.tgz",
+
      "integrity": "sha512-xyvEFq3x+7dCA7NFhqOmTMk0fPmmAzCUYL2svkw2LGBaXXQLRP0lFnfXHzysri9WZNMkzp/FD1u0w2Qc7Co+JA=="
+
    },
+
    "window-metadata": {
+
      "version": "1.0.0",
+
      "resolved": "https://registry.npmjs.org/window-metadata/-/window-metadata-1.0.0.tgz",
+
      "integrity": "sha512-eYoXsZ9X4J+6xZgbHhNAatSR5bCtT409q8B+2Ol9ySx7qsdtgVZcNfox4qszFmKlGsFtT2b1Tcmcy69bRMObcg==",
+
      "requires": {
+
        "window-getters": "^1.0.0"
+
      }
+
    },
    "word-wrap": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
      "dev": true
    },
+
    "wrap-ansi": {
+
      "version": "5.1.0",
+
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+
      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+
      "requires": {
+
        "ansi-styles": "^3.2.0",
+
        "string-width": "^3.0.0",
+
        "strip-ansi": "^5.0.0"
+
      },
+
      "dependencies": {
+
        "ansi-styles": {
+
          "version": "3.2.1",
+
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+
          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+
          "requires": {
+
            "color-convert": "^1.9.0"
+
          }
+
        },
+
        "color-convert": {
+
          "version": "1.9.3",
+
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+
          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+
          "requires": {
+
            "color-name": "1.1.3"
+
          }
+
        },
+
        "color-name": {
+
          "version": "1.1.3",
+
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+
          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+
        }
+
      }
+
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -6848,11 +8490,42 @@
      "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
      "requires": {}
    },
+
    "y18n": {
+
      "version": "4.0.3",
+
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+
      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+
    },
    "yallist": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
+
    },
+
    "yargs": {
+
      "version": "13.3.2",
+
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+
      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+
      "requires": {
+
        "cliui": "^5.0.0",
+
        "find-up": "^3.0.0",
+
        "get-caller-file": "^2.0.1",
+
        "require-directory": "^2.1.1",
+
        "require-main-filename": "^2.0.0",
+
        "set-blocking": "^2.0.0",
+
        "string-width": "^3.0.0",
+
        "which-module": "^2.0.0",
+
        "y18n": "^4.0.0",
+
        "yargs-parser": "^13.1.2"
+
      }
+
    },
+
    "yargs-parser": {
+
      "version": "13.1.2",
+
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+
      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+
      "requires": {
+
        "camelcase": "^5.0.0",
+
        "decamelize": "^1.2.0"
+
      }
    }
  }
}
modified package.json
@@ -31,12 +31,20 @@
    "@gnosis.pm/safe-service-client": "^0.1.0-alpha.0",
    "@stardazed/streams": "^3.1.0",
    "@types/marked": "^2.0.3",
+
    "@ethersproject/abstract-provider": "^5.4.0",
+
    "@walletconnect/client": "^1.4.2-rc.2",
+
    "@walletconnect/signer-connection": "^1.4.2-rc.2",
+
    "@walletconnect/types": "^1.4.2-rc.2",
+
    "@walletconnect/utils": "^1.4.2-rc.2",
    "buffer": "^6.0.3",
    "ethereum-blockies": "^0.1.1",
+
    "eventemitter3": "4.0.7",
+
    "eip1193-provider": "1.0.1",
    "ethers": "^5.0.31",
    "marked": "^2.0.7",
    "multibase": "^4.0.4",
    "multihashes": "^4.0.2",
+
    "pure-svg-code": "^1.0.6",
    "svelte": "^3.32.3",
    "svelte-preprocess": "^4.7.2",
    "svelte-routing": "^1.6.0"
modified src/App.svelte
@@ -15,9 +15,15 @@
  import Loading from '@app/Loading.svelte';
  import Modal from '@app/Modal.svelte';

-
  const loadConfig = getConfig().then(cfg => {
+
  const loadConfig = getConfig().then(async cfg => {
    if ($state.connection === Connection.Connected) {
      state.refreshBalance(cfg);
+
    } else if ($state.connection === Connection.Disconnected) {
+
      // Update the session state if we're already connected to WalletConnect
+
      // from a previous session.
+
      if (cfg.walletConnect.client.connected) {
+
        await state.connectWalletConnect(cfg);
+
      }
    }
    return cfg;
  });
modified src/Connect.svelte
@@ -1,23 +1,42 @@
<script lang="ts">
-
  import { Connection } from "@app/session";
-
  import { state } from '@app/session';
+
  import { get } from "svelte/store";
+
  import { Connection, state } from "@app/session";
+
  import type { Err } from '@app/error';
+
  import Error from '@app/Error.svelte';
  import type { Config } from '@app/config';
+
  import ConnectWallet from "@app/components/Modal/ConnectWallet.svelte";

-
  export let config: Config;
  export let caption = "Connect";
  export let className = "";
  export let style = "";
+
  export let config: Config;

  let walletUnavailable = !window.ethereum;
+
  let error: Err | null = null;
+

+
  const onModalClose = () => {
+
    const wcs = get(config.walletConnect.state);
+

+
    if (wcs.state === "open") {
+
      config.walletConnect.state.set({ state: "close" });
+
      wcs.onClose();
+
    }
+
  };
+
  const onConnect = async () => {
+
    try {
+
      await state.connectWalletConnect(config);
+
    } catch (e) {
+
      walletConnectState.set({ state: "close" });
+
      error = e;
+
    }
+
  };

  $: connecting = $state.connection === Connection.Connecting;
+
  $: walletConnectState = config.walletConnect.state;
</script>

-
<style>
-
</style>
-

<button
-
  on:click={() => state.connect(config)}
+
  on:click|stopPropagation={onConnect}
  {style}
  class="connect {className}"
  disabled={connecting || walletUnavailable}
@@ -29,3 +48,11 @@
    {caption}
  {/if}
</button>
+

+
{#if $walletConnectState.state === "open"}
+
  <ConnectWallet {config} uri={$walletConnectState.uri} on:close={onModalClose} />
+
{:else if error}
+
  <Error floating title="Wallet connection failed" {error}
+
         on:close={() => error = null} />
+
{/if}
+

modified src/Header.svelte
@@ -148,7 +148,7 @@
      </span>

      <button class="address outline small" bind:this={sessionButton}
-
        on:click={disconnectWallet}
+
        on:click={() => disconnectWallet(config)}
        on:mouseover={() => sessionButtonHover = true}
        on:mouseout={() => sessionButtonHover = false}
      >
modified src/Modal.svelte
@@ -4,6 +4,7 @@
  export let subtle = false;
  export let small = false;
  export let narrow = false;
+
  export let center = false;
</script>

<style>
@@ -96,7 +97,7 @@
  <div class="modal-overlay"></div>
{/if}

-
<div class:modal-floating={floating} class="centered">
+
<div class:modal-floating={floating} class:centered={!center}>
  <div class="modal" class:error
       class:modal-subtle={subtle}
       class:modal-narrow={narrow}
added src/WalletConnectSigner.ts
@@ -0,0 +1,131 @@
+
import type WalletConnect from "@walletconnect/client";
+
import * as ethers from "ethers";
+
import * as ethersBytes from "@ethersproject/bytes";
+
import type { TransactionRequest, TransactionResponse } from "@ethersproject/abstract-provider";
+
import { Deferrable, resolveProperties } from "@ethersproject/properties";
+
import { _TypedDataEncoder } from "ethers/lib/utils";
+
import type { TypedDataDomain, TypedDataField } from "@ethersproject/abstract-signer";
+

+
export class WalletConnectSigner extends ethers.Signer {
+
  public walletConnect: WalletConnect;
+
  public readonly provider: ethers.providers.JsonRpcProvider;
+

+
  constructor(
+
    walletConnect: WalletConnect,
+
    provider: ethers.providers.JsonRpcProvider,
+
  ) {
+
    super();
+

+
    this.provider = provider;
+
    this.walletConnect = walletConnect;
+
  }
+

+
  async getAddress(): Promise<string> {
+
    const accountAddress = this.walletConnect.accounts[0];
+
    if (!accountAddress) {
+
      throw new Error(
+
        "The connected wallet has no accounts or there is a connection problem"
+
      );
+
    }
+
    return accountAddress;
+
  }
+

+
  async _signTypedData(domain: TypedDataDomain, types: Record<string, Array<TypedDataField>>, value: Record<string, any>): Promise<string> {
+
    // Populate any ENS names (in-place)
+
    const populated = await _TypedDataEncoder.resolveNames(domain, types, value, (name: string) => {
+
      return this.provider.resolveName(name);
+
    });
+

+
    const address = await this.getAddress();
+
    const signature = await this.walletConnect.signTypedData([
+
      address.toLowerCase(),
+
      JSON.stringify(_TypedDataEncoder.getPayload(populated.domain, types, populated.value)),
+
    ]);
+
    return signature;
+
  }
+

+
  async signMessage(message: ethers.Bytes | string): Promise<string> {
+
    const prefix = ethers.utils.toUtf8Bytes(
+
      `\x19Ethereum Signed Message:\n${message.length}`
+
    );
+
    const msg = ethers.utils.concat([prefix, message]);
+
    const address = await this.getAddress();
+
    const keccakMessage = ethers.utils.keccak256(msg);
+
    const signature = await this.walletConnect.signMessage([
+
      address.toLowerCase(),
+
      keccakMessage,
+
    ]);
+
    return signature;
+
  }
+

+
  async sendTransaction(
+
    transaction: Deferrable<TransactionRequest>
+
  ): Promise<TransactionResponse> {
+
    const tx = await resolveProperties(transaction);
+
    const from = tx.from || (await this.getAddress());
+

+
    const txHash = await this.walletConnect.sendTransaction({
+
      from,
+
      to: tx.to,
+
      value: maybeBigNumberToString(tx.value),
+
      data: bytesLikeToString(tx.data),
+
    });
+
    return <TransactionResponse>{
+
      hash: txHash,
+
      nonce: tx.nonce,
+
      gasLimit: tx.gasLimit,
+
      gasPrice: tx.gasPrice,
+
      data: bytesLikeToString(tx.data) || "",
+
      value: tx.value,
+
      chainId: tx.chainId,
+
      confirmations: 0,
+
      from: from,
+
      wait: (confirmations?: number) => {
+
        return this.provider?.waitForTransaction(txHash, confirmations);
+
      }
+
    };
+
  }
+

+
  async signTransaction(
+
    transaction: Deferrable<TransactionRequest>
+
  ): Promise<string> {
+
    const tx = await resolveProperties(transaction);
+
    const from = tx.from || (await this.getAddress());
+
    const nonce = await this.provider.getTransactionCount(from);
+

+
    const signedTx = await this.walletConnect.signTransaction({
+
      from,
+
      to: tx.to,
+
      value: maybeBigNumberToString(tx.value || 0),
+
      gasLimit: maybeBigNumberToString(tx.gasLimit || 200 * 1000),
+
      gasPrice: maybeBigNumberToString(tx.gasPrice || 0),
+
      nonce,
+
      data: bytesLikeToString(tx.data),
+
    });
+
    return signedTx;
+
  }
+

+
  connect(): ethers.Signer {
+
    throw new Error("WalletConnectSigner.connect should never be called");
+
  }
+
}
+

+
function maybeBigNumberToString(
+
  bn: ethers.BigNumberish | undefined
+
): string | undefined {
+
  if (bn === undefined) {
+
    return undefined;
+
  } else {
+
    return ethers.BigNumber.from(bn).toString();
+
  }
+
}
+

+
function bytesLikeToString(
+
  bytes: ethersBytes.BytesLike | undefined
+
): string | undefined {
+
  if (bytes === undefined) {
+
    return undefined;
+
  } else {
+
    return ethersBytes.hexlify(bytes);
+
  }
+
}
modified src/base/registrations/registrar.ts
@@ -1,4 +1,3 @@
-
// TODO: Show "look at your wallet" / "confirm tx" before state change.
import { ethers } from 'ethers';
import { writable } from 'svelte/store';
import type { BigNumber } from 'ethers';
@@ -99,7 +98,7 @@ export async function registrationFee(config: Config): Promise<BigNumber> {
}

export async function registerName(name: string, owner: string, config: Config): Promise<void> {
-
  assert(config.signer);
+
  assert(config.signer, "signer is not available");

  if (! name) return;

@@ -144,7 +143,7 @@ async function commitAndRegister(name: string, owner: string, config: Config): P
}

async function commit(commitment: string, fee: BigNumber, minAge: number, config: Config): Promise<void> {
-
  assert(config.signer);
+
  assert(config.signer, "signer is not available");

  const owner = config.signer;
  const ownerAddr = await owner.getAddress();
@@ -187,8 +186,7 @@ async function permitSignature(
  value: ethers.BigNumberish,
  deadline: ethers.BigNumberish,
): Promise<ethers.Signature> {
-
  assert(owner.provider);
-

+
  assert(owner.provider, "provider is not available");
  state.set({ connection: State.SigningPermit });

  const ownerAddr = await owner.getAddress();
@@ -222,7 +220,7 @@ async function permitSignature(
}

async function register(name: string, owner: string, salt: Uint8Array, config: Config) {
-
  assert(config.signer);
+
  assert(config.signer, "signer is not available");
  state.set({ connection: State.SigningRegister });

  const tx = await registrar(config).connect(config.signer).register(
@@ -233,7 +231,7 @@ async function register(name: string, owner: string, salt: Uint8Array, config: C
  console.log("Sent", tx);

  await tx.wait();
-
  window.localStorage.clear();
+
  window.localStorage.removeItem("commitment");
  state.set({ connection: State.Registered });
}

added src/components/Modal/ConnectWallet.svelte
@@ -0,0 +1,79 @@
+
<script lang="ts">
+
  import { createEventDispatcher } from "svelte";
+
  import { qrcode } from "pure-svg-code";
+

+
  import Modal from "@app/Modal.svelte";
+
  import { state } from "@app/session";
+
  import type { Config } from "@app/config";
+

+
  export let uri: string;
+
  export let config: Config;
+

+
  $: svgString = qrcode({
+
    content: uri,
+
    width: 200,
+
    height: 200,
+
    color: "black",
+
    padding: 0,
+
    background: "white",
+
    ecl: "M",
+
  });
+

+
  const dispatch = createEventDispatcher();
+
  const onClickConnect = () => { state.connectMetamask(config); };
+
  const onClose = () => { dispatch("close"); };
+
</script>
+

+
<style>
+
  .qrcode-wrapper {
+
    width: min-content;
+
    margin: 0 auto;
+
    padding: 0.75rem;
+
    background-color: white;
+
  }
+
  .qrcode {
+
    width: 200px;
+
    height: 200px;
+
  }
+
  .wrapper {
+
    cursor: default;
+
    display: flex;
+
    flex-direction: column;
+
    height: 100%;
+
  }
+
</style>
+

+
<div class="wrapper">
+
  <Modal floating center>
+
    <div slot="title">
+
      <div>👛</div>
+
      <div>Connect your wallet</div>
+
    </div>
+

+
    <div slot="subtitle">
+
      <div class="text-small">
+
        WalletConnect<br/>
+
        <a href="https://walletconnect.org/wallets" class="link">
+
          View compatible wallets
+
        </a>
+
      </div>
+
    </div>
+

+
    <div slot="body">
+
      <div class="qrcode-wrapper">
+
        <div class="qrcode">
+
          {@html svgString}
+
        </div>
+
      </div>
+
    </div>
+

+
    <div slot="actions">
+
      <button class="secondary tiny text-small" on:click={onClickConnect} disabled={!config.metamaskSigner}>
+
        Connect with Metamask
+
      </button>
+
      <button class="text tiny text-small" on:click={onClose}>
+
        Close
+
      </button>
+
    </div>
+
  </Modal>
+
</div>
modified src/config.json
@@ -48,6 +48,7 @@
    "tokens": []
  },
  "alchemy": { "key": "cQFlLK8EokIGlJhd_soImwEyUoC7Ec8r" },
+
  "walletConnect": { "bridge": "https://radicle.bridge.walletconnect.org" },
  "ceramic": { "api": "https://ceramic-clay.3boxlabs.com" },
  "radicle": { "api": "http://0.0.0.0:8888" },
  "ipfs": { "gateway": "https://ipfs.io/ipfs/" },
modified src/config.ts
@@ -1,9 +1,13 @@
+
import { writable } from "svelte/store";
+
import type { Writable } from "svelte/store";
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 WalletConnect from "@walletconnect/client";
import config from "@app/config.json";
+
import { WalletConnectSigner } from "./WalletConnectSigner";

declare global {
  interface Window {
@@ -12,6 +16,15 @@ declare global {
  }
}

+
/// Gas limits for various transactions.
+
const gasLimits = {
+
  createOrg: 1_200_000,
+
};
+

+
export type WalletConnectState =
+
    { state: "close" }
+
  | { state: "open"; uri: string; onClose: any };
+

export class Config {
  network: { name: string; chainId: number };
  registrar: { address: string; domain: string };
@@ -21,7 +34,14 @@ export class Config {
  orgs: { subgraph: string; contractHash: string };
  gasLimits: { createOrg: number };
  provider: ethers.providers.JsonRpcProvider;
-
  signer: ethers.Signer & TypedDataSigner | null;
+
  signer: ethers.Signer & TypedDataSigner | WalletConnectSigner | null;
+
  walletConnect: {
+
    client: WalletConnect;
+
    bridge: string;
+
    signer: WalletConnectSigner;
+
    state: Writable<WalletConnectState>;
+
  };
+
  metamaskSigner: ethers.Signer & TypedDataSigner | null;
  safe: {
    api?: string;
    client?: SafeServiceClient;
@@ -36,29 +56,31 @@ export class Config {

  constructor(
    network: { name: string; chainId: number },
-
    provider: ethers.providers.JsonRpcProvider | null,
-
    signer: ethers.Signer & TypedDataSigner | null,
+
    provider: ethers.providers.JsonRpcProvider,
+
    metamaskSigner: ethers.Signer & TypedDataSigner | null,
  ) {
-
    const cfg = (<Record<string, any>> config)[network.name];
    const api = config.radicle.api;
-

-
    if (! cfg) {
-
      throw `Network ${network.name} is not supported`;
-
    }
-

-
    // Use Alchemy in production, on mainnet.
-
    provider = network.name === "homestead" && import.meta.env.PROD
-
      ? new ethers.providers.AlchemyProvider(network.name, config.alchemy.key)
-
      : provider;
-

-
    if (! provider) {
-
      throw `No Web3 provider available.`;
-
    }
-

+
    const cfg = (<Record<string, any>> config)[network.name];
    const ceramic = new CeramicClient(config.ceramic.api);
    const idx = new IDX({ ceramic });

+
    const walletConnectState = writable<WalletConnectState>(
+
      { state: "close" }
+
    );
+
    const wc = Config.initializeWalletConnect(
+
      config.walletConnect.bridge,
+
      walletConnectState,
+
      provider
+
    );
+

    this.network = network;
+
    this.metamaskSigner = metamaskSigner;
+
    this.walletConnect = {
+
      bridge: config.walletConnect.bridge,
+
      client: wc.connector,
+
      signer: wc.signer,
+
      state: walletConnectState,
+
    };
    this.seed = { api };
    this.registrar = cfg.registrar;
    this.radToken = cfg.radToken;
@@ -70,7 +92,7 @@ export class Config {
      ? new SafeServiceClient(this.safe.api)
      : undefined;
    this.provider = provider;
-
    this.signer = signer;
+
    this.signer = null;
    this.gasLimits = gasLimits;
    this.abi = config.abi;
    this.idx = { client: idx };
@@ -83,6 +105,10 @@ export class Config {
    );
  }

+
  setSigner(signer: ethers.Signer & TypedDataSigner | WalletConnectSigner): void {
+
    this.signer = signer;
+
  }
+

  // Return the config with an overwritten seed URL.
  withSeed(seed: string): Config {
    const cfg = {} as Config;
@@ -91,31 +117,109 @@ export class Config {

    return cfg;
  }
-
}

-
/// Gas limits for various transactions.
-
const gasLimits = {
-
  createOrg: 1_200_000,
-
};
+
  getWalletConnectSigner(): WalletConnectSigner {
+
    if (this.walletConnect.client.connected) {
+
      this.setSigner(this.walletConnect.signer);
+
      return this.walletConnect.signer;
+
    }
+
    const wc = Config.initializeWalletConnect(
+
      this.walletConnect.bridge,
+
      this.walletConnect.state,
+
      this.provider
+
    );
+
    this.walletConnect.client = wc.connector;
+
    this.walletConnect.signer = wc.signer;
+
    this.setSigner(wc.signer);
+

+
    return wc.signer;
+
  }
+

+
  static initializeWalletConnect(
+
    bridge: string,
+
    state: Writable<WalletConnectState>,
+
    provider: ethers.providers.JsonRpcProvider
+
  ): {
+
    connector: WalletConnect;
+
    signer: WalletConnectSigner;
+
  } {
+
    const walletConnect = new WalletConnect({
+
      bridge: config.walletConnect.bridge,
+
      qrcodeModal: {
+
        open: (uri: string, onClose) => {
+
          state.set({ state: "open", uri, onClose });
+
        },
+
        close: () => {
+
          state.set({ state: "close" });
+
        }
+
      },
+
      clientMeta: {
+
        name: "Radicle",
+
        description: "Radicle Interface",
+
        url: window.location.host,
+
        icons: [
+
          `${window.location.protocol}//${window.location.host}/favicon.ico`,
+
          `${window.location.protocol}//${window.location.host}/favicon.svg`
+
        ],
+
      }
+
    });
+
    walletConnect.on("modal_closed", () => {
+
      state.set({ state: "close" });
+
    });
+

+
    const walletConnectSigner = new WalletConnectSigner(walletConnect, provider);
+

+
    return {
+
      connector: walletConnect,
+
      signer: walletConnectSigner,
+
    };
+
  }
+
}

function isMetamaskInstalled(): boolean {
  const { ethereum } = window;
  return Boolean(ethereum && ethereum.isMetaMask);
}

+
function getProvider(
+
  network: { name: string },
+
  config: Record<string, any>,
+
  metamask: ethers.providers.JsonRpcProvider | null,
+
): ethers.providers.JsonRpcProvider {
+
  // Use Alchemy in production, on mainnet. Otherwise use Metamask if installed.
+
  if (network.name === "homestead" && import.meta.env.PROD) {
+
    return new ethers.providers.AlchemyProvider(network.name, config.alchemy.key);
+
  } else if (metamask) {
+
    return metamask;
+
  } else {
+
    throw new Error("No Web3 provider available.");
+
  }
+
}
+

export async function getConfig(): Promise<Config> {
-
  let config: Config;
+
  const metamask = isMetamaskInstalled()
+
    ? new ethers.providers.Web3Provider(window.ethereum)
+
    : null;
+
  const metamaskSigner = metamask?.getSigner() || null;

-
  if (isMetamaskInstalled()) {
-
    const metamask = new ethers.providers.Web3Provider(window.ethereum);
-
    const network = await metamask.ready;
-
    config = new Config(network, metamask, metamask.getSigner());
-
  } else {
-
    // If we don't have Metamask, we default to Homestead.
-
    const network = { name: "homestead", chainId: 1 };
-
    config = new Config(network, null, null);
+
  let network = { name: "homestead", chainId: 1 };
+
  if (metamask) {
+
    // If Metamask is detected, we use the network configured there.
+
    network = await metamask.ready;
  }
-
  console.log(config);

-
  return config;
+
  const networkConfig = (<Record<string, any>> config)[network.name];
+
  if (! networkConfig) {
+
    throw new Error(`Network ${network.name} is not supported`);
+
  }
+

+
  const provider = getProvider(network, networkConfig, metamask);
+
  const cfg = new Config(
+
    network,
+
    provider,
+
    metamaskSigner,
+
  );
+
  console.log(cfg, "config");
+

+
  return cfg;
}
added src/polyfills/enc-utils.js
@@ -0,0 +1,73 @@
+
/* eslint-disable @typescript-eslint/naming-convention */
+
/* eslint-disable @typescript-eslint/no-var-requires */
+

+
"use strict";
+

+
var Buffer = require("buffer/").Buffer;
+
var typedarrayToBuffer = require("typedarray-to-buffer");
+

+
const ENC_UTF8 = 'utf8';
+
const ENC_HEX = 'hex';
+

+
function bufferToArray(buf) {
+
  return new Uint8Array(buf);
+
}
+
exports.bufferToArray = bufferToArray;
+

+
function bufferToUtf8(buf) {
+
  return buf.toString(ENC_UTF8);
+
}
+
exports.bufferToUtf8 = bufferToUtf8;
+

+
function bufferToHex(buf, prefixed = false) {
+
  const hex = buf.toString(ENC_HEX);
+
  return prefixed ? addHexPrefix(hex) : hex;
+
}
+
exports.bufferToHex = bufferToHex;
+

+
function utf8ToBuffer(utf8) {
+
  return Buffer.from(utf8, ENC_UTF8);
+
}
+
exports.utf8ToBuffer = utf8ToBuffer;
+

+
function utf8ToArray(utf8) {
+
  return bufferToArray(utf8ToBuffer(utf8));
+
}
+
exports.utf8ToArray = utf8ToArray;
+

+
function hexToArray(hex) {
+
  return bufferToArray(hexToBuffer(hex));
+
}
+
exports.hexToArray = hexToArray;
+

+
function hexToBuffer(hex) {
+
  return Buffer.from(removeHexPrefix(hex), ENC_HEX);
+
}
+
exports.hexToBuffer = hexToBuffer;
+

+
function removeHexPrefix(hex) {
+
  return hex.replace(/^0x/, '');
+
}
+
exports.removeHexPrefix = removeHexPrefix;
+

+
function addHexPrefix(hex) {
+
  return hex.startsWith('0x') ? hex : `0x${hex}`;
+
}
+
exports.addHexPrefix = addHexPrefix;
+

+
function arrayToBuffer(arr) {
+
  return typedarrayToBuffer(arr);
+
}
+
exports.arrayToBuffer = arrayToBuffer;
+

+
function arrayToHex(arr, prefixed = false) {
+
  return bufferToHex(arrayToBuffer(arr), prefixed);
+
}
+
exports.arrayToHex = arrayToHex;
+

+
function concatArrays(...args) {
+
  let result = [];
+
  args.forEach(arg => (result = result.concat(Array.from(arg))));
+
  return new Uint8Array([...result]);
+
}
+
exports.concatArrays = concatArrays;
added src/polyfills/typedarray-to-buffer.js
@@ -0,0 +1,17 @@
+
/* eslint-disable @typescript-eslint/naming-convention */
+
/* eslint-disable @typescript-eslint/no-var-requires */
+

+
var isTypedArray = require('is-typedarray').strict;
+
var Buffer = require('buffer/').Buffer;
+

+
module.exports = function typedarrayToBuffer(arr) {
+
  if (isTypedArray(arr)) {
+
    var buf = Buffer.from(arr.buffer);
+
    if (arr.byteLength !== arr.buffer.byteLength) {
+
      buf = buf.slice(arr.byteOffset, arr.byteOffset + arr.byteLength);
+
    }
+
    return buf;
+
  } else {
+
    return Buffer.from(arr);
+
  }
+
};
modified src/session.ts
@@ -3,6 +3,7 @@ import type { BigNumber } from 'ethers';
import type { TransactionReceipt, TransactionResponse } from '@ethersproject/providers';
import { Config, getConfig } from "@app/config";
import { Unreachable, assert, assertEq } from "@app/error";
+
import * as ethers from "ethers";

export enum Connection {
  Disconnected,
@@ -29,10 +30,10 @@ export interface Session {
}

export interface Store extends Readable<State> {
-
  connect(config: Config): Promise<void>;
+
  connectMetamask(config: Config): Promise<void>;
+
  connectWalletConnect(config: Config): Promise<void>;
  updateBalance(n: BigNumber): void;
  refreshBalance(config: Config): Promise<void>;
-

  setTxSigning(): void;
  setTxPending(tx: TransactionResponse): void;
  setTxConfirmed(tx: TransactionReceipt): void;
@@ -41,42 +42,80 @@ export interface Store extends Readable<State> {

export const loadState = (initial: State): Store => {
  const store = writable<State>(initial);
-
  const session = window.localStorage.getItem("session");
+
  const metamask = window.localStorage.getItem("metamask");

-
  if (session) store.set({ connection: Connection.Connected, session: JSON.parse(session) });
+
  if (metamask) {
+
    store.set({ connection: Connection.Connected, session: JSON.parse(metamask) });
+
  }

  return {
    subscribe: store.subscribe,
-
    connect: async (config: Config) => {
-
      assert(config.signer);
+
    connectMetamask: async (config: Config) => {
+
      assert(config.metamaskSigner);
+

      const state = get(store);

-
      assertEq(state.connection, Connection.Disconnected);
+
      assertEq(state.connection, Connection.Disconnected || Connection.Connecting);
      store.set({ connection: Connection.Connecting });

-
      // TODO: This hangs on Brave, if you have to unlock your wallet..
-
      try {
-
        await window.ethereum.request({ method: 'eth_requestAccounts' });
-
      } catch (e) {
-
        console.error(e);
-
      }
+
      await window.ethereum.request({ method: 'eth_requestAccounts' });

-
      const signer = config.signer;
+
      const signer = config.metamaskSigner;
      const address = await signer.getAddress();

+
      config.setSigner(signer);
+

      try {
+
        config.walletConnect.state.set({ state: "close" });
+

        const tokenBalance: BigNumber = await config.token.balanceOf(address);
        const session = { address, tokenBalance, tx: null };
+

        store.set({
          connection: Connection.Connected,
          session,
        });
-
        saveSession({ ...session, tokenBalance: null });
+
        saveSession({ ...session });
      } catch (e) {
        console.error(e);
      }
    },

+
    connectWalletConnect: async (config: Config) => {
+
      store.set({ connection: Connection.Connecting });
+
      const signer = config.getWalletConnectSigner();
+

+
      try {
+
        await config.walletConnect.client.connect();
+

+
        const address = await signer.getAddress();
+
        const tokenBalance: BigNumber = await config.token.balanceOf(address);
+
        const session = { address, tokenBalance, tx: null };
+
        const network = await ethers.providers.getNetwork(
+
          signer.walletConnect.chainId
+
        );
+

+
        if (network.chainId !== config.network.chainId) {
+
          config.walletConnect.client.killSession();
+
          throw new Error(
+
            `Network mismatch. Please switch to ${config.network.name}.`
+
          );
+
        }
+
        store.set({ connection: Connection.Connected, session });
+
      } catch (e) {
+
        store.set({ connection: Connection.Disconnected });
+

+
        // There seems to be no way to detect this "error" caused by the user
+
        // closing the modal dialog, besides matching on the message string.
+
        // Welcome to the wonderful ghetto that is WalletConnect.
+
        //
+
        // Since it's not really an error, we don't throw if this is what happened.
+
        if (e.message !== "User close QRCode Modal") {
+
          throw e;
+
        }
+
      }
+
    },
+

    updateBalance: (n: BigNumber) => {
      store.update((s: State) => {
        assert(s.connection === Connection.Connected);
@@ -168,7 +207,7 @@ export const loadState = (initial: State): Store => {
            // In case of locking Metamask the accountsChanged event returns undefined.
            // To prevent out of sync state, the wallet gets disconnected.
            if (address === undefined) {
-
              disconnectWallet();
+
              disconnectMetamask();
            } else {
              s.session.address = address;
              saveSession(s.session);
@@ -178,11 +217,12 @@ export const loadState = (initial: State): Store => {
            return s;
        }
      });
-
    }
+
    },
  };
};

export const state = loadState({ connection: Connection.Disconnected });
+

export const session = derived(state, s => {
  if (s.connection === Connection.Connected) {
    return s.session;
@@ -193,7 +233,7 @@ export const session = derived(state, s => {
window.ethereum?.on('chainChanged', () => {
  // We disconnect the wallet to avoid out of sync state
  // between the account address and IDX DIDs
-
  disconnectWallet();
+
  disconnectMetamask();
  location.reload();
});

@@ -222,13 +262,20 @@ export async function approveSpender(spender: string, amount: BigNumber, config:
  }
}

-
export function disconnectWallet(): void {
-
  window.localStorage.removeItem("session");
-
  location.reload();
+
export function disconnectMetamask(): void {
+
  window.localStorage.removeItem('metamask');
+
  window.location.reload();
+
}
+

+
export function disconnectWallet(config: Config): void {
+
  if (config.walletConnect.client.connected) {
+
    config.walletConnect.client.killSession();
+
  }
+
  disconnectMetamask();
}

function saveSession(session: Session): void {
-
  window.localStorage.setItem("session", JSON.stringify({
+
  window.localStorage.setItem("metamask", JSON.stringify({
    ...session, tokenBalance: null
  }));
}
modified vite.config.ts
@@ -1,26 +1,28 @@
-
import path from "path";
-
import { UserConfig } from "vite";
-
import svelte from "@sveltejs/vite-plugin-svelte";
-
import rewriteAll from "vite-plugin-rewrite-all";
+
import path from 'path';
+
import { UserConfig } from 'vite';
+
import svelte from '@sveltejs/vite-plugin-svelte';
+
import rewriteAll from 'vite-plugin-rewrite-all';

const config: UserConfig = {
  optimizeDeps: {
-
    exclude: ['svelte-routing']
+
    exclude: ['svelte-routing', '@pedrouid/environment', '@pedrouid/iso-crypto']
  },
  plugins: [svelte(), rewriteAll()],
  resolve: {
    alias: {
-
      "@app": path.resolve("./src"),
-
      // Polyfill for Node.js "stream" library.
-
      "stream": path.resolve("./src/polyfills/stream.ts"),
+
      '@app': path.resolve('./src'),
+
      // Polyfill for Node.js 'stream' library.
+
      'stream': path.resolve('./src/polyfills/stream.ts'),
+
      'typedarray-to-buffer': path.resolve('./src/polyfills/typedarray-to-buffer.js'),
+
      'enc-utils': path.resolve('./src/polyfills/enc-utils.js'),
    },
  },
  define: {
    // eslint-disable-next-line @typescript-eslint/naming-convention
-
    "process.env": { READABLE_STREAM: "disable" }
+
    'process.env': { READABLE_STREAM: 'disable' }
  },
  build: {
-
    outDir: "build",
+
    outDir: 'build',
    sourcemap: true
  }
};