diff --git a/.circleci/config.yml b/.circleci/config.yml index 44caca4..a2b91db 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -50,4 +50,4 @@ workflows: - test: matrix: parameters: - node-version: ['18.12', '16.18'] \ No newline at end of file + node-version: ['20.9', '18.12', '16.18'] \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index c32828c..0a47c85 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -lts/hydrogen \ No newline at end of file +lts/iron \ No newline at end of file diff --git a/README.md b/README.md index dd3905e..4039dd7 100644 --- a/README.md +++ b/README.md @@ -117,26 +117,12 @@ interface EthersModuleOptions { */ quorum?: number; - /** - * Optional parameter if this option is false, EthersModule won't wait until - * the providers are ready. If this option is true, EthersModule will wait - * until the network has heen established for all the providers. - * @see {@link https://docs.ethers.io/v5/api/providers/provider/#Provider-ready} - */ - waitUntilIsConnected?: boolean; - /** * Optional parameter if this option is false, EthersModule will try to connect * with the credentials provided in options. If you define more than one provider, * EthersModule will use the FallbackProvider to send multiple requests simultaneously. */ useDefaultProvider?: boolean; - - /** - * Optional parameter if this option is true, EthersModule will disable - * the console.log in the ethers.js library. - */ - disableEthersLogger?: boolean /** * Optional parameter to associate a token name to EthersProvider, diff --git a/package-lock.json b/package-lock.json index 14d3e83..f0ba4c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,46 +8,34 @@ "name": "nestjs-ethers", "version": "3.0.0-beta.1", "license": "Apache", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/contracts": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.1", - "@ethersproject/providers": "^5.7.2", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/wallet": "^5.7.0", - "@ethersproject/web": "^5.7.1", - "@ethersproject/wordlists": "^5.7.0" - }, "devDependencies": { "@nestjs/common": "^10.2.7", "@nestjs/core": "^10.2.7", "@nestjs/platform-express": "^10.2.7", "@nestjs/platform-fastify": "^10.2.7", - "@types/node": "^18.11.9", - "@types/supertest": "^2.0.14", - "@typescript-eslint/eslint-plugin": "^6.7.5", - "@typescript-eslint/parser": "^6.7.5", - "eslint": "^8.51.0", + "@types/node": "^20.8.9", + "@types/supertest": "^2.0.15", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.28.1", + "eslint-plugin-import": "^2.29.0", "eslint-plugin-prettier": "^5.0.1", - "nock": "^13.3.4", + "ethers": "^6.8.0", + "nock": "^13.3.7", "pre-commit": "^1.2.2", "prettier": "^3.0.3", "rxjs": "^7.8.1", "supertest": "^6.3.3", - "tap": "^18.5.1", + "tap": "^18.5.3", "typescript": "^5.2.2" }, "engines": { - "node": "^16.x || >=18.x" + "node": "^16.x || >=18.x || >=20.x" }, "peerDependencies": { - "@nestjs/common": "^10.2.7" + "@nestjs/common": "^10.2.7", + "ethers": "^6.8.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -59,6 +47,12 @@ "node": ">=0.10.0" } }, + "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==", + "dev": true + }, "node_modules/@alcalzone/ansi-tokenize": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", @@ -124,9 +118,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -156,642 +150,14 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "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/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/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/@fastify/ajv-compiler": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", @@ -885,12 +251,12 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -912,9 +278,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1174,6 +540,30 @@ } } }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1225,44 +615,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@npmcli/agent/node_modules/lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", @@ -1272,20 +624,6 @@ "node": "14 || >=16.14" } }, - "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@npmcli/fs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", @@ -1412,14 +750,14 @@ } }, "node_modules/@npmcli/run-script": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.1.tgz", - "integrity": "sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.2.tgz", + "integrity": "sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==", "dev": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^9.0.0", + "node-gyp": "^10.0.0", "read-package-json-fast": "^3.0.0", "which": "^4.0.0" }, @@ -1521,9 +859,9 @@ } }, "node_modules/@sigstore/sign": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.1.0.tgz", - "integrity": "sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz", + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==", "dev": true, "dependencies": { "@sigstore/bundle": "^2.1.0", @@ -1534,28 +872,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/@sigstore/tuf": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", @@ -1570,9 +886,9 @@ } }, "node_modules/@tapjs/after": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-1.1.12.tgz", - "integrity": "sha512-I1p8j3GJdgticIdi/ADYmDnjcpdk+5gXGwcoPoxQXsusXtXf6Icj/rjnVEY8l33DSsQXEG24ZeDmLApskuIFpA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-1.1.13.tgz", + "integrity": "sha512-E2yGUayyCmgtyGDGIcejcVZjdcTmqxEfQexS/TTdELE2cCVYDlkTog5sRJVW02fQUyKrqta0X6bfUjT5+VtO9g==", "dev": true, "dependencies": { "is-actual-promise": "^1.0.0" @@ -1581,13 +897,13 @@ "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/after-each": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-1.1.12.tgz", - "integrity": "sha512-7BNGvx3KlSZ0t6CEHWhHezwAvrF8xWK2tuPqXy1N5TVXdkc0+PQv8tYkKuep0VHcMOI1t8uZ5rdTlzZulpfe8w==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-1.1.13.tgz", + "integrity": "sha512-KnX5QCz+f0Qvm8ZkN+/QugSqbNznVTisNu+xbYWY+m2sOhUtyNYSsqvxcKEhpBTS+fRjTPl1wU5ocZv5dDUMEA==", "dev": true, "dependencies": { "function-loop": "^4.0.0" @@ -1596,13 +912,13 @@ "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/asserts": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-1.1.12.tgz", - "integrity": "sha512-E8DmpbDiR8xTh098GXwEr7/xPO5/Sm7Ume33KzOvVSTCPEv2fCqegKOh4gNeL3HF0BqhGnndj7mPaOgF0gtrfA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-1.1.13.tgz", + "integrity": "sha512-nX9Dzkz4BToVw6Foi/naQO2oId4kvu1nOd9Brql75TrLOhSIf0BNhmUtedPouzefqHTnOQcOK+wxPqm2mUCvHQ==", "dev": true, "dependencies": { "@tapjs/stack": "1.2.6", @@ -1617,13 +933,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/before": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-1.1.12.tgz", - "integrity": "sha512-nfwPqwkYWgHr5SI2xK6ExWyX+FsCOIh0DrPp2ZUKT1UrD0+11sREwPD0XMv7TtFJ9AIu00imEmrlYZdaL6cDUA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-1.1.13.tgz", + "integrity": "sha512-IBgbKmc5Mqw+4JX0A52ZSn3ycwIQSNkqfOEjzELrEqhLuzeyQnb99P6QZKYfcVDaMhPqeYHRO+ziJOgtbAgPkQ==", "dev": true, "dependencies": { "is-actual-promise": "^1.0.0" @@ -1632,13 +948,13 @@ "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/before-each": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-1.1.12.tgz", - "integrity": "sha512-9Qa8ykkeklVY4mFirdlZlvDCJvlm6BwU4TqlnTRjWoADBLEOcZi8dcjaLhNsdv1DBcny+aK6Db51gcQkUK4OLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-1.1.13.tgz", + "integrity": "sha512-wprmLLmX9QowI9Z5eNtQ8/PRpLHzip99PxukOR59V2839Ypmwu9e1vVfrSIU1F6u6CcUrb80SaJDf2Izm8hmBg==", "dev": true, "dependencies": { "function-loop": "^4.0.0" @@ -1647,17 +963,17 @@ "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/config": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-2.4.8.tgz", - "integrity": "sha512-tIQ/nv3Fr2sV7JUtQyHtQV0WS9xJSN25Q85wBfqxsSgz/JuuK46rNubB0MNkJ3nxupCIItc8MYVxNyHB+n+28w==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-2.4.9.tgz", + "integrity": "sha512-3coHlkF0XJn59ixl0ln2vRn2SyYPUXyoLDixu4jP/C38ZA7yYTlpsDYuovNiMhXUgJi1AMbWCqASmYL49rn8Sw==", "dev": true, "dependencies": { - "@tapjs/core": "1.4.1", - "@tapjs/test": "1.3.12", + "@tapjs/core": "1.4.2", + "@tapjs/test": "1.3.13", "chalk": "^5.2.0", "jackspeak": "^2.3.6", "polite-json": "^4.0.1", @@ -1671,8 +987,8 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1", - "@tapjs/test": "1.3.12" + "@tapjs/core": "1.4.2", + "@tapjs/test": "1.3.13" } }, "node_modules/@tapjs/config/node_modules/chalk": { @@ -1688,14 +1004,14 @@ } }, "node_modules/@tapjs/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-1.4.1.tgz", - "integrity": "sha512-EApY3r/8bLRmgHF/2V0X0TK2lzbXqYxHsbdoOiDlSB/P98IFDYKVAefu+IhOItvoVM4kT4J7qOCLVKl77eutvA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-1.4.2.tgz", + "integrity": "sha512-+mI2R8l/LjRrf7VLcme7jumi9MZb8vx3ARrheuS/djaXdcUd7lWHMjJSvCvnWhV5twTTUsfnc7GytWeFL3N4vA==", "dev": true, "dependencies": { - "@tapjs/processinfo": "^3.1.4", + "@tapjs/processinfo": "^3.1.5", "@tapjs/stack": "1.2.6", - "@tapjs/test": "1.3.12", + "@tapjs/test": "1.3.13", "async-hook-domain": "^4.0.1", "diff": "^5.1.0", "is-actual-promise": "^1.0.0", @@ -1738,9 +1054,9 @@ } }, "node_modules/@tapjs/filter": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-1.2.12.tgz", - "integrity": "sha512-0Yh9CeAUkoxp/3hl1u8Zh2GaW9x90n2O6IxOWtteuImdgiSBDwcmXtcDz+gkdZmWEexU/QRHct6Y0tZ1X8lXwg==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-1.2.13.tgz", + "integrity": "sha512-HahbPSl5gkJ12pIRqMq595A0zNMaTSUvQyLYtDX8GhQM7YanCMLPPPfxg5SFk2p7XinxN5HUiZ5i+Jh1W9tpeQ==", "dev": true, "engines": { "node": ">=16" @@ -1749,13 +1065,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/fixture": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-1.2.12.tgz", - "integrity": "sha512-w0cswMM107KfVOHCALF6rH4njxeu8iZghdQuehoYLcW9dONArRFQxMRUUXKZBE+2+2jfs1aZELzZJPYfLojsWA==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-1.2.13.tgz", + "integrity": "sha512-PPw4EqgIwOzoPjaPSv4O6l7e5RKLEhJH1CbrTqdaM2YxuLgC9Gv9AN0LxJsXsfTnJgoWodzC29dE7JB5RJINuQ==", "dev": true, "dependencies": { "mkdirp": "^3.0.0", @@ -1768,7 +1084,7 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/fixture/node_modules/brace-expansion": { @@ -1851,28 +1167,28 @@ } }, "node_modules/@tapjs/intercept": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-1.2.12.tgz", - "integrity": "sha512-Bbpt7hlbsWdQ9CXxCKJ64ObVriFz3o2/1v3iFQbmIft+5ZtRrSzvz5inetW3LjXr6jgt4Fm07HW3bcZ09Laczg==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-1.2.13.tgz", + "integrity": "sha512-/miqU/GK+AFW1y7Wc3N/1OpcFYK++voQ/Ai4u2cORbcxnUt0cWBxHPOZOyepZqwX88sPwr1NdrCV1/B3BbgPWw==", "dev": true, "dependencies": { - "@tapjs/after": "1.1.12", + "@tapjs/after": "1.1.13", "@tapjs/stack": "1.2.6" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/mock": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-1.2.10.tgz", - "integrity": "sha512-OU12N9gQ/XpRe0mAvkqyfXSXhoB2j0N2LoL1dQ98ygM/UlGFITqqN9Y74QtJWAEPqF5j2Ny9HV9wW7rVrNUCGg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-1.2.11.tgz", + "integrity": "sha512-fXMvbQa04qfnNjgGN/cKWj52flYpN8J18/gkWQDbiOLieC1QJVtF1tkTohL602mqVbxn+9rOpTPjDvyJhi65zg==", "dev": true, "dependencies": { - "@tapjs/after": "1.1.12", + "@tapjs/after": "1.1.13", "@tapjs/stack": "1.2.6", "resolve-import": "^1.4.4", "walk-up-path": "^3.0.1" @@ -1884,13 +1200,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/node-serialize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-1.2.1.tgz", - "integrity": "sha512-pKuPJhzrGYAzw/aUAftDwIpnetpGBcRi8o8M3LR7PN5Hoo25ABi5JlhQHaTHMK/VLZH/Sdu/MM8zZPbUnMLgxQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-1.2.2.tgz", + "integrity": "sha512-ycPPYNxRsj/AFoqaGY5P38nehMVcwMAz7U0uRO7/2dh4vxUQcKyIBh5KNhB3z/EEas5wiQip+YJ1CW1fAx/PHg==", "dev": true, "dependencies": { "@tapjs/error-serdes": "1.2.0", @@ -1904,13 +1220,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/processinfo": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.4.tgz", - "integrity": "sha512-PpA2WmgBh73P6U6oi7k01wjb4Lbe4/d8vnYrhii2qeJtdbvV3O5Zqr5HoBgOGVgnjf/0NcJ0KH1zQJfVbUAm5g==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.5.tgz", + "integrity": "sha512-KCx0Dbatmuja9soLFFK1asDwodz+16gwHL9QWiziz83b7LK4x5h9kiUbbhTi3I3wtKREeaN8caNA0Z2m6Yxsag==", "dev": true, "dependencies": { "pirates": "^4.0.5", @@ -1935,12 +1251,12 @@ } }, "node_modules/@tapjs/reporter": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-1.3.8.tgz", - "integrity": "sha512-cqqF6Sv3FlCybIbE5lK2uQXOa8xPaASR/+mw6HF93e89Rdk2JDw++y45pGo0npAuCHd6fMrIPjF6e7YRTevwkA==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-1.3.10.tgz", + "integrity": "sha512-5fDwmDMXe20NiW8p8AQ7Tn9mrnFCwY3qX7iBJ7z2+4cgAzvoLdkqcjoUwBW15KwxfcJPm8oFMhf0Wv+d84A7OQ==", "dev": true, "dependencies": { - "@tapjs/config": "2.4.8", + "@tapjs/config": "2.4.9", "@tapjs/stack": "1.2.6", "chalk": "^5.2.0", "ink": "^4.4.1", @@ -1961,7 +1277,7 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/reporter/node_modules/chalk": { @@ -1983,19 +1299,19 @@ "dev": true }, "node_modules/@tapjs/run": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-1.4.8.tgz", - "integrity": "sha512-RIAklQxHCQTtxK2QUgvXvrKEoyJVVgOYBMELLVPs+0IRMvkGReQ9tyBqsAMuKH9EvMF85d9dZ/Ali2EM6/5nZw==", - "dev": true, - "dependencies": { - "@tapjs/after": "1.1.12", - "@tapjs/before": "1.1.12", - "@tapjs/config": "2.4.8", - "@tapjs/processinfo": "^3.1.4", - "@tapjs/reporter": "1.3.8", - "@tapjs/spawn": "1.1.12", - "@tapjs/stdin": "1.1.12", - "@tapjs/test": "1.3.12", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-1.4.10.tgz", + "integrity": "sha512-m1464ealbd+NL2WkYoevFveXhwCNU1I+MG0JpuAh/7MSEORRiG73ivRQOyfBVxfjeFMHVy4i99Sx1x9WDkHO7Q==", + "dev": true, + "dependencies": { + "@tapjs/after": "1.1.13", + "@tapjs/before": "1.1.13", + "@tapjs/config": "2.4.9", + "@tapjs/processinfo": "^3.1.5", + "@tapjs/reporter": "1.3.10", + "@tapjs/spawn": "1.1.13", + "@tapjs/stdin": "1.1.13", + "@tapjs/test": "1.3.13", "c8": "^8.0.1", "chalk": "^5.3.0", "chokidar": "^3.5.3", @@ -2025,7 +1341,7 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/run/node_modules/brace-expansion": { @@ -2156,9 +1472,9 @@ } }, "node_modules/@tapjs/snapshot": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-1.2.12.tgz", - "integrity": "sha512-1+fxWM9kCHdXFbXyyq5veI1ZZvEWbNCmRL9vACM7aQoE21rD9n2TJV7FNpf7TOVT2wdFCIAYTYAYp5BqCNMlrg==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-1.2.13.tgz", + "integrity": "sha512-/vW3kOxNA1vclsEU87A5vZ7edRbrL1Hlm7LauJwRAvAgdW2VrEcc1ivyCMbWvYi11csGu1MM9A2Poo/aOhzQ/Q==", "dev": true, "dependencies": { "is-actual-promise": "^1.0.0", @@ -2172,19 +1488,19 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/spawn": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-1.1.12.tgz", - "integrity": "sha512-xwcx2y/wbR5oyQWM4/VX0/3hHOuUuDQFNguorNYI3I2WDe1MAWdVluhY2EibM1/Wb+z/CiEoZbZBqJg1xDfdJQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-1.1.13.tgz", + "integrity": "sha512-s2byTuuyyPv+8uI4xSspFhiFPddi/Bwz2a/RHQVm3IKuvO0gW9KA53J8PEjWIRXLFNgf5X0xWIYGgMXeklYN/w==", "dev": true, "engines": { "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/stack": { @@ -2200,39 +1516,39 @@ } }, "node_modules/@tapjs/stdin": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-1.1.12.tgz", - "integrity": "sha512-K9a+0uKEeAflyfkUI66jqHnyZAfZD/NDVV8vGHx16VnCSe2V4UY1qMDLA6ZbUaS5sPX9Va+kkS7sPl7qxHVsTw==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-1.1.13.tgz", + "integrity": "sha512-ilamAMcQ7TPzuB4fVLtTyCYaqU3bAh1YLssmwtcYwRE0J4szNIFLMsduVjWLNGnjViKRHI6x1iHGOZg2IwTXug==", "dev": true, "engines": { "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/test": { - "version": "1.3.12", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-1.3.12.tgz", - "integrity": "sha512-j7EPow6xdY7+FwLx8dNCgZcf4E1ffsrsfel7Q6GsQ4IWPgmx+Uw4Z9aCZYsVaPrwjuPG7/WGr+vl94yoYLKGeQ==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-1.3.13.tgz", + "integrity": "sha512-eqlrFgdMwOuqMeMGWMButPmas7q5Z0yEqmyBZIsjKk246wN1GUKIwGxX+K0THMBHaiSKW4c/PvXpMynZyywqbw==", "dev": true, "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.1", - "@tapjs/after": "1.1.12", - "@tapjs/after-each": "1.1.12", - "@tapjs/asserts": "1.1.12", - "@tapjs/before": "1.1.12", - "@tapjs/before-each": "1.1.12", - "@tapjs/filter": "1.2.12", - "@tapjs/fixture": "1.2.12", - "@tapjs/intercept": "1.2.12", - "@tapjs/mock": "1.2.10", - "@tapjs/node-serialize": "1.2.1", - "@tapjs/snapshot": "1.2.12", - "@tapjs/spawn": "1.1.12", - "@tapjs/stdin": "1.1.12", - "@tapjs/typescript": "1.3.1", - "@tapjs/worker": "1.1.12", + "@tapjs/after": "1.1.13", + "@tapjs/after-each": "1.1.13", + "@tapjs/asserts": "1.1.13", + "@tapjs/before": "1.1.13", + "@tapjs/before-each": "1.1.13", + "@tapjs/filter": "1.2.13", + "@tapjs/fixture": "1.2.13", + "@tapjs/intercept": "1.2.13", + "@tapjs/mock": "1.2.11", + "@tapjs/node-serialize": "1.2.2", + "@tapjs/snapshot": "1.2.13", + "@tapjs/spawn": "1.1.13", + "@tapjs/stdin": "1.1.13", + "@tapjs/typescript": "1.3.2", + "@tapjs/worker": "1.1.13", "glob": "^10.3.10", "jackspeak": "^2.3.6", "mkdirp": "^3.0.0", @@ -2250,7 +1566,7 @@ "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/test/node_modules/brace-expansion": { @@ -2333,9 +1649,9 @@ } }, "node_modules/@tapjs/typescript": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-1.3.1.tgz", - "integrity": "sha512-RswIFHgSVMPxeFvLE4C8l7MHJCEQfBbmkkkfVYg2asB9++R1wEQVW9TClPCl83McQqL7vuqSsX3PijWu0ylOFA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-1.3.2.tgz", + "integrity": "sha512-R8E36Kd1ImufcygVzSbQt/rEgg5RIW+CvIBzJNmv1IczRoAVFo5/OElZwOThiko7CAxDMRJxI8Cla63uK3gsLA==", "dev": true, "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.1" @@ -2344,28 +1660,19 @@ "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" + "@tapjs/core": "1.4.2" } }, "node_modules/@tapjs/worker": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-1.1.12.tgz", - "integrity": "sha512-NJ9GnibFF/+5QT8F78osEvI74McbLvyM/P7HJD21vca1LQE/c9laXexjCmw8sfV+10FirWltkM/OCPL95zAshA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-1.1.13.tgz", + "integrity": "sha512-B/g1rdQcuOFdU6OeBHkdYUjzM6pbHo64nV+ckQNE7Atj4yzV0u7C+Emq+f7F+zItsGXaMm/a4Z7Zoliszy7YXw==", "dev": true, "engines": { "node": ">=16" }, "peerDependencies": { - "@tapjs/core": "1.4.1" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" + "@tapjs/core": "1.4.2" } }, "node_modules/@tsconfig/node14": { @@ -2439,21 +1746,21 @@ } }, "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-LZ8SD3LpNmLMDLkG2oCBjZg+ETnx6XdCjydUE0HwojDmnDfDUnhMKKbtth1TZh+hzcqb03azrYWoXLS8sMXdqg==", "dev": true }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/json5": { @@ -2463,21 +1770,24 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.18.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.5.tgz", - "integrity": "sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==", - "dev": true + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/superagent": { - "version": "4.1.19", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.19.tgz", - "integrity": "sha512-McM1mlc7PBZpCaw0fw/36uFqo0YeA6m8JqoyE4OfqXsZCIg0hPP2xdE6FM7r6fdprDZHlJwDpydUj1R++93hCA==", + "version": "4.1.20", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.20.tgz", + "integrity": "sha512-GfpwJgYSr3yO+nArFkmyqv3i0vZavyEG5xPd/o95RwpKYpsOKJYI5XLdxLpdRbZI3YiGKKdIOFIf/jlP7A0Jxg==", "dev": true, "dependencies": { "@types/cookiejar": "*", @@ -2485,25 +1795,25 @@ } }, "node_modules/@types/supertest": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.14.tgz", - "integrity": "sha512-Q900DeeHNFF3ZYYepf/EyJfZDA2JrnWLaSQ0YNV7+2GTo8IlJzauEnDGhya+hauncpBYTYGpVHwGdssJeAQ7eA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.15.tgz", + "integrity": "sha512-jUCZZ/TMcpGzoSaed9Gjr8HCf3HehExdibyw3OHHEL1als1KmyzcOZZH4MjbObI8TkWsEr7bc7gsW0WTDni+qQ==", "dev": true, "dependencies": { "@types/superagent": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", - "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2529,15 +1839,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.5.tgz", - "integrity": "sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -2557,13 +1867,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2574,13 +1884,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", - "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -2601,9 +1911,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2614,13 +1924,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", - "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2641,17 +1951,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", - "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" }, "engines": { @@ -2666,12 +1976,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2682,12 +1992,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -2720,9 +2039,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2741,41 +2060,30 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "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==", + "dev": true }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "humanize-ms": "^1.2.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -2919,50 +2227,17 @@ "node": ">= 8" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "dev": true - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "dev": true + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, "node_modules/arg": { "version": "4.1.3", @@ -3190,11 +2465,6 @@ } ] }, - "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-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -3213,11 +2483,6 @@ "node": ">=8" } }, - "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", @@ -3291,11 +2556,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/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -3489,13 +2749,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3759,15 +3020,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3813,12 +3065,6 @@ "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", "dev": true }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4018,12 +3264,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4098,25 +3338,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "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/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4171,26 +3392,26 @@ "dev": true }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -4200,7 +3421,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -4214,7 +3435,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -4224,26 +3445,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -4291,18 +3512,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4403,26 +3625,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -4588,6 +3810,46 @@ "node": ">= 0.6" } }, + "node_modules/ethers": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.8.0.tgz", + "integrity": "sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q==", + "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.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/@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/ethers/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/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -5200,54 +4462,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5258,15 +4472,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5406,15 +4620,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -5434,12 +4639,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5484,19 +4689,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "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==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/hexoid": { @@ -5508,16 +4710,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/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", @@ -5568,30 +4760,29 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -5603,15 +4794,6 @@ "node": ">=14.18.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5739,7 +4921,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ink": { "version": "4.4.1", @@ -5836,13 +5019,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -5949,12 +5132,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6318,11 +5501,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "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", @@ -6457,169 +5635,69 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "loose-envify": "cli.js" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "semver": "^7.5.3" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/media-typer": { @@ -6719,16 +5797,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6980,14 +6048,13 @@ } }, "node_modules/nock": { - "version": "13.3.4", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.4.tgz", - "integrity": "sha512-DDpmn5oLEdCTclEqweOT4U7bEpuoifBMFUXem9sA4turDAZ5tlbrEoWqCorwXey8CaAw44mst5JOQeVNiwtkhw==", + "version": "13.3.7", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.7.tgz", + "integrity": "sha512-z3voRxo6G0JxqCsjuzERh1ReFC4Vp2b7JpSgcMJB6jnJbUszf88awAeQLIID2UNMwbMh9/Zm5sFscagj0QYHEg==", "dev": true, "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", "propagate": "^2.0.0" }, "engines": { @@ -7015,43 +6082,112 @@ } }, "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.0.tgz", + "integrity": "sha512-LkaKUbjyacJGRHiuhUeUblzZNxTF1/XNooyAl6aiaJ6ZpeurR4Mk9sjxncGNSI7pETqyqM+hLAER0788oSxt0A==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" + "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { @@ -7171,28 +6307,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -7220,21 +6334,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7245,9 +6344,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7629,9 +6728,9 @@ } }, "node_modules/pino": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.0.tgz", - "integrity": "sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==", + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.1.tgz", + "integrity": "sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", @@ -7895,9 +6994,9 @@ } }, "node_modules/process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.0.tgz", + "integrity": "sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==", "dev": true }, "node_modules/promise-inflight": { @@ -8646,11 +7745,6 @@ "loose-envify": "^1.1.0" } }, - "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/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", @@ -8732,18 +7826,27 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, "node_modules/set-cookie-parser": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -8882,17 +7985,17 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "dev": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/sonic-boom": { @@ -9428,29 +8531,29 @@ } }, "node_modules/tap": { - "version": "18.5.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-18.5.1.tgz", - "integrity": "sha512-PdryPwDpb7LK4ApRLkCCkzQXyZA+A/FmOtWiFoiYI3HV0fBdM9aotyOZ1bYrVWQ9rccNpH2f0xrJQBlGDMdweg==", - "dev": true, - "dependencies": { - "@tapjs/after": "1.1.12", - "@tapjs/after-each": "1.1.12", - "@tapjs/asserts": "1.1.12", - "@tapjs/before": "1.1.12", - "@tapjs/before-each": "1.1.12", - "@tapjs/core": "1.4.1", - "@tapjs/filter": "1.2.12", - "@tapjs/fixture": "1.2.12", - "@tapjs/intercept": "1.2.12", - "@tapjs/mock": "1.2.10", - "@tapjs/node-serialize": "1.2.1", - "@tapjs/run": "1.4.8", - "@tapjs/snapshot": "1.2.12", - "@tapjs/spawn": "1.1.12", - "@tapjs/stdin": "1.1.12", - "@tapjs/test": "1.3.12", - "@tapjs/typescript": "1.3.1", - "@tapjs/worker": "1.1.12", + "version": "18.5.3", + "resolved": "https://registry.npmjs.org/tap/-/tap-18.5.3.tgz", + "integrity": "sha512-TrcgwuQp0siTg/2MGJiZ1T5f3N+JZAOpPq+VR66+j6x9dCxw+1CuaUzWGW34ebCTxy8efT0akZ6dbGlbJVBhRA==", + "dev": true, + "dependencies": { + "@tapjs/after": "1.1.13", + "@tapjs/after-each": "1.1.13", + "@tapjs/asserts": "1.1.13", + "@tapjs/before": "1.1.13", + "@tapjs/before-each": "1.1.13", + "@tapjs/core": "1.4.2", + "@tapjs/filter": "1.2.13", + "@tapjs/fixture": "1.2.13", + "@tapjs/intercept": "1.2.13", + "@tapjs/mock": "1.2.11", + "@tapjs/node-serialize": "1.2.2", + "@tapjs/run": "1.4.10", + "@tapjs/snapshot": "1.2.13", + "@tapjs/spawn": "1.1.13", + "@tapjs/stdin": "1.1.13", + "@tapjs/test": "1.3.13", + "@tapjs/typescript": "1.3.2", + "@tapjs/worker": "1.1.13", "resolve-import": "^1.4.4" }, "bin": { @@ -9678,12 +8781,13 @@ } }, "node_modules/tshy": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-1.4.0.tgz", - "integrity": "sha512-fq31iXid+DyfYWhLYDPo/urGSu/RbZLWr+Cfd5VUoyYxlpG8PfMgB3PHvsLUu6qyit2yowImk5gwpgdS9dBjmg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-1.7.0.tgz", + "integrity": "sha512-ioFoMasVNtcOGkJACDpmo+C6xZfRqamimeK0hL2uyS0l7DliiCwAKJj8/x0LVlvdGvCoqkhOHfKpEPjHeI9U8Q==", "dev": true, "dependencies": { "chalk": "^5.3.0", + "chokidar": "^3.5.3", "foreground-child": "^3.1.1", "mkdirp": "^3.0.1", "resolve-import": "^1.4.4", @@ -9810,28 +8914,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9980,6 +9062,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -10076,9 +9164,9 @@ } }, "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -10170,13 +9258,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -10188,44 +9276,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -10351,11 +9401,12 @@ "dev": true }, "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==", + "dev": true, "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", diff --git a/package.json b/package.json index f0e1954..cb2c618 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "main": "dist/index.js", "engineStrict": false, "engines": { - "node": "^16.x || >=18.x" + "node": "^16.x || >=18.x || >=20.x" }, "scripts": { "build": "rm -rf ./dist && tsc --p tsconfig.build.json", @@ -16,7 +16,7 @@ "format": "prettier --write \"src/**/*.ts\"", "lint": "eslint \"{src,apps,libs,test,__tests__}/**/*.ts\" --fix", "lint:ci": "eslint \"{src,apps,libs,test,__tests__}/**/*.ts\"", - "test": "tap --passes test/*.spec.ts", + "test": "tap test/ethers.{contract,custom-rpcs,decorators}.spec.ts", "test:cov": "tap test/*.spec.ts --coverage-report=text-summary --coverage-report=lcovonly --allow-incomplete-coverage", "prepublishOnly": "npm run lint:ci && npm run test" }, @@ -42,47 +42,35 @@ }, "homepage": "https://github.com/blockcoders/nestjs-ethers/blob/main/README.md", "bugs": "https://github.com/blockcoders/nestjs-ethers/issues", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/contracts": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.1", - "@ethersproject/providers": "^5.7.2", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/wallet": "^5.7.0", - "@ethersproject/web": "^5.7.1", - "@ethersproject/wordlists": "^5.7.0" - }, "devDependencies": { "@nestjs/common": "^10.2.7", "@nestjs/core": "^10.2.7", "@nestjs/platform-express": "^10.2.7", "@nestjs/platform-fastify": "^10.2.7", - "@types/node": "^18.11.9", - "@types/supertest": "^2.0.14", - "@typescript-eslint/eslint-plugin": "^6.7.5", - "@typescript-eslint/parser": "^6.7.5", - "eslint": "^8.51.0", + "@types/node": "^20.8.9", + "@types/supertest": "^2.0.15", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.28.1", + "eslint-plugin-import": "^2.29.0", "eslint-plugin-prettier": "^5.0.1", - "nock": "^13.3.4", + "ethers": "^6.8.0", + "nock": "^13.3.7", "pre-commit": "^1.2.2", "prettier": "^3.0.3", "rxjs": "^7.8.1", "supertest": "^6.3.3", - "tap": "^18.5.1", + "tap": "^18.5.3", "typescript": "^5.2.2" }, "peerDependencies": { - "@nestjs/common": "^10.2.7" + "@nestjs/common": "^10.2.7", + "ethers": "^6.8.0" }, "tap": { "diag": true, - "bail": true, + "bail": false, "comments": true, "timeout": 40000 } diff --git a/src/ethers-core.module.ts b/src/ethers-core.module.ts index 8724125..5ad1030 100644 --- a/src/ethers-core.module.ts +++ b/src/ethers-core.module.ts @@ -1,6 +1,6 @@ -import { Provider as AbstractProvider } from '@ethersproject/providers' import { DynamicModule, Global, Module, OnApplicationShutdown } from '@nestjs/common' import { DiscoveryModule, DiscoveryService } from '@nestjs/core' +import { AbstractProvider } from 'ethers' import { EthersContract } from './ethers.contract' import { EthersModuleOptions, EthersModuleAsyncOptions } from './ethers.interface' import { diff --git a/src/ethers.constants.ts b/src/ethers.constants.ts index 5ca7e61..efe84fb 100644 --- a/src/ethers.constants.ts +++ b/src/ethers.constants.ts @@ -1,151 +1,82 @@ -import { Network } from '@ethersproject/providers' +import { Network } from 'ethers' export const DECORATED_PREFIX = 'EthersJS' export const ETHERS_MODULE_OPTIONS = 'EthersModuleOptions' export const DEFAULT_TOKEN = 'default' export const BSCSCAN_DEFAULT_API_KEY = 'EVTS3CU31AATZV72YQ55TPGXGMVIFUQ9M9' export const BINANCE_POCKET_DEFAULT_APP_ID = '6136201a7bad1500343e248d' -export const MAINNET_NETWORK: Network = { - chainId: 1, - name: 'homestead', -} -export const UNSPECIFIED_NETWORK: Network = { - chainId: 0, - name: 'unspecified', -} -export const GOERLI_NETWORK: Network = { - chainId: 5, - name: 'goerli', -} -export const SEPOLIA_NETWORK: Network = { - chainId: 11155111, - name: 'sepolia', -} -export const GNOSIS_NETWORK: Network = { - chainId: 100, - name: 'gnosis', -} -export const POLYGON_NETWORK: Network = { - chainId: 137, - name: 'matic', -} -export const MUMBAI_NETWORK: Network = { - chainId: 80001, - name: 'maticmum', -} -export const BINANCE_NETWORK: Network = { - chainId: 56, - name: 'bnb', -} -export const BINANCE_TESTNET_NETWORK: Network = { - chainId: 97, - name: 'bnbt', -} -export const OPTIMISM_NETWORK: Network = { - chainId: 10, - name: 'optimism', -} -export const OPTIMISM_KOVAN_NETWORK: Network = { - chainId: 69, - name: 'optimism-kovan', -} -export const OPTIMISM_GOERLI_NETWORK: Network = { - chainId: 420, - name: 'optimism-goerli', -} -export const ARBITRUM_NETWORK: Network = { - chainId: 42161, - name: 'arbitrum', -} -export const ARBITRUM_RINKEBY_NETWORK: Network = { - chainId: 421611, - name: 'arbitrum', -} -export const AVALANCHE_NETWORK: Network = { - chainId: 43114, - name: 'avalanche', -} -export const AVALANCHE_FUJI_NETWORK: Network = { - chainId: 43113, - name: 'avalanche-fuji', -} -export const CRONOS_NETWORK: Network = { - chainId: 25, - name: 'cronos', -} -export const CRONOS_TESTNET_NETWORK: Network = { - chainId: 338, - name: 'cronos-testnet', -} -export const FANTOM_NETWORK: Network = { - chainId: 250, - name: 'fantom', -} -export const FANTOM_TESTNET_NETWORK: Network = { - chainId: 4002, - name: 'fantom-testnet', -} -export const AURORA_NETWORK: Network = { - chainId: 1313161554, - name: 'aurora', -} -export const AURORA_BETA_NETWORK: Network = { - chainId: 1313161556, - name: 'aurora-beta', -} -export const AURORA_TESTNET_NETWORK: Network = { - chainId: 1313161555, - name: 'aurora-testnet', -} +export const MAINNET_NETWORK = new Network('mainnet', 1) +export const UNSPECIFIED_NETWORK = new Network('unspecified', 0) +export const GOERLI_NETWORK = new Network('goerli', 5) +export const SEPOLIA_NETWORK = new Network('sepolia', 11155111) +export const GNOSIS_NETWORK = new Network('gnosis', 100) +export const POLYGON_NETWORK = new Network('matic', 137) +export const MUMBAI_NETWORK = new Network('maticmum', 80001) +export const BINANCE_NETWORK = new Network('bnb', 56) +export const BINANCE_TESTNET_NETWORK = new Network('bnbt', 97) +export const OPTIMISM_NETWORK = new Network('optimism', 10) +export const OPTIMISM_KOVAN_NETWORK = new Network('optimism-kovan', 69) +export const OPTIMISM_GOERLI_NETWORK = new Network('optimism-goerli', 420) +export const ARBITRUM_NETWORK = new Network('arbitrum', 42161) +export const ARBITRUM_RINKEBY_NETWORK = new Network('arbitrum', 421611) +export const AVALANCHE_NETWORK = new Network('avalanche', 43114) +export const AVALANCHE_FUJI_NETWORK = new Network('avalanche-fuji', 43113) +export const CRONOS_NETWORK = new Network('cronos', 25) +export const CRONOS_TESTNET_NETWORK = new Network('cronos-testnet', 338) +export const FANTOM_NETWORK = new Network('fantom', 250) +export const FANTOM_TESTNET_NETWORK = new Network('fantom-testnet', 4002) +export const AURORA_NETWORK = new Network('aurora', 1313161554) +export const AURORA_BETA_NETWORK = new Network('aurora-beta', 1313161556) +export const AURORA_TESTNET_NETWORK = new Network('aurora-testnet', 1313161555) -export const NETWORKS_BY_CHAIN_ID: Record = { - [MAINNET_NETWORK.chainId]: MAINNET_NETWORK, - [UNSPECIFIED_NETWORK.chainId]: UNSPECIFIED_NETWORK, - [GOERLI_NETWORK.chainId]: GOERLI_NETWORK, - [SEPOLIA_NETWORK.chainId]: SEPOLIA_NETWORK, - [GNOSIS_NETWORK.chainId]: GNOSIS_NETWORK, - [POLYGON_NETWORK.chainId]: POLYGON_NETWORK, - [MUMBAI_NETWORK.chainId]: MUMBAI_NETWORK, - [BINANCE_NETWORK.chainId]: BINANCE_NETWORK, - [BINANCE_TESTNET_NETWORK.chainId]: BINANCE_TESTNET_NETWORK, - [OPTIMISM_NETWORK.chainId]: OPTIMISM_NETWORK, - [OPTIMISM_KOVAN_NETWORK.chainId]: OPTIMISM_KOVAN_NETWORK, - [OPTIMISM_GOERLI_NETWORK.chainId]: OPTIMISM_GOERLI_NETWORK, - [ARBITRUM_NETWORK.chainId]: ARBITRUM_NETWORK, - [ARBITRUM_RINKEBY_NETWORK.chainId]: ARBITRUM_RINKEBY_NETWORK, - [AVALANCHE_NETWORK.chainId]: AVALANCHE_NETWORK, - [AVALANCHE_FUJI_NETWORK.chainId]: AVALANCHE_FUJI_NETWORK, - [CRONOS_NETWORK.chainId]: CRONOS_NETWORK, - [CRONOS_TESTNET_NETWORK.chainId]: CRONOS_TESTNET_NETWORK, - [FANTOM_NETWORK.chainId]: FANTOM_NETWORK, - [FANTOM_TESTNET_NETWORK.chainId]: FANTOM_TESTNET_NETWORK, - [AURORA_NETWORK.chainId]: AURORA_NETWORK, - [AURORA_BETA_NETWORK.chainId]: AURORA_BETA_NETWORK, - [AURORA_TESTNET_NETWORK.chainId]: AURORA_TESTNET_NETWORK, -} +const NETWORKS_BY_CHAIN_ID: Map = new Map() +NETWORKS_BY_CHAIN_ID.set(MAINNET_NETWORK.chainId, MAINNET_NETWORK) +NETWORKS_BY_CHAIN_ID.set(UNSPECIFIED_NETWORK.chainId, UNSPECIFIED_NETWORK) +NETWORKS_BY_CHAIN_ID.set(GOERLI_NETWORK.chainId, GOERLI_NETWORK) +NETWORKS_BY_CHAIN_ID.set(SEPOLIA_NETWORK.chainId, SEPOLIA_NETWORK) +NETWORKS_BY_CHAIN_ID.set(GNOSIS_NETWORK.chainId, GNOSIS_NETWORK) +NETWORKS_BY_CHAIN_ID.set(POLYGON_NETWORK.chainId, POLYGON_NETWORK) +NETWORKS_BY_CHAIN_ID.set(MUMBAI_NETWORK.chainId, MUMBAI_NETWORK) +NETWORKS_BY_CHAIN_ID.set(BINANCE_NETWORK.chainId, BINANCE_NETWORK) +NETWORKS_BY_CHAIN_ID.set(BINANCE_TESTNET_NETWORK.chainId, BINANCE_TESTNET_NETWORK) +NETWORKS_BY_CHAIN_ID.set(OPTIMISM_NETWORK.chainId, OPTIMISM_NETWORK) +NETWORKS_BY_CHAIN_ID.set(OPTIMISM_KOVAN_NETWORK.chainId, OPTIMISM_KOVAN_NETWORK) +NETWORKS_BY_CHAIN_ID.set(OPTIMISM_GOERLI_NETWORK.chainId, OPTIMISM_GOERLI_NETWORK) +NETWORKS_BY_CHAIN_ID.set(ARBITRUM_NETWORK.chainId, ARBITRUM_NETWORK) +NETWORKS_BY_CHAIN_ID.set(ARBITRUM_RINKEBY_NETWORK.chainId, ARBITRUM_RINKEBY_NETWORK) +NETWORKS_BY_CHAIN_ID.set(AVALANCHE_NETWORK.chainId, AVALANCHE_NETWORK) +NETWORKS_BY_CHAIN_ID.set(AVALANCHE_FUJI_NETWORK.chainId, AVALANCHE_FUJI_NETWORK) +NETWORKS_BY_CHAIN_ID.set(CRONOS_NETWORK.chainId, CRONOS_NETWORK) +NETWORKS_BY_CHAIN_ID.set(CRONOS_TESTNET_NETWORK.chainId, CRONOS_TESTNET_NETWORK) +NETWORKS_BY_CHAIN_ID.set(FANTOM_NETWORK.chainId, FANTOM_NETWORK) +NETWORKS_BY_CHAIN_ID.set(FANTOM_TESTNET_NETWORK.chainId, FANTOM_TESTNET_NETWORK) +NETWORKS_BY_CHAIN_ID.set(AURORA_NETWORK.chainId, AURORA_NETWORK) +NETWORKS_BY_CHAIN_ID.set(AURORA_BETA_NETWORK.chainId, AURORA_BETA_NETWORK) +NETWORKS_BY_CHAIN_ID.set(AURORA_TESTNET_NETWORK.chainId, AURORA_TESTNET_NETWORK) -export const NETWORKS_BY_NAME: Record = { - [MAINNET_NETWORK.name]: MAINNET_NETWORK, - [UNSPECIFIED_NETWORK.name]: UNSPECIFIED_NETWORK, - [GOERLI_NETWORK.name]: GOERLI_NETWORK, - [SEPOLIA_NETWORK.name]: SEPOLIA_NETWORK, - [GNOSIS_NETWORK.name]: GNOSIS_NETWORK, - [POLYGON_NETWORK.name]: POLYGON_NETWORK, - [MUMBAI_NETWORK.name]: MUMBAI_NETWORK, - [BINANCE_NETWORK.name]: BINANCE_NETWORK, - [BINANCE_TESTNET_NETWORK.name]: BINANCE_TESTNET_NETWORK, - [OPTIMISM_NETWORK.name]: OPTIMISM_NETWORK, - [OPTIMISM_KOVAN_NETWORK.name]: OPTIMISM_KOVAN_NETWORK, - [OPTIMISM_GOERLI_NETWORK.name]: OPTIMISM_GOERLI_NETWORK, - [ARBITRUM_NETWORK.name]: ARBITRUM_NETWORK, - [ARBITRUM_RINKEBY_NETWORK.name]: ARBITRUM_RINKEBY_NETWORK, - [AVALANCHE_NETWORK.name]: AVALANCHE_NETWORK, - [AVALANCHE_FUJI_NETWORK.name]: AVALANCHE_FUJI_NETWORK, - [CRONOS_NETWORK.name]: CRONOS_NETWORK, - [CRONOS_TESTNET_NETWORK.name]: CRONOS_TESTNET_NETWORK, - [FANTOM_NETWORK.name]: FANTOM_NETWORK, - [FANTOM_TESTNET_NETWORK.name]: FANTOM_TESTNET_NETWORK, - [AURORA_NETWORK.name]: AURORA_NETWORK, - [AURORA_BETA_NETWORK.name]: AURORA_BETA_NETWORK, - [AURORA_TESTNET_NETWORK.name]: AURORA_TESTNET_NETWORK, -} +const NETWORKS_BY_NAME: Map = new Map() +NETWORKS_BY_NAME.set(MAINNET_NETWORK.name, MAINNET_NETWORK) +NETWORKS_BY_NAME.set(UNSPECIFIED_NETWORK.name, UNSPECIFIED_NETWORK) +NETWORKS_BY_NAME.set(GOERLI_NETWORK.name, GOERLI_NETWORK) +NETWORKS_BY_NAME.set(SEPOLIA_NETWORK.name, SEPOLIA_NETWORK) +NETWORKS_BY_NAME.set(GNOSIS_NETWORK.name, GNOSIS_NETWORK) +NETWORKS_BY_NAME.set(POLYGON_NETWORK.name, POLYGON_NETWORK) +NETWORKS_BY_NAME.set(MUMBAI_NETWORK.name, MUMBAI_NETWORK) +NETWORKS_BY_NAME.set(BINANCE_NETWORK.name, BINANCE_NETWORK) +NETWORKS_BY_NAME.set(BINANCE_TESTNET_NETWORK.name, BINANCE_TESTNET_NETWORK) +NETWORKS_BY_NAME.set(OPTIMISM_NETWORK.name, OPTIMISM_NETWORK) +NETWORKS_BY_NAME.set(OPTIMISM_KOVAN_NETWORK.name, OPTIMISM_KOVAN_NETWORK) +NETWORKS_BY_NAME.set(OPTIMISM_GOERLI_NETWORK.name, OPTIMISM_GOERLI_NETWORK) +NETWORKS_BY_NAME.set(ARBITRUM_NETWORK.name, ARBITRUM_NETWORK) +NETWORKS_BY_NAME.set(ARBITRUM_RINKEBY_NETWORK.name, ARBITRUM_RINKEBY_NETWORK) +NETWORKS_BY_NAME.set(AVALANCHE_NETWORK.name, AVALANCHE_NETWORK) +NETWORKS_BY_NAME.set(AVALANCHE_FUJI_NETWORK.name, AVALANCHE_FUJI_NETWORK) +NETWORKS_BY_NAME.set(CRONOS_NETWORK.name, CRONOS_NETWORK) +NETWORKS_BY_NAME.set(CRONOS_TESTNET_NETWORK.name, CRONOS_TESTNET_NETWORK) +NETWORKS_BY_NAME.set(FANTOM_NETWORK.name, FANTOM_NETWORK) +NETWORKS_BY_NAME.set(FANTOM_TESTNET_NETWORK.name, FANTOM_TESTNET_NETWORK) +NETWORKS_BY_NAME.set(AURORA_NETWORK.name, AURORA_NETWORK) +NETWORKS_BY_NAME.set(AURORA_BETA_NETWORK.name, AURORA_BETA_NETWORK) +NETWORKS_BY_NAME.set(AURORA_TESTNET_NETWORK.name, AURORA_TESTNET_NETWORK) + +export { NETWORKS_BY_CHAIN_ID, NETWORKS_BY_NAME } diff --git a/src/ethers.contract.ts b/src/ethers.contract.ts index f03f2e7..0f66933 100644 --- a/src/ethers.contract.ts +++ b/src/ethers.contract.ts @@ -1,7 +1,4 @@ -import { VoidSigner } from '@ethersproject/abstract-signer' -import { Contract, ContractInterface } from '@ethersproject/contracts' -import { Provider as AbstractProvider } from '@ethersproject/providers' -import { Wallet } from '@ethersproject/wallet' +import { VoidSigner, Wallet, Contract, InterfaceAbi, AbstractProvider } from 'ethers' export class EthersContract { private readonly provider: AbstractProvider @@ -10,7 +7,7 @@ export class EthersContract { this.provider = provider } - create(address: string, abi: ContractInterface, signer?: Wallet | VoidSigner): Contract { + create(address: string, abi: InterfaceAbi, signer?: Wallet | VoidSigner): Contract { return new Contract(address, abi, signer ?? this.provider) } } diff --git a/src/ethers.custom-rpcs.ts b/src/ethers.custom-rpcs.ts index b200ae7..4364a5c 100644 --- a/src/ethers.custom-rpcs.ts +++ b/src/ethers.custom-rpcs.ts @@ -1,14 +1,13 @@ import { - BaseProvider, + AbstractProvider, EtherscanProvider, FallbackProvider, getDefaultProvider, Network, Networkish, - PocketProvider, - UrlJsonRpcProvider, -} from '@ethersproject/providers' -import { ConnectionInfo } from '@ethersproject/web' + JsonRpcProvider, + FetchRequest, +} from 'ethers' import { BINANCE_NETWORK, BINANCE_POCKET_DEFAULT_APP_ID, @@ -18,7 +17,7 @@ import { MAINNET_NETWORK, SEPOLIA_NETWORK, } from './ethers.constants' -import { MoralisProviderOptions, PocketProviderOptions, ProviderOptions } from './ethers.interface' +import { ProviderOptions } from './ethers.interface' import { getNetwork, isBinanceNetwork } from './ethers.utils' export class BscscanProvider extends EtherscanProvider { @@ -29,10 +28,10 @@ export class BscscanProvider extends EtherscanProvider { } getBaseUrl(): string { - switch (this.network.chainId) { - case BINANCE_NETWORK.chainId: + switch (this.network.name) { + case BINANCE_NETWORK.name: return 'https://api.bscscan.com' - case BINANCE_TESTNET_NETWORK.chainId: + case BINANCE_TESTNET_NETWORK.name: return 'https://api-testnet.bscscan.com' } @@ -44,38 +43,61 @@ export class BscscanProvider extends EtherscanProvider { } } -export class BinancePocketProvider extends PocketProvider { - constructor(_network: Networkish, apiKey?: PocketProviderOptions | string) { - const network = getNetwork(_network) +export class BinancePocketProvider extends JsonRpcProvider { + readonly applicationId!: string + readonly applicationSecret!: null | string + + constructor(_network?: Networkish, applicationId?: null | string, applicationSecret?: null | string) { + const network = Network.from(_network) + + if (applicationId == null) { + applicationId = BINANCE_POCKET_DEFAULT_APP_ID + } + + if (applicationSecret == null) { + applicationSecret = null + } - super(network.chainId, apiKey || { applicationId: BINANCE_POCKET_DEFAULT_APP_ID, loadBalancer: true }) + const options = { staticNetwork: network } + + const request = BinancePocketProvider.getRequest(network, applicationId, applicationSecret) + super(request, network, options) + + this.applicationId = applicationId + this.applicationSecret = applicationSecret } - static getUrl(network: Network, apiKey: PocketProviderOptions): ConnectionInfo { - let host: string | null = null - switch (network.chainId) { - case BINANCE_NETWORK.chainId: - host = 'bsc-mainnet.gateway.pokt.network' - break - // Binance Testnet Claimed RelayChain - case BINANCE_TESTNET_NETWORK.chainId: - host = 'bsc-testnet.gateway.pokt.network' - break + static getHost(name: string): string { + switch (name) { + case BINANCE_NETWORK.name: + return 'bsc-mainnet.gateway.pokt.network' + case BINANCE_TESTNET_NETWORK.name: + return 'bsc-testnet.gateway.pokt.network' default: - throw new Error(`unsupported network ${network.name}`) + throw new Error(`unsupported network ${name}`) } + } - const url = `https:/\/${host}/v1/lb/${apiKey.applicationId}` + _getProvider(chainId: number): AbstractProvider { + try { + return new BinancePocketProvider(chainId, this.applicationId, this.applicationSecret) + } catch (error) {} + return super._getProvider(chainId) + } - const connection: ConnectionInfo = { url, headers: {} } + static getRequest(network: Network, applicationId?: null | string, applicationSecret?: null | string): FetchRequest { + if (applicationId == null) { + applicationId = BINANCE_POCKET_DEFAULT_APP_ID + } - // Apply application secret key - if (apiKey.applicationSecretKey != null) { - connection.user = '' - connection.password = apiKey.applicationSecretKey + const request = new FetchRequest(`https:/\/${BinancePocketProvider.getHost(network.name)}/v1/lb/${applicationId}`) + request.allowGzip = true + + if (applicationSecret) { + request.setCredentials('', applicationSecret) } - return connection + return request } isCommunityResource(): boolean { @@ -83,101 +105,88 @@ export class BinancePocketProvider extends PocketProvider { } } -export class MoralisProvider extends UrlJsonRpcProvider { - static getApiKey(apiKey: MoralisProviderOptions | string): MoralisProviderOptions { - const options: MoralisProviderOptions = { - apiKey: typeof apiKey === 'string' ? apiKey : apiKey.apiKey, - region: typeof apiKey === 'string' ? 'nyc' : apiKey.region ?? 'nyc', +export class MoralisProvider extends JsonRpcProvider { + public readonly applicationId: string + public readonly region: string + + constructor(_network?: Networkish, applicationId?: string, region?: string) { + if (!_network) { + _network = 'mainnet' } + const network = Network.from(_network) - if (!options.apiKey) { + if (!applicationId) { throw new Error('Invalid moralis apiKey') } - return options - } - - static getConnectionInfo(options: MoralisProviderOptions, endpoint: string): ConnectionInfo { - return { - url: `https://speedy-nodes-${options.region}.moralis.io/${options.apiKey}/${endpoint}`, - headers: {}, + if (!region) { + region = 'nyc' } - } -} -export class BinanceMoralisProvider extends MoralisProvider { - constructor(_network: Networkish, apiKey?: MoralisProviderOptions | string) { - const network = getNetwork(_network) + const options = { staticNetwork: network } - super(network, apiKey) - } + const request = MoralisProvider.getRequest(network, applicationId, region) - static getUrl(network: Network, apiKey: MoralisProviderOptions): ConnectionInfo { - let endpoint: string - switch (network.chainId) { - case BINANCE_NETWORK.chainId: - endpoint = 'bsc/mainnet' - break - case BINANCE_TESTNET_NETWORK.chainId: - endpoint = 'bsc/testnet' - break - default: - throw new Error(`unsupported network ${network.name}`) - } + super(request, network, options) - return MoralisProvider.getConnectionInfo(MoralisProvider.getApiKey(apiKey), endpoint) + this.applicationId = applicationId + this.region = region } -} -export class EthereumMoralisProvider extends MoralisProvider { - constructor(_network: Networkish, apiKey?: MoralisProviderOptions | string) { - const network = getNetwork(_network) - - super(network, apiKey) + _getProvider(chainId: number): AbstractProvider { + try { + return new MoralisProvider(chainId, this.applicationId, this.region) + } catch (error) {} + return super._getProvider(chainId) } - static getUrl(network: Network, apiKey: MoralisProviderOptions): ConnectionInfo { + static getRequest(network: Network, applicationId: string, region: string): FetchRequest { let endpoint: string - switch (network.chainId) { - case MAINNET_NETWORK.chainId: + + switch (network.name) { + case BINANCE_NETWORK.name: + endpoint = 'bsc/mainnet' + break + case BINANCE_TESTNET_NETWORK.name: + endpoint = 'bsc/testnet' + break + case MAINNET_NETWORK.name: endpoint = 'eth/mainnet' break - case GOERLI_NETWORK.chainId: + case GOERLI_NETWORK.name: endpoint = 'eth/goerli' break - case SEPOLIA_NETWORK.chainId: + case SEPOLIA_NETWORK.name: endpoint = 'eth/sepolia' break default: throw new Error(`unsupported network ${network.name}`) } - return MoralisProvider.getConnectionInfo(MoralisProvider.getApiKey(apiKey), endpoint) + const request = new FetchRequest(`https://speedy-nodes-${region}.moralis.io/${applicationId}/${endpoint}`) + + request.allowGzip = true + + return request } } export async function getFallbackProvider( - providers: BaseProvider[] = [], + providers: AbstractProvider[] = [], quorum = 1, - waitUntilIsConnected = true, -): Promise { +): Promise { if (providers.length < 1) { throw new Error( 'Error in provider creation. The property "useDefaultProvider" is false and the providers supplied are invalid.', ) } - if (waitUntilIsConnected) { - // wait until the node is up and running smoothly. - await Promise.all(providers.map((provider) => provider.ready)) - } - if (providers.length > 1) { /** * FallbackProvider with selected providers. * @see {@link https://docs.ethers.io/v5/api/providers/other/#FallbackProvider} */ - return new FallbackProvider(providers, quorum) + return new FallbackProvider(providers, undefined, { quorum }) } return providers[0] @@ -187,16 +196,16 @@ export async function getBinanceDefaultProvider( network: Network, options?: Pick, ) { - const providers: Array = [ + const providers: Array = [ new BscscanProvider(network, options?.bscscan), - new BinancePocketProvider(network, options?.pocket), + new BinancePocketProvider(network, options?.pocket?.applicationId, options?.pocket?.applicationSecretKey), ] if (options?.moralis) { - providers.push(new BinanceMoralisProvider(network, options.moralis)) + providers.push(new MoralisProvider(network, options?.moralis?.apiKey, options?.moralis?.region)) } - return getFallbackProvider(providers, options?.quorum ?? Math.min(providers.length, 2), true) + return getFallbackProvider(providers, options?.quorum ?? Math.min(providers.length, 2)) } export async function getNetworkDefaultProvider(network: Network, options: ProviderOptions = {}) { diff --git a/src/ethers.interface.ts b/src/ethers.interface.ts index 3cb5079..e47e7f5 100644 --- a/src/ethers.interface.ts +++ b/src/ethers.interface.ts @@ -1,10 +1,5 @@ -import { BytesLike } from '@ethersproject/bytes' -import { Networkish } from '@ethersproject/networks' -import { ConnectionInfo } from '@ethersproject/web' -import { Wordlist } from '@ethersproject/wordlists' import { ModuleMetadata } from '@nestjs/common/interfaces' - -export type WordlistLike = string | Wordlist +import type { Networkish } from 'ethers' export interface InfuraProviderOptions { projectId?: string @@ -21,30 +16,23 @@ export interface MoralisProviderOptions { region?: string } -export interface AnkrProviderOptions { - apiKey?: string - projectSecret?: string -} - export interface ProviderOptions { alchemy?: string | undefined etherscan?: string | undefined bscscan?: string | undefined cloudflare?: boolean | undefined - infura?: InfuraProviderOptions | string | undefined - pocket?: PocketProviderOptions | string | undefined - moralis?: MoralisProviderOptions | string | undefined - ankr?: AnkrProviderOptions | string | undefined - custom?: ConnectionInfo | string | (ConnectionInfo | string)[] | undefined + infura?: InfuraProviderOptions | undefined + pocket?: PocketProviderOptions | undefined + moralis?: MoralisProviderOptions | undefined + ankr?: string | undefined + custom?: string | string[] | undefined quorum?: number | undefined } export interface EthersModuleOptions extends ProviderOptions { network?: Networkish | undefined token?: string | undefined - waitUntilIsConnected?: boolean | undefined useDefaultProvider?: boolean | undefined - disableEthersLogger?: boolean | undefined } export interface EthersModuleAsyncOptions extends Pick { @@ -52,9 +40,3 @@ export interface EthersModuleAsyncOptions extends Pick Omit | Promise> inject?: any[] } - -export interface RandomWalletOptions { - extraEntropy?: BytesLike - locale: WordlistLike - path: string -} diff --git a/src/ethers.providers.ts b/src/ethers.providers.ts index 3a83031..dbbd187 100644 --- a/src/ethers.providers.ts +++ b/src/ethers.providers.ts @@ -1,25 +1,21 @@ -import { Logger, LogLevel } from '@ethersproject/logger' +import { Provider } from '@nestjs/common' import { - Provider as AbstractProvider, - BaseProvider, + AbstractProvider, AlchemyProvider, CloudflareProvider, EtherscanProvider, InfuraProvider, PocketProvider, - StaticJsonRpcProvider, + JsonRpcProvider, AnkrProvider, -} from '@ethersproject/providers' -import { ConnectionInfo } from '@ethersproject/web' -import { Provider } from '@nestjs/common' +} from 'ethers' import { defer, lastValueFrom } from 'rxjs' import { ETHERS_MODULE_OPTIONS, MAINNET_NETWORK } from './ethers.constants' import { EthersContract } from './ethers.contract' import { - BinanceMoralisProvider, + MoralisProvider, BinancePocketProvider, BscscanProvider, - EthereumMoralisProvider, getFallbackProvider, getNetworkDefaultProvider, } from './ethers.custom-rpcs' @@ -27,13 +23,13 @@ import { EthersModuleOptions, EthersModuleAsyncOptions } from './ethers.interfac import { EthersSigner } from './ethers.signer' import { getEthersToken, getContractToken, getSignerToken, getNetwork, isBinanceNetwork } from './ethers.utils' -export async function createBaseProvider(options: EthersModuleOptions): Promise { +export async function createAbstractProvider( + options: EthersModuleOptions, +): Promise { const { network = MAINNET_NETWORK, quorum = 1, - waitUntilIsConnected = true, useDefaultProvider = true, - disableEthersLogger = false, alchemy, etherscan, bscscan, @@ -45,14 +41,10 @@ export async function createBaseProvider(options: EthersModuleOptions): Promise< custom, } = options - if (disableEthersLogger) { - Logger.setLogLevel(LogLevel.OFF) - } - const providerNetwork = getNetwork(network) if (!useDefaultProvider) { - const providers: Array = [] + const providers: Array = [] if (alchemy) { providers.push(new AlchemyProvider(providerNetwork, alchemy)) @@ -67,23 +59,19 @@ export async function createBaseProvider(options: EthersModuleOptions): Promise< } if (infura) { - providers.push(new InfuraProvider(providerNetwork, infura)) + providers.push(new InfuraProvider(providerNetwork, infura?.projectId, infura?.projectSecret)) } if (pocket) { if (isBinanceNetwork(providerNetwork)) { - providers.push(new BinancePocketProvider(providerNetwork, pocket)) + providers.push(new BinancePocketProvider(providerNetwork, pocket?.applicationId, pocket?.applicationSecretKey)) } else { - providers.push(new PocketProvider(providerNetwork, pocket)) + providers.push(new PocketProvider(providerNetwork, pocket?.applicationId, pocket?.applicationSecretKey)) } } if (moralis) { - if (isBinanceNetwork(providerNetwork)) { - providers.push(new BinanceMoralisProvider(providerNetwork, moralis)) - } else { - providers.push(new EthereumMoralisProvider(providerNetwork, moralis)) - } + providers.push(new MoralisProvider(providerNetwork, moralis?.apiKey, moralis?.region)) } if (cloudflare) { @@ -99,14 +87,14 @@ export async function createBaseProvider(options: EthersModuleOptions): Promise< } if (custom) { - const customInfos: (ConnectionInfo | string)[] = !Array.isArray(custom) ? [custom] : custom + const customInfos: string[] = !Array.isArray(custom) ? [custom] : custom customInfos.forEach((customInfo) => { - providers.push(new StaticJsonRpcProvider(customInfo, providerNetwork)) + providers.push(new JsonRpcProvider(customInfo, providerNetwork)) }) } - return getFallbackProvider(providers, quorum, waitUntilIsConnected) + return getFallbackProvider(providers, quorum) } /** @@ -129,8 +117,8 @@ export async function createBaseProvider(options: EthersModuleOptions): Promise< export function createEthersProvider(options: EthersModuleOptions): Provider { return { provide: getEthersToken(options.token), - useFactory: async (): Promise => { - return await lastValueFrom(defer(() => createBaseProvider(options))) + useFactory: async (): Promise => { + return await lastValueFrom(defer(() => createAbstractProvider(options))) }, } } @@ -138,8 +126,8 @@ export function createEthersProvider(options: EthersModuleOptions): Provider { export function createEthersAsyncProvider(token?: string): Provider { return { provide: getEthersToken(token), - useFactory: async (options: EthersModuleOptions): Promise => { - return await lastValueFrom(defer(() => createBaseProvider(options))) + useFactory: async (options: EthersModuleOptions): Promise => { + return await lastValueFrom(defer(() => createAbstractProvider(options))) }, inject: [ETHERS_MODULE_OPTIONS], } diff --git a/src/ethers.signer.ts b/src/ethers.signer.ts index a64ee32..0a11131 100644 --- a/src/ethers.signer.ts +++ b/src/ethers.signer.ts @@ -1,11 +1,13 @@ -import { ExternallyOwnedAccount, VoidSigner } from '@ethersproject/abstract-signer' -import { BytesLike } from '@ethersproject/bytes' -import { ProgressCallback } from '@ethersproject/json-wallets' -import { Provider as AbstractProvider } from '@ethersproject/providers' -import { SigningKey } from '@ethersproject/signing-key' -import { Wallet } from '@ethersproject/wallet' -import { Wordlist } from '@ethersproject/wordlists' -import { RandomWalletOptions } from './ethers.interface' +import { + VoidSigner, + BytesLike, + ProgressCallback, + AbstractProvider, + SigningKey, + Wallet, + HDNodeWallet, + Mnemonic, +} from 'ethers' export class EthersSigner { private readonly provider: AbstractProvider @@ -14,28 +16,26 @@ export class EthersSigner { this.provider = provider } - createWallet(privateKey: BytesLike | ExternallyOwnedAccount | SigningKey): Wallet { + createWallet(privateKey: string | SigningKey): Wallet { return new Wallet(privateKey, this.provider) } - createRandomWallet(options?: RandomWalletOptions): Wallet { - const wallet = Wallet.createRandom(options) as Wallet - - return wallet.connect(this.provider) + createRandomWallet(): HDNodeWallet { + return Wallet.createRandom(this.provider) } async createWalletFromEncryptedJson( jsonString: string, password: BytesLike, progressCallback?: ProgressCallback, - ): Promise { + ): Promise { const wallet = await Wallet.fromEncryptedJson(jsonString, password, progressCallback) return wallet.connect(this.provider) } - createWalletfromMnemonic(mnemonic: string, path?: string, wordlist?: Wordlist): Wallet { - const wallet = Wallet.fromMnemonic(mnemonic, path, wordlist) as Wallet + createWalletfromMnemonic(mnemonic: Mnemonic, path?: string): HDNodeWallet { + const wallet = HDNodeWallet.fromMnemonic(mnemonic, path) return wallet.connect(this.provider) } diff --git a/src/ethers.utils.ts b/src/ethers.utils.ts index 6508295..202807a 100644 --- a/src/ethers.utils.ts +++ b/src/ethers.utils.ts @@ -1,4 +1,4 @@ -import { Network, Networkish } from '@ethersproject/networks' +import { Network, Networkish } from 'ethers' import { BINANCE_NETWORK, BINANCE_TESTNET_NETWORK, @@ -21,30 +21,30 @@ export function getSignerToken(token?: string): string { return `${DECORATED_PREFIX}:Signer:${token || DEFAULT_TOKEN}` } -export function getNetwork(network: Networkish | null | undefined): Network { +export function getNetwork(network?: Networkish): Network { if (!network) { throw new Error(`Invalid value: ${network}`) } - if (typeof network === 'number' && NETWORKS_BY_CHAIN_ID[network]) { - return NETWORKS_BY_CHAIN_ID[network] + if (typeof network === 'number' && NETWORKS_BY_CHAIN_ID.has(BigInt(network))) { + return NETWORKS_BY_CHAIN_ID.get(BigInt(network)) as Network } - if (typeof network === 'string' && NETWORKS_BY_NAME[network]) { - return NETWORKS_BY_NAME[network] + if (typeof network === 'string' && NETWORKS_BY_NAME.has(network)) { + return NETWORKS_BY_NAME.get(network) as Network } - if (typeof network !== 'number' && typeof network !== 'string' && network.chainId) { - return network + if (typeof network !== 'bigint' && typeof network !== 'number' && typeof network !== 'string' && network?.name) { + return Network.from(network) } return UNSPECIFIED_NETWORK } export function isBinanceNetwork(network: Network): boolean { - switch (network.chainId) { - case BINANCE_NETWORK.chainId: - case BINANCE_TESTNET_NETWORK.chainId: + switch (network.name) { + case BINANCE_NETWORK.name: + case BINANCE_TESTNET_NETWORK.name: return true default: return false diff --git a/test/ethers.contract.spec.ts b/test/ethers.contract.spec.ts index 3b84f84..dae5447 100644 --- a/test/ethers.contract.spec.ts +++ b/test/ethers.contract.spec.ts @@ -1,5 +1,5 @@ -import { Contract } from '@ethersproject/contracts' import { Module, Controller, Get, Injectable } from '@nestjs/common' +import { Contract } from 'ethers' import * as nock from 'nock' import t from 'tap' import * as ABI from './utils/ABI.json' @@ -37,11 +37,11 @@ t.test('EthersContract', (t) => { async someMethod(): Promise { const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI) - if (!contract?.provider?.getNetwork()) { + if (!contract?.runner) { throw new Error('No provider injected') } - return contract.address + return contract.getAddress() } } @@ -84,15 +84,11 @@ t.test('EthersContract', (t) => { const wallet = this.signer.createWallet(ETHERS_PRIVATE_KEY) const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI, wallet) - if (!contract?.provider?.getNetwork()) { + if (!contract?.runner) { throw new Error('No provider injected') } - if (!contract?.signer.provider?.getNetwork()) { - throw new Error('No signer injected') - } - - return contract.address + return contract.getAddress() } } @@ -137,11 +133,11 @@ t.test('EthersContract', (t) => { async someMethod(): Promise { const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI) - if (!contract?.provider?.getNetwork()) { + if (!contract?.runner) { throw new Error('No provider injected') } - return contract.address + return contract.getAddress() } } @@ -192,15 +188,11 @@ t.test('EthersContract', (t) => { const wallet = this.signer.createWallet(ETHERS_PRIVATE_KEY) const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI, wallet) - if (!contract?.provider?.getNetwork()) { + if (!contract?.runner) { throw new Error('No provider injected') } - if (!contract?.signer.provider?.getNetwork()) { - throw new Error('No signer injected') - } - - return contract.address + return contract.getAddress() } } diff --git a/test/ethers.custom-rpcs.spec.ts b/test/ethers.custom-rpcs.spec.ts index a2efffb..fba139d 100644 --- a/test/ethers.custom-rpcs.spec.ts +++ b/test/ethers.custom-rpcs.spec.ts @@ -1,11 +1,11 @@ import { AlchemyProvider, - AnkrProvider, CloudflareProvider, EtherscanProvider, FallbackProvider, InfuraProvider, -} from '@ethersproject/providers' + QuickNodeProvider, +} from 'ethers' import * as nock from 'nock' import t from 'tap' import { @@ -16,10 +16,8 @@ import { SEPOLIA_NETWORK, } from '../src/ethers.constants' import { - BinanceMoralisProvider, BinancePocketProvider, BscscanProvider, - EthereumMoralisProvider, getBinanceDefaultProvider, getFallbackProvider, getNetworkDefaultProvider, @@ -86,18 +84,24 @@ t.test('Ethers Custom RPC', (t) => { }) t.test('BinancePocketProvider', (t) => { - t.test('getUrl', (t) => { - t.test('should return a bsc network url', (t) => { - const provider = new BinancePocketProvider(BINANCE_NETWORK) - - t.equal(provider.connection.url, 'https://bsc-mainnet.gateway.pokt.network/v1/lb/6136201a7bad1500343e248d') + t.test('getRequest', (t) => { + t.only('should return a bsc network url', (t) => { + const provider = new BinancePocketProvider(BINANCE_NETWORK.name) + + t.equal( + provider._getConnection().url, + 'https://bsc-mainnet.gateway.pokt.network/v1/lb/6136201a7bad1500343e248d', + ) t.end() }) t.test('should return a bsc testnet network url', (t) => { - const provider = new BinancePocketProvider(BINANCE_TESTNET_NETWORK) + const provider = new BinancePocketProvider(BINANCE_TESTNET_NETWORK.name) - t.equal(provider.connection.url, 'https://bsc-testnet.gateway.pokt.network/v1/lb/6136201a7bad1500343e248d') + t.equal( + provider._getConnection().url, + 'https://bsc-testnet.gateway.pokt.network/v1/lb/6136201a7bad1500343e248d', + ) t.end() }) @@ -107,14 +111,11 @@ t.test('Ethers Custom RPC', (t) => { }) t.test('should use an applicationSecretKey', (t) => { - const provider = new BinancePocketProvider(BINANCE_TESTNET_NETWORK, { - applicationId: '1234', - applicationSecretKey: '4321', - }) - - t.equal(provider.connection.url, 'https://bsc-testnet.gateway.pokt.network/v1/lb/1234') - t.equal(provider.connection.user, '') - t.equal(provider.connection.password, '4321') + const provider = new BinancePocketProvider(BINANCE_TESTNET_NETWORK.name, '1234', '4321') + const credentials = provider._getConnection().credentials + + t.equal(provider._getConnection().url, 'https://bsc-testnet.gateway.pokt.network/v1/lb/1234') + t.equal(credentials, ':4321') t.end() }) @@ -143,94 +144,51 @@ t.test('Ethers Custom RPC', (t) => { }) t.test('MoralisProvider', (t) => { - t.test('getApiKey', (t) => { - t.test('should return the provider options for a string key', (t) => { - t.same(MoralisProvider.getApiKey('1234'), { apiKey: '1234', region: 'nyc' }) - t.end() - }) - - t.test('should return the provider options for a non string key', (t) => { - t.same(MoralisProvider.getApiKey({ apiKey: '1234', region: 'caba' }), { - apiKey: '1234', - region: 'caba', - }) - t.end() - }) - - t.test('should throw an error if the api key is not valid', (t) => { - t.throws(() => MoralisProvider.getApiKey('')) - t.end() - }) - - t.end() - }) - t.test('getConnectionInfo', (t) => { + t.test('getRequest', (t) => { t.test('should return the connection info', (t) => { - t.same(MoralisProvider.getConnectionInfo({ apiKey: '1234', region: 'caba' }, 'test'), { - url: 'https://speedy-nodes-caba.moralis.io/1234/test', - headers: {}, - }) + const provider = new MoralisProvider(BINANCE_NETWORK, '1234', 'caba') + + t.equal(provider._getConnection().url, 'https://speedy-nodes-caba.moralis.io/1234/bsc/mainnet') t.end() }) - t.end() - }) - - t.end() - }) - - t.test('BinanceMoralisProvider', (t) => { - t.test('getUrl', (t) => { t.test('should return a bsc network url', (t) => { - const provider = new BinanceMoralisProvider(BINANCE_NETWORK, { apiKey: '1234' }) + const provider = new MoralisProvider(BINANCE_NETWORK, '1234') - t.equal(provider.connection.url, 'https://speedy-nodes-nyc.moralis.io/1234/bsc/mainnet') + t.equal(provider._getConnection().url, 'https://speedy-nodes-nyc.moralis.io/1234/bsc/mainnet') t.end() }) t.test('should return a bsc testnet network url', (t) => { - const provider = new BinanceMoralisProvider(BINANCE_TESTNET_NETWORK, { apiKey: '1234' }) + const provider = new MoralisProvider(BINANCE_TESTNET_NETWORK, '1234') - t.equal(provider.connection.url, 'https://speedy-nodes-nyc.moralis.io/1234/bsc/testnet') + t.equal(provider._getConnection().url, 'https://speedy-nodes-nyc.moralis.io/1234/bsc/testnet') t.end() }) - t.test('should throw an error if the network is not valid', (t) => { - t.throws(() => new BinanceMoralisProvider(1, { apiKey: '1234' })) - t.end() - }) - - t.end() - }) - - t.end() - }) - - t.test('EthereumMoralisProvider', (t) => { - t.test('getUrl', (t) => { t.test('should return a mainnet network url', (t) => { - const provider = new EthereumMoralisProvider(MAINNET_NETWORK, { apiKey: '1234' }) + const provider = new MoralisProvider(MAINNET_NETWORK, '1234') - t.equal(provider.connection.url, 'https://speedy-nodes-nyc.moralis.io/1234/eth/mainnet') + t.equal(provider._getConnection().url, 'https://speedy-nodes-nyc.moralis.io/1234/eth/mainnet') t.end() }) t.test('should return a goerli network url', (t) => { - const provider = new EthereumMoralisProvider(GOERLI_NETWORK, { apiKey: '1234' }) + const provider = new MoralisProvider(GOERLI_NETWORK, '1234') - t.equal(provider.connection.url, 'https://speedy-nodes-nyc.moralis.io/1234/eth/goerli') + t.equal(provider._getConnection().url, 'https://speedy-nodes-nyc.moralis.io/1234/eth/goerli') t.end() }) t.test('should return a sepolia network url', (t) => { - const provider = new EthereumMoralisProvider(SEPOLIA_NETWORK, { apiKey: '1234' }) + const provider = new MoralisProvider(SEPOLIA_NETWORK, '1234') - t.equal(provider.connection.url, 'https://speedy-nodes-nyc.moralis.io/1234/eth/sepolia') + t.equal(provider._getConnection().url, 'https://speedy-nodes-nyc.moralis.io/1234/eth/sepolia') t.end() }) t.test('should throw an error if the network is not valid', (t) => { - t.throws(() => new EthereumMoralisProvider(97, { apiKey: '1234' })) + t.throws(() => new MoralisProvider(69, '1234')) t.end() }) @@ -270,23 +228,26 @@ t.test('Ethers Custom RPC', (t) => { t.test( 'should return a instance of FallbackProvider wt.testh BscscanProvider and BinancePocketProvider', async (t) => { - const provider = await getBinanceDefaultProvider(BINANCE_TESTNET_NETWORK) + const provider = await getBinanceDefaultProvider(BINANCE_TESTNET_NETWORK, { quorum: 1 }) t.type(provider, FallbackProvider) t.type((provider as FallbackProvider).providerConfigs[0].provider, BscscanProvider) t.type((provider as FallbackProvider).providerConfigs[1].provider, BinancePocketProvider) - t.equal((provider as FallbackProvider).quorum, 2) + t.equal((provider as FallbackProvider).quorum, 1) t.end() }, ) t.test('should return a instance of FallbackProvider wt.testh BinanceMoralisProvider', async (t) => { - const provider = await getBinanceDefaultProvider(BINANCE_TESTNET_NETWORK, { moralis: { apiKey: '1234' } }) + const provider = await getBinanceDefaultProvider(BINANCE_TESTNET_NETWORK, { + quorum: 2, + moralis: { apiKey: '1234' }, + }) t.type(provider, FallbackProvider) t.type((provider as FallbackProvider).providerConfigs[0].provider, BscscanProvider) t.type((provider as FallbackProvider).providerConfigs[1].provider, BinancePocketProvider) - t.type((provider as FallbackProvider).providerConfigs[2].provider, BinanceMoralisProvider) + t.type((provider as FallbackProvider).providerConfigs[2].provider, MoralisProvider) t.equal((provider as FallbackProvider).quorum, 2) t.end() }) @@ -298,12 +259,12 @@ t.test('Ethers Custom RPC', (t) => { t.test( 'should return a instance of FallbackProvider wt.testh BscscanProvider and BinancePocketProvider', async (t) => { - const provider = await getNetworkDefaultProvider(BINANCE_TESTNET_NETWORK) + const provider = await getNetworkDefaultProvider(BINANCE_TESTNET_NETWORK, { quorum: 1 }) t.type(provider, FallbackProvider) t.type((provider as FallbackProvider).providerConfigs[0].provider, BscscanProvider) t.type((provider as FallbackProvider).providerConfigs[1].provider, BinancePocketProvider) - t.equal((provider as FallbackProvider).quorum, 2) + t.equal((provider as FallbackProvider).quorum, 1) t.end() }, ) @@ -311,13 +272,13 @@ t.test('Ethers Custom RPC', (t) => { t.test( 'should return a instance of FallbackProvider wt.testh BscscanProvider and BinancePocketProvider', async (t) => { - const provider = await getNetworkDefaultProvider(GOERLI_NETWORK) + const provider = await getNetworkDefaultProvider(GOERLI_NETWORK, { quorum: 1 }) t.type(provider, FallbackProvider) - t.type((provider as FallbackProvider).providerConfigs[0].provider, InfuraProvider) + t.type((provider as FallbackProvider).providerConfigs[0].provider, AlchemyProvider) t.type((provider as FallbackProvider).providerConfigs[1].provider, EtherscanProvider) - t.type((provider as FallbackProvider).providerConfigs[2].provider, AlchemyProvider) - t.type((provider as FallbackProvider).providerConfigs[3].provider, AnkrProvider) + t.type((provider as FallbackProvider).providerConfigs[2].provider, InfuraProvider) + t.type((provider as FallbackProvider).providerConfigs[3].provider, QuickNodeProvider) t.equal((provider as FallbackProvider).quorum, 1) t.end() }, diff --git a/test/ethers.decorators.spec.ts b/test/ethers.decorators.spec.ts index aaf0166..10e7735 100644 --- a/test/ethers.decorators.spec.ts +++ b/test/ethers.decorators.spec.ts @@ -1,21 +1,25 @@ -import { Contract } from '@ethersproject/contracts' -import { Network } from '@ethersproject/networks' -import { BaseProvider } from '@ethersproject/providers' import { Module, Controller, Get, Injectable } from '@nestjs/common' +import { Contract, AbstractProvider, Network, FallbackProvider } from 'ethers' import * as nock from 'nock' import t from 'tap' import * as ABI from './utils/ABI.json' import { appRequest } from './utils/appRequest' -import { ETHERS_ADDRESS } from './utils/constants' +import { + ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY, + ETHERS_ADDRESS, + GOERLI_ETHERSCAN_API_KEY, + GOERLI_ETHERSCAN_URL, + PROVIDER_GET_BLOCK_NUMBER_RESPONSE, +} from './utils/constants' import { platforms } from './utils/platforms' import { EthersModule, InjectEthersProvider, InjectContractProvider, InjectSignerProvider, - MAINNET_NETWORK, EthersContract, EthersSigner, + GOERLI_NETWORK, } from '../src' t.test('InjectEthersProvider', (t) => { @@ -36,14 +40,21 @@ t.test('InjectEthersProvider', (t) => { t.test(PlatformAdapter.name, (t) => { t.test('forRoot', (t) => { t.test('should inject ethers provider in a service successfully', async (t) => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Injectable() class TestService { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: FallbackProvider, ) {} async someMethod(): Promise { - return this.ethersProvider.getNetwork() + const data = await this.ethersProvider.getNetwork() + + return data } } @@ -54,12 +65,18 @@ t.test('InjectEthersProvider', (t) => { async get() { const network = await this.service.someMethod() - return { network } + return { name: network.name, chainId: Number(network.chainId) } } } @Module({ - imports: [EthersModule.forRoot()], + imports: [ + EthersModule.forRoot({ + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, + }), + ], controllers: [TestController], providers: [TestService], }) @@ -69,29 +86,40 @@ t.test('InjectEthersProvider', (t) => { t.equal(res.statusCode, 200) t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) + t.hasOwnProps(res.body, ['name', 'chainId']) + t.equal(res.body.name, GOERLI_NETWORK.name) + t.equal(res.body.chainId, Number(GOERLI_NETWORK.chainId)) t.end() }) t.test('should inject ethers provider in a controller successfully', async (t) => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Controller('/') class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { const network = await this.ethersProvider.getNetwork() - return { network } + return { name: network.name, chainId: Number(network.chainId) } } } @Module({ - imports: [EthersModule.forRoot()], + imports: [ + EthersModule.forRoot({ + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, + }), + ], controllers: [TestController], }) class TestModule {} @@ -100,13 +128,18 @@ t.test('InjectEthersProvider', (t) => { t.equal(res.statusCode, 200) t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) + t.hasOwnProps(res.body, ['name', 'chainId']) + t.equal(res.body.name, GOERLI_NETWORK.name) + t.equal(res.body.chainId, Number(GOERLI_NETWORK.chainId)) t.end() }) t.test('should inject contract provider in a service successfully', async (t) => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Injectable() class TestService { constructor( @@ -116,7 +149,7 @@ t.test('InjectEthersProvider', (t) => { async someMethod(): Promise { const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI) - return contract.address + return contract.getAddress() } } @@ -132,7 +165,13 @@ t.test('InjectEthersProvider', (t) => { } @Module({ - imports: [EthersModule.forRoot()], + imports: [ + EthersModule.forRoot({ + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, + }), + ], controllers: [TestController], providers: [TestService], }) @@ -146,6 +185,11 @@ t.test('InjectEthersProvider', (t) => { }) t.test('should inject contract provider in a controller successfully', async (t) => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Controller('/') class TestController { constructor( @@ -155,13 +199,20 @@ t.test('InjectEthersProvider', (t) => { @Get() async get() { const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI) + const address = await contract.getAddress() - return { address: contract.address.toLowerCase() } + return { address: address.toLowerCase() } } } @Module({ - imports: [EthersModule.forRoot()], + imports: [ + EthersModule.forRoot({ + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, + }), + ], controllers: [TestController], }) class TestModule {} @@ -174,6 +225,11 @@ t.test('InjectEthersProvider', (t) => { }) t.test('should inject signer provider in a service successfully', async (t) => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Injectable() class TestService { constructor( @@ -199,7 +255,13 @@ t.test('InjectEthersProvider', (t) => { } @Module({ - imports: [EthersModule.forRoot()], + imports: [ + EthersModule.forRoot({ + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, + }), + ], controllers: [TestController], providers: [TestService], }) @@ -213,6 +275,11 @@ t.test('InjectEthersProvider', (t) => { }) t.test('should inject signer provider in a controller successfully', async (t) => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Controller('/') class TestController { constructor( @@ -228,7 +295,13 @@ t.test('InjectEthersProvider', (t) => { } @Module({ - imports: [EthersModule.forRoot()], + imports: [ + EthersModule.forRoot({ + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, + }), + ], controllers: [TestController], }) class TestModule {} @@ -245,14 +318,21 @@ t.test('InjectEthersProvider', (t) => { t.test('forRootAsync', (t) => { t.test('should inject ethers provider in a service successfully', async () => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Injectable() class TestService { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: FallbackProvider, ) {} async someMethod(): Promise { - return this.ethersProvider.getNetwork() + const data = await this.ethersProvider.getNetwork() + + return data } } @@ -263,7 +343,7 @@ t.test('InjectEthersProvider', (t) => { async get() { const network = await this.service.someMethod() - return { network } + return { name: network.name, chainId: Number(network.chainId) } } } @@ -272,7 +352,9 @@ t.test('InjectEthersProvider', (t) => { EthersModule.forRootAsync({ useFactory: () => { return { - useDefaultProvider: true, + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, } }, }), @@ -286,24 +368,29 @@ t.test('InjectEthersProvider', (t) => { t.equal(res.statusCode, 200) t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) + t.hasOwnProps(res.body, ['name', 'chainId']) + t.equal(res.body.name, GOERLI_NETWORK.name) + t.equal(res.body.chainId, Number(GOERLI_NETWORK.chainId)) t.end() }) t.test('should inject ethers provider in a controller successfully', async () => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Controller('/') class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { const network = await this.ethersProvider.getNetwork() - return { network } + return { name: network.name, chainId: Number(network.chainId) } } } @@ -312,7 +399,9 @@ t.test('InjectEthersProvider', (t) => { EthersModule.forRootAsync({ useFactory: () => { return { - useDefaultProvider: true, + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, } }, }), @@ -325,13 +414,18 @@ t.test('InjectEthersProvider', (t) => { t.equal(res.statusCode, 200) t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) + t.hasOwnProps(res.body, ['name', 'chainId']) + t.equal(res.body.name, GOERLI_NETWORK.name) + t.equal(res.body.chainId, Number(GOERLI_NETWORK.chainId)) t.end() }) t.test('should inject contract provider in a service successfully', async () => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Injectable() class TestService { constructor( @@ -341,7 +435,7 @@ t.test('InjectEthersProvider', (t) => { async someMethod(): Promise { const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI) - return contract.address + return contract.getAddress() } } @@ -361,7 +455,9 @@ t.test('InjectEthersProvider', (t) => { EthersModule.forRootAsync({ useFactory: () => { return { - useDefaultProvider: true, + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, } }, }), @@ -379,6 +475,11 @@ t.test('InjectEthersProvider', (t) => { }) t.test('should inject contract provider in a controller successfully', async () => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Controller('/') class TestController { constructor( @@ -388,8 +489,9 @@ t.test('InjectEthersProvider', (t) => { @Get() async get() { const contract: Contract = this.contract.create(ETHERS_ADDRESS, ABI) + const address = await contract.getAddress() - return { address: contract.address.toLowerCase() } + return { address: address.toLowerCase() } } } @@ -398,7 +500,9 @@ t.test('InjectEthersProvider', (t) => { EthersModule.forRootAsync({ useFactory: () => { return { - useDefaultProvider: true, + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, } }, }), @@ -415,6 +519,11 @@ t.test('InjectEthersProvider', (t) => { }) t.test('should inject signer provider in a service successfully', async () => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Injectable() class TestService { constructor( @@ -444,7 +553,9 @@ t.test('InjectEthersProvider', (t) => { EthersModule.forRootAsync({ useFactory: () => { return { - useDefaultProvider: true, + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, } }, }), @@ -462,6 +573,11 @@ t.test('InjectEthersProvider', (t) => { }) t.test('should inject signer provider in a controller successfully', async () => { + nock(GOERLI_ETHERSCAN_URL) + .get('') + .query(ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY) + .reply(200, PROVIDER_GET_BLOCK_NUMBER_RESPONSE) + @Controller('/') class TestController { constructor( @@ -481,7 +597,9 @@ t.test('InjectEthersProvider', (t) => { EthersModule.forRootAsync({ useFactory: () => { return { - useDefaultProvider: true, + network: GOERLI_NETWORK, + etherscan: GOERLI_ETHERSCAN_API_KEY, + useDefaultProvider: false, } }, }), diff --git a/test/ethers.module.spec.ts b/test/ethers.module.spec.ts index 0eabb34..c0f8745 100644 --- a/test/ethers.module.spec.ts +++ b/test/ethers.module.spec.ts @@ -1,14 +1,14 @@ -import { BigNumber } from '@ethersproject/bignumber' -import { Network } from '@ethersproject/networks' +import { Module, Controller, Get, Injectable } from '@nestjs/common' +import { NestFactory } from '@nestjs/core' import { - BaseProvider, + Network, + AbstractProvider, FallbackProvider, - StaticJsonRpcProvider, PocketProvider, AlchemyProvider, -} from '@ethersproject/providers' -import { Module, Controller, Get, Injectable } from '@nestjs/common' -import { NestFactory } from '@nestjs/core' + JsonRpcProvider, + FeeData, +} from 'ethers' import * as nock from 'nock' import t from 'tap' import { appRequest } from './utils/appRequest' @@ -17,7 +17,6 @@ import { GOERLI_ALCHEMY_API_KEY, GOERLI_POCKET_URL, GOERLI_POKT_API_KEY, - GOERLI_POKT_SECRET_KEY, GOERLI_ETHERSCAN_URL, GOERLI_ETHERSCAN_API_KEY, GOERLI_INFURA_URL, @@ -80,7 +79,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -114,13 +113,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @Module({ @@ -151,23 +150,20 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @Module({ imports: [ EthersModule.forRoot({ network: GOERLI_NETWORK, - pocket: { - applicationId: GOERLI_POKT_API_KEY, - applicationSecretKey: GOERLI_POKT_SECRET_KEY, - }, + pocket: GOERLI_POKT_API_KEY, useDefaultProvider: false, }), ], @@ -189,13 +185,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @Module({ @@ -226,13 +222,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @Module({ @@ -261,13 +257,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @Module({ @@ -298,23 +294,20 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @Module({ imports: [ EthersModule.forRoot({ network: BINANCE_NETWORK, - pocket: { - applicationId: GOERLI_POKT_API_KEY, - applicationSecretKey: GOERLI_POKT_SECRET_KEY, - }, + pocket: GOERLI_POKT_API_KEY, useDefaultProvider: false, }), ], @@ -334,7 +327,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -364,7 +357,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -394,7 +387,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -419,7 +412,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -439,66 +432,6 @@ t.test('Ethers Module Initialization', (t) => { t.end() }) - t.test('should not wait until providers are connected', async (t) => { - @Controller('/') - class TestController { - constructor( - @InjectEthersProvider() - private readonly ethersProvider: FallbackProvider, - ) {} - @Get() - async get() { - const network: Network = await this.ethersProvider.getNetwork() - - return { network } - } - } - @Module({ - imports: [EthersModule.forRoot({ waitUntilIsConnected: false })], - controllers: [TestController], - }) - class TestModule {} - - const res = await appRequest(t, TestModule, PlatformAdapter) - - t.equal(res.statusCode, 200) - t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) - t.end() - }) - - t.test('should disable ethers logger', async (t) => { - @Controller('/') - class TestController { - constructor( - @InjectEthersProvider() - private readonly ethersProvider: FallbackProvider, - ) {} - @Get() - async get() { - const network: Network = await this.ethersProvider.getNetwork() - - return { network } - } - } - @Module({ - imports: [EthersModule.forRoot({ disableEthersLogger: true })], - controllers: [TestController], - }) - class TestModule {} - - const res = await appRequest(t, TestModule, PlatformAdapter) - - t.equal(res.statusCode, 200) - t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) - t.end() - }) - t.test('should work with bscscan provider', async (t) => { nock(TESTNET_BSCSCAN_URL) .get('') @@ -513,9 +446,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.bscProvider.getGasPrice() + const data: FeeData = await this.bscProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -561,9 +494,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.bscProvider.getGasPrice() + const data: FeeData = await this.bscProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -616,9 +549,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.bscProvider.getGasPrice() + const data: FeeData = await this.bscProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -645,7 +578,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -678,13 +611,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly customProvider: StaticJsonRpcProvider, + private readonly customProvider: JsonRpcProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.customProvider.getGasPrice() + const data: FeeData = await this.customProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -734,9 +667,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.customProvider.getGasPrice() + const data: FeeData = await this.customProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -778,18 +711,18 @@ t.test('Ethers Module Initialization', (t) => { @InjectEthersProvider('poly') private readonly alchemyProvider: AlchemyProvider, @InjectEthersProvider('bsc') - private readonly customProvider: StaticJsonRpcProvider, + private readonly customProvider: JsonRpcProvider, ) {} @Get() async get() { - const pocketGasPrice: BigNumber = await this.pocketProvider.getGasPrice() - const alchemyGasPrice: BigNumber = await this.alchemyProvider.getGasPrice() - const bscGasPrice: BigNumber = await this.customProvider.getGasPrice() + const pocketGasPrice: FeeData = await this.pocketProvider.getFeeData() + const alchemyGasPrice: FeeData = await this.alchemyProvider.getFeeData() + const bscGasPrice: FeeData = await this.customProvider.getFeeData() return { - pocketGasPrice: pocketGasPrice.toString(), - alchemyGasPrice: alchemyGasPrice.toString(), - bscGasPrice: bscGasPrice.toString(), + pocketGasPrice: pocketGasPrice.gasPrice?.toString(), + alchemyGasPrice: alchemyGasPrice.gasPrice?.toString(), + bscGasPrice: bscGasPrice.gasPrice?.toString(), } } } @@ -798,10 +731,7 @@ t.test('Ethers Module Initialization', (t) => { EthersModule.forRoot({ token: 'eth', network: GOERLI_NETWORK, - pocket: { - applicationId: GOERLI_POKT_API_KEY, - applicationSecretKey: GOERLI_POKT_SECRET_KEY, - }, + pocket: GOERLI_POKT_API_KEY, useDefaultProvider: false, }), EthersModule.forRoot({ @@ -846,13 +776,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -900,13 +830,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -950,13 +880,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1021,13 +951,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.ethersProvider.getGasPrice() + const data: FeeData = await this.ethersProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1076,7 +1006,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -1121,7 +1051,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -1166,7 +1096,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -1206,7 +1136,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -1241,44 +1171,6 @@ t.test('Ethers Module Initialization', (t) => { t.end() }) - t.test('should not wait until providers are connected', async (t) => { - @Controller('/') - class TestController { - constructor( - @InjectEthersProvider() - private readonly ethersProvider: FallbackProvider, - ) {} - @Get() - async get() { - const network: Network = await this.ethersProvider.getNetwork() - - return { network } - } - } - @Module({ - imports: [ - EthersModule.forRootAsync({ - useFactory: () => { - return { - waitUntilIsConnected: false, - } - }, - }), - ], - controllers: [TestController], - }) - class TestModule {} - - const res = await appRequest(t, TestModule, PlatformAdapter) - - t.equal(res.statusCode, 200) - t.notHas(res.body, 'network') - t.hasOwnProps(res.body.network, ['name', 'chainId', 'ensAddress']) - t.equal(res.body.network.name, MAINNET_NETWORK.name) - t.equal(res.body.network.chainId, 1) - t.end() - }) - t.test('should work with bscscan provider', async (t) => { nock(TESTNET_BSCSCAN_URL) .get('') @@ -1293,9 +1185,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.bscProvider.getGasPrice() + const data: FeeData = await this.bscProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1357,9 +1249,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.bscProvider.getGasPrice() + const data: FeeData = await this.bscProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1424,9 +1316,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.bscProvider.getGasPrice() + const data: FeeData = await this.bscProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1469,7 +1361,7 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly ethersProvider: BaseProvider, + private readonly ethersProvider: AbstractProvider, ) {} @Get() async get() { @@ -1514,13 +1406,13 @@ t.test('Ethers Module Initialization', (t) => { class TestController { constructor( @InjectEthersProvider() - private readonly customProvider: StaticJsonRpcProvider, + private readonly customProvider: JsonRpcProvider, ) {} @Get() async get() { - const gasPrice: BigNumber = await this.customProvider.getGasPrice() + const data: FeeData = await this.customProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1586,9 +1478,9 @@ t.test('Ethers Module Initialization', (t) => { ) {} @Get() async get() { - const gasPrice: BigNumber = await this.customProvider.getGasPrice() + const data: FeeData = await this.customProvider.getFeeData() - return { gasPrice: gasPrice.toString() } + return { gasPrice: data.gasPrice?.toString() } } } @@ -1646,26 +1538,26 @@ t.test('Ethers Module Initialization', (t) => { @InjectEthersProvider('poly') private readonly alchemyProvider: AlchemyProvider, @InjectEthersProvider('bsc') - private readonly customProvider: StaticJsonRpcProvider, + private readonly customProvider: JsonRpcProvider, ) {} @Get() async get() { - const pocketGasPrice: BigNumber = await this.pocketProvider.getGasPrice() - const alchemyGasPrice: BigNumber = await this.alchemyProvider.getGasPrice() - const bscGasPrice: BigNumber = await this.customProvider.getGasPrice() + const pocketGasPrice: FeeData = await this.pocketProvider.getFeeData() + const alchemyGasPrice: FeeData = await this.alchemyProvider.getFeeData() + const bscGasPrice: FeeData = await this.customProvider.getFeeData() return { - pocketGasPrice: pocketGasPrice.toString(), - alchemyGasPrice: alchemyGasPrice.toString(), - bscGasPrice: bscGasPrice.toString(), + pocketGasPrice: pocketGasPrice.gasPrice?.toString(), + alchemyGasPrice: alchemyGasPrice.gasPrice?.toString(), + bscGasPrice: bscGasPrice.gasPrice?.toString(), } } } @Injectable() class ConfigService { - public readonly applicationId = GOERLI_POKT_API_KEY - public readonly applicationSecretKey = GOERLI_POKT_SECRET_KEY + public readonly applicationId = GOERLI_POKT_API_KEY.applicationId + public readonly applicationSecretKey = GOERLI_POKT_API_KEY.applicationSecretKey public readonly alchemy = GOERLI_ALCHEMY_API_KEY public readonly custom = CUSTOM_BSC_1_URL } diff --git a/test/ethers.signer.spec.ts b/test/ethers.signer.spec.ts index 6612e9f..40a6555 100644 --- a/test/ethers.signer.spec.ts +++ b/test/ethers.signer.spec.ts @@ -1,4 +1,5 @@ import { Module, Controller, Get, Injectable } from '@nestjs/common' +import { Mnemonic } from 'ethers' import * as nock from 'nock' import t from 'tap' import { appRequest } from './utils/appRequest' @@ -169,7 +170,7 @@ t.test('EthersSigner', (t) => { private readonly signer: EthersSigner, ) {} async someMethod(): Promise { - const wallet = this.signer.createWalletfromMnemonic(ETHERS_MNEMONIC) + const wallet = this.signer.createWalletfromMnemonic(Mnemonic.fromPhrase(ETHERS_MNEMONIC)) if (!wallet?.provider?.getNetwork()) { throw new Error('No provider injected') @@ -415,7 +416,7 @@ t.test('EthersSigner', (t) => { private readonly signer: EthersSigner, ) {} async someMethod(): Promise { - const wallet = this.signer.createWalletfromMnemonic(ETHERS_MNEMONIC) + const wallet = this.signer.createWalletfromMnemonic(Mnemonic.fromPhrase(ETHERS_MNEMONIC)) if (!wallet?.provider?.getNetwork()) { throw new Error('No provider injected') diff --git a/test/ethers.utils.spec.ts b/test/ethers.utils.spec.ts index f655c83..c5f467e 100644 --- a/test/ethers.utils.spec.ts +++ b/test/ethers.utils.spec.ts @@ -68,7 +68,7 @@ t.test('getNetwork', (t) => { }) t.test('should throw an error if the network is not defined', (t) => { - t.throws(() => getNetwork(null)) + t.throws(() => getNetwork()) t.end() }) @@ -81,15 +81,14 @@ t.test('getNetwork', (t) => { t.test('should return a valid network for a name', (t) => { const network = getNetwork('sepolia') - - t.equal(network, SEPOLIA_NETWORK) + t.equal(network.name, SEPOLIA_NETWORK.name) t.end() }) t.test('should return a valid network for a Network object', (t) => { const network = getNetwork(SEPOLIA_NETWORK) - t.equal(network, SEPOLIA_NETWORK) + t.equal(network.name, SEPOLIA_NETWORK.name) t.end() }) diff --git a/test/utils/constants.ts b/test/utils/constants.ts index fdb4c81..ca73587 100644 --- a/test/utils/constants.ts +++ b/test/utils/constants.ts @@ -15,13 +15,15 @@ export const CUSTOM_BSC_3_URL = 'https://data-seed-prebsc-2-s2.binance.org:8545' export const MUMBAI_ALCHEMY_URL = 'https://polygon-mumbai.g.alchemy.com/v2/' export const GOERLI_ETHERSCAN_API_KEY = randomBytes(17).toString('hex') export const GOERLI_ALCHEMY_API_KEY = randomBytes(16).toString('hex') -export const GOERLI_POKT_API_KEY = randomBytes(12).toString('hex') -export const GOERLI_POKT_SECRET_KEY = randomBytes(16).toString('hex') +export const GOERLI_POKT_API_KEY = { + applicationId: randomBytes(12).toString('hex'), + applicationSecretKey: randomBytes(16).toString('hex'), +} export const GOERLI_INFURA_PROJECT_ID = randomBytes(16).toString('hex') export const GOERLI_INFURA_PROJECT_SECRET = randomBytes(16).toString('hex') -export const GOERLI_MORALIS_API_KEY = randomBytes(12).toString('hex') +export const GOERLI_MORALIS_API_KEY = { apiKey: randomBytes(12).toString('hex') } export const GOERLI_MORALIS_URL = `https://speedy-nodes-nyc.moralis.io/${GOERLI_MORALIS_API_KEY}/eth/goerli` -export const BINANCE_TESTNET_MORALIS_API_KEY = randomBytes(12).toString('hex') +export const BINANCE_TESTNET_MORALIS_API_KEY = { apiKey: randomBytes(12).toString('hex') } export const BINANCE_TESTNET_MORALIS_URL = `https://speedy-nodes-nyc.moralis.io/${BINANCE_TESTNET_MORALIS_API_KEY}/bsc/testnet` export const GOERLI_ANKR_API_KEY = randomBytes(12).toString('hex') export const GOERLI_ANKR_URL = `https://rpc.ankr.com/eth_goerli/${GOERLI_ANKR_API_KEY}` @@ -41,9 +43,12 @@ export const ETHERSCAN_GET_GAS_PRICE_QUERY = { action: 'eth_gasPrice', apikey: GOERLI_ETHERSCAN_API_KEY, } -export const ETHERSCAN_GET_BLOCK_NUMBER_QUERY = { +export const ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY = { module: 'proxy', action: 'eth_blockNumber', +} +export const ETHERSCAN_GET_BLOCK_NUMBER_QUERY = { + ...ETHERSCAN_GET_BLOCK_NUMBER_QUERY_COMMUNITY, apikey: GOERLI_ETHERSCAN_API_KEY, } export const PROVIDER_GET_BLOCK_NUMBER_BODY = {