diff --git a/package-lock.json b/package-lock.json index 7390f73..69b77d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3069,677 +3069,6 @@ "node": ">=14" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, "node_modules/@foundry-rs/easy-foundryup": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@foundry-rs/easy-foundryup/-/easy-foundryup-0.1.3.tgz", @@ -6018,36 +5347,6 @@ "node": ">=14" } }, - "node_modules/@synthetixio/synpress/node_modules/@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==", - "dev": true - }, - "node_modules/@synthetixio/synpress/node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@synthetixio/synpress/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true - }, - "node_modules/@synthetixio/synpress/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true - }, "node_modules/@synthetixio/synpress/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -6057,34 +5356,6 @@ "node": ">=14" } }, - "node_modules/@synthetixio/synpress/node_modules/ethers": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.3.tgz", - "integrity": "sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@synthetixio/synpress/node_modules/get-port": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", @@ -6097,33 +5368,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@synthetixio/synpress/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@synthetixio/synpress/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@testing-library/cypress": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-9.0.0.tgz", @@ -6319,12 +5563,12 @@ } }, "node_modules/@topos-protocol/topos-smart-contracts": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@topos-protocol/topos-smart-contracts/-/topos-smart-contracts-3.0.0.tgz", - "integrity": "sha512-ABDny/flDSRzfZntdxeV3ZZWBO1s7amI1+3pxHYBdQ4EhvD5FJzlv8Go1QYbYrUf2q+vW1p+soY7+T9KDFE1QA==", + "version": "3.1.0-rc2", + "resolved": "https://registry.npmjs.org/@topos-protocol/topos-smart-contracts/-/topos-smart-contracts-3.1.0-rc2.tgz", + "integrity": "sha512-3839jo+jVMkwxgnlHFSduI78B5YzVDN+CCCd09lcxCrISsrRQJdmbsAlLYTWAc8TPwY/76HuKAP6KIGGw3g8bg==", "dependencies": { "@openzeppelin/contracts": "^4.8.3", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "solidity-rlp": "2.0.7" } }, @@ -7765,9 +7009,9 @@ } }, "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "node_modules/agent-base": { "version": "6.0.2", @@ -8602,11 +7846,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -8662,11 +7901,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -8749,11 +7983,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, "node_modules/browserslist": { "version": "4.21.9", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", @@ -10861,25 +10090,6 @@ "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", "dev": true }, - "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==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/email-addresses": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", @@ -11672,13 +10882,13 @@ } }, "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.1.tgz", + "integrity": "sha512-kuV8fGd4/8Gj7wkurbsuUsm1DCG6N5gKGYdw3fnWG/7QGknhy1xtHD7kbkCWQAcbAYmzLCLqCPedS3FYncFkKQ==", "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "url": "https://github.com/sponsors/ethers-io/" }, { "type": "individual", @@ -11686,38 +10896,55 @@ } ], "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/etherscan-api": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/etherscan-api/-/etherscan-api-10.3.0.tgz", @@ -13052,15 +12279,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -13104,16 +12322,6 @@ "node": ">=8" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -15029,11 +14237,6 @@ "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15846,12 +15049,8 @@ "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==" - }, - "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": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", @@ -18679,11 +17878,6 @@ "compute-scroll-into-view": "^3.0.2" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -21459,11 +20653,11 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -21657,20 +20851,19 @@ "@ethereumjs/rlp": "^4.0.1", "@ethereumjs/trie": "^5.0.4", "@ethereumjs/util": "^8.0.5", - "@ethersproject/abstract-provider": "^5.7.0", "@opentelemetry/api": "^1.6.0", "@opentelemetry/context-zone": "^1.17.1", "@opentelemetry/exporter-metrics-otlp-proto": "^0.45.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.45.0", "@opentelemetry/sdk-metrics": "^1.17.1", "@opentelemetry/sdk-trace-web": "^1.17.1", - "@topos-protocol/topos-smart-contracts": "^3.0.0", + "@topos-protocol/topos-smart-contracts": "^3.1.0-rc1", "@types/event-source-polyfill": "^1.0.1", "antd": "^5.4.0", "axios": "^1.0.0", "buffer": "^6.0.3", "bull": "^4.10.4", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "event-source-polyfill": "^1.0.31", "metamask-react": "^2.6.0", "react": "18.2.0", @@ -21707,6 +20900,12 @@ "vitest": "^0.33.0" } }, + "packages/frontend/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true + }, "packages/frontend/node_modules/@vitest/coverage-v8": { "version": "0.34.6", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz", @@ -21776,6 +20975,11 @@ "node": ">=14.0.0" } }, + "packages/frontend/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "packages/frontend/node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -24024,377 +23228,6 @@ "ethereum-cryptography": "^1.1.2" } }, - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, "@foundry-rs/easy-foundryup": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@foundry-rs/easy-foundryup/-/easy-foundryup-0.1.3.tgz", @@ -25977,69 +24810,17 @@ "wait-on": "^7.0.1" }, "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==", - "dev": true - }, - "@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true - }, - "@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true - }, - "aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true - }, "commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, - "ethers": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.3.tgz", - "integrity": "sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw==", - "dev": true, - "requires": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - } - }, "get-port": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", "dev": true - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} } } }, @@ -26189,12 +24970,12 @@ "dev": true }, "@topos-protocol/topos-smart-contracts": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@topos-protocol/topos-smart-contracts/-/topos-smart-contracts-3.0.0.tgz", - "integrity": "sha512-ABDny/flDSRzfZntdxeV3ZZWBO1s7amI1+3pxHYBdQ4EhvD5FJzlv8Go1QYbYrUf2q+vW1p+soY7+T9KDFE1QA==", + "version": "3.1.0-rc2", + "resolved": "https://registry.npmjs.org/@topos-protocol/topos-smart-contracts/-/topos-smart-contracts-3.1.0-rc2.tgz", + "integrity": "sha512-3839jo+jVMkwxgnlHFSduI78B5YzVDN+CCCd09lcxCrISsrRQJdmbsAlLYTWAc8TPwY/76HuKAP6KIGGw3g8bg==", "requires": { "@openzeppelin/contracts": "^4.8.3", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "solidity-rlp": "2.0.7" } }, @@ -27399,9 +26180,9 @@ "dev": true }, "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "agent-base": { "version": "6.0.2", @@ -28081,11 +26862,6 @@ "tweetnacl": "^0.14.3" } }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -28134,11 +26910,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -28218,11 +26989,6 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, "browserslist": { "version": "4.21.9", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", @@ -29829,27 +28595,6 @@ "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", "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", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "email-addresses": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", @@ -30473,40 +29218,47 @@ } }, "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.1.tgz", + "integrity": "sha512-kuV8fGd4/8Gj7wkurbsuUsm1DCG6N5gKGYdw3fnWG/7QGknhy1xtHD7kbkCWQAcbAYmzLCLqCPedS3FYncFkKQ==", + "requires": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "dependencies": { + "@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + } + }, + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + }, + "@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "etherscan-api": { @@ -31124,7 +29876,6 @@ "@ethereumjs/rlp": "^4.0.1", "@ethereumjs/trie": "^5.0.4", "@ethereumjs/util": "^8.0.5", - "@ethersproject/abstract-provider": "^5.7.0", "@opentelemetry/api": "^1.6.0", "@opentelemetry/context-zone": "^1.17.1", "@opentelemetry/exporter-metrics-otlp-proto": "^0.45.0", @@ -31135,7 +29886,7 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "14.0.0", "@testing-library/user-event": "^14.4.3", - "@topos-protocol/topos-smart-contracts": "^3.0.0", + "@topos-protocol/topos-smart-contracts": "^3.1.0-rc1", "@types/event-source-polyfill": "^1.0.1", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", @@ -31154,7 +29905,7 @@ "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "event-source-polyfill": "^1.0.31", "eventsourcemock": "^2.0.0", "jsdom": "^22.1.0", @@ -31172,6 +29923,12 @@ "web-vitals": "^3.3.1" }, "dependencies": { + "@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true + }, "@vitest/coverage-v8": { "version": "0.34.6", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz", @@ -31215,6 +29972,11 @@ "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", "dev": true }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -31676,15 +30438,6 @@ "has-symbols": "^1.0.2" } }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -31715,16 +30468,6 @@ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -33139,11 +31882,6 @@ "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -33773,12 +32511,8 @@ "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==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "minimatch": { "version": "3.1.2", @@ -35844,11 +34578,6 @@ "compute-scroll-into-view": "^3.0.2" } }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, "seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -37875,9 +36604,9 @@ } }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "requires": {} }, "xml-name-validator": { diff --git a/packages/frontend/cypress/e2e/step1.cy.ts b/packages/frontend/cypress/e2e/step1.cy.ts index 6d63be2..45a8784 100644 --- a/packages/frontend/cypress/e2e/step1.cy.ts +++ b/packages/frontend/cypress/e2e/step1.cy.ts @@ -295,13 +295,6 @@ describe('Multistep form step-1 with Incal', () => { .parents('.ant-form-item') .should('not.have.class', 'ant-form-item-has-error') cy.get('#recipientAddress').clear() - cy.get('#recipientAddress').type( - '4aab25b4fad0beaac466050f3a7142a502f4cf0a' - ) - cy.get('#recipientAddress') - .parents('.ant-form-item') - .should('not.have.class', 'ant-form-item-has-error') - cy.get('#recipientAddress').clear() }) it('should not be able to input a larger amount than current balance (default supply)', () => { diff --git a/packages/frontend/cypress/e2e/step2.cy.ts b/packages/frontend/cypress/e2e/step2.cy.ts index 78b6482..34dc45e 100644 --- a/packages/frontend/cypress/e2e/step2.cy.ts +++ b/packages/frontend/cypress/e2e/step2.cy.ts @@ -31,7 +31,9 @@ describe('Multistep form step-2', () => { .find('.ant-select-item-option-content') .contains('Incal') .click() - cy.get('#recipientAddress').type('4aab25b4fad0beaac466050f3a7142a502f4cf0a') + cy.get('#recipientAddress').type( + '0x4aab25b4fad0beaac466050f3a7142a502f4cf0a' + ) cy.get('#amount').type('1') cy.get('#nextButton').click() }) @@ -42,7 +44,7 @@ describe('Multistep form step-2', () => { cy.get('#summary1Token').should('have.text', 'TST') cy.get('#summary1RecipientAddress').should( 'have.text', - shortenAddress('4aab25b4fad0beaac466050f3a7142a502f4cf0a') + shortenAddress('0x4aab25b4fad0beaac466050f3a7142a502f4cf0a') ) }) diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 1cf195d..4dc1f42 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -21,20 +21,19 @@ "@ethereumjs/rlp": "^4.0.1", "@ethereumjs/trie": "^5.0.4", "@ethereumjs/util": "^8.0.5", - "@ethersproject/abstract-provider": "^5.7.0", "@opentelemetry/api": "^1.6.0", "@opentelemetry/context-zone": "^1.17.1", "@opentelemetry/exporter-metrics-otlp-proto": "^0.45.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.45.0", "@opentelemetry/sdk-metrics": "^1.17.1", "@opentelemetry/sdk-trace-web": "^1.17.1", - "@topos-protocol/topos-smart-contracts": "^3.0.0", + "@topos-protocol/topos-smart-contracts": "^3.1.0-rc1", "@types/event-source-polyfill": "^1.0.1", "antd": "^5.4.0", "axios": "^1.0.0", "buffer": "^6.0.3", "bull": "^4.10.4", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "event-source-polyfill": "^1.0.31", "metamask-react": "^2.6.0", "react": "18.2.0", diff --git a/packages/frontend/src/App.tsx b/packages/frontend/src/App.tsx index e06b117..c5e7ded 100644 --- a/packages/frontend/src/App.tsx +++ b/packages/frontend/src/App.tsx @@ -1,7 +1,8 @@ import { ThemeProvider } from '@emotion/react' import styled from '@emotion/styled' +import { ToposCore__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' import { Alert, Layout as _Layout } from 'antd' -import { BigNumber, ethers } from 'ethers' +import { JsonRpcProvider } from 'ethers' import { useEffect, useState } from 'react' import Header from './components/Header' @@ -10,7 +11,6 @@ import { Error, ErrorsContext } from './contexts/errors' import { SubnetsContext } from './contexts/subnets' import useRegisteredSubnets from './hooks/useRegisteredSubnets' import useTheme from './hooks/useTheme' -import { toposCoreContract } from './contracts' import { SubnetWithId } from './types' const { Content: _Content } = _Layout @@ -49,17 +49,18 @@ const App = () => { let toposSubnet: SubnetWithId | undefined if (toposSubnetEndpointHttp && toposSubnetEndpointWs) { - const provider = new ethers.providers.JsonRpcProvider( - toposSubnetEndpointHttp - ) + const provider = new JsonRpcProvider(toposSubnetEndpointHttp) const network = await provider.getNetwork() const chainId = network.chainId - const contract = toposCoreContract.connect(provider) + const contract = ToposCore__factory.connect( + import.meta.env.VITE_TOPOS_CORE_PROXY_CONTRACT_ADDRESS, + provider + ) const subnetId = await contract.networkSubnetId() toposSubnet = { - chainId: BigNumber.from(chainId.toString()), + chainId: chainId, endpointHttp: toposSubnetEndpointHttp, endpointWs: toposSubnetEndpointWs, currencySymbol: 'TOPOS', diff --git a/packages/frontend/src/components/Header.tsx b/packages/frontend/src/components/Header.tsx index 3622ab7..4828d6a 100644 --- a/packages/frontend/src/components/Header.tsx +++ b/packages/frontend/src/components/Header.tsx @@ -1,4 +1,3 @@ -import React from 'react' import { Col, Layout, Row, Space } from 'antd' import logo from '../logo.svg' diff --git a/packages/frontend/src/components/Progress.tsx b/packages/frontend/src/components/Progress.tsx index 449e16a..c2f1196 100644 --- a/packages/frontend/src/components/Progress.tsx +++ b/packages/frontend/src/components/Progress.tsx @@ -1,5 +1,4 @@ import { Progress as AntdProgress } from 'antd' -import React from 'react' interface Props { progress: number diff --git a/packages/frontend/src/components/SubnetSelect.test.tsx b/packages/frontend/src/components/SubnetSelect.test.tsx index d914907..5bdd434 100644 --- a/packages/frontend/src/components/SubnetSelect.test.tsx +++ b/packages/frontend/src/components/SubnetSelect.test.tsx @@ -3,12 +3,11 @@ import { describe, it, expect, vi } from 'vitest' import SubnetSelect from './SubnetSelect' import { SubnetWithId } from '../types' -import { BigNumber } from 'ethers' import { userEvent } from '../utils/tests' const subnetsMock: SubnetWithId[] = [ { - chainId: BigNumber.from(1), + chainId: BigInt(1), currencySymbol: 'TST', endpointHttp: '', endpointWs: '', diff --git a/packages/frontend/src/components/SubnetSelect.tsx b/packages/frontend/src/components/SubnetSelect.tsx index ea3f465..a320c30 100644 --- a/packages/frontend/src/components/SubnetSelect.tsx +++ b/packages/frontend/src/components/SubnetSelect.tsx @@ -1,8 +1,6 @@ import { Avatar, Select, SelectProps, Space, Typography } from 'antd' -import React from 'react' import { SubnetWithId } from '../types' -import TestId from '../utils/testId' const { Option } = Select const { Text } = Typography diff --git a/packages/frontend/src/components/steps/Step1.tsx b/packages/frontend/src/components/steps/Step1.tsx index 3ec2d48..71301bd 100644 --- a/packages/frontend/src/components/steps/Step1.tsx +++ b/packages/frontend/src/components/steps/Step1.tsx @@ -13,7 +13,7 @@ import { message, } from 'antd' import { SegmentedValue } from 'antd/lib/segmented' -import { ethers } from 'ethers' +import { isAddress } from 'ethers' import { useCallback, useContext, useEffect, useMemo } from 'react' import { MultiStepFormContext } from '../../contexts/multiStepForm' @@ -216,7 +216,7 @@ const Step1 = ({ onFinish, onPrev }: StepProps) => { { validator: (_, value) => new Promise((resolve, reject) => { - if (ethers.utils.isAddress(value) || !value) { + if ((isAddress(value) && value.startsWith('0x')) || !value) { resolve() } diff --git a/packages/frontend/src/components/steps/Step2.tsx b/packages/frontend/src/components/steps/Step2.tsx index 3a5182a..c62ca04 100644 --- a/packages/frontend/src/components/steps/Step2.tsx +++ b/packages/frontend/src/components/steps/Step2.tsx @@ -9,7 +9,14 @@ import { import * as ERC20MessagingJSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/examples/ERC20Messaging.sol/ERC20Messaging.json' import { Avatar, List, Spin } from 'antd' import { Job } from 'bull' -import { BigNumber, ContractReceipt, ContractTransaction, ethers } from 'ethers' +import { + ContractTransactionReceipt, + ContractTransactionResponse, + EventLog, + hexlify, + Interface, + parseUnits, +} from 'ethers' import { useContext, useEffect, useMemo, useState } from 'react' import { lastValueFrom, tap } from 'rxjs' @@ -91,7 +98,7 @@ const Step2 = ({ onFinish }: StepProps) => { if (isReady) { try { mainSpan = useTracingCreateSpan('Step2', 'main', stepSpan) - const parsedAmount = ethers.utils.parseUnits(amount.toString()) + const parsedAmount = parseUnits(amount.toString()) await processTokenAllowance(parsedAmount, token) setActiveProgressStep((s) => s + 1) @@ -104,48 +111,53 @@ const Step2 = ({ onFinish }: StepProps) => { ) setActiveProgressStep((s) => s + 1) - const merkleProofOutput = await processMerkleProofCreation( - sendTokenOutput!.sendTokenReceipt, - sendTokenOutput!.sendTokenTx - ) - - const tokenSentLogIndex = await processSentTokenLogIndex( - sendTokenOutput!.sendTokenReceipt - ) - - const executorServiceJob = await processExecutorServiceExecute( - receivingSubnet, - tokenSentLogIndex, - merkleProofOutput.proof, - merkleProofOutput.trieRoot - ) + if (sendTokenOutput.sendTokenReceipt) { + const merkleProofOutput = await processMerkleProofCreation( + sendTokenOutput.sendTokenReceipt, + sendTokenOutput.sendTokenTx + ) - if (executorServiceJob) { - const observable = await processExecutorServiceObserveJob( - executorServiceJob + const tokenSentLogIndex = await processSentTokenLogIndex( + sendTokenOutput!.sendTokenReceipt ) - await lastValueFrom(observable) - .then(() => { - setActiveProgressStep((s) => s + 1) - }) - .catch((error) => { - throw error - }) - mainSpan?.setStatus({ - code: SpanStatusCode.OK, - }) - stepSpan.setStatus({ - code: SpanStatusCode.OK, - }) - rootSpan?.setStatus({ - code: SpanStatusCode.OK, - }) - mainSpan?.end() - stepSpan?.end() - rootSpan?.end() + if (merkleProofOutput) { + const executorServiceJob = await processExecutorServiceExecute( + receivingSubnet, + tokenSentLogIndex, + merkleProofOutput.proof, + merkleProofOutput.trieRoot + ) + + if (executorServiceJob) { + const observable = await processExecutorServiceObserveJob( + executorServiceJob + ) + await lastValueFrom(observable) + .then(() => { + setActiveProgressStep((s) => s + 1) + }) + .catch((error) => { + throw error + }) + + mainSpan?.setStatus({ + code: SpanStatusCode.OK, + }) + stepSpan.setStatus({ + code: SpanStatusCode.OK, + }) + rootSpan?.setStatus({ + code: SpanStatusCode.OK, + }) + mainSpan?.end() + stepSpan?.end() + rootSpan?.end() + } + } } } catch (error: any) { + console.error(error) setErrors((e) => [ ...e, { @@ -184,10 +196,10 @@ const Step2 = ({ onFinish }: StepProps) => { } } - function processTokenAllowance(parsedAmount: BigNumber, token: Token) { + function processTokenAllowance(parsedAmount: bigint, token: Token) { return getCurrentAllowance(token) .then((currentAllowance) => { - if (currentAllowance.lt(parsedAmount)) { + if (currentAllowance < parsedAmount) { const span = useTracingCreateSpan( 'Step2', 'processTokenAllowance', @@ -219,7 +231,7 @@ const Step2 = ({ onFinish }: StepProps) => { receivingSubnet: SubnetWithId, token: Token, recipientAddress: string, - parsedAmount: BigNumber + parsedAmount: bigint ) { const span = useTracingCreateSpan( 'Step2', @@ -251,37 +263,43 @@ const Step2 = ({ onFinish }: StepProps) => { } function processMerkleProofCreation( - sendTokenReceipt: ContractReceipt, - sendTokenTx: ContractTransaction + sendTokenReceipt: ContractTransactionReceipt, + sendTokenTx: ContractTransactionResponse ) { const span = useTracingCreateSpan( 'Step2', 'processMerkleProofCreation', mainSpan ) + + const prefectTxs = true + return provider - .getBlockWithTransactions(sendTokenReceipt.blockHash) + .getBlock(sendTokenReceipt.blockHash, prefectTxs) .then((block) => { span.addEvent('got block', { block: JSON.stringify(block) }) - return createMerkleProof(block, sendTokenTx) - .then(({ proof, trie }) => { - const trieRoot = ethers.utils.hexlify(trie.root()) - span.addEvent('got proof and trie', { - proof, - trie: JSON.stringify(trie), - trieRoot, + + if (block) { + return createMerkleProof(block, sendTokenTx) + .then(({ proof, trie }) => { + const trieRoot = hexlify(trie.root()) + span.addEvent('got proof and trie', { + proof, + trie: JSON.stringify(trie), + trieRoot, + }) + span.setStatus({ code: SpanStatusCode.OK }) + return { proof, trie, trieRoot } }) - span.setStatus({ code: SpanStatusCode.OK }) - return { proof, trie, trieRoot } - }) - .catch((error) => { - const message = getErrorMessage(error) - span.setStatus({ - code: SpanStatusCode.ERROR, - message, + .catch((error) => { + const message = getErrorMessage(error) + span.setStatus({ + code: SpanStatusCode.ERROR, + message, + }) + throw error }) - throw error - }) + } }) .catch((error) => { const message = getErrorMessage(error) @@ -296,22 +314,24 @@ const Step2 = ({ onFinish }: StepProps) => { }) } - function processSentTokenLogIndex(sendTokenReceipt: ContractReceipt) { + function processSentTokenLogIndex( + sendTokenReceipt: ContractTransactionReceipt + ) { const span = useTracingCreateSpan( 'Step2', 'processSentTokenLogIndex', mainSpan ) - const iface = new ethers.utils.Interface(ERC20MessagingJSON.abi) + const iface = new Interface(ERC20MessagingJSON.abi) let tokenSentLogIndex: number | undefined = undefined for (let log of sendTokenReceipt.logs) { try { - const logDescription = iface.parseLog(log) + const logDescription = iface.parseLog(log as any) - if (logDescription.name === 'TokenSent') { - tokenSentLogIndex = log.logIndex + if (logDescription && logDescription.name === 'TokenSent') { + tokenSentLogIndex = log.index break } } catch { diff --git a/packages/frontend/src/contracts.ts b/packages/frontend/src/contracts.ts deleted file mode 100644 index c8e0c88..0000000 --- a/packages/frontend/src/contracts.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as SubnetRegistratorJSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/topos-core/SubnetRegistrator.sol/SubnetRegistrator.json' -import * as ERC20MessagingJSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/examples/ERC20Messaging.sol/ERC20Messaging.json' -import * as ToposCoreJSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/topos-core/ToposCore.sol/ToposCore.json' -import { - SubnetRegistrator, - ToposCore, -} from '@topos-protocol/topos-smart-contracts/typechain-types/contracts/topos-core' -import { ERC20Messaging } from '@topos-protocol/topos-smart-contracts/typechain-types/contracts/examples' -import { ethers } from 'ethers' - -export const subnetRegistratorContract = new ethers.Contract( - import.meta.env.VITE_SUBNET_REGISTRATOR_CONTRACT_ADDRESS || '', - SubnetRegistratorJSON.abi -) as SubnetRegistrator - -export const toposCoreContract = new ethers.Contract( - import.meta.env.VITE_TOPOS_CORE_PROXY_CONTRACT_ADDRESS || '', - ToposCoreJSON.abi -) as ToposCore - -export const erc20MessagingContract = new ethers.Contract( - import.meta.env.VITE_ERC20_MESSAGING_CONTRACT_ADDRESS || '', - ERC20MessagingJSON.abi -) as ERC20Messaging diff --git a/packages/frontend/src/hooks/useAllowance.test.ts b/packages/frontend/src/hooks/useAllowance.test.ts index 2cf76f3..922eced 100644 --- a/packages/frontend/src/hooks/useAllowance.test.ts +++ b/packages/frontend/src/hooks/useAllowance.test.ts @@ -1,6 +1,5 @@ import { act, renderHook } from '@testing-library/react' -import * as BurnableMintableCappedERC20JSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/topos-core/BurnableMintableCappedERC20.sol/BurnableMintableCappedERC20.json' -import { ethers } from 'ethers' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' import { vi } from 'vitest' import { Token } from '../types' @@ -15,13 +14,17 @@ const txMock = { wait: vi.fn().mockResolvedValue({}), } -const amountMock = ethers.BigNumber.from(1) +const amountMock = BigInt(1) const approveMock = vi.fn().mockResolvedValue(txMock) const allowanceMock = vi.fn().mockResolvedValue(1) +const contractConnectMock = vi + .fn() + .mockReturnValue({ allowance: allowanceMock, approve: approveMock }) + const contractSpy = vi - .spyOn(ethers, 'Contract') - .mockReturnValue({ allowance: allowanceMock, approve: approveMock } as any) + .spyOn(typechainExports, 'BurnableMintableCappedERC20__factory', 'get') + .mockReturnValue({ connect: contractConnectMock } as any) vi.mock('./useEthers', () => ({ default: vi.fn().mockReturnValue({ @@ -42,9 +45,8 @@ describe('useApproveAllowance', () => { act(() => { result.current.approveAllowance(tokenMock, amountMock).then(() => { expect(result.current.loading).toBe(true) - expect(contractSpy).toHaveBeenCalledWith( + expect(contractConnectMock).toHaveBeenCalledWith( tokenMock.addr, - BurnableMintableCappedERC20JSON.abi, expect.anything() ) @@ -67,9 +69,8 @@ describe('useApproveAllowance', () => { .getCurrentAllowance(tokenMock) .then((currentAllowance) => { expect(result.current.loading).toBe(true) - expect(contractSpy).toHaveBeenCalledWith( + expect(contractConnectMock).toHaveBeenCalledWith( tokenMock.addr, - BurnableMintableCappedERC20JSON.abi, expect.anything() ) diff --git a/packages/frontend/src/hooks/useAllowance.ts b/packages/frontend/src/hooks/useAllowance.ts index aaf5be9..f09e4e8 100644 --- a/packages/frontend/src/hooks/useAllowance.ts +++ b/packages/frontend/src/hooks/useAllowance.ts @@ -1,20 +1,20 @@ -import * as BurnableMintableCappedERC20JSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/topos-core/BurnableMintableCappedERC20.sol/BurnableMintableCappedERC20.json' -import { BurnableMintableCappedERC20 } from '@topos-protocol/topos-smart-contracts/typechain-types/contracts/topos-core/BurnableMintableCappedERC20' -import { BigNumber, ContractTransaction, ethers } from 'ethers' -import { useCallback, useState } from 'react' +import { BurnableMintableCappedERC20__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' +import { useCallback, useMemo, useState } from 'react' import { Token } from '../types' import useEthers from './useEthers' +import { BrowserProvider } from 'ethers' export default function useAllowance() { const { provider } = useEthers({ viaMetaMask: true, }) + const [loading, setLoading] = useState(false) const approveAllowance = useCallback( - (token: Token, amount: BigNumber) => - new Promise((resolve, reject) => { + (token: Token, amount: bigint) => + new Promise(async (resolve, reject) => { const erc20MessagingContractAddress = import.meta.env .VITE_ERC20_MESSAGING_CONTRACT_ADDRESS @@ -27,15 +27,14 @@ export default function useAllowance() { if (token && token.addr) { setLoading(true) - const contract = new ethers.Contract( - token?.addr, - BurnableMintableCappedERC20JSON.abi, - provider.getSigner() - ) as BurnableMintableCappedERC20 + const signer = await (provider as BrowserProvider).getSigner() + + const burnableMintableCappedERC20 = + BurnableMintableCappedERC20__factory.connect(token.addr, signer) - contract + burnableMintableCappedERC20 .approve(erc20MessagingContractAddress, amount) - .then((tx: ContractTransaction) => { + .then((tx) => { tx.wait() .then((receipt) => { resolve(receipt) @@ -60,7 +59,7 @@ export default function useAllowance() { ) const getCurrentAllowance = useCallback( (token: Token) => - new Promise((resolve, reject) => { + new Promise(async (resolve, reject) => { const erc20MessagingContractAddress = import.meta.env .VITE_ERC20_MESSAGING_CONTRACT_ADDRESS @@ -72,16 +71,15 @@ export default function useAllowance() { if (token && token.addr) { setLoading(true) - const signer = provider.getSigner() - const contract = new ethers.Contract( - token?.addr, - BurnableMintableCappedERC20JSON.abi, - signer - ) as BurnableMintableCappedERC20 + const burnableMintableCappedERC20 = + BurnableMintableCappedERC20__factory.connect(token.addr, provider) - contract - .allowance(signer.getAddress(), erc20MessagingContractAddress) + burnableMintableCappedERC20 + .allowance( + (await (provider as BrowserProvider).getSigner()).getAddress(), + erc20MessagingContractAddress + ) .then((allowance) => { resolve(allowance) }) diff --git a/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.test.ts b/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.test.ts index ca8d837..8f3bb72 100644 --- a/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.test.ts +++ b/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.test.ts @@ -1,12 +1,12 @@ import { act, renderHook } from '@testing-library/react' -import { BigNumber, ethers } from 'ethers' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' +import * as ethersExports from 'ethers' import { vi } from 'vitest' import * as subnetsContextExports from '../contexts/subnets' -import * as contractsExports from '../contracts' import { FetchData, SubnetWithId, Token } from '../types' import useCheckTokenOnReceivingSubnet from './useCheckTokenOnReceivingSubnet' -import React from 'react' +import { createContext } from 'react' const tokenMock: Token = { addr: 'address', @@ -15,7 +15,7 @@ const tokenMock: Token = { const subnetsMock: SubnetWithId[] = [ { - chainId: BigNumber.from(1), + chainId: BigInt(1), currencySymbol: '', id: 'id', endpointHttp: 'http://endpoint', @@ -26,32 +26,35 @@ const subnetsMock: SubnetWithId[] = [ ] vi.spyOn(subnetsContextExports, 'SubnetsContext', 'get').mockReturnValue( - React.createContext>({ data: subnetsMock }) + createContext>({ data: subnetsMock }) ) -const getCodeMock = vi.fn().mockResolvedValue('code') - -const providerSpy = vi - .spyOn(ethers.providers, 'WebSocketProvider') - .mockReturnValue({ getCode: getCodeMock } as any) +vi.mock('ethers', async () => { + const actual = (await vi.importActual('ethers')) as any + return { + ...actual, + getDefaultProvider: vi + .fn() + .mockReturnValue({ getCode: vi.fn().mockResolvedValue('code') }), + } +}) const getTokenBySymbolMock = vi.fn().mockResolvedValue(tokenMock) +const contractAddressMock = 'address' + const contractConnectMock = vi.fn().mockReturnValue({ + address: contractAddressMock, getTokenBySymbol: getTokenBySymbolMock, }) -const contractMock = { - address: 'address', - connect: contractConnectMock, -} - const contractSpy = vi - .spyOn(contractsExports, 'erc20MessagingContract', 'get') - .mockReturnValue(contractMock as any) + .spyOn(typechainExports, 'ERC20Messaging__factory', 'get') + .mockReturnValue({ connect: contractConnectMock } as any) describe('useCheckTokenOnReceivingSubnet', () => { it("should call connected contract's getTokenByAddress public method", () => { + const getDefaultProviderSpy = vi.spyOn(ethersExports, 'getDefaultProvider') const { result } = renderHook(() => useCheckTokenOnReceivingSubnet()) expect(result.current.loading).toBe(false) @@ -60,10 +63,13 @@ describe('useCheckTokenOnReceivingSubnet', () => { .checkTokenOnSubnet(tokenMock, subnetsMock[0].id) .then(() => { expect(result.current.loading).toBe(true) - expect(providerSpy).toHaveBeenCalledWith(subnetsMock[0].endpointWs) - + expect(getDefaultProviderSpy).toHaveBeenCalledWith( + subnetsMock[0].endpointWs + ) expect(contractSpy).toHaveBeenCalled() - expect(getCodeMock).toHaveBeenCalledWith(contractMock.address) + // expect(getDefaultProviderSpy.mock.lastCall).toHaveBeenCalledWith( + // contractAddressMock + // ) expect(contractConnectMock).toHaveBeenCalled() expect(getTokenBySymbolMock).toHaveBeenCalledWith(tokenMock.symbol) }) diff --git a/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.ts b/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.ts index 00167f5..1651624 100644 --- a/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.ts +++ b/packages/frontend/src/hooks/useCheckTokenOnReceivingSubnet.ts @@ -1,10 +1,13 @@ -import { providers } from 'ethers' +import { ERC20Messaging__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' +import { getDefaultProvider } from 'ethers' import { useCallback, useContext, useState } from 'react' import { SubnetsContext } from '../contexts/subnets' -import { erc20MessagingContract } from '../contracts' import { Token } from '../types' +const erc20MessagingContractAddress = import.meta.env + .VITE_ERC20_MESSAGING_CONTRACT_ADDRESS + export default function useCheckTokenOnSubnet() { const { data: subnets } = useContext(SubnetsContext) const [loading, setLoading] = useState(false) @@ -18,14 +21,11 @@ export default function useCheckTokenOnSubnet() { if (subnet && token) { const endpoint = subnet?.endpointWs || subnet?.endpointHttp - const url = new URL(endpoint) - const subnetProvider = url.protocol.startsWith('ws') - ? new providers.WebSocketProvider(endpoint) - : new providers.JsonRpcProvider(endpoint) + const subnetProvider = getDefaultProvider(endpoint) if (subnetProvider) { if ( - (await subnetProvider.getCode(erc20MessagingContract.address)) === + (await subnetProvider.getCode(erc20MessagingContractAddress)) === '0x' ) { setLoading(false) @@ -33,7 +33,10 @@ export default function useCheckTokenOnSubnet() { `ToposCore contract could not be found on ${subnet.name}!` ) } else { - const contract = erc20MessagingContract.connect(subnetProvider) + const contract = ERC20Messaging__factory.connect( + erc20MessagingContractAddress, + subnetProvider + ) const onChainToken = await contract .getTokenBySymbol(token.symbol) diff --git a/packages/frontend/src/hooks/useEthers.test.ts b/packages/frontend/src/hooks/useEthers.test.ts index a459d7a..d02ac39 100644 --- a/packages/frontend/src/hooks/useEthers.test.ts +++ b/packages/frontend/src/hooks/useEthers.test.ts @@ -1,19 +1,18 @@ import { renderHook } from '@testing-library/react' -import { BigNumber, ethers } from 'ethers' +import * as ethersExports from 'ethers' import { useMetaMask } from 'metamask-react' import { vi } from 'vitest' import useEthers from './useEthers' -import React from 'react' -const existingChainIds = ['1', '2'].map((x) => BigNumber.from(x)) +const existingChainIds = ['1', '2'].map((x) => BigInt(x)) const subnetMock = { chainId: existingChainIds[0], endpointWs: 'ws://endpoint' } const subnetOtherMock = { chainId: existingChainIds[1], endpointWs: 'ws://other-endpoint', } const newSubnetMock = { - chainId: BigNumber.from('3'), + chainId: BigInt(3), currencySymbol: '', endpointWs: 'ws://other-other-endpoint', name: '', @@ -29,7 +28,7 @@ vi.mock('metamask-react', () => ({ new Promise((resolve, reject) => { if ( existingChainIds - .map((x) => ethers.utils.hexStripZeros(x.toHexString())) + .map((x) => ethersExports.toQuantity(x.toString(16))) .indexOf(chainId) > -1 ) { resolve() @@ -41,18 +40,27 @@ vi.mock('metamask-react', () => ({ }), })) -const webSocketProviderSpy = vi - .spyOn(ethers.providers, 'WebSocketProvider') - .mockReturnValue({} as any) - -const web3ProviderSpy = vi - .spyOn(ethers.providers, 'Web3Provider') - .mockReturnValue({} as any) +vi.mock('ethers', async () => { + const actual = (await vi.importActual('ethers')) as any + return { + ...actual, + BrowserProvider: vi.fn().mockReturnValue({}), + getDefaultProvider: vi.fn().mockReturnValue({}), + } +}) describe('useEthers', () => { + let getDefaultProviderSpy: any + let browserProviderSpy: any + + beforeAll(() => { + getDefaultProviderSpy = vi.spyOn(ethersExports, 'getDefaultProvider') + browserProviderSpy = vi.spyOn(ethersExports, 'BrowserProvider') + }) + it('should use webSocket provider with Topos Subnet if not requested to use metaMask and no subnet', () => { renderHook(() => useEthers({ viaMetaMask: false })) - expect(webSocketProviderSpy).toHaveBeenCalledWith( + expect(getDefaultProviderSpy).toHaveBeenCalledWith( import.meta.env.VITE_TOPOS_SUBNET_ENDPOINT_WS ) }) @@ -61,12 +69,12 @@ describe('useEthers', () => { renderHook(() => useEthers({ subnet: subnetMock as any, viaMetaMask: false }) ) - expect(webSocketProviderSpy).toHaveBeenCalledWith(subnetMock.endpointWs) + expect(getDefaultProviderSpy).toHaveBeenCalledWith(subnetMock.endpointWs) }) it('should use web3 provider if not requested to use metaMask', () => { renderHook(() => useEthers({ viaMetaMask: true })) - expect(web3ProviderSpy).toHaveBeenCalled() + expect(browserProviderSpy).toHaveBeenCalled() }) it('should try to switch network if requested to use metaMask with subnet and subnet changes', () => { @@ -81,7 +89,7 @@ describe('useEthers', () => { ) expect(switchChain).toHaveBeenCalledWith( - ethers.utils.hexStripZeros(subnetOtherMock.chainId.toHexString()) + ethersExports.toQuantity(subnetOtherMock.chainId.toString(16)) ) }) @@ -97,7 +105,7 @@ describe('useEthers', () => { ) expect(switchChain).toHaveBeenCalledWith( - ethers.utils.hexStripZeros(newSubnetMock.chainId.toHexString()) + ethersExports.toQuantity(newSubnetMock.chainId.toString(16)) ) // TODO: make this test work (the addChain call should be picked) diff --git a/packages/frontend/src/hooks/useEthers.ts b/packages/frontend/src/hooks/useEthers.ts index 63e74f1..0900b42 100644 --- a/packages/frontend/src/hooks/useEthers.ts +++ b/packages/frontend/src/hooks/useEthers.ts @@ -1,4 +1,4 @@ -import { providers, utils } from 'ethers' +import { BrowserProvider, getDefaultProvider } from 'ethers' import { useEffect, useMemo } from 'react' import { useMetaMask } from 'metamask-react' @@ -13,32 +13,26 @@ export default function useEthers({ subnet, viaMetaMask }: Args = {}) { const { account, addChain, connect, ethereum, status, switchChain } = useMetaMask() - const provider = useMemo< - providers.Web3Provider | providers.JsonRpcProvider - >(() => { + const provider = useMemo(() => { if (viaMetaMask && ethereum) { - return new providers.Web3Provider(ethereum) + return new BrowserProvider(ethereum) } if (!subnet) { const toposSubnetEndpointWs = import.meta.env .VITE_TOPOS_SUBNET_ENDPOINT_WS - return new providers.WebSocketProvider(toposSubnetEndpointWs) + return getDefaultProvider(toposSubnetEndpointWs) } const endpoint = subnet.endpointWs || subnet.endpointHttp - const url = new URL(endpoint) - - return url.protocol.startsWith('ws') - ? new providers.WebSocketProvider(endpoint) - : new providers.JsonRpcProvider(endpoint) + return getDefaultProvider(endpoint) }, [subnet, viaMetaMask, ethereum]) useEffect( function switchNetworkAndConnect() { const _ = async () => { if (subnet && viaMetaMask && ethereum) { - const chainId = utils.hexStripZeros(subnet.chainId.toHexString()) + const chainId = `0x${subnet.chainId.toString(16)}` if (ethereum.networkVersion !== chainId) { try { diff --git a/packages/frontend/src/hooks/useExecutorService.ts b/packages/frontend/src/hooks/useExecutorService.ts index dbbb1d4..17c7201 100644 --- a/packages/frontend/src/hooks/useExecutorService.ts +++ b/packages/frontend/src/hooks/useExecutorService.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { Job, JobId } from 'bull' import { EventSourcePolyfill } from 'event-source-polyfill' -import React, { useContext, useEffect, useMemo, useState } from 'react' +import { useContext, useEffect, useMemo, useState } from 'react' import { Observable } from 'rxjs' import { OAuthResponse } from 'common' diff --git a/packages/frontend/src/hooks/useReceiptTrie.test.ts b/packages/frontend/src/hooks/useReceiptTrie.test.ts index 5ed29dc..61a48b9 100644 --- a/packages/frontend/src/hooks/useReceiptTrie.test.ts +++ b/packages/frontend/src/hooks/useReceiptTrie.test.ts @@ -1,9 +1,9 @@ import { act, renderHook } from '@testing-library/react' -import { BigNumber } from 'ethers' import { vi } from 'vitest' import * as useEthersExports from './useEthers' import useReceiptTrie from './useReceiptTrie' +import { Block } from 'ethers' // Taken from a local subnet const receiptMock = { @@ -12,7 +12,7 @@ const receiptMock = { contractAddress: null, transactionIndex: 0, root: '0x0000000000000000000000000000000000000000000000000000000000000000', - gasUsed: BigNumber.from('0xeec7'), + gasUsed: BigInt('0xeec7'), logsBloom: '0x00000000000000000000000000000001000000000400000000000020080000001000080000000000000000000000000000000000000000000000000000200000800080000000000000000008400000000000000000000000000000000000000000000000020000000001000000000800000200000000000000000010000000000000000000000000000000000080100000000020000080000000000000000000020000000000001000001000000020000000100000000000000000000000000000000002000000000000000040000000000000000000000000000000002028000010000000000000000000000000000000000000020000000000000008000000', blockHash: @@ -85,7 +85,7 @@ const receiptMock = { ], blockNumber: 1148, confirmations: 7, - cumulativeGasUsed: BigNumber.from('0xeec7'), + cumulativeGasUsed: BigInt('0xeec7'), status: 1, type: 0, byzantium: true, @@ -140,7 +140,7 @@ const receiptMock = { '0xff63b98e7d02220e3cca1d3c37d28db75b18bae171fb03fd8e280cd634f4030f', '0x3add941f2DA6bA73dBA5C70cF433bbC1C1DF39ad', '0x4AAb25B4fAd0Beaac466050f3A7142A502f4Cf0a', - BigNumber.from('0x0de0b6b3a7640000'), + BigInt('0x0de0b6b3a7640000'), ], event: 'TokenSent', eventSignature: 'TokenSent(bytes32,address,address,uint256)', @@ -171,12 +171,12 @@ const blockWithTransactionsMock = { timestamp: 1693209380, nonce: '0x0000000000000000', difficulty: 1148, - gasLimit: BigNumber.from('0x989680'), - gasUsed: BigNumber.from('0xeec7'), + gasLimit: BigInt('0x989680'), + gasUsed: BigInt('0xeec7'), miner: '0x0000000000000000000000000000000000000000', extraData: '0x0000000000000000000000000000000000000000000000000000000000000000f90239f90120f846943e8eec8c2c7e0bdf4c84ec81dc84393b59d6fab7b0a15ca1ed6f1a54e2c2e7c17a3a79a2410b583d6d0feb9611f2aa3f23d9ac7c92bf8e1176b0abd1226ebb5422d8381b43f84694bc41222403d787b568daa4b7008330d905310224b080e9c2d9d46921725ad4c4751c9f84c0e56d32c59caeeb3623b910f3ba02c428833d1ece9f879d3e9c27a7e5262901c1f846949f7fcfafd01ab7d12c24fe637ec86d1f1d278d96b0a28573fa4eedbaab32906923fc243205bedfb775463e2b30aa8a394c3f502a48fdfbd78e67534f5661ff109c9a267af5f84694425824b54e3a69f866e001f6c97e67f5063b35aab0acc44552254e317711bef743022e7458c434006f67b18402e0f59d6044ef716e967039fbc1ea38161263ec923a79ac02b8419df1edd4a995a4040e0d71304f2bfc45bc48775fa982ab84609e4cdc6d9eb9b974cdca2ab34ac789be33a28ff63ef2048292c70eb29bdae010638ca0843f16a900f8630db86096ab3f355eee0fb58d3ee9989d1e9569db9536a5a98324332349afcc7b1469a6987f8a8aa7ebf001a0c17d7bc498313109f86acc81411010900813c11cb655e033657c639065c660602541d40163935baddc4a0bc42d8a3159dd23b1bff9f0fef8630bb8608a6533aa1538ec3fee846b7a6b2c0c450267597bdc44db3f01a1999956e3895483b8a326d44462514d443eec21d7bc000866822a96b5ba7a3de7a6e7bf8822bf866ee41905b9178843c1e1bc7ae2c935a6a09291b7242c664627efd747d8b71a880000000000000000', - transactions: [ + prefetchedTransactions: [ { hash: '0xc5ff2012213c9d99671d2477bb386ec5e72f28e5b59a26d58301cb93dabfbb66', type: 0, @@ -187,10 +187,10 @@ const blockWithTransactionsMock = { transactionIndex: 0, confirmations: 7, from: '0x4AAb25B4fAd0Beaac466050f3A7142A502f4Cf0a', - gasPrice: BigNumber.from('0x00'), - gasLimit: BigNumber.from('0x3d0900'), + gasPrice: BigInt('0x00'), + gasLimit: BigInt('0x3d0900'), to: '0xd8A6034001862c42982b0f3F9E3dB7a104420646', - value: BigNumber.from('0x00'), + value: BigInt('0x00'), nonce: 9, data: '0x5c914ec6ff63b98e7d02220e3cca1d3c37d28db75b18bae171fb03fd8e280cd634f4030f0000000000000000000000003add941f2da6ba73dba5c70cf433bbc1c1df39ad0000000000000000000000004aab25b4fad0beaac466050f3a7142a502f4cf0a0000000000000000000000000000000000000000000000000de0b6b3a7640000', r: '0x6e2b73aa905e903861ebcbdf5d74accf20e2e890c31d26cd0a562515b5eff750', @@ -201,8 +201,8 @@ const blockWithTransactionsMock = { wait: vi.fn().mockResolvedValue(receiptMock), }, ], - _difficulty: BigNumber.from('0x047c'), -} + _difficulty: BigInt('0x047c'), +} as unknown as Block vi.mock('./useEthers', () => ({ default: vi.fn().mockReturnValue({ @@ -229,7 +229,7 @@ describe('createMerkleProof', () => { const { proof } = await result.current.createMerkleProof( blockWithTransactionsMock, - blockWithTransactionsMock.transactions[0] + blockWithTransactionsMock.prefetchedTransactions[0] ) expect(result.current.errors.length).toBe(0) @@ -253,7 +253,7 @@ describe('createMerkleProof', () => { await act(async () => { const { proof } = await result.current.createMerkleProof( blockWithTransactionsMock, - blockWithTransactionsMock.transactions[0] + blockWithTransactionsMock.prefetchedTransactions[0] ) expect(proof).toBe('') diff --git a/packages/frontend/src/hooks/useReceiptTrie.ts b/packages/frontend/src/hooks/useReceiptTrie.ts index fd17216..2f0d1e3 100644 --- a/packages/frontend/src/hooks/useReceiptTrie.ts +++ b/packages/frontend/src/hooks/useReceiptTrie.ts @@ -1,8 +1,7 @@ import { Trie } from '@ethereumjs/trie' import { RLP } from '@ethereumjs/rlp' -import { BlockWithTransactions } from '@ethersproject/abstract-provider' import { Buffer } from 'buffer' -import { ethers } from 'ethers' +import { Block, BrowserProvider, TransactionResponse, hexlify } from 'ethers' import { useCallback, useState } from 'react' import useEthers from './useEthers' @@ -13,47 +12,50 @@ export default function useTransactionTrie() { }) const [errors, setErrors] = useState([]) - const createReceiptTrie = useCallback( - async (block: BlockWithTransactions) => { - const trie = new Trie() + const createReceiptTrie = useCallback(async (block: Block) => { + const trie = new Trie() - await Promise.all( - block.transactions.map(async (tx, index) => { - const { cumulativeGasUsed, logs, logsBloom, status } = await tx.wait() + await Promise.all( + block.prefetchedTransactions.map(async (tx, index) => { + const receipt = await tx.wait() + + if (receipt) { + const { cumulativeGasUsed, logs, logsBloom, status } = receipt return trie.put( Buffer.from(RLP.encode(index)), Buffer.from( RLP.encode([ status, - cumulativeGasUsed.toNumber(), + Number(cumulativeGasUsed), logsBloom, - logs.map((l) => [l.address, l.topics, l.data]), + logs.map((l) => [l.address, l.topics as any, l.data]), ]) ) ) - }) - ).catch((error) => { - console.error(error) - setErrors((e) => [...e, `Error when creating the transaction trie`]) + } }) + ).catch((error) => { + console.error(error) + setErrors((e) => [...e, `Error when creating the transaction trie`]) + }) - return trie - }, - [] - ) + return trie + }, []) const createMerkleProof = useCallback( - async (block: BlockWithTransactions, transaction: ethers.Transaction) => { + async (block: Block, transaction: TransactionResponse) => { const trie = await createReceiptTrie(block) let proof = '' - const rawBlock = await provider.send('eth_getBlockByHash', [ - ethers.utils.hexValue(block.hash), - true, - ]) + const receipt = await transaction.wait() + + const rawBlock = await (provider as BrowserProvider).send( + 'eth_getBlockByHash', + [receipt?.blockHash, true] + ) - const trieRoot = ethers.utils.hexlify(trie.root()) + const trieRoot = hexlify(trie.root()) if (trieRoot !== rawBlock.receiptsRoot) { const errorMessage = @@ -65,7 +67,7 @@ export default function useTransactionTrie() { } else { if (trie) { try { - const indexOfTx = block.transactions.findIndex( + const indexOfTx = block.prefetchedTransactions.findIndex( (tx) => tx.hash === transaction.hash ) @@ -74,7 +76,7 @@ export default function useTransactionTrie() { const { stack: _stack } = await trie.findPath(key) const stack = _stack.map((node) => node.raw()) - proof = ethers.utils.hexlify(RLP.encode([1, indexOfTx, stack])) + proof = hexlify(RLP.encode([1, indexOfTx, stack])) } catch (error) { console.error(error) setErrors((e) => [...e, `Error when creating the merkle proof`]) diff --git a/packages/frontend/src/hooks/useRegisterToken.test.ts b/packages/frontend/src/hooks/useRegisterToken.test.ts index 194891b..4f7b14a 100644 --- a/packages/frontend/src/hooks/useRegisterToken.test.ts +++ b/packages/frontend/src/hooks/useRegisterToken.test.ts @@ -1,9 +1,9 @@ import { renderHook } from '@testing-library/react' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' +import { AbiCoder, parseUnits } from 'ethers' import { vi } from 'vitest' -import * as contractExports from '../contracts' import useRegisterToken from './useRegisterToken' -import { ethers } from 'ethers' const deployTokenMock = vi .fn() @@ -13,7 +13,7 @@ const contractConnectMock = vi.fn().mockReturnValue({ deployToken: deployTokenMock, }) -vi.spyOn(contractExports, 'erc20MessagingContract', 'get').mockReturnValue({ +vi.spyOn(typechainExports, 'ERC20Messaging__factory', 'get').mockReturnValue({ connect: contractConnectMock, } as any) @@ -39,14 +39,14 @@ describe('registerToken', () => { const symbol = 'TST' const supply = 1_000 - const params = ethers.utils.defaultAbiCoder.encode( + const params = AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint256', 'uint256', 'uint256'], [ name, symbol, - ethers.utils.parseUnits(cap.toString()), - ethers.utils.parseUnits(dailyMintLimit.toString()), - ethers.utils.parseUnits(supply.toString()), + parseUnits(cap.toString()), + parseUnits(dailyMintLimit.toString()), + parseUnits(supply.toString()), ] ) diff --git a/packages/frontend/src/hooks/useRegisterToken.ts b/packages/frontend/src/hooks/useRegisterToken.ts index 640f88d..9c023fb 100644 --- a/packages/frontend/src/hooks/useRegisterToken.ts +++ b/packages/frontend/src/hooks/useRegisterToken.ts @@ -1,9 +1,9 @@ -import { ContractTransaction, ethers } from 'ethers' -import { useCallback, useContext, useMemo, useState } from 'react' +import { ERC20Messaging__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' +import { AbiCoder, BrowserProvider, parseUnits } from 'ethers' +import { useCallback, useContext, useState } from 'react' import { Values } from '../components/RegisterToken' import { ErrorsContext } from '../contexts/errors' -import { erc20MessagingContract } from '../contracts' import useEthers from './useEthers' export default function useRegisterToken() { @@ -13,30 +13,32 @@ export default function useRegisterToken() { const { setErrors } = useContext(ErrorsContext) const [loading, setLoading] = useState(false) - const contract = useMemo( - () => erc20MessagingContract.connect(provider.getSigner()), - [provider] - ) - const registerToken = useCallback( async ({ cap, dailyMintLimit, name, symbol, supply }: Values) => { setLoading(true) - const params = ethers.utils.defaultAbiCoder.encode( + const signer = await (provider as BrowserProvider).getSigner() + + const erc20Messaging = ERC20Messaging__factory.connect( + import.meta.env.VITE_ERC20_MESSAGING_CONTRACT_ADDRESS, + signer + ) + + const params = AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint256', 'uint256', 'uint256'], [ name, symbol, - ethers.utils.parseUnits(cap.toString()), - ethers.utils.parseUnits(dailyMintLimit.toString()), - ethers.utils.parseUnits(supply.toString()), + parseUnits(cap.toString()), + parseUnits(dailyMintLimit.toString()), + parseUnits(supply.toString()), ] ) return new Promise((resolve, reject) => { - contract + erc20Messaging .deployToken(params) - .then((tx: ContractTransaction) => + .then((tx) => tx .wait() .then((receipt) => { @@ -52,7 +54,7 @@ export default function useRegisterToken() { }) ) .catch((error: Error) => { - console.error(error) + console.error(JSON.stringify(error)) setErrors((e) => [ ...e, { message: `Error when registering the token` }, @@ -64,7 +66,7 @@ export default function useRegisterToken() { }) }) }, - [contract] + [provider] ) return { loading, registerToken } diff --git a/packages/frontend/src/hooks/useRegisteredSubnets.test.ts b/packages/frontend/src/hooks/useRegisteredSubnets.test.ts index c51bf32..9a445cd 100644 --- a/packages/frontend/src/hooks/useRegisteredSubnets.test.ts +++ b/packages/frontend/src/hooks/useRegisteredSubnets.test.ts @@ -1,14 +1,13 @@ import { renderHook, waitFor } from '@testing-library/react' -import { BigNumber } from 'ethers' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' import { vi } from 'vitest' import useRegisteredSubnets from './useRegisteredSubnets' -import * as contractExports from '../contracts' import { Subnet } from '../types' const registeredSubnets: { [x: string]: Subnet } = { subnet1: { - chainId: BigNumber.from(1), + chainId: BigInt(1), currencySymbol: 'TST', endpointHttp: '', endpointWs: '', @@ -16,7 +15,7 @@ const registeredSubnets: { [x: string]: Subnet } = { name: 'subnetMock', }, subnet2: { - chainId: BigNumber.from(2), + chainId: BigInt(2), currencySymbol: 'TST2', endpointHttp: '', endpointWs: '', @@ -24,7 +23,7 @@ const registeredSubnets: { [x: string]: Subnet } = { name: 'subnetMock', }, incal: { - chainId: BigNumber.from(2), + chainId: BigInt(2), currencySymbol: 'TST2', endpointHttp: '', endpointWs: '', @@ -42,7 +41,7 @@ const expectedSubnets = subnetIdsByIndexes.map((id) => ({ const getSubnetCountMock = vi .fn() - .mockResolvedValue(BigNumber.from(subnetIdsByIndexes.length)) + .mockResolvedValue(BigInt(subnetIdsByIndexes.length)) const getSubnetIdAtIndexMock = vi .fn() @@ -62,9 +61,9 @@ const contractConnectMock = vi.fn().mockReturnValue({ subnets: subnetsMock, }) -vi.spyOn(contractExports, 'subnetRegistratorContract', 'get').mockReturnValue({ - connect: contractConnectMock, -} as any) +vi.spyOn(typechainExports, 'SubnetRegistrator__factory', 'get').mockReturnValue( + { connect: contractConnectMock } as any +) vi.mock('./useEthers', () => ({ default: vi.fn().mockReturnValue({ provider: {} }), diff --git a/packages/frontend/src/hooks/useRegisteredSubnets.ts b/packages/frontend/src/hooks/useRegisteredSubnets.ts index 0bd4ebc..7ffa7ee 100644 --- a/packages/frontend/src/hooks/useRegisteredSubnets.ts +++ b/packages/frontend/src/hooks/useRegisteredSubnets.ts @@ -1,8 +1,8 @@ -import { ethers } from 'ethers' +import { SubnetRegistrator__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' +import {} from 'ethers' import { useCallback, useContext, useEffect, useState } from 'react' -import { ErrorsContext } from '../contexts/errors' -import { subnetRegistratorContract } from '../contracts' +import { ErrorsContext } from '../contexts/errors' import { Subnet, SubnetWithId } from '../types' import useEthers from './useEthers' @@ -12,14 +12,17 @@ export default function useRegisteredSubnets() { const [loading, setLoading] = useState(false) const [registeredSubnets, setRegisteredSubnets] = useState() - const contract = subnetRegistratorContract.connect(provider) + const contract = SubnetRegistrator__factory.connect( + import.meta.env.VITE_SUBNET_REGISTRATOR_CONTRACT_ADDRESS, + provider + ) const getRegisteredSubnets = useCallback(async () => { setLoading(true) const registeredSubnetsCount = await contract .getSubnetCount() - .then((count: ethers.BigNumber) => count.toNumber()) + .then((count) => Number(count)) .catch((error: any) => { console.error(error) setErrors((e) => [ @@ -48,8 +51,8 @@ export default function useRegisteredSubnets() { promises.push( contract .subnets(subnetId) - .then((subnet: Subnet) => ({ - ...subnet, + .then((subnet) => ({ + ...(subnet as any).toObject(), // toObject method of ES6 Proxy id: subnetId, })) .catch((error: Error) => { diff --git a/packages/frontend/src/hooks/useRegisteredTokens.test.ts b/packages/frontend/src/hooks/useRegisteredTokens.test.ts index 9c6fec3..4c107de 100644 --- a/packages/frontend/src/hooks/useRegisteredTokens.test.ts +++ b/packages/frontend/src/hooks/useRegisteredTokens.test.ts @@ -1,13 +1,12 @@ import { renderHook, waitFor } from '@testing-library/react' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' import { vi } from 'vitest' -import * as contractExports from '../contracts' import { Token } from '../types' import useRegisteredTokens from './useRegisteredTokens' -import { BigNumber } from 'ethers' const subnetMock = { - chainId: BigNumber.from(1), + chainId: BigInt(1), currencySymbol: 'TST', endpointHttp: '', endpointWs: '', @@ -32,7 +31,7 @@ const expectedTokens = tokenKeysByIndexes.map((id) => registeredTokens[id]) const getTokenCountMock = vi .fn() - .mockResolvedValue(BigNumber.from(tokenKeysByIndexes.length)) + .mockResolvedValue(BigInt(tokenKeysByIndexes.length)) const getTokenKeyAtIndexMock = vi .fn() @@ -48,7 +47,10 @@ const tokensMock = vi const onMock = vi.fn() +const onTokenDeployedEventMock = vi.fn() + const contractConnectMock = vi.fn().mockReturnValue({ + filters: { TokenDeployed: onTokenDeployedEventMock }, getTokenCount: getTokenCountMock, getTokenKeyAtIndex: getTokenKeyAtIndexMock, on: onMock, @@ -56,7 +58,7 @@ const contractConnectMock = vi.fn().mockReturnValue({ tokens: tokensMock, }) -vi.spyOn(contractExports, 'erc20MessagingContract', 'get').mockReturnValue({ +vi.spyOn(typechainExports, 'ERC20Messaging__factory', 'get').mockReturnValue({ connect: contractConnectMock, } as any) @@ -87,6 +89,9 @@ describe('useRegisteredTokens', () => { it('should listen for new tokens', async () => { renderHook(() => useRegisteredTokens(subnetMock)) - expect(onMock).toHaveBeenCalledWith('TokenDeployed', expect.anything()) + expect(onMock).toHaveBeenCalledWith( + onTokenDeployedEventMock, + expect.anything() + ) }) }) diff --git a/packages/frontend/src/hooks/useRegisteredTokens.ts b/packages/frontend/src/hooks/useRegisteredTokens.ts index acf7743..8e8ff3d 100644 --- a/packages/frontend/src/hooks/useRegisteredTokens.ts +++ b/packages/frontend/src/hooks/useRegisteredTokens.ts @@ -1,8 +1,7 @@ -import { ethers } from 'ethers' +import { ERC20Messaging__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' import { useCallback, useContext, useEffect, useMemo, useState } from 'react' import { ErrorsContext } from '../contexts/errors' -import { erc20MessagingContract } from '../contracts' import { Subnet, Token } from '../types' import useEthers from './useEthers' @@ -14,18 +13,24 @@ export default function useRegisteredTokens(subnet?: Subnet) { const [loading, setLoading] = useState(false) const [tokens, setTokens] = useState() - const contract = useMemo( - () => (subnet ? erc20MessagingContract.connect(provider) : undefined), + const erc20Messaging = useMemo( + () => + subnet + ? ERC20Messaging__factory.connect( + import.meta.env.VITE_ERC20_MESSAGING_CONTRACT_ADDRESS, + provider + ) + : undefined, [subnet, provider] ) const getRegisteredTokens = useCallback(async () => { - if (contract) { + if (erc20Messaging) { setLoading(true) - const registeredTokensCount = await contract + const registeredTokensCount = await erc20Messaging .getTokenCount() - .then((count: ethers.BigNumber) => count.toNumber()) + .then((count) => Number(count)) .catch((error: any) => { console.error(error) setErrors((e) => [ @@ -38,7 +43,7 @@ export default function useRegisteredTokens(subnet?: Subnet) { const promises = [] let i = 0 while (i < registeredTokensCount) { - const tokenKey = await contract + const tokenKey = await erc20Messaging .getTokenKeyAtIndex(i) .catch((error: any) => { console.error(error) @@ -52,7 +57,7 @@ export default function useRegisteredTokens(subnet?: Subnet) { if (tokenKey !== undefined) { promises.push( - contract.tokens(tokenKey).catch((error: any) => { + erc20Messaging.tokens(tokenKey).catch((error: any) => { console.error(error) setErrors((e) => [ ...e, @@ -77,7 +82,7 @@ export default function useRegisteredTokens(subnet?: Subnet) { setLoading(false) } - }, [contract]) + }, [erc20Messaging]) useEffect( function onSubnetChange() { @@ -90,17 +95,23 @@ export default function useRegisteredTokens(subnet?: Subnet) { useEffect( function watchTokenDeployed() { - if (contract && getRegisteredTokens) { - contract.on('TokenDeployed', getRegisteredTokens) + if (erc20Messaging && getRegisteredTokens) { + erc20Messaging.on( + erc20Messaging.filters.TokenDeployed, + getRegisteredTokens + ) } return function cleanup() { - if (contract && getRegisteredTokens) { - contract.removeListener('TokenDeployed', getRegisteredTokens) + if (erc20Messaging && getRegisteredTokens) { + erc20Messaging.removeListener( + erc20Messaging.filters.TokenDeployed, + getRegisteredTokens + ) } } }, - [contract, getRegisteredTokens] + [erc20Messaging, getRegisteredTokens] ) return { loading, tokens } diff --git a/packages/frontend/src/hooks/useSendToken.test.ts b/packages/frontend/src/hooks/useSendToken.test.ts index 3ad176f..aee2388 100644 --- a/packages/frontend/src/hooks/useSendToken.test.ts +++ b/packages/frontend/src/hooks/useSendToken.test.ts @@ -1,9 +1,8 @@ import { act, renderHook } from '@testing-library/react' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' import { vi } from 'vitest' -import * as contractExports from '../contracts' import useSendToken from './useSendToken' -import { BigNumber, ethers } from 'ethers' const sendTokenMock = vi .fn() @@ -13,7 +12,7 @@ const contractConnectMock = vi.fn().mockReturnValue({ sendToken: sendTokenMock, }) -vi.spyOn(contractExports, 'erc20MessagingContract', 'get').mockReturnValue({ +vi.spyOn(typechainExports, 'ERC20Messaging__factory', 'get').mockReturnValue({ connect: contractConnectMock, } as any) @@ -36,7 +35,7 @@ describe('sendToken', () => { const receivingSubnetId = 'receiving' const tokenSymbol = 'tokenSymbol' const recipientAddress = 'receivingAddr' - const amount = BigNumber.from(1) + const amount = BigInt(1) await act(() => { result.current diff --git a/packages/frontend/src/hooks/useSendToken.ts b/packages/frontend/src/hooks/useSendToken.ts index 91da202..ed22f7e 100644 --- a/packages/frontend/src/hooks/useSendToken.ts +++ b/packages/frontend/src/hooks/useSendToken.ts @@ -1,12 +1,16 @@ -import { BigNumber, ContractReceipt, ContractTransaction } from 'ethers' -import { useCallback, useMemo, useState } from 'react' +import { ERC20Messaging__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' +import { + BrowserProvider, + ContractTransactionReceipt, + ContractTransactionResponse, +} from 'ethers' +import { useCallback, useState } from 'react' -import { erc20MessagingContract } from '../contracts' import useEthers from './useEthers' export interface SendTokenOutput { - sendTokenTx: ContractTransaction - sendTokenReceipt: ContractReceipt + sendTokenTx: ContractTransactionResponse + sendTokenReceipt: ContractTransactionReceipt | null } export default function useSendToken() { @@ -15,26 +19,28 @@ export default function useSendToken() { }) const [loading, setLoading] = useState(false) - const contract = useMemo( - () => erc20MessagingContract.connect(provider.getSigner()), - [provider] - ) - const sendToken = useCallback( - ( + async ( receivingSubnetId: string, tokenSymbol: string, recipientAddress: string, - amount: BigNumber - ) => - new Promise((resolve, reject) => { - setLoading(true) + amount: bigint + ) => { + setLoading(true) - contract + const signer = await (provider as BrowserProvider).getSigner() + + const erc20Messaging = ERC20Messaging__factory.connect( + import.meta.env.VITE_ERC20_MESSAGING_CONTRACT_ADDRESS, + signer + ) + + return new Promise((resolve, reject) => { + erc20Messaging .sendToken(receivingSubnetId, tokenSymbol, recipientAddress, amount, { gasLimit: 4_000_000, }) - .then((tx: ContractTransaction) => { + .then((tx) => { tx.wait() .then((receipt) => { resolve({ sendTokenTx: tx, sendTokenReceipt: receipt }) @@ -53,8 +59,9 @@ export default function useSendToken() { .finally(() => { setLoading(false) }) - }), - [contract] + }) + }, + [provider] ) return { loading, sendToken } diff --git a/packages/frontend/src/hooks/useTokenBalance.test.ts b/packages/frontend/src/hooks/useTokenBalance.test.ts index 53e9c61..65f0244 100644 --- a/packages/frontend/src/hooks/useTokenBalance.test.ts +++ b/packages/frontend/src/hooks/useTokenBalance.test.ts @@ -1,12 +1,13 @@ import { renderHook, waitFor } from '@testing-library/react' -import { BigNumber, ethers } from 'ethers' +import * as typechainExports from '@topos-protocol/topos-smart-contracts/typechain-types' +import { formatUnits } from 'ethers' import { vi } from 'vitest' import { Subnet, Token } from '../types' import useTokenBalance from './useTokenBalance' const subnetMock: Subnet = { - chainId: BigNumber.from(1), + chainId: BigInt(1), currencySymbol: 'TST', endpointHttp: '', endpointWs: '', @@ -19,16 +20,24 @@ const tokenMock: Token = { symbol: 'TST2', } -const balanceOfMock = vi.fn().mockResolvedValue(1) +const balanceOfMock = vi.fn().mockResolvedValue(BigInt(1)) -vi.spyOn(ethers, 'Contract').mockReturnValue({ - balanceOf: balanceOfMock, +const contractConnectMock = vi + .fn() + .mockReturnValue({ balanceOf: balanceOfMock }) + +vi.spyOn( + typechainExports, + 'BurnableMintableCappedERC20__factory', + 'get' +).mockReturnValue({ + connect: contractConnectMock, } as any) vi.mock('./useEthers', () => ({ default: vi.fn().mockReturnValue({ provider: { - getSigner: vi.fn().mockReturnValue({ getAddress: vi.fn() }), + getSigner: vi.fn().mockResolvedValue({ getAddress: vi.fn() }), }, }), })) @@ -40,7 +49,7 @@ describe('useTokenBalance', () => { await waitFor(() => { expect(balanceOfMock).toHaveBeenCalled() - expect(result.current.balance).toBe(ethers.utils.formatUnits(1)) + expect(result.current.balance).toBe(formatUnits(1)) }) }) diff --git a/packages/frontend/src/hooks/useTokenBalance.ts b/packages/frontend/src/hooks/useTokenBalance.ts index f7a46a4..62d8162 100644 --- a/packages/frontend/src/hooks/useTokenBalance.ts +++ b/packages/frontend/src/hooks/useTokenBalance.ts @@ -1,5 +1,5 @@ -import * as BurnableMintableCappedERC20JSON from '@topos-protocol/topos-smart-contracts/artifacts/contracts/topos-core/BurnableMintableCappedERC20.sol/BurnableMintableCappedERC20.json' -import { ethers } from 'ethers' +import { BurnableMintableCappedERC20__factory } from '@topos-protocol/topos-smart-contracts/typechain-types' +import { BrowserProvider, formatUnits } from 'ethers' import { useEffect, useMemo, useState } from 'react' import { Subnet, Token } from '../types' @@ -13,19 +13,15 @@ export default function useTokenBalance(subnet?: Subnet, token?: Token) { const [loading, setLoading] = useState(false) const [balance, setBalance] = useState() - const signerAddress = useMemo(() => { - const signer = provider.getSigner() + const signerAddress = useMemo(async () => { + const signer = await (provider as BrowserProvider).getSigner() return signer.getAddress() }, [provider]) const tokenContract = useMemo( () => token - ? new ethers.Contract( - token.addr, - BurnableMintableCappedERC20JSON.abi, - provider - ) + ? BurnableMintableCappedERC20__factory.connect(token.addr, provider) : null, [token, provider] ) @@ -35,7 +31,7 @@ export default function useTokenBalance(subnet?: Subnet, token?: Token) { async function _() { if (tokenContract) { const balance = await tokenContract.balanceOf(signerAddress) - setBalance(ethers.utils.formatUnits(balance)) + setBalance(formatUnits(balance)) } } diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx index 4dd2547..1aa2a9a 100644 --- a/packages/frontend/src/index.tsx +++ b/packages/frontend/src/index.tsx @@ -7,6 +7,13 @@ import App from './App' import reportWebVitals from './reportWebVitals' import './telemetry' +Object.defineProperty(BigInt.prototype, 'toJSON', { + get() { + 'use strict' + return () => String(this) + }, +}) + const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement) root.render( // diff --git a/packages/frontend/src/types.ts b/packages/frontend/src/types.ts index e0451db..c9f31da 100644 --- a/packages/frontend/src/types.ts +++ b/packages/frontend/src/types.ts @@ -1,7 +1,5 @@ -import { BigNumber } from 'ethers' - export interface Subnet { - chainId: BigNumber + chainId: bigint currencySymbol: string endpointHttp: string endpointWs: string