Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Switch to TypeScript
Alexis Sellier committed 5 years ago
commit a34b26384ccf1448bd43bc572388b2c2b3b73e0a
parent 52522d242f1a6b89199103116957c582a0c33c21
24 files changed +1365 -647
modified package-lock.json
@@ -1,23 +1,26 @@
{
-
  "name": "radicle-app",
+
  "name": "radicle-interface",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "dependencies": {
+
        "@snowpack/plugin-typescript": "^1.2.1",
        "ethers": "^5.0.31",
        "svelte": "^3.32.3",
        "svelte-routing": "^1.5.0"
      },
      "devDependencies": {
        "@snowpack/plugin-svelte": "^3.5.2",
-
        "snowpack": "^3.0.1"
+
        "@tsconfig/svelte": "^1.0.10",
+
        "snowpack": "^3.0.1",
+
        "svelte-check": "^1.5.2",
+
        "svelte-preprocess": "^4.7.2",
+
        "typescript": "^4.2.4"
      }
    },
    "node_modules/@ethersproject/abi": {
      "version": "5.0.12",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.12.tgz",
-
      "integrity": "sha512-Ujr/3bwyYYjXLDQfebeiiTuvOw9XtUKM8av6YkoBeMXyGQM9GkjrQlwJMNwGTmqjATH/ZNbRgCh98GjOLiIB1Q==",
      "funding": [
        {
          "type": "individual",
@@ -28,6 +31,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/address": "^5.0.9",
        "@ethersproject/bignumber": "^5.0.13",
@@ -42,8 +46,6 @@
    },
    "node_modules/@ethersproject/abstract-provider": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.9.tgz",
-
      "integrity": "sha512-X9fMkqpeu9ayC3JyBkeeZhn35P4xQkpGX/l+FrxDtEW9tybf/UWXSMi8bGThpPtfJ6q6U2LDetXSpSwK4TfYQQ==",
      "funding": [
        {
          "type": "individual",
@@ -54,6 +56,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/bytes": "^5.0.9",
@@ -66,8 +69,6 @@
    },
    "node_modules/@ethersproject/abstract-signer": {
      "version": "5.0.13",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.13.tgz",
-
      "integrity": "sha512-VBIZEI5OK0TURoCYyw0t3w+TEO4kdwnI9wvt4kqUwyxSn3YCRpXYVl0Xoe7XBR/e5+nYOi2MyFGJ3tsFwONecQ==",
      "funding": [
        {
          "type": "individual",
@@ -78,6 +79,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abstract-provider": "^5.0.8",
        "@ethersproject/bignumber": "^5.0.13",
@@ -88,8 +90,6 @@
    },
    "node_modules/@ethersproject/address": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.10.tgz",
-
      "integrity": "sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw==",
      "funding": [
        {
          "type": "individual",
@@ -100,6 +100,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/bytes": "^5.0.9",
@@ -110,8 +111,6 @@
    },
    "node_modules/@ethersproject/base64": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.8.tgz",
-
      "integrity": "sha512-PNbpHOMgZpZ1skvQl119pV2YkCPXmZTxw+T92qX0z7zaMFPypXWTZBzim+hUceb//zx4DFjeGT4aSjZRTOYThg==",
      "funding": [
        {
          "type": "individual",
@@ -122,14 +121,13 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9"
      }
    },
    "node_modules/@ethersproject/basex": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.0.8.tgz",
-
      "integrity": "sha512-PCVKZIShBQUqAXjJSvaCidThPvL0jaaQZcewJc0sf8Xx05BizaOS8r3jdPdpNdY+/qZtRDqwHTSKjvR/xssyLQ==",
      "funding": [
        {
          "type": "individual",
@@ -140,6 +138,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/properties": "^5.0.7"
@@ -147,8 +146,6 @@
    },
    "node_modules/@ethersproject/bignumber": {
      "version": "5.0.14",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.14.tgz",
-
      "integrity": "sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw==",
      "funding": [
        {
          "type": "individual",
@@ -159,6 +156,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8",
@@ -167,8 +165,6 @@
    },
    "node_modules/@ethersproject/bytes": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz",
-
      "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==",
      "funding": [
        {
          "type": "individual",
@@ -179,14 +175,13 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/logger": "^5.0.8"
      }
    },
    "node_modules/@ethersproject/constants": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.9.tgz",
-
      "integrity": "sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg==",
      "funding": [
        {
          "type": "individual",
@@ -197,14 +192,13 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bignumber": "^5.0.13"
      }
    },
    "node_modules/@ethersproject/contracts": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.0.11.tgz",
-
      "integrity": "sha512-FTUUd/6x00dYL2VufE2VowZ7h3mAyBfCQMGwI3tKDIWka+C0CunllFiKrlYCdiHFuVeMotR65dIcnzbLn72MCw==",
      "funding": [
        {
          "type": "individual",
@@ -215,6 +209,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abi": "^5.0.10",
        "@ethersproject/abstract-provider": "^5.0.8",
@@ -229,8 +224,6 @@
    },
    "node_modules/@ethersproject/hash": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.11.tgz",
-
      "integrity": "sha512-H3KJ9fk33XWJ2djAW03IL7fg3DsDMYjO1XijiUb1hJ85vYfhvxu0OmsU7d3tg2Uv1H1kFSo8ghr3WFQ8c+NL3g==",
      "funding": [
        {
          "type": "individual",
@@ -241,6 +234,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abstract-signer": "^5.0.10",
        "@ethersproject/address": "^5.0.9",
@@ -254,8 +248,6 @@
    },
    "node_modules/@ethersproject/hdnode": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.0.9.tgz",
-
      "integrity": "sha512-S5UMmIC6XfFtqhUK4uTjD8GPNzSbE+sZ/0VMqFnA3zAJ+cEFZuEyhZDYnl2ItGJzjT4jsy+uEy1SIl3baYK1PQ==",
      "funding": [
        {
          "type": "individual",
@@ -266,6 +258,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abstract-signer": "^5.0.10",
        "@ethersproject/basex": "^5.0.7",
@@ -283,8 +276,6 @@
    },
    "node_modules/@ethersproject/json-wallets": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.0.11.tgz",
-
      "integrity": "sha512-0GhWScWUlXXb4qJNp0wmkU95QS3YdN9UMOfMSEl76CRANWWrmyzxcBVSXSBu5iQ0/W8wO+xGlJJ3tpA6v3mbIw==",
      "funding": [
        {
          "type": "individual",
@@ -295,6 +286,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abstract-signer": "^5.0.10",
        "@ethersproject/address": "^5.0.9",
@@ -313,8 +305,6 @@
    },
    "node_modules/@ethersproject/keccak256": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.8.tgz",
-
      "integrity": "sha512-zoGbwXcWWs9MX4NOAZ7N0hhgIRl4Q/IO/u9c/RHRY4WqDy3Ywm0OLamEV53QDwhjwn3YiiVwU1Ve5j7yJ0a/KQ==",
      "funding": [
        {
          "type": "individual",
@@ -325,6 +315,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "js-sha3": "0.5.7"
@@ -332,8 +323,6 @@
    },
    "node_modules/@ethersproject/logger": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz",
-
      "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==",
      "funding": [
        {
          "type": "individual",
@@ -343,12 +332,11 @@
          "type": "individual",
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
-
      ]
+
      ],
+
      "license": "MIT"
    },
    "node_modules/@ethersproject/networks": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.8.tgz",
-
      "integrity": "sha512-PYpptlO2Tu5f/JEBI5hdlMds5k1DY1QwVbh3LKPb3un9dQA2bC51vd2/gRWAgSBpF3kkmZOj4FhD7ATLX4H+DA==",
      "funding": [
        {
          "type": "individual",
@@ -359,14 +347,13 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/logger": "^5.0.8"
      }
    },
    "node_modules/@ethersproject/pbkdf2": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.0.8.tgz",
-
      "integrity": "sha512-UlmAMGbIPaS2xXsI38FbePVTfJMuU9jnwcqVn3p88HxPF4kD897ha+l3TNsBqJqf32UbQL5GImnf1oJkSKq4vQ==",
      "funding": [
        {
          "type": "individual",
@@ -377,6 +364,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/sha2": "^5.0.7"
@@ -384,8 +372,6 @@
    },
    "node_modules/@ethersproject/properties": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz",
-
      "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==",
      "funding": [
        {
          "type": "individual",
@@ -396,14 +382,13 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/logger": "^5.0.8"
      }
    },
    "node_modules/@ethersproject/providers": {
      "version": "5.0.23",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.0.23.tgz",
-
      "integrity": "sha512-eJ94z2tgPaUgUmxwd3BVkIzkgkbNIkY6wRPVas04LVaBTycObQbgj794aaUu2bfk7+Bn2B/gjUZtJW1ybxh9/A==",
      "funding": [
        {
          "type": "individual",
@@ -414,6 +399,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abstract-provider": "^5.0.8",
        "@ethersproject/abstract-signer": "^5.0.10",
@@ -438,8 +424,6 @@
    },
    "node_modules/@ethersproject/random": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.0.8.tgz",
-
      "integrity": "sha512-4rHtotmd9NjklW0eDvByicEkL+qareIyFSbG1ShC8tPJJSAC0g55oQWzw+3nfdRCgBHRuEE7S8EcPcTVPvZ9cA==",
      "funding": [
        {
          "type": "individual",
@@ -450,6 +434,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8"
@@ -457,8 +442,6 @@
    },
    "node_modules/@ethersproject/rlp": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.8.tgz",
-
      "integrity": "sha512-E4wdFs8xRNJfzNHmnkC8w5fPeT4Wd1U2cust3YeT16/46iSkLT8nn8ilidC6KhR7hfuSZE4UqSPzyk76p7cdZg==",
      "funding": [
        {
          "type": "individual",
@@ -469,6 +452,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8"
@@ -476,8 +460,6 @@
    },
    "node_modules/@ethersproject/sha2": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.0.8.tgz",
-
      "integrity": "sha512-ILP1ZgyvDj4rrdE+AXrTv9V88m7x87uga2VZ/FeULKPumOEw/4bGnJz/oQ8zDnDvVYRCJ+48VaQBS2CFLbk1ww==",
      "funding": [
        {
          "type": "individual",
@@ -488,6 +470,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8",
@@ -496,8 +479,6 @@
    },
    "node_modules/@ethersproject/signing-key": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.10.tgz",
-
      "integrity": "sha512-w5it3GbFOvN6e0mTd5gDNj+bwSe6L9jqqYjU+uaYS8/hAEp4qYLk5p8ZjbJJkNn7u1p0iwocp8X9oH/OdK8apA==",
      "funding": [
        {
          "type": "individual",
@@ -508,6 +489,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8",
@@ -517,8 +499,6 @@
    },
    "node_modules/@ethersproject/solidity": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.0.9.tgz",
-
      "integrity": "sha512-LIxSAYEQgLRXE3mRPCq39ou61kqP8fDrGqEeNcaNJS3aLbmAOS8MZp56uK++WsdI9hj8sNsFh78hrAa6zR9Jag==",
      "funding": [
        {
          "type": "individual",
@@ -529,6 +509,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/bytes": "^5.0.9",
@@ -539,8 +520,6 @@
    },
    "node_modules/@ethersproject/strings": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.9.tgz",
-
      "integrity": "sha512-ogxBpcUpdO524CYs841MoJHgHxEPUy0bJFDS4Ezg8My+WYVMfVAOlZSLss0Rurbeeam8CpUVDzM4zUn09SU66Q==",
      "funding": [
        {
          "type": "individual",
@@ -551,6 +530,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/constants": "^5.0.8",
@@ -559,8 +539,6 @@
    },
    "node_modules/@ethersproject/transactions": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.10.tgz",
-
      "integrity": "sha512-Tqpp+vKYQyQdJQQk4M73tDzO7ODf2D42/sJOcKlDAAbdSni13v6a+31hUdo02qYXhVYwIs+ZjHnO4zKv5BNk8w==",
      "funding": [
        {
          "type": "individual",
@@ -571,6 +549,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/address": "^5.0.9",
        "@ethersproject/bignumber": "^5.0.13",
@@ -585,8 +564,6 @@
    },
    "node_modules/@ethersproject/units": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.0.10.tgz",
-
      "integrity": "sha512-eaiHi9ham5lbC7qpqxpae7OY/nHJUnRUnFFuEwi2VB5Nwe3Np468OAV+e+HR+jAK4fHXQE6PFBTxWGtnZuO37g==",
      "funding": [
        {
          "type": "individual",
@@ -597,6 +574,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/constants": "^5.0.8",
@@ -605,8 +583,6 @@
    },
    "node_modules/@ethersproject/wallet": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.0.11.tgz",
-
      "integrity": "sha512-2Fg/DOvUltR7aZTOyWWlQhru+SKvq2UE3uEhXSyCFgMqDQNuc2nHXh1SHJtN65jsEbjVIppOe1Q7EQMvhmeeRw==",
      "funding": [
        {
          "type": "individual",
@@ -617,6 +593,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abstract-provider": "^5.0.8",
        "@ethersproject/abstract-signer": "^5.0.10",
@@ -637,8 +614,6 @@
    },
    "node_modules/@ethersproject/web": {
      "version": "5.0.13",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.13.tgz",
-
      "integrity": "sha512-G3x/Ns7pQm21ALnWLbdBI5XkW/jrsbXXffI9hKNPHqf59mTxHYtlNiSwxdoTSwCef3Hn7uvGZpaSgTyxs7IufQ==",
      "funding": [
        {
          "type": "individual",
@@ -649,6 +624,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/base64": "^5.0.7",
        "@ethersproject/bytes": "^5.0.9",
@@ -659,8 +635,6 @@
    },
    "node_modules/@ethersproject/wordlists": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.0.9.tgz",
-
      "integrity": "sha512-Sn6MTjZkfbriod6GG6+p43W09HOXT4gwcDVNj0YoPYlo4Zq2Fk6b1CU9KUX3c6aI17PrgYb4qwZm5BMuORyqyQ==",
      "funding": [
        {
          "type": "individual",
@@ -671,6 +645,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/hash": "^5.0.10",
@@ -681,9 +656,8 @@
    },
    "node_modules/@snowpack/plugin-svelte": {
      "version": "3.5.2",
-
      "resolved": "https://registry.npmjs.org/@snowpack/plugin-svelte/-/plugin-svelte-3.5.2.tgz",
-
      "integrity": "sha512-i7OhkIRNt1uJ/y3qpowlU7icjtSgFPIl/GjMmBxhtwoIqHAnowFLh1Ur5G6S36GCFo65ymClnYfEIM/2x1+wPQ==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "rollup-plugin-svelte": "^7.0.0",
        "svelte-hmr": "^0.12.1",
@@ -693,60 +667,202 @@
        "svelte": "^3.21.0"
      }
    },
+
    "node_modules/@snowpack/plugin-typescript": {
+
      "version": "1.2.1",
+
      "license": "MIT",
+
      "dependencies": {
+
        "execa": "^5.0.0",
+
        "npm-run-path": "^4.0.1"
+
      },
+
      "peerDependencies": {
+
        "typescript": "*"
+
      }
+
    },
+
    "node_modules/@tsconfig/svelte": {
+
      "version": "1.0.10",
+
      "dev": true,
+
      "license": "MIT"
+
    },
    "node_modules/@types/node": {
      "version": "14.14.31",
-
      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz",
-
      "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==",
-
      "dev": true
+
      "dev": true,
+
      "license": "MIT"
    },
    "node_modules/@types/pug": {
      "version": "2.0.4",
-
      "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz",
-
      "integrity": "sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=",
-
      "dev": true
+
      "dev": true,
+
      "license": "MIT"
    },
    "node_modules/@types/sass": {
      "version": "1.16.0",
-
      "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz",
-
      "integrity": "sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "@types/node": "*"
      }
    },
    "node_modules/aes-js": {
      "version": "3.0.0",
-
      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
-
      "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
+
      "license": "MIT"
+
    },
+
    "node_modules/ansi-styles": {
+
      "version": "4.3.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "color-convert": "^2.0.1"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      },
+
      "funding": {
+
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
      }
+
    },
+
    "node_modules/anymatch": {
+
      "version": "3.1.2",
+
      "dev": true,
+
      "license": "ISC",
+
      "dependencies": {
+
        "normalize-path": "^3.0.0",
+
        "picomatch": "^2.0.4"
+
      },
+
      "engines": {
+
        "node": ">= 8"
+
      }
+
    },
+
    "node_modules/balanced-match": {
+
      "version": "1.0.2",
+
      "dev": true,
+
      "license": "MIT"
    },
    "node_modules/bech32": {
      "version": "1.1.4",
-
      "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
-
      "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
+
      "license": "MIT"
+
    },
+
    "node_modules/binary-extensions": {
+
      "version": "2.2.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=8"
+
      }
    },
    "node_modules/bn.js": {
      "version": "4.11.9",
-
      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-
      "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
+
      "license": "MIT"
+
    },
+
    "node_modules/brace-expansion": {
+
      "version": "1.1.11",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "balanced-match": "^1.0.0",
+
        "concat-map": "0.0.1"
+
      }
+
    },
+
    "node_modules/braces": {
+
      "version": "3.0.2",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "fill-range": "^7.0.1"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      }
    },
    "node_modules/brorand": {
      "version": "1.1.0",
-
      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-
      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+
      "license": "MIT"
+
    },
+
    "node_modules/callsites": {
+
      "version": "3.1.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
+
    "node_modules/chalk": {
+
      "version": "4.1.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "ansi-styles": "^4.1.0",
+
        "supports-color": "^7.1.0"
+
      },
+
      "engines": {
+
        "node": ">=10"
+
      },
+
      "funding": {
+
        "url": "https://github.com/chalk/chalk?sponsor=1"
+
      }
+
    },
+
    "node_modules/chokidar": {
+
      "version": "3.5.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "anymatch": "~3.1.1",
+
        "braces": "~3.0.2",
+
        "glob-parent": "~5.1.0",
+
        "is-binary-path": "~2.1.0",
+
        "is-glob": "~4.0.1",
+
        "normalize-path": "~3.0.0",
+
        "readdirp": "~3.5.0"
+
      },
+
      "engines": {
+
        "node": ">= 8.10.0"
+
      },
+
      "optionalDependencies": {
+
        "fsevents": "~2.3.1"
+
      }
+
    },
+
    "node_modules/color-convert": {
+
      "version": "2.0.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "color-name": "~1.1.4"
+
      },
+
      "engines": {
+
        "node": ">=7.0.0"
+
      }
+
    },
+
    "node_modules/color-name": {
+
      "version": "1.1.4",
+
      "dev": true,
+
      "license": "MIT"
+
    },
+
    "node_modules/concat-map": {
+
      "version": "0.0.1",
+
      "dev": true,
+
      "license": "MIT"
+
    },
+
    "node_modules/cross-spawn": {
+
      "version": "7.0.3",
+
      "license": "MIT",
+
      "dependencies": {
+
        "path-key": "^3.1.0",
+
        "shebang-command": "^2.0.0",
+
        "which": "^2.0.1"
+
      },
+
      "engines": {
+
        "node": ">= 8"
+
      }
    },
    "node_modules/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==",
      "dev": true,
+
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/elliptic": {
      "version": "6.5.4",
-
      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
-
      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+
      "license": "MIT",
      "dependencies": {
        "bn.js": "^4.11.9",
        "brorand": "^1.1.0",
@@ -759,24 +875,20 @@
    },
    "node_modules/esbuild": {
      "version": "0.8.50",
-
      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.50.tgz",
-
      "integrity": "sha512-oidFLXssA7IccYzkqLVZSqNJDwDq8Mh/vqvrW+3fPWM7iUiC5O2bCllhnO8+K9LlyL/2Z6n+WwRJAz9fqSIVRg==",
      "dev": true,
      "hasInstallScript": true,
+
      "license": "MIT",
      "bin": {
        "esbuild": "bin/esbuild"
      }
    },
    "node_modules/estree-walker": {
      "version": "0.6.1",
-
      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
-
      "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
-
      "dev": true
+
      "dev": true,
+
      "license": "MIT"
    },
    "node_modules/ethers": {
      "version": "5.0.31",
-
      "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.31.tgz",
-
      "integrity": "sha512-zpq0YbNFLFn+t+ibS8UkVWFeK5w6rVMSvbSHrHAQslfazovLnQ/mc2gdN5+6P45/k8fPgHrfHrYvJ4XvyK/S1A==",
      "funding": [
        {
          "type": "individual",
@@ -787,6 +899,7 @@
          "url": "https://www.buymeacoffee.com/ricmoo"
        }
      ],
+
      "license": "MIT",
      "dependencies": {
        "@ethersproject/abi": "5.0.12",
        "@ethersproject/abstract-provider": "5.0.9",
@@ -820,24 +933,94 @@
        "@ethersproject/wordlists": "5.0.9"
      }
    },
-
    "node_modules/fsevents": {
-
      "version": "2.3.2",
-
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-
      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+
    "node_modules/execa": {
+
      "version": "5.0.0",
+
      "license": "MIT",
+
      "dependencies": {
+
        "cross-spawn": "^7.0.3",
+
        "get-stream": "^6.0.0",
+
        "human-signals": "^2.1.0",
+
        "is-stream": "^2.0.0",
+
        "merge-stream": "^2.0.0",
+
        "npm-run-path": "^4.0.1",
+
        "onetime": "^5.1.2",
+
        "signal-exit": "^3.0.3",
+
        "strip-final-newline": "^2.0.0"
+
      },
+
      "engines": {
+
        "node": ">=10"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+
      }
+
    },
+
    "node_modules/fill-range": {
+
      "version": "7.0.1",
      "dev": true,
-
      "hasInstallScript": true,
-
      "optional": true,
-
      "os": [
-
        "darwin"
-
      ],
+
      "license": "MIT",
+
      "dependencies": {
+
        "to-regex-range": "^5.0.1"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
+
    "node_modules/fs.realpath": {
+
      "version": "1.0.0",
+
      "dev": true,
+
      "license": "ISC"
+
    },
+
    "node_modules/get-stream": {
+
      "version": "6.0.1",
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=10"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sponsors/sindresorhus"
+
      }
+
    },
+
    "node_modules/glob": {
+
      "version": "7.1.6",
+
      "dev": true,
+
      "license": "ISC",
+
      "dependencies": {
+
        "fs.realpath": "^1.0.0",
+
        "inflight": "^1.0.4",
+
        "inherits": "2",
+
        "minimatch": "^3.0.4",
+
        "once": "^1.3.0",
+
        "path-is-absolute": "^1.0.0"
+
      },
      "engines": {
-
        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+
        "node": "*"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sponsors/isaacs"
+
      }
+
    },
+
    "node_modules/glob-parent": {
+
      "version": "5.1.2",
+
      "dev": true,
+
      "license": "ISC",
+
      "dependencies": {
+
        "is-glob": "^4.0.1"
+
      },
+
      "engines": {
+
        "node": ">= 6"
+
      }
+
    },
+
    "node_modules/has-flag": {
+
      "version": "4.0.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=8"
      }
    },
    "node_modules/hash.js": {
      "version": "1.1.3",
-
      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
-
      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
+
      "license": "MIT",
      "dependencies": {
        "inherits": "^2.0.3",
        "minimalistic-assert": "^1.0.0"
@@ -845,24 +1028,63 @@
    },
    "node_modules/hmac-drbg": {
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-
      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+
      "license": "MIT",
      "dependencies": {
        "hash.js": "^1.0.3",
        "minimalistic-assert": "^1.0.0",
        "minimalistic-crypto-utils": "^1.0.1"
      }
    },
+
    "node_modules/human-signals": {
+
      "version": "2.1.0",
+
      "license": "Apache-2.0",
+
      "engines": {
+
        "node": ">=10.17.0"
+
      }
+
    },
+
    "node_modules/import-fresh": {
+
      "version": "3.3.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "parent-module": "^1.0.0",
+
        "resolve-from": "^4.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sponsors/sindresorhus"
+
      }
+
    },
+
    "node_modules/inflight": {
+
      "version": "1.0.6",
+
      "dev": true,
+
      "license": "ISC",
+
      "dependencies": {
+
        "once": "^1.3.0",
+
        "wrappy": "1"
+
      }
+
    },
    "node_modules/inherits": {
      "version": "2.0.4",
-
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+
      "license": "ISC"
+
    },
+
    "node_modules/is-binary-path": {
+
      "version": "2.1.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "binary-extensions": "^2.0.0"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      }
    },
    "node_modules/is-docker": {
      "version": "2.1.1",
-
      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
-
      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
      "dev": true,
+
      "license": "MIT",
      "bin": {
        "is-docker": "cli.js"
      },
@@ -873,11 +1095,44 @@
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
+
    "node_modules/is-extglob": {
+
      "version": "2.1.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=0.10.0"
+
      }
+
    },
+
    "node_modules/is-glob": {
+
      "version": "4.0.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "is-extglob": "^2.1.1"
+
      },
+
      "engines": {
+
        "node": ">=0.10.0"
+
      }
+
    },
+
    "node_modules/is-number": {
+
      "version": "7.0.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=0.12.0"
+
      }
+
    },
+
    "node_modules/is-stream": {
+
      "version": "2.0.0",
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
    "node_modules/is-wsl": {
      "version": "2.2.0",
-
      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-
      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "is-docker": "^2.0.0"
      },
@@ -885,35 +1140,100 @@
        "node": ">=8"
      }
    },
+
    "node_modules/isexe": {
+
      "version": "2.0.0",
+
      "license": "ISC"
+
    },
    "node_modules/js-sha3": {
      "version": "0.5.7",
-
      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
-
      "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
+
      "license": "MIT"
+
    },
+
    "node_modules/merge-stream": {
+
      "version": "2.0.0",
+
      "license": "MIT"
+
    },
+
    "node_modules/mimic-fn": {
+
      "version": "2.1.0",
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=6"
+
      }
    },
    "node_modules/min-indent": {
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
-
      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
      "dev": true,
+
      "license": "MIT",
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/minimalistic-assert": {
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-
      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+
      "license": "ISC"
    },
    "node_modules/minimalistic-crypto-utils": {
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-
      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+
      "license": "MIT"
+
    },
+
    "node_modules/minimatch": {
+
      "version": "3.0.4",
+
      "dev": true,
+
      "license": "ISC",
+
      "dependencies": {
+
        "brace-expansion": "^1.1.7"
+
      },
+
      "engines": {
+
        "node": "*"
+
      }
+
    },
+
    "node_modules/minimist": {
+
      "version": "1.2.5",
+
      "dev": true,
+
      "license": "MIT"
+
    },
+
    "node_modules/normalize-path": {
+
      "version": "3.0.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=0.10.0"
+
      }
+
    },
+
    "node_modules/npm-run-path": {
+
      "version": "4.0.1",
+
      "license": "MIT",
+
      "dependencies": {
+
        "path-key": "^3.0.0"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
+
    "node_modules/once": {
+
      "version": "1.4.0",
+
      "dev": true,
+
      "license": "ISC",
+
      "dependencies": {
+
        "wrappy": "1"
+
      }
+
    },
+
    "node_modules/onetime": {
+
      "version": "5.1.2",
+
      "license": "MIT",
+
      "dependencies": {
+
        "mimic-fn": "^2.1.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sponsors/sindresorhus"
+
      }
    },
    "node_modules/open": {
      "version": "7.4.2",
-
      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
-
      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "is-docker": "^2.0.0",
        "is-wsl": "^2.1.1"
@@ -925,17 +1245,71 @@
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
+
    "node_modules/parent-module": {
+
      "version": "1.0.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "callsites": "^3.0.0"
+
      },
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
+
    "node_modules/path-is-absolute": {
+
      "version": "1.0.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=0.10.0"
+
      }
+
    },
+
    "node_modules/path-key": {
+
      "version": "3.1.1",
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
+
    "node_modules/picomatch": {
+
      "version": "2.2.3",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=8.6"
+
      },
+
      "funding": {
+
        "url": "https://github.com/sponsors/jonschlinkert"
+
      }
+
    },
+
    "node_modules/readdirp": {
+
      "version": "3.5.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "picomatch": "^2.2.1"
+
      },
+
      "engines": {
+
        "node": ">=8.10.0"
+
      }
+
    },
    "node_modules/require-relative": {
      "version": "0.8.7",
-
      "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
-
      "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
-
      "dev": true
+
      "dev": true,
+
      "license": "MIT"
+
    },
+
    "node_modules/resolve-from": {
+
      "version": "4.0.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=4"
+
      }
    },
    "node_modules/rollup": {
      "version": "2.39.0",
-
      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.39.0.tgz",
-
      "integrity": "sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw==",
      "dev": true,
+
      "license": "MIT",
      "bin": {
        "rollup": "dist/bin/rollup"
      },
@@ -948,9 +1322,8 @@
    },
    "node_modules/rollup-plugin-svelte": {
      "version": "7.1.0",
-
      "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz",
-
      "integrity": "sha512-vopCUq3G+25sKjwF5VilIbiY6KCuMNHP1PFvx2Vr3REBNMDllKHFZN2B9jwwC+MqNc3UPKkjXnceLPEjTjXGXg==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "require-relative": "^0.8.7",
        "rollup-pluginutils": "^2.8.2"
@@ -965,23 +1338,41 @@
    },
    "node_modules/rollup-pluginutils": {
      "version": "2.8.2",
-
      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
-
      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "estree-walker": "^0.6.1"
      }
    },
    "node_modules/scrypt-js": {
      "version": "3.0.1",
-
      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
-
      "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+
      "license": "MIT"
+
    },
+
    "node_modules/shebang-command": {
+
      "version": "2.0.0",
+
      "license": "MIT",
+
      "dependencies": {
+
        "shebang-regex": "^3.0.0"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
+
    "node_modules/shebang-regex": {
+
      "version": "3.0.0",
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
+
    "node_modules/signal-exit": {
+
      "version": "3.0.3",
+
      "license": "ISC"
    },
    "node_modules/snowpack": {
      "version": "3.0.11",
-
      "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.0.11.tgz",
-
      "integrity": "sha512-lBxgkvWTgdg0szE31JUt01wQkA9Lnmm+6lxqeV9rxDfflpx7ASnldVHFvu7Se70QJmPTQB0UJjfKI+xmYGwiiQ==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "esbuild": "^0.8.7",
        "open": "^7.0.4",
@@ -998,11 +1389,25 @@
        "fsevents": "^2.2.0"
      }
    },
+
    "node_modules/source-map": {
+
      "version": "0.7.3",
+
      "dev": true,
+
      "license": "BSD-3-Clause",
+
      "engines": {
+
        "node": ">= 8"
+
      }
+
    },
+
    "node_modules/strip-final-newline": {
+
      "version": "2.0.0",
+
      "license": "MIT",
+
      "engines": {
+
        "node": ">=6"
+
      }
+
    },
    "node_modules/strip-indent": {
      "version": "3.0.0",
-
      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
-
      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "min-indent": "^1.0.0"
      },
@@ -1010,29 +1415,59 @@
        "node": ">=8"
      }
    },
+
    "node_modules/supports-color": {
+
      "version": "7.2.0",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "has-flag": "^4.0.0"
+
      },
+
      "engines": {
+
        "node": ">=8"
+
      }
+
    },
    "node_modules/svelte": {
      "version": "3.32.3",
-
      "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.32.3.tgz",
-
      "integrity": "sha512-5etu/wDwtewhnYO/631KKTjSmFrKohFLWNm1sWErVHXqGZ8eJLqrW0qivDSyYTcN8GbUqsR4LkIhftNFsjNehg==",
+
      "license": "MIT",
      "engines": {
        "node": ">= 8"
      }
    },
+
    "node_modules/svelte-check": {
+
      "version": "1.5.2",
+
      "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-1.5.2.tgz",
+
      "integrity": "sha512-x9Pc13r814TKrMXY70IyqDEmPzuFiqNSpBmsrMKrFpi995MiG+lmqYnyw8iQC+DGh7H3eUt3LIFXbNd396XIFw==",
+
      "dev": true,
+
      "dependencies": {
+
        "chalk": "^4.0.0",
+
        "chokidar": "^3.4.1",
+
        "glob": "^7.1.6",
+
        "import-fresh": "^3.2.1",
+
        "minimist": "^1.2.5",
+
        "source-map": "^0.7.3",
+
        "svelte-preprocess": "^4.0.0",
+
        "typescript": "*"
+
      },
+
      "bin": {
+
        "svelte-check": "bin/svelte-check"
+
      },
+
      "peerDependencies": {
+
        "svelte": "^3.24.0"
+
      }
+
    },
    "node_modules/svelte-hmr": {
      "version": "0.12.6",
-
      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.12.6.tgz",
-
      "integrity": "sha512-q08BjoUSbwXpKo9ij6aym93jBrt7K8eutLwix5Y9cuSFLS5djxumOoUVsSzDkdKssLlg5X//Kg/0MWHHBeQRTg==",
      "dev": true,
+
      "license": "ISC",
      "peerDependencies": {
        "svelte": ">=3.19.0"
      }
    },
    "node_modules/svelte-preprocess": {
-
      "version": "4.6.9",
-
      "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.6.9.tgz",
-
      "integrity": "sha512-SROWH0rB0DJ+0Ii264cprmNu/NJyZacs5wFD71ya93Cg/oA2lKHgQm4F6j0EWA4ktFMzeuJJm/eX6fka39hEHA==",
+
      "version": "4.7.2",
      "dev": true,
      "hasInstallScript": true,
+
      "license": "MIT",
      "dependencies": {
        "@types/pug": "^2.0.4",
        "@types/sass": "^1.16.0",
@@ -1093,16 +1528,54 @@
    },
    "node_modules/svelte-routing": {
      "version": "1.5.0",
-
      "resolved": "https://registry.npmjs.org/svelte-routing/-/svelte-routing-1.5.0.tgz",
-
      "integrity": "sha512-4ftcSO2x5kzCUWQKm9Td6/C+t7lRjMEo72utRO0liS/aWZuRwAXOBl3y+hWZw8tV+DTGElqaAAyi44AuWXcVBg==",
+
      "license": "MIT",
      "peerDependencies": {
        "svelte": "^3.20.x"
      }
    },
+
    "node_modules/to-regex-range": {
+
      "version": "5.0.1",
+
      "dev": true,
+
      "license": "MIT",
+
      "dependencies": {
+
        "is-number": "^7.0.0"
+
      },
+
      "engines": {
+
        "node": ">=8.0"
+
      }
+
    },
+
    "node_modules/typescript": {
+
      "version": "4.2.4",
+
      "license": "Apache-2.0",
+
      "bin": {
+
        "tsc": "bin/tsc",
+
        "tsserver": "bin/tsserver"
+
      },
+
      "engines": {
+
        "node": ">=4.2.0"
+
      }
+
    },
+
    "node_modules/which": {
+
      "version": "2.0.2",
+
      "license": "ISC",
+
      "dependencies": {
+
        "isexe": "^2.0.0"
+
      },
+
      "bin": {
+
        "node-which": "bin/node-which"
+
      },
+
      "engines": {
+
        "node": ">= 8"
+
      }
+
    },
+
    "node_modules/wrappy": {
+
      "version": "1.0.2",
+
      "dev": true,
+
      "license": "ISC"
+
    },
    "node_modules/ws": {
      "version": "7.2.3",
-
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
-
      "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==",
+
      "license": "MIT",
      "engines": {
        "node": ">=8.3.0"
      },
@@ -1123,8 +1596,6 @@
  "dependencies": {
    "@ethersproject/abi": {
      "version": "5.0.12",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.12.tgz",
-
      "integrity": "sha512-Ujr/3bwyYYjXLDQfebeiiTuvOw9XtUKM8av6YkoBeMXyGQM9GkjrQlwJMNwGTmqjATH/ZNbRgCh98GjOLiIB1Q==",
      "requires": {
        "@ethersproject/address": "^5.0.9",
        "@ethersproject/bignumber": "^5.0.13",
@@ -1139,8 +1610,6 @@
    },
    "@ethersproject/abstract-provider": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.9.tgz",
-
      "integrity": "sha512-X9fMkqpeu9ayC3JyBkeeZhn35P4xQkpGX/l+FrxDtEW9tybf/UWXSMi8bGThpPtfJ6q6U2LDetXSpSwK4TfYQQ==",
      "requires": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/bytes": "^5.0.9",
@@ -1153,8 +1622,6 @@
    },
    "@ethersproject/abstract-signer": {
      "version": "5.0.13",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.13.tgz",
-
      "integrity": "sha512-VBIZEI5OK0TURoCYyw0t3w+TEO4kdwnI9wvt4kqUwyxSn3YCRpXYVl0Xoe7XBR/e5+nYOi2MyFGJ3tsFwONecQ==",
      "requires": {
        "@ethersproject/abstract-provider": "^5.0.8",
        "@ethersproject/bignumber": "^5.0.13",
@@ -1165,8 +1632,6 @@
    },
    "@ethersproject/address": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.10.tgz",
-
      "integrity": "sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw==",
      "requires": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/bytes": "^5.0.9",
@@ -1177,16 +1642,12 @@
    },
    "@ethersproject/base64": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.8.tgz",
-
      "integrity": "sha512-PNbpHOMgZpZ1skvQl119pV2YkCPXmZTxw+T92qX0z7zaMFPypXWTZBzim+hUceb//zx4DFjeGT4aSjZRTOYThg==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9"
      }
    },
    "@ethersproject/basex": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.0.8.tgz",
-
      "integrity": "sha512-PCVKZIShBQUqAXjJSvaCidThPvL0jaaQZcewJc0sf8Xx05BizaOS8r3jdPdpNdY+/qZtRDqwHTSKjvR/xssyLQ==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/properties": "^5.0.7"
@@ -1194,8 +1655,6 @@
    },
    "@ethersproject/bignumber": {
      "version": "5.0.14",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.14.tgz",
-
      "integrity": "sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8",
@@ -1204,24 +1663,18 @@
    },
    "@ethersproject/bytes": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz",
-
      "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==",
      "requires": {
        "@ethersproject/logger": "^5.0.8"
      }
    },
    "@ethersproject/constants": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.9.tgz",
-
      "integrity": "sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg==",
      "requires": {
        "@ethersproject/bignumber": "^5.0.13"
      }
    },
    "@ethersproject/contracts": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.0.11.tgz",
-
      "integrity": "sha512-FTUUd/6x00dYL2VufE2VowZ7h3mAyBfCQMGwI3tKDIWka+C0CunllFiKrlYCdiHFuVeMotR65dIcnzbLn72MCw==",
      "requires": {
        "@ethersproject/abi": "^5.0.10",
        "@ethersproject/abstract-provider": "^5.0.8",
@@ -1236,8 +1689,6 @@
    },
    "@ethersproject/hash": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.11.tgz",
-
      "integrity": "sha512-H3KJ9fk33XWJ2djAW03IL7fg3DsDMYjO1XijiUb1hJ85vYfhvxu0OmsU7d3tg2Uv1H1kFSo8ghr3WFQ8c+NL3g==",
      "requires": {
        "@ethersproject/abstract-signer": "^5.0.10",
        "@ethersproject/address": "^5.0.9",
@@ -1251,8 +1702,6 @@
    },
    "@ethersproject/hdnode": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.0.9.tgz",
-
      "integrity": "sha512-S5UMmIC6XfFtqhUK4uTjD8GPNzSbE+sZ/0VMqFnA3zAJ+cEFZuEyhZDYnl2ItGJzjT4jsy+uEy1SIl3baYK1PQ==",
      "requires": {
        "@ethersproject/abstract-signer": "^5.0.10",
        "@ethersproject/basex": "^5.0.7",
@@ -1270,8 +1719,6 @@
    },
    "@ethersproject/json-wallets": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.0.11.tgz",
-
      "integrity": "sha512-0GhWScWUlXXb4qJNp0wmkU95QS3YdN9UMOfMSEl76CRANWWrmyzxcBVSXSBu5iQ0/W8wO+xGlJJ3tpA6v3mbIw==",
      "requires": {
        "@ethersproject/abstract-signer": "^5.0.10",
        "@ethersproject/address": "^5.0.9",
@@ -1290,30 +1737,22 @@
    },
    "@ethersproject/keccak256": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.8.tgz",
-
      "integrity": "sha512-zoGbwXcWWs9MX4NOAZ7N0hhgIRl4Q/IO/u9c/RHRY4WqDy3Ywm0OLamEV53QDwhjwn3YiiVwU1Ve5j7yJ0a/KQ==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "js-sha3": "0.5.7"
      }
    },
    "@ethersproject/logger": {
-
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz",
-
      "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw=="
+
      "version": "5.0.9"
    },
    "@ethersproject/networks": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.8.tgz",
-
      "integrity": "sha512-PYpptlO2Tu5f/JEBI5hdlMds5k1DY1QwVbh3LKPb3un9dQA2bC51vd2/gRWAgSBpF3kkmZOj4FhD7ATLX4H+DA==",
      "requires": {
        "@ethersproject/logger": "^5.0.8"
      }
    },
    "@ethersproject/pbkdf2": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.0.8.tgz",
-
      "integrity": "sha512-UlmAMGbIPaS2xXsI38FbePVTfJMuU9jnwcqVn3p88HxPF4kD897ha+l3TNsBqJqf32UbQL5GImnf1oJkSKq4vQ==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/sha2": "^5.0.7"
@@ -1321,16 +1760,12 @@
    },
    "@ethersproject/properties": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz",
-
      "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==",
      "requires": {
        "@ethersproject/logger": "^5.0.8"
      }
    },
    "@ethersproject/providers": {
      "version": "5.0.23",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.0.23.tgz",
-
      "integrity": "sha512-eJ94z2tgPaUgUmxwd3BVkIzkgkbNIkY6wRPVas04LVaBTycObQbgj794aaUu2bfk7+Bn2B/gjUZtJW1ybxh9/A==",
      "requires": {
        "@ethersproject/abstract-provider": "^5.0.8",
        "@ethersproject/abstract-signer": "^5.0.10",
@@ -1355,8 +1790,6 @@
    },
    "@ethersproject/random": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.0.8.tgz",
-
      "integrity": "sha512-4rHtotmd9NjklW0eDvByicEkL+qareIyFSbG1ShC8tPJJSAC0g55oQWzw+3nfdRCgBHRuEE7S8EcPcTVPvZ9cA==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8"
@@ -1364,8 +1797,6 @@
    },
    "@ethersproject/rlp": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.8.tgz",
-
      "integrity": "sha512-E4wdFs8xRNJfzNHmnkC8w5fPeT4Wd1U2cust3YeT16/46iSkLT8nn8ilidC6KhR7hfuSZE4UqSPzyk76p7cdZg==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8"
@@ -1373,8 +1804,6 @@
    },
    "@ethersproject/sha2": {
      "version": "5.0.8",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.0.8.tgz",
-
      "integrity": "sha512-ILP1ZgyvDj4rrdE+AXrTv9V88m7x87uga2VZ/FeULKPumOEw/4bGnJz/oQ8zDnDvVYRCJ+48VaQBS2CFLbk1ww==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8",
@@ -1383,8 +1812,6 @@
    },
    "@ethersproject/signing-key": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.10.tgz",
-
      "integrity": "sha512-w5it3GbFOvN6e0mTd5gDNj+bwSe6L9jqqYjU+uaYS8/hAEp4qYLk5p8ZjbJJkNn7u1p0iwocp8X9oH/OdK8apA==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/logger": "^5.0.8",
@@ -1394,8 +1821,6 @@
    },
    "@ethersproject/solidity": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.0.9.tgz",
-
      "integrity": "sha512-LIxSAYEQgLRXE3mRPCq39ou61kqP8fDrGqEeNcaNJS3aLbmAOS8MZp56uK++WsdI9hj8sNsFh78hrAa6zR9Jag==",
      "requires": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/bytes": "^5.0.9",
@@ -1406,8 +1831,6 @@
    },
    "@ethersproject/strings": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.9.tgz",
-
      "integrity": "sha512-ogxBpcUpdO524CYs841MoJHgHxEPUy0bJFDS4Ezg8My+WYVMfVAOlZSLss0Rurbeeam8CpUVDzM4zUn09SU66Q==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/constants": "^5.0.8",
@@ -1416,8 +1839,6 @@
    },
    "@ethersproject/transactions": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.10.tgz",
-
      "integrity": "sha512-Tqpp+vKYQyQdJQQk4M73tDzO7ODf2D42/sJOcKlDAAbdSni13v6a+31hUdo02qYXhVYwIs+ZjHnO4zKv5BNk8w==",
      "requires": {
        "@ethersproject/address": "^5.0.9",
        "@ethersproject/bignumber": "^5.0.13",
@@ -1432,8 +1853,6 @@
    },
    "@ethersproject/units": {
      "version": "5.0.10",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.0.10.tgz",
-
      "integrity": "sha512-eaiHi9ham5lbC7qpqxpae7OY/nHJUnRUnFFuEwi2VB5Nwe3Np468OAV+e+HR+jAK4fHXQE6PFBTxWGtnZuO37g==",
      "requires": {
        "@ethersproject/bignumber": "^5.0.13",
        "@ethersproject/constants": "^5.0.8",
@@ -1442,8 +1861,6 @@
    },
    "@ethersproject/wallet": {
      "version": "5.0.11",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.0.11.tgz",
-
      "integrity": "sha512-2Fg/DOvUltR7aZTOyWWlQhru+SKvq2UE3uEhXSyCFgMqDQNuc2nHXh1SHJtN65jsEbjVIppOe1Q7EQMvhmeeRw==",
      "requires": {
        "@ethersproject/abstract-provider": "^5.0.8",
        "@ethersproject/abstract-signer": "^5.0.10",
@@ -1464,8 +1881,6 @@
    },
    "@ethersproject/web": {
      "version": "5.0.13",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.13.tgz",
-
      "integrity": "sha512-G3x/Ns7pQm21ALnWLbdBI5XkW/jrsbXXffI9hKNPHqf59mTxHYtlNiSwxdoTSwCef3Hn7uvGZpaSgTyxs7IufQ==",
      "requires": {
        "@ethersproject/base64": "^5.0.7",
        "@ethersproject/bytes": "^5.0.9",
@@ -1476,8 +1891,6 @@
    },
    "@ethersproject/wordlists": {
      "version": "5.0.9",
-
      "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.0.9.tgz",
-
      "integrity": "sha512-Sn6MTjZkfbriod6GG6+p43W09HOXT4gwcDVNj0YoPYlo4Zq2Fk6b1CU9KUX3c6aI17PrgYb4qwZm5BMuORyqyQ==",
      "requires": {
        "@ethersproject/bytes": "^5.0.9",
        "@ethersproject/hash": "^5.0.10",
@@ -1488,8 +1901,6 @@
    },
    "@snowpack/plugin-svelte": {
      "version": "3.5.2",
-
      "resolved": "https://registry.npmjs.org/@snowpack/plugin-svelte/-/plugin-svelte-3.5.2.tgz",
-
      "integrity": "sha512-i7OhkIRNt1uJ/y3qpowlU7icjtSgFPIl/GjMmBxhtwoIqHAnowFLh1Ur5G6S36GCFo65ymClnYfEIM/2x1+wPQ==",
      "dev": true,
      "requires": {
        "rollup-plugin-svelte": "^7.0.0",
@@ -1497,57 +1908,137 @@
        "svelte-preprocess": "^4.6.0"
      }
    },
+
    "@snowpack/plugin-typescript": {
+
      "version": "1.2.1",
+
      "requires": {
+
        "execa": "^5.0.0",
+
        "npm-run-path": "^4.0.1"
+
      }
+
    },
+
    "@tsconfig/svelte": {
+
      "version": "1.0.10",
+
      "dev": true
+
    },
    "@types/node": {
      "version": "14.14.31",
-
      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz",
-
      "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==",
      "dev": true
    },
    "@types/pug": {
      "version": "2.0.4",
-
      "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz",
-
      "integrity": "sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=",
      "dev": true
    },
    "@types/sass": {
      "version": "1.16.0",
-
      "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz",
-
      "integrity": "sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==",
      "dev": true,
      "requires": {
        "@types/node": "*"
      }
    },
    "aes-js": {
-
      "version": "3.0.0",
-
      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
-
      "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
+
      "version": "3.0.0"
+
    },
+
    "ansi-styles": {
+
      "version": "4.3.0",
+
      "dev": true,
+
      "requires": {
+
        "color-convert": "^2.0.1"
+
      }
+
    },
+
    "anymatch": {
+
      "version": "3.1.2",
+
      "dev": true,
+
      "requires": {
+
        "normalize-path": "^3.0.0",
+
        "picomatch": "^2.0.4"
+
      }
+
    },
+
    "balanced-match": {
+
      "version": "1.0.2",
+
      "dev": true
    },
    "bech32": {
-
      "version": "1.1.4",
-
      "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
-
      "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
+
      "version": "1.1.4"
+
    },
+
    "binary-extensions": {
+
      "version": "2.2.0",
+
      "dev": true
    },
    "bn.js": {
-
      "version": "4.11.9",
-
      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-
      "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
+
      "version": "4.11.9"
+
    },
+
    "brace-expansion": {
+
      "version": "1.1.11",
+
      "dev": true,
+
      "requires": {
+
        "balanced-match": "^1.0.0",
+
        "concat-map": "0.0.1"
+
      }
+
    },
+
    "braces": {
+
      "version": "3.0.2",
+
      "dev": true,
+
      "requires": {
+
        "fill-range": "^7.0.1"
+
      }
    },
    "brorand": {
-
      "version": "1.1.0",
-
      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-
      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+
      "version": "1.1.0"
+
    },
+
    "callsites": {
+
      "version": "3.1.0",
+
      "dev": true
+
    },
+
    "chalk": {
+
      "version": "4.1.1",
+
      "dev": true,
+
      "requires": {
+
        "ansi-styles": "^4.1.0",
+
        "supports-color": "^7.1.0"
+
      }
+
    },
+
    "chokidar": {
+
      "version": "3.5.1",
+
      "dev": true,
+
      "requires": {
+
        "anymatch": "~3.1.1",
+
        "braces": "~3.0.2",
+
        "fsevents": "~2.3.1",
+
        "glob-parent": "~5.1.0",
+
        "is-binary-path": "~2.1.0",
+
        "is-glob": "~4.0.1",
+
        "normalize-path": "~3.0.0",
+
        "readdirp": "~3.5.0"
+
      }
+
    },
+
    "color-convert": {
+
      "version": "2.0.1",
+
      "dev": true,
+
      "requires": {
+
        "color-name": "~1.1.4"
+
      }
+
    },
+
    "color-name": {
+
      "version": "1.1.4",
+
      "dev": true
+
    },
+
    "concat-map": {
+
      "version": "0.0.1",
+
      "dev": true
+
    },
+
    "cross-spawn": {
+
      "version": "7.0.3",
+
      "requires": {
+
        "path-key": "^3.1.0",
+
        "shebang-command": "^2.0.0",
+
        "which": "^2.0.1"
+
      }
    },
    "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==",
      "dev": true
    },
    "elliptic": {
      "version": "6.5.4",
-
      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
-
      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
      "requires": {
        "bn.js": "^4.11.9",
        "brorand": "^1.1.0",
@@ -1560,20 +2051,14 @@
    },
    "esbuild": {
      "version": "0.8.50",
-
      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.50.tgz",
-
      "integrity": "sha512-oidFLXssA7IccYzkqLVZSqNJDwDq8Mh/vqvrW+3fPWM7iUiC5O2bCllhnO8+K9LlyL/2Z6n+WwRJAz9fqSIVRg==",
      "dev": true
    },
    "estree-walker": {
      "version": "0.6.1",
-
      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
-
      "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
      "dev": true
    },
    "ethers": {
      "version": "5.0.31",
-
      "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.31.tgz",
-
      "integrity": "sha512-zpq0YbNFLFn+t+ibS8UkVWFeK5w6rVMSvbSHrHAQslfazovLnQ/mc2gdN5+6P45/k8fPgHrfHrYvJ4XvyK/S1A==",
      "requires": {
        "@ethersproject/abi": "5.0.12",
        "@ethersproject/abstract-provider": "5.0.9",
@@ -1607,17 +2092,59 @@
        "@ethersproject/wordlists": "5.0.9"
      }
    },
-
    "fsevents": {
-
      "version": "2.3.2",
-
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-
      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+
    "execa": {
+
      "version": "5.0.0",
+
      "requires": {
+
        "cross-spawn": "^7.0.3",
+
        "get-stream": "^6.0.0",
+
        "human-signals": "^2.1.0",
+
        "is-stream": "^2.0.0",
+
        "merge-stream": "^2.0.0",
+
        "npm-run-path": "^4.0.1",
+
        "onetime": "^5.1.2",
+
        "signal-exit": "^3.0.3",
+
        "strip-final-newline": "^2.0.0"
+
      }
+
    },
+
    "fill-range": {
+
      "version": "7.0.1",
      "dev": true,
-
      "optional": true
+
      "requires": {
+
        "to-regex-range": "^5.0.1"
+
      }
+
    },
+
    "fs.realpath": {
+
      "version": "1.0.0",
+
      "dev": true
+
    },
+
    "get-stream": {
+
      "version": "6.0.1"
+
    },
+
    "glob": {
+
      "version": "7.1.6",
+
      "dev": true,
+
      "requires": {
+
        "fs.realpath": "^1.0.0",
+
        "inflight": "^1.0.4",
+
        "inherits": "2",
+
        "minimatch": "^3.0.4",
+
        "once": "^1.3.0",
+
        "path-is-absolute": "^1.0.0"
+
      }
+
    },
+
    "glob-parent": {
+
      "version": "5.1.2",
+
      "dev": true,
+
      "requires": {
+
        "is-glob": "^4.0.1"
+
      }
+
    },
+
    "has-flag": {
+
      "version": "4.0.0",
+
      "dev": true
    },
    "hash.js": {
      "version": "1.1.3",
-
      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
-
      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
      "requires": {
        "inherits": "^2.0.3",
        "minimalistic-assert": "^1.0.0"
@@ -1625,75 +2152,169 @@
    },
    "hmac-drbg": {
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-
      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
      "requires": {
        "hash.js": "^1.0.3",
        "minimalistic-assert": "^1.0.0",
        "minimalistic-crypto-utils": "^1.0.1"
      }
    },
+
    "human-signals": {
+
      "version": "2.1.0"
+
    },
+
    "import-fresh": {
+
      "version": "3.3.0",
+
      "dev": true,
+
      "requires": {
+
        "parent-module": "^1.0.0",
+
        "resolve-from": "^4.0.0"
+
      }
+
    },
+
    "inflight": {
+
      "version": "1.0.6",
+
      "dev": true,
+
      "requires": {
+
        "once": "^1.3.0",
+
        "wrappy": "1"
+
      }
+
    },
    "inherits": {
-
      "version": "2.0.4",
-
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+
      "version": "2.0.4"
+
    },
+
    "is-binary-path": {
+
      "version": "2.1.0",
+
      "dev": true,
+
      "requires": {
+
        "binary-extensions": "^2.0.0"
+
      }
    },
    "is-docker": {
      "version": "2.1.1",
-
      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
-
      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
      "dev": true
    },
+
    "is-extglob": {
+
      "version": "2.1.1",
+
      "dev": true
+
    },
+
    "is-glob": {
+
      "version": "4.0.1",
+
      "dev": true,
+
      "requires": {
+
        "is-extglob": "^2.1.1"
+
      }
+
    },
+
    "is-number": {
+
      "version": "7.0.0",
+
      "dev": true
+
    },
+
    "is-stream": {
+
      "version": "2.0.0"
+
    },
    "is-wsl": {
      "version": "2.2.0",
-
      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-
      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
      "dev": true,
      "requires": {
        "is-docker": "^2.0.0"
      }
    },
+
    "isexe": {
+
      "version": "2.0.0"
+
    },
    "js-sha3": {
-
      "version": "0.5.7",
-
      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
-
      "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
+
      "version": "0.5.7"
+
    },
+
    "merge-stream": {
+
      "version": "2.0.0"
+
    },
+
    "mimic-fn": {
+
      "version": "2.1.0"
    },
    "min-indent": {
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
-
      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
      "dev": true
    },
    "minimalistic-assert": {
-
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-
      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+
      "version": "1.0.1"
    },
    "minimalistic-crypto-utils": {
-
      "version": "1.0.1",
-
      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-
      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+
      "version": "1.0.1"
+
    },
+
    "minimatch": {
+
      "version": "3.0.4",
+
      "dev": true,
+
      "requires": {
+
        "brace-expansion": "^1.1.7"
+
      }
+
    },
+
    "minimist": {
+
      "version": "1.2.5",
+
      "dev": true
+
    },
+
    "normalize-path": {
+
      "version": "3.0.0",
+
      "dev": true
+
    },
+
    "npm-run-path": {
+
      "version": "4.0.1",
+
      "requires": {
+
        "path-key": "^3.0.0"
+
      }
+
    },
+
    "once": {
+
      "version": "1.4.0",
+
      "dev": true,
+
      "requires": {
+
        "wrappy": "1"
+
      }
+
    },
+
    "onetime": {
+
      "version": "5.1.2",
+
      "requires": {
+
        "mimic-fn": "^2.1.0"
+
      }
    },
    "open": {
      "version": "7.4.2",
-
      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
-
      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
      "dev": true,
      "requires": {
        "is-docker": "^2.0.0",
        "is-wsl": "^2.1.1"
      }
    },
+
    "parent-module": {
+
      "version": "1.0.1",
+
      "dev": true,
+
      "requires": {
+
        "callsites": "^3.0.0"
+
      }
+
    },
+
    "path-is-absolute": {
+
      "version": "1.0.1",
+
      "dev": true
+
    },
+
    "path-key": {
+
      "version": "3.1.1"
+
    },
+
    "picomatch": {
+
      "version": "2.2.3",
+
      "dev": true
+
    },
+
    "readdirp": {
+
      "version": "3.5.0",
+
      "dev": true,
+
      "requires": {
+
        "picomatch": "^2.2.1"
+
      }
+
    },
    "require-relative": {
      "version": "0.8.7",
-
      "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
-
      "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
+
      "dev": true
+
    },
+
    "resolve-from": {
+
      "version": "4.0.0",
      "dev": true
    },
    "rollup": {
      "version": "2.39.0",
-
      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.39.0.tgz",
-
      "integrity": "sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw==",
      "dev": true,
      "requires": {
        "fsevents": "~2.3.1"
@@ -1701,8 +2322,6 @@
    },
    "rollup-plugin-svelte": {
      "version": "7.1.0",
-
      "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz",
-
      "integrity": "sha512-vopCUq3G+25sKjwF5VilIbiY6KCuMNHP1PFvx2Vr3REBNMDllKHFZN2B9jwwC+MqNc3UPKkjXnceLPEjTjXGXg==",
      "dev": true,
      "requires": {
        "require-relative": "^0.8.7",
@@ -1711,22 +2330,28 @@
    },
    "rollup-pluginutils": {
      "version": "2.8.2",
-
      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
-
      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
      "dev": true,
      "requires": {
        "estree-walker": "^0.6.1"
      }
    },
    "scrypt-js": {
-
      "version": "3.0.1",
-
      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
-
      "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+
      "version": "3.0.1"
+
    },
+
    "shebang-command": {
+
      "version": "2.0.0",
+
      "requires": {
+
        "shebang-regex": "^3.0.0"
+
      }
+
    },
+
    "shebang-regex": {
+
      "version": "3.0.0"
+
    },
+
    "signal-exit": {
+
      "version": "3.0.3"
    },
    "snowpack": {
      "version": "3.0.11",
-
      "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.0.11.tgz",
-
      "integrity": "sha512-lBxgkvWTgdg0szE31JUt01wQkA9Lnmm+6lxqeV9rxDfflpx7ASnldVHFvu7Se70QJmPTQB0UJjfKI+xmYGwiiQ==",
      "dev": true,
      "requires": {
        "esbuild": "^0.8.7",
@@ -1735,31 +2360,53 @@
        "rollup": "^2.34.0"
      }
    },
+
    "source-map": {
+
      "version": "0.7.3",
+
      "dev": true
+
    },
+
    "strip-final-newline": {
+
      "version": "2.0.0"
+
    },
    "strip-indent": {
      "version": "3.0.0",
-
      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
-
      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
      "dev": true,
      "requires": {
        "min-indent": "^1.0.0"
      }
    },
+
    "supports-color": {
+
      "version": "7.2.0",
+
      "dev": true,
+
      "requires": {
+
        "has-flag": "^4.0.0"
+
      }
+
    },
    "svelte": {
-
      "version": "3.32.3",
-
      "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.32.3.tgz",
-
      "integrity": "sha512-5etu/wDwtewhnYO/631KKTjSmFrKohFLWNm1sWErVHXqGZ8eJLqrW0qivDSyYTcN8GbUqsR4LkIhftNFsjNehg=="
+
      "version": "3.32.3"
+
    },
+
    "svelte-check": {
+
      "version": "1.5.2",
+
      "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-1.5.2.tgz",
+
      "integrity": "sha512-x9Pc13r814TKrMXY70IyqDEmPzuFiqNSpBmsrMKrFpi995MiG+lmqYnyw8iQC+DGh7H3eUt3LIFXbNd396XIFw==",
+
      "dev": true,
+
      "requires": {
+
        "chalk": "^4.0.0",
+
        "chokidar": "^3.4.1",
+
        "glob": "^7.1.6",
+
        "import-fresh": "^3.2.1",
+
        "minimist": "^1.2.5",
+
        "source-map": "^0.7.3",
+
        "svelte-preprocess": "^4.0.0",
+
        "typescript": "*"
+
      }
    },
    "svelte-hmr": {
      "version": "0.12.6",
-
      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.12.6.tgz",
-
      "integrity": "sha512-q08BjoUSbwXpKo9ij6aym93jBrt7K8eutLwix5Y9cuSFLS5djxumOoUVsSzDkdKssLlg5X//Kg/0MWHHBeQRTg==",
      "dev": true,
      "requires": {}
    },
    "svelte-preprocess": {
-
      "version": "4.6.9",
-
      "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.6.9.tgz",
-
      "integrity": "sha512-SROWH0rB0DJ+0Ii264cprmNu/NJyZacs5wFD71ya93Cg/oA2lKHgQm4F6j0EWA4ktFMzeuJJm/eX6fka39hEHA==",
+
      "version": "4.7.2",
      "dev": true,
      "requires": {
        "@types/pug": "^2.0.4",
@@ -1770,14 +2417,30 @@
    },
    "svelte-routing": {
      "version": "1.5.0",
-
      "resolved": "https://registry.npmjs.org/svelte-routing/-/svelte-routing-1.5.0.tgz",
-
      "integrity": "sha512-4ftcSO2x5kzCUWQKm9Td6/C+t7lRjMEo72utRO0liS/aWZuRwAXOBl3y+hWZw8tV+DTGElqaAAyi44AuWXcVBg==",
      "requires": {}
    },
+
    "to-regex-range": {
+
      "version": "5.0.1",
+
      "dev": true,
+
      "requires": {
+
        "is-number": "^7.0.0"
+
      }
+
    },
+
    "typescript": {
+
      "version": "4.2.4"
+
    },
+
    "which": {
+
      "version": "2.0.2",
+
      "requires": {
+
        "isexe": "^2.0.0"
+
      }
+
    },
+
    "wrappy": {
+
      "version": "1.0.2",
+
      "dev": true
+
    },
    "ws": {
      "version": "7.2.3",
-
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
-
      "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==",
      "requires": {}
    }
  }
modified package.json
@@ -2,13 +2,19 @@
  "scripts": {
    "start": "snowpack dev",
    "build": "snowpack build",
+
    "check": "svelte-check",
    "test": "echo \"This template does not include a test runner by default.\" && exit 1"
  },
  "devDependencies": {
    "@snowpack/plugin-svelte": "^3.5.2",
-
    "snowpack": "^3.0.1"
+
    "@tsconfig/svelte": "^1.0.10",
+
    "snowpack": "^3.0.1",
+
    "svelte-check": "^1.5.2",
+
    "svelte-preprocess": "^4.7.2",
+
    "typescript": "^4.2.4"
  },
  "dependencies": {
+
    "@snowpack/plugin-typescript": "^1.2.1",
    "ethers": "^5.0.31",
    "svelte": "^3.32.3",
    "svelte-routing": "^1.5.0"
modified snowpack.config.js
@@ -8,7 +8,8 @@ module.exports = {
    '@app': './src',
  },
  plugins: [
-
    '@snowpack/plugin-svelte'
+
    '@snowpack/plugin-svelte',
+
    '@snowpack/plugin-typescript',
  ],
  routes: [
    /* Enable an SPA Fallback in development: */
modified src/App.svelte
@@ -1,10 +1,10 @@
-
<script lang="javascript">
+
<script lang="typescript">
  // TODO: Navigating directly to /vesting doesn't work.
  import { ethers } from 'ethers';
  import { get } from 'svelte/store';
  import { Router, Link, Route } from "svelte-routing";
-
  import { getConfig } from '@app/config.js';
-
  import { session } from '@app/session.js';
+
  import { getConfig } from '@app/config';
+
  import { session } from '@app/session';

  import Vesting from '@app/base/vesting/Vesting.svelte';
  import Register from '@app/base/register/Register.svelte';
@@ -16,16 +16,12 @@

  function handleKeydown(event) {
    if (event.key === 'Enter') {
-
      document.querySelector('button.primary').click();
+
      (document.querySelector('button.primary') as HTMLElement).click();
    }
  }
</script>

<style>
-
  main {
-
    padding-top: 2rem;
-
    align-self: center;
-
  }
  .wrapper {
    display: flex;
    align-items: center;
modified src/Connect.svelte
@@ -1,6 +1,6 @@
-
<script lang="javascript">
+
<script lang="typescript">
  import { derived } from "svelte/store";
-
  import { CONNECTION, session, connectWallet } from "./session.js";
+
  import { Connection, session, connectWallet } from "./session";

  export let caption = "Connect";
  export let className = "";
@@ -8,8 +8,8 @@

  let walletUnavailable = !window.ethereum;

-
  const connecting = derived(session, $s => {
-
    return $s.connection === CONNECTION.CONNECTING;
+
  const connecting = derived(session, ($s) => {
+
    return $s.connection === Connection.Connecting;
  });
</script>

modified src/Header.svelte
@@ -1,12 +1,12 @@
-
<script lang="javascript">
+
<script lang="typescript">
  // TODO: Shorten tx hash
  // TODO: Link to correct network on etherscan
  import { derived } from "svelte/store";
  import { ethers } from "ethers";
  import { link } from "svelte-routing";
  import { formatBalance } from "@app/utils";
-
  import { CONNECTION, session, connectWallet, disconnectWallet, shortAddress } from "./session.js";
-
  import { error, ERROR } from './error.js';
+
  import { session, disconnectWallet, shortAddress } from "./session";
+
  import { error, ERROR } from './error';
  import Logo from './Logo.svelte';
  import Connect from './Connect.svelte';

@@ -59,10 +59,6 @@
    margin-left: 2rem;
    width: 9.75rem;
  }
-
  .indicator {
-
    font-size: 0.5rem;
-
    margin-left: 0.5rem;
-
  }
</style>

{#if $error}
modified src/Logo.svelte
@@ -1,4 +1,4 @@
-
<script>
+
<script lang="typescript">
  export let style = "";
</script>

modified src/base/register/Register.svelte
@@ -1,16 +1,22 @@
-
<script lang="javascript">
-
  import { ethers } from 'ethers';
+
<script lang="typescript">
+
  import { onMount } from 'svelte';
  import { get } from 'svelte/store';
-
  import { error } from '@app/error.js';
-
  import { session } from '@app/session.js';
-
  import { registrar, registerName, registrationFee } from './registrar.js';
-
  import { STATE, state } from './state.js';
+
  import { ethers } from 'ethers';
+
  import { error } from '@app/error';
+
  import { session } from '@app/session';
+
  import { registrar, registerName, registrationFee } from './registrar';
+
  import { State, state } from './state';

  import RegisterButton from './RegisterButton.svelte';

  export let config;

  let subdomain = "";
+
  let input;
+

+
  onMount(() => {
+
    input.focus();
+
  });

  async function getFee(cfg) {
    let fee = await registrationFee(cfg);
@@ -25,8 +31,8 @@
  }
  input.subdomain {
    margin-right: 0;
-
    border-radius-top-right: 0;
-
    border-radius-bottom-right: 0;
+
    border-top-right-radius: 0;
+
    border-bottom-right-radius: 0;
    border-radius: var(--border-radius) 0 0 var(--border-radius);
    border-right: none;
  }
@@ -77,13 +83,10 @@
    border: 1px solid var(--color-secondary);
    border-left: none;
  }
-
  .register {
-
    margin: 1rem;
-
  }
</style>

<main>
-
  {#if $state === STATE.IDLE  || $state === STATE.CHECKING_AVAILABILITY}
+
  {#if $state === State.Idle  || $state === State.CheckingAvailability}
    <div class="input-caption">
      Register a <strong>radicle.eth</strong> name
    </div>
@@ -91,11 +94,12 @@
      <span class="name">
        <div>
          <input
-
            autofocus
+
            bind:this={input}
+
            bind:value={subdomain}
            placeholder=""
            class="subdomain"
-
            disabled={$state === STATE.CHECKING_AVAILABILITY}
-
            type="text" bind:value={subdomain}
+
            disabled={$state === State.CheckingAvailability}
+
            type="text"
          />
          <span class="root">.radicle.eth</span>
        </div>
@@ -107,11 +111,11 @@
      <div class="modal-title">
        {subdomain}.radicle.eth
      </div>
-
      {#if $state === STATE.REGISTERED}
+
      {#if $state === State.Registered}
        <div class="available">The name <span class="domain">{subdomain}</span> has been successfully registered to {$session.address}.</div>
-
      {:else if $state === STATE.NAME_AVAILABLE}
+
      {:else if $state === State.NameAvailable}
        <div class="available">The name <span class="domain">{subdomain}</span> is available for registration.</div>
-
      {:else if $state === STATE.APPROVING}
+
      {:else if $state === State.Approving}
        <div class="available">
          Approving Radicle for {#await getFee(config)}
            ?
@@ -119,7 +123,7 @@
            {fee}
          {/await} <strong>RAD</strong>...
        </div>
-
      {:else if $state == STATE.NAME_UNAVAILABLE}
+
      {:else if $state == State.NameUnavailable}
        <div class="available">The name <span class="domain">{subdomain}</span> is not available for registration.</div>
      {/if}
      <div class="modal-actions">
modified src/base/register/RegisterButton.svelte
@@ -1,9 +1,9 @@
-
<script lang="javascript">
+
<script lang="typescript">
  import { get } from 'svelte/store';
-
  import { error } from '@app/error.js';
-
  import { session } from '@app/session.js';
-
  import { STATE, state } from './state.js';
-
  import { registrar, registerName } from './registrar.js';
+
  import { error } from '@app/error';
+
  import { session } from '@app/session';
+
  import { State, state } from './state';
+
  import { registrar, registerName } from './registrar';

  import Connect from '@app/Connect.svelte';

@@ -27,16 +27,16 @@
  async function checkAvailability() {
    registrar(config).available(subdomain).then(isAvailable => {
      if (isAvailable) {
-
        state.set(STATE.NAME_AVAILABLE);
+
        state.set(State.NameAvailable);
      } else {
-
        state.set(STATE.NAME_UNAVAILABLE);
+
        state.set(State.NameUnavailable);
      }
    });
-
    state.set(STATE.CHECKING_AVAILABILITY);
+
    state.set(State.CheckingAvailability);
  }

  function cancel() {
-
    state.set(STATE.IDLE);
+
    state.set(State.Idle);
    error.set(null);
  }
</script>
@@ -47,16 +47,16 @@
  }
</style>

-
{#if $state >= STATE.NAME_AVAILABLE && $state < STATE.REGISTERED}
+
{#if $state >= State.NameAvailable && $state < State.Registered}
  {#if $session.address}
-
    <button on:click={register} disabled={$state > STATE.NAME_AVAILABLE} class="primary register">
-
      {#if $state === STATE.APPROVING}
+
    <button on:click={register} disabled={$state > State.NameAvailable} class="primary register">
+
      {#if $state === State.Approving}
        Approving...
-
      {:else if $state === STATE.COMMITTING}
+
      {:else if $state === State.Committing}
        Committing...
-
      {:else if $state === STATE.WAITING_TO_REGISTER}
+
      {:else if $state === State.WaitingToRegister}
        Waiting...
-
      {:else if $state === STATE.REGISTERING}
+
      {:else if $state === State.Registering}
        Registering...
      {:else}
        Begin registration &rarr;
@@ -68,19 +68,19 @@
  <button on:click={cancel} class="cancel text">
    Cancel
  </button>
-
{:else if $state === STATE.REGISTERED}
-
  <button on:click={() => state.set(STATE.IDLE)}>
+
{:else if $state === State.Registered}
+
  <button on:click={() => state.set(State.Idle)}>
    Done
  </button>
-
{:else if $state === STATE.NAME_UNAVAILABLE}
-
  <button on:click={() => state.set(STATE.IDLE)}>
+
{:else if $state === State.NameUnavailable}
+
  <button on:click={() => state.set(State.Idle)}>
    Back
  </button>
{:else if subdomain == ""}
  <button disabled class="primary register">
    Check
  </button>
-
{:else if $state === STATE.CHECKING_AVAILABILITY}
+
{:else if $state === State.CheckingAvailability}
  <button disabled class="primary register" data-waiting>
    Check
  </button>
deleted src/base/register/registrar.js
@@ -1,112 +0,0 @@
-
// TODO: Show "look at your wallet" / "confirm tx" before state change.
-
// TODO: Two registration actions with same label
-
import { ethers } from "ethers";
-
import { STATE, state } from './state.js';
-
import { approveSpender, updateBalance } from '@app/session.js';
-
import { ERROR } from '@app/error.js';
-

-
const registrarAbi = [
-
  {"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"CommitmentMade","type":"event"},
-
  {"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},
-
  {"inputs":[],"name":"commitments","outputs":[{"internalType":"contract Commitments","name":"","type":"address"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[],"name":"minCommitmentAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[{"internalType":"bytes32","name":"parent","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"}],"name":"namehash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},
-
  {"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},
-
  {"inputs":[],"name":"registrationFeeRad","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
-
  {"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"valid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}
-
];
-

-
export function registrar(config) {
-
  return new ethers.Contract(config.registrar.address, registrarAbi, config.provider);
-
}
-

-
export async function registrationFee(config) {
-
  return await registrar(config).registrationFeeRad();
-
}
-

-
export async function registerName(name, owner, config) {
-
  if (! name) return;
-

-
  let commitmentJson = window.localStorage.getItem('commitment');
-
  let commitment = commitmentJson && JSON.parse(commitmentJson);
-

-
  // Try to recover an existing commitment.
-
  if (commitment && commitment.name === name && commitment.owner === owner) {
-
    await register(name, owner, commitment.salt, config);
-
  } else {
-
    await approveRegistrar(owner, config);
-
    await commitAndRegister(name, owner, config);
-
  }
-
}
-

-
async function approveRegistrar(owner, config) {
-
  state.set(STATE.APPROVING);
-

-
  const amount = await registrationFee(config);
-
  await approveSpender(config.registrar.address, amount, config);
-
}
-

-
async function commitAndRegister(name, owner, config) {
-
  let salt = ethers.utils.randomBytes(32);
-
  let minAge = (await registrar(config).minCommitmentAge()).toNumber();
-
  let fee = await registrationFee(config);
-

-
  await commit(makeCommitment(name, owner, salt), fee, minAge, config);
-
  // Save commitment in local storage in case the user refreshes or closes
-
  // the page.
-
  window.localStorage.setItem('commitment', JSON.stringify({
-
    name: name,
-
    owner: owner,
-
    salt: ethers.utils.hexlify(salt)
-
  }));
-

-
  await register(name, owner, salt, config);
-
}
-

-
async function commit(commitment, fee, minAge, config) {
-
  state.set(STATE.COMMITTING);
-

-
  const signer = config.provider.getSigner();
-
  const tx = await registrar(config)
-
    .connect(signer)
-
    .commit(commitment, { gasLimit: 150000 })
-
    .catch(e => console.error(e));
-

-
  await tx.wait(1);
-
  updateBalance(fee.mul(-1));
-

-
  // TODO: Getting "commitment too new"
-
  state.set(STATE.WAITING_TO_REGISTER);
-
  await tx.wait(minAge + 1);
-
}
-

-
async function register(name, owner, salt, config) {
-
  state.set(STATE.REGISTERING);
-

-
  const signer = config.provider.getSigner();
-
  const tx = await registrar(config).connect(signer).register(
-
    name, owner, ethers.BigNumber.from(salt), { gasLimit: 150000 }
-
  );
-
  console.log("Sent", tx);
-

-
  try {
-
    await tx.wait();
-
    window.localStorage.clear();
-
    state.set(STATE.REGISTERED);
-
  } catch (e) {
-
    throw { type: ERROR.TRANSACTION_FAILED, hash: tx.hash };
-
  }
-
}
-

-
function makeCommitment(name, owner, salt) {
-
  let bytes = ethers.utils.concat([
-
    ethers.utils.toUtf8Bytes(name),
-
    ethers.utils.getAddress(owner),
-
    ethers.BigNumber.from(salt),
-
  ]);
-
  return ethers.utils.keccak256(bytes);
-
}
added src/base/register/registrar.ts
@@ -0,0 +1,112 @@
+
// TODO: Show "look at your wallet" / "confirm tx" before state change.
+
// TODO: Two registration actions with same label
+
import { ethers } from "ethers";
+
import { State, state } from './state';
+
import { approveSpender, updateBalance } from '@app/session';
+
import { ERROR } from '@app/error';
+

+
const registrarAbi = [
+
  {"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"CommitmentMade","type":"event"},
+
  {"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},
+
  {"inputs":[],"name":"commitments","outputs":[{"internalType":"contract Commitments","name":"","type":"address"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[],"name":"minCommitmentAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[{"internalType":"bytes32","name":"parent","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"}],"name":"namehash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},
+
  {"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},
+
  {"inputs":[],"name":"registrationFeeRad","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
+
  {"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"valid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}
+
];
+

+
export function registrar(config) {
+
  return new ethers.Contract(config.registrar.address, registrarAbi, config.provider);
+
}
+

+
export async function registrationFee(config) {
+
  return await registrar(config).registrationFeeRad();
+
}
+

+
export async function registerName(name, owner, config) {
+
  if (! name) return;
+

+
  let commitmentJson = window.localStorage.getItem('commitment');
+
  let commitment = commitmentJson && JSON.parse(commitmentJson);
+

+
  // Try to recover an existing commitment.
+
  if (commitment && commitment.name === name && commitment.owner === owner) {
+
    await register(name, owner, commitment.salt, config);
+
  } else {
+
    await approveRegistrar(owner, config);
+
    await commitAndRegister(name, owner, config);
+
  }
+
}
+

+
async function approveRegistrar(owner, config) {
+
  state.set(State.Approving);
+

+
  const amount = await registrationFee(config);
+
  await approveSpender(config.registrar.address, amount, config);
+
}
+

+
async function commitAndRegister(name, owner, config) {
+
  let salt = ethers.utils.randomBytes(32);
+
  let minAge = (await registrar(config).minCommitmentAge()).toNumber();
+
  let fee = await registrationFee(config);
+

+
  await commit(makeCommitment(name, owner, salt), fee, minAge, config);
+
  // Save commitment in local storage in case the user refreshes or closes
+
  // the page.
+
  window.localStorage.setItem('commitment', JSON.stringify({
+
    name: name,
+
    owner: owner,
+
    salt: ethers.utils.hexlify(salt)
+
  }));
+

+
  await register(name, owner, salt, config);
+
}
+

+
async function commit(commitment, fee, minAge, config) {
+
  state.set(State.Committing);
+

+
  const signer = config.provider.getSigner();
+
  const tx = await registrar(config)
+
    .connect(signer)
+
    .commit(commitment, { gasLimit: 150000 })
+
    .catch(e => console.error(e));
+

+
  await tx.wait(1);
+
  updateBalance(fee.mul(-1));
+

+
  // TODO: Getting "commitment too new"
+
  state.set(State.WaitingToRegister);
+
  await tx.wait(minAge + 1);
+
}
+

+
async function register(name, owner, salt, config) {
+
  state.set(State.Registering);
+

+
  const signer = config.provider.getSigner();
+
  const tx = await registrar(config).connect(signer).register(
+
    name, owner, ethers.BigNumber.from(salt), { gasLimit: 150000 }
+
  );
+
  console.log("Sent", tx);
+

+
  try {
+
    await tx.wait();
+
    window.localStorage.clear();
+
    state.set(State.Registered);
+
  } catch (e) {
+
    throw { type: ERROR.TRANSACTION_FAILED, hash: tx.hash };
+
  }
+
}
+

+
function makeCommitment(name, owner, salt) {
+
  let bytes = ethers.utils.concat([
+
    ethers.utils.toUtf8Bytes(name),
+
    ethers.utils.getAddress(owner),
+
    ethers.BigNumber.from(salt).toHexString(),
+
  ]);
+
  return ethers.utils.keccak256(bytes);
+
}
deleted src/base/register/state.js
@@ -1,16 +0,0 @@
-
import { derived, writable } from "svelte/store";
-

-
export const STATE = {
-
  ERROR: -1,
-
  IDLE: 0,
-
  CHECKING_AVAILABILITY: 1,
-
  NAME_UNAVAILABLE: 2,
-
  NAME_AVAILABLE: 3,
-
  APPROVING: 4,
-
  COMMITTING: 5,
-
  WAITING_TO_REGISTER: 6,
-
  REGISTERING: 7,
-
  REGISTERED: 8,
-
};
-

-
export const state = writable(STATE.IDLE);
added src/base/register/state.ts
@@ -0,0 +1,16 @@
+
import { derived, writable } from "svelte/store";
+

+
export enum State {
+
  Error = -1,
+
  Idle,
+
  CheckingAvailability,
+
  NameUnavailable,
+
  NameAvailable,
+
  Approving,
+
  Committing,
+
  WaitingToRegister,
+
  Registering,
+
  Registered,
+
}
+

+
export const state = writable(State.Idle);
modified src/base/vesting/Vesting.svelte
@@ -1,10 +1,17 @@
-
<script lang="javascript">
-
  import { ethers } from 'ethers';
+
<script lang="typescript">
+
  import { onMount } from 'svelte';
  import { get, derived, writable } from 'svelte/store';
+
  import { ethers } from 'ethers';
  import { session, shortAddress } from '@app/session.js';
  import { STATE, state } from './state.js';
  import { getInfo, withdrawVested } from './vesting.js';

+
  let input;
+

+
  onMount(() => {
+
    input.focus();
+
  });
+

  export let config = null;

  let contractAddress = "";
@@ -91,12 +98,13 @@
      <span class="name">
        <div>
          <input
-
            autofocus
            size="40"
            placeholder=""
            class="subdomain"
            disabled={$state === STATE.LOADING}
-
            type="text" bind:value={contractAddress}
+
            type="text"
+
            bind:this={input}
+
            bind:value={contractAddress}
          />
        </div>
      </span>
deleted src/config.js
@@ -1,46 +0,0 @@
-
import { ethers } from "ethers";
-

-
const config = {
-
  homestead: {
-
    registrar: {
-
      address: "0x37723287Ae6F34866d82EE623401f92Ec9013154",
-
    },
-
    radToken: {
-
      address: "0x31c8EAcBFFdD875c74b94b077895Bd78CF1E64A3",
-
    }
-
  },
-
  ropsten: {
-
    registrar: {
-
      address: "0xb31441c140E92Ca20A0141D68b13b10ca051e40a",
-
    },
-
    radToken: {
-
      address: "0x59b5eee36f5fa52400A136Fd4630Ee2bF126a4C0",
-
    }
-
  }
-
};
-

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

-
export async function getConfig() {
-
  if (isMetamaskInstalled()) {
-
    const provider = new ethers.providers.Web3Provider(window.ethereum);
-

-
    let network = await provider.ready;
-
    let cfg = config[network.name];
-

-
    if (cfg) {
-
      return {
-
        registrar: cfg.registrar,
-
        radToken: cfg.radToken,
-
        provider: provider,
-
      };
-
    } else {
-
      throw `Wrong network: ${network.name}`;
-
    }
-
  } else {
-
    throw "No provider available";
-
  }
-
}
added src/config.ts
@@ -0,0 +1,52 @@
+
import { ethers } from "ethers";
+

+
declare global {
+
  interface Window {
+
    ethereum: any;
+
  }
+
}
+

+
const config = {
+
  homestead: {
+
    registrar: {
+
      address: "0x37723287Ae6F34866d82EE623401f92Ec9013154",
+
    },
+
    radToken: {
+
      address: "0x31c8EAcBFFdD875c74b94b077895Bd78CF1E64A3",
+
    }
+
  },
+
  ropsten: {
+
    registrar: {
+
      address: "0xb31441c140E92Ca20A0141D68b13b10ca051e40a",
+
    },
+
    radToken: {
+
      address: "0x59b5eee36f5fa52400A136Fd4630Ee2bF126a4C0",
+
    }
+
  }
+
};
+

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

+
export async function getConfig() {
+
  if (isMetamaskInstalled()) {
+
    const provider = new ethers.providers.Web3Provider(window.ethereum);
+

+
    let network = await provider.ready;
+
    let cfg = config[network.name];
+

+
    if (cfg) {
+
      return {
+
        registrar: cfg.registrar,
+
        radToken: cfg.radToken,
+
        provider: provider,
+
      };
+
    } else {
+
      throw `Wrong network: ${network.name}`;
+
    }
+
  } else {
+
    throw "No provider available";
+
  }
+
}
deleted src/error.js
@@ -1,7 +0,0 @@
-
import { writable } from "svelte/store";
-

-
export const ERROR = {
-
  TRANSACTION_FAILED: 1,
-
};
-

-
export const error = writable(null);
added src/error.ts
@@ -0,0 +1,7 @@
+
import { writable } from "svelte/store";
+

+
export const ERROR = {
+
  TRANSACTION_FAILED: 1,
+
};
+

+
export const error = writable(null);
deleted src/session.js
@@ -1,101 +0,0 @@
-
import { get, writable } from "svelte/store";
-
import { ethers } from "ethers";
-
import { getConfig } from "./config.js";
-

-
export const CONNECTION = {
-
  DISCONNECTED: 0,
-
  CONNECTING: 1,
-
  CONNECTED: 2
-
};
-

-
export const session = writable({
-
  connection: CONNECTION.DISCONNECTED,
-
});
-

-
session.subscribe(s => {
-
  console.log("Session", s);
-
});
-

-
const tokenAbi = [
-
  "function balanceOf(address) view returns (uint256)",
-
  "function approve(address, uint256) returns (bool)",
-
  "function allowance(address, address) view returns (uint256)",
-
];
-

-
export async function connectWallet() {
-
  session.set({ connection: CONNECTION.CONNECTING });
-

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

-
  const config = await getConfig();
-

-
  const token = new ethers.Contract(config.radToken.address, tokenAbi, config.provider);
-
  const signer = config.provider.getSigner();
-

-
  let addr = await signer.getAddress();
-

-
  try {
-
    let tokenBalance = await token.balanceOf(addr);
-
    session.set({
-
      address: addr,
-
      tokenBalance: tokenBalance,
-
      connection: CONNECTION.CONNECTED
-
    });
-
  } catch (e) {
-
    console.error(e);
-
  }
-
}
-

-
export async function approveSpender(spender, amount, config) {
-
  const token = new ethers.Contract(config.radToken.address, tokenAbi, config.provider);
-
  const signer = config.provider.getSigner();
-
  const addr = await signer.getAddress();
-

-
  const allowance = await token.allowance(addr, spender);
-

-
  if (allowance < amount) {
-
    let tx = await token.connect(signer).approve(spender, amount);
-
    await tx.wait();
-
  }
-
}
-

-
export async function updateBalance(n) {
-
  session.update((s) => {
-
    s.tokenBalance = s.tokenBalance.add(n);
-
    return s;
-
  });
-
}
-

-
export async function refreshBalance(config) {
-
  const addr = get(session).address;
-

-
  if (addr) {
-
    try {
-
      const token = new ethers.Contract(config.radToken.address, tokenAbi, config.provider);
-
      const tokenBalance = await token.balanceOf(addr);
-
      console.log("new balance", tokenBalance);
-

-
      session.update((s) => {
-
        s.tokenBalance = tokenBalance;
-
        return s;
-
      });
-
    } catch (e) {
-
      console.error(e);
-
    }
-
  }
-
}
-

-
export function disconnectWallet() {
-
  location.reload();
-
}
-

-
export function shortAddress(addr) {
-
  return addr.substring(0, 6)
-
    + '...'
-
    + addr.substring(addr.length - 4, addr.length);
-
}
added src/session.ts
@@ -0,0 +1,107 @@
+
import { get, writable, Writable } from "svelte/store";
+
import { ethers } from "ethers";
+
import { getConfig } from "./config";
+

+
export enum Connection {
+
  Disconnected,
+
  Connecting,
+
  Connected
+
}
+

+
export type Session = {
+
  connection: Connection
+
  address?: string
+
  tokenBalance?: any
+
};
+

+
export const session: Writable<Session> = writable({
+
  connection: Connection.Disconnected,
+
});
+

+
session.subscribe(s => {
+
  console.log("Session", s);
+
});
+

+
const tokenAbi = [
+
  "function balanceOf(address) view returns (uint256)",
+
  "function approve(address, uint256) returns (bool)",
+
  "function allowance(address, address) view returns (uint256)",
+
];
+

+
export async function connectWallet() {
+
  session.set({ connection: Connection.Connecting });
+

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

+
  const config = await getConfig();
+

+
  const token = new ethers.Contract(config.radToken.address, tokenAbi, config.provider);
+
  const signer = config.provider.getSigner();
+

+
  let addr = await signer.getAddress();
+

+
  try {
+
    let tokenBalance = await token.balanceOf(addr);
+
    session.set({
+
      address: addr,
+
      tokenBalance: tokenBalance,
+
      connection: Connection.Connected
+
    });
+
  } catch (e) {
+
    console.error(e);
+
  }
+
}
+

+
export async function approveSpender(spender, amount, config) {
+
  const token = new ethers.Contract(config.radToken.address, tokenAbi, config.provider);
+
  const signer = config.provider.getSigner();
+
  const addr = await signer.getAddress();
+

+
  const allowance = await token.allowance(addr, spender);
+

+
  if (allowance < amount) {
+
    let tx = await token.connect(signer).approve(spender, amount);
+
    await tx.wait();
+
  }
+
}
+

+
export async function updateBalance(n) {
+
  session.update((s) => {
+
    s.tokenBalance = s.tokenBalance.add(n);
+
    return s;
+
  });
+
}
+

+
export async function refreshBalance(config) {
+
  const addr = get(session).address;
+

+
  if (addr) {
+
    try {
+
      const token = new ethers.Contract(config.radToken.address, tokenAbi, config.provider);
+
      const tokenBalance = await token.balanceOf(addr);
+
      console.log("new balance", tokenBalance);
+

+
      session.update((s) => {
+
        s.tokenBalance = tokenBalance;
+
        return s;
+
      });
+
    } catch (e) {
+
      console.error(e);
+
    }
+
  }
+
}
+

+
export function disconnectWallet() {
+
  location.reload();
+
}
+

+
export function shortAddress(addr) {
+
  return addr.substring(0, 6)
+
    + '...'
+
    + addr.substring(addr.length - 4, addr.length);
+
}
deleted src/utils.js
@@ -1,5 +0,0 @@
-
import { ethers } from "ethers";
-

-
export function formatBalance(n) {
-
  return ethers.utils.commify(parseFloat(ethers.utils.formatUnits(n)).toFixed(2));
-
}
added src/utils.ts
@@ -0,0 +1,5 @@
+
import { ethers } from "ethers";
+

+
export function formatBalance(n) {
+
  return ethers.utils.commify(parseFloat(ethers.utils.formatUnits(n)).toFixed(2));
+
}
added svelte.config.js
@@ -0,0 +1,9 @@
+
const autoPreprocess = require('svelte-preprocess');
+

+
module.exports = {
+
  preprocess: autoPreprocess({
+
    defaults: {
+
      script: 'typescript',
+
    },
+
  }),
+
};
added tsconfig.json
@@ -0,0 +1,23 @@
+
{
+
  "extends": "@tsconfig/svelte/tsconfig.json",
+
  "include": [
+
    "src",
+
    "types"
+
  ],
+
  "exclude": [
+
    "node_modules/*"
+
  ],
+
  "compilerOptions": {
+
    "target": "es2019",
+
    "types": [
+
      "svelte"
+
    ],
+
    "moduleResolution": "node",
+
    "paths": {
+
      "@app/*": ["./src/*"]
+
    }
+
  },
+
  "strict": true,
+
  "skipLibCheck": true,
+
  "allowSyntheticDefaultImports": true
+
}