diff --git a/.prettierrc b/.prettierrc index 74eabe89..ee79893b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,12 +5,6 @@ "useTabs": false, "bracketSpacing": true, "overrides": [ - { - "files": "*.sol", - "options": { - "explicitTypes": "always" - } - }, { "files": "*.js", "options": { diff --git a/package-lock.json b/package-lock.json index 4c13b3fa..83a65f0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,15 +12,19 @@ "@cosmjs/cosmwasm-stargate": "^0.32.2", "@mysten/sui.js": "^0.54.1", "child_process": "^1.0.2", - "dotenv": "^16.3.1", - "eslint": "^8.57.0", - "eslint-config-richardpringle": "^2.0.0", "ethers": "^5.0.0", "fs": "^0.0.1-security", - "prettier": "^2.8.7", "secp256k1": "^5.0.0", "tmp": "^0.2.1" }, + "devDependencies": { + "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "dotenv": "^16.3.1", + "eslint": "^8.57.0", + "eslint-config-richardpringle": "^2.0.0", + "prettier": "^2.8.7", + "prettier-plugin-sort-imports": "^1.8.5" + }, "engines": { "node": ">=18" } @@ -55,7 +59,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -64,6 +67,316 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.6", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.6", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", @@ -75,6 +388,64 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/template": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@confio/ics23": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", @@ -228,6 +599,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -242,6 +614,7 @@ "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" } @@ -250,6 +623,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -272,6 +646,7 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1008,6 +1383,7 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -1021,6 +1397,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "engines": { "node": ">=12.22" }, @@ -1032,13 +1409,48 @@ "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@ianvs/prettier-plugin-sort-imports": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.2.1.tgz", + "integrity": "sha512-NKN1LVFWUDGDGr3vt+6Ey3qPeN/163uR1pOPAlkWpgvAqgxQ6kSdUf1F0it8aHUtKRUzEGcK38Wxd07O61d7+Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.0", + "@babel/generator": "^7.23.6", + "@babel/parser": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "semver": "^7.5.2" + }, + "peerDependencies": { + "@vue/compiler-sfc": "2.7.x || 3.x", + "prettier": "2 || 3" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1052,7 +1464,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -1061,7 +1472,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -1069,14 +1479,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "peer": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1143,6 +1551,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1155,6 +1564,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -1163,6 +1573,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1272,7 +1683,8 @@ "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/long": { "version": "4.0.2", @@ -1290,7 +1702,8 @@ "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==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@volar/language-core": { "version": "2.2.5", @@ -1393,6 +1806,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1406,6 +1820,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1421,6 +1836,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -1429,6 +1845,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1442,7 +1859,8 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/aria-query": { "version": "5.3.0", @@ -1457,6 +1875,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -1472,6 +1891,7 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -1491,6 +1911,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -1510,6 +1931,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1527,6 +1949,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1544,6 +1967,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -1570,6 +1994,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -1652,6 +2077,38 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/bs58": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", @@ -1664,6 +2121,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1682,14 +2140,36 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001625", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz", + "integrity": "sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1732,6 +2212,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1742,7 +2223,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1765,6 +2247,12 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/cosmjs-types": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", @@ -1774,6 +2262,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1800,6 +2289,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -1816,6 +2306,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -1832,6 +2323,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -1853,6 +2345,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1873,7 +2366,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/define-data-property": { "version": "1.1.4", @@ -1928,6 +2422,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -1939,6 +2434,7 @@ "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -1946,6 +2442,12 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "node_modules/electron-to-chromium": { + "version": "1.4.786", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.786.tgz", + "integrity": "sha512-i/A2UB0sxYViMN0M2zIotQFRIOt1jLuVXudACHBDiJ5gGuAUzf/crZxwlBTdA0O52Hy4CNtTzS7AKRAacs/08Q==", + "dev": true + }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -1980,6 +2482,7 @@ "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -2058,6 +2561,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -2069,6 +2573,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -2082,6 +2587,7 @@ "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": { "hasown": "^2.0.0" } @@ -2090,6 +2596,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2102,10 +2609,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -2117,6 +2634,7 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2171,6 +2689,7 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, "dependencies": { "get-stdin": "^6.0.0" }, @@ -2185,6 +2704,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-config-richardpringle/-/eslint-config-richardpringle-2.0.0.tgz", "integrity": "sha512-c2eaJF76KmvOz1KvQCu5nrHBM1H6qB9Z5aW+RYaw9yQsoELiZ09ms9F7NZdPV4Q15sYV8NEJje9rTwnrbUSX6w==", + "dev": true, "dependencies": { "eslint-config-prettier": "^6.10.1", "eslint-config-standard": "^14.1.1", @@ -2199,6 +2719,7 @@ "version": "14.1.1", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", + "dev": true, "peerDependencies": { "eslint": ">=6.2.2", "eslint-plugin-import": ">=2.18.0", @@ -2211,6 +2732,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -2221,6 +2743,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -2229,6 +2752,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, "dependencies": { "debug": "^3.2.7" }, @@ -2245,6 +2769,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -2253,6 +2778,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" @@ -2271,6 +2797,7 @@ "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -2301,6 +2828,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -2309,6 +2837,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -2320,6 +2849,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", "integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==", + "dev": true, "dependencies": { "eslint-utils": "^2.0.0", "ramda": "^0.27.0" @@ -2335,6 +2865,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, "dependencies": { "eslint-plugin-es": "^3.0.0", "eslint-utils": "^2.0.0", @@ -2354,6 +2885,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "dev": true, "engines": { "node": ">=6" } @@ -2362,6 +2894,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", + "dev": true, "funding": [ { "type": "github", @@ -2384,6 +2917,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2399,6 +2933,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -2413,6 +2948,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, "engines": { "node": ">=4" } @@ -2421,6 +2957,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2432,6 +2969,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2448,6 +2986,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -2459,6 +2998,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -2470,6 +3010,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -2483,6 +3024,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2537,22 +3079,26 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -2561,6 +3107,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -2572,6 +3119,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2587,6 +3135,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -2599,7 +3148,8 @@ "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -2624,6 +3174,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -2663,6 +3214,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2680,10 +3232,20 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -2706,6 +3268,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, "engines": { "node": ">=4" } @@ -2714,6 +3277,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -2749,6 +3313,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2760,6 +3325,7 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -2815,7 +3381,8 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/graphql": { "version": "16.8.1", @@ -2829,6 +3396,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2837,6 +3405,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2878,6 +3447,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -2930,6 +3500,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, "engines": { "node": ">= 4" } @@ -2938,6 +3509,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2953,6 +3525,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -2975,6 +3548,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -2988,6 +3562,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -3003,6 +3578,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -3014,6 +3590,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -3029,6 +3606,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -3040,6 +3618,7 @@ "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": { "hasown": "^2.0.0" }, @@ -3051,6 +3630,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, "dependencies": { "is-typed-array": "^1.1.13" }, @@ -3065,6 +3645,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3079,6 +3660,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3087,6 +3669,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -3098,6 +3681,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -3109,6 +3693,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3123,6 +3708,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3140,6 +3726,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -3155,6 +3742,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, "dependencies": { "call-bind": "^1.0.7" }, @@ -3169,6 +3757,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3183,6 +3772,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -3197,6 +3787,7 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -3211,6 +3802,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -3221,12 +3813,14 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isomorphic-ws": { "version": "4.0.1", @@ -3241,10 +3835,17 @@ "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", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -3252,25 +3853,41 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -3282,6 +3899,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -3290,6 +3908,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3321,6 +3940,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -3334,7 +3954,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/long": { "version": "4.0.0", @@ -3349,6 +3970,15 @@ "tslib": "^2.0.3" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -3408,6 +4038,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3415,7 +4046,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/muggle-string": { "version": "0.4.1", @@ -3425,7 +4057,8 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/no-case": { "version": "3.0.4", @@ -3451,10 +4084,17 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/object-inspect": { "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" } @@ -3471,6 +4111,7 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -3488,6 +4129,7 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3505,6 +4147,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3518,6 +4161,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3542,6 +4186,7 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -3558,6 +4203,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3572,6 +4218,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -3591,6 +4238,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -3616,6 +4264,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -3632,6 +4281,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -3639,7 +4289,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/periscopic": { "version": "3.1.0", @@ -3661,10 +4312,17 @@ "@types/estree": "^1.0.0" } }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -3673,6 +4331,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -3681,6 +4340,7 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, "bin": { "prettier": "bin-prettier.js" }, @@ -3691,6 +4351,33 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-plugin-sort-imports": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-1.8.5.tgz", + "integrity": "sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==", + "dev": true, + "dependencies": { + "prettier": "^3.1.1" + }, + "peerDependencies": { + "typescript": ">4.0.0" + } + }, + "node_modules/prettier-plugin-sort-imports/node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/protobufjs": { "version": "6.11.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", @@ -3725,6 +4412,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -3733,6 +4421,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -3751,7 +4440,8 @@ "node_modules/ramda": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==" + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true }, "node_modules/readonly-date": { "version": "1.0.0", @@ -3762,6 +4452,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -3779,6 +4470,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, "engines": { "node": ">=8" }, @@ -3790,6 +4482,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -3806,6 +4499,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -3814,6 +4508,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3837,6 +4532,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -3859,6 +4555,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -3876,6 +4573,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -3911,6 +4609,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -3919,6 +4618,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3935,6 +4635,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3949,6 +4650,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3960,6 +4662,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -3968,6 +4671,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -3993,6 +4697,7 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4010,6 +4715,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4023,6 +4729,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4039,6 +4746,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4050,6 +4758,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { "node": ">=4" } @@ -4058,6 +4767,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -4077,6 +4787,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4088,6 +4799,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -4153,7 +4865,8 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/tmp": { "version": "0.2.1", @@ -4166,10 +4879,20 @@ "node": ">=8.17.0" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -4191,6 +4914,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4202,6 +4926,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -4213,6 +4938,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -4226,6 +4952,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -4244,6 +4971,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -4263,6 +4991,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -4295,6 +5024,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -4310,10 +5040,41 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -4331,6 +5092,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4345,6 +5107,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -4360,6 +5123,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -4378,6 +5142,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4416,10 +5181,17 @@ "symbol-observable": "^2.0.3" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 1810a4ed..cd502b5f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "test": "for d in ./move/*/; do sui move test --path $d ; done", "coverage": "./scripts/coverage.sh", "lint": "eslint --fix '**/*.js'", - "prettier": "prettier --write '**/*.js' 'package.json' '.github/**/*.yaml'" + "prettier": "prettier --write '**/*.js'" }, "keywords": [ "axelar", @@ -23,17 +23,21 @@ "node": ">=18" }, "dependencies": { - "@mysten/sui.js": "^0.54.1", "@cosmjs/cosmwasm-stargate": "^0.32.2", + "@mysten/sui.js": "^0.54.1", "child_process": "^1.0.2", - "dotenv": "^16.3.1", "ethers": "^5.0.0", "fs": "^0.0.1-security", "secp256k1": "^5.0.0", - "tmp": "^0.2.1", - "prettier": "^2.8.7", + "tmp": "^0.2.1" + }, + "devDependencies": { + "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "dotenv": "^16.3.1", "eslint": "^8.57.0", - "eslint-config-richardpringle": "^2.0.0" + "eslint-config-richardpringle": "^2.0.0", + "prettier": "^2.8.7", + "prettier-plugin-sort-imports": "^1.8.5" }, "description": "Axelar Sui Move contracts" } diff --git a/scripts/gateway.js b/scripts/gateway.js index d9477608..113b81dc 100644 --- a/scripts/gateway.js +++ b/scripts/gateway.js @@ -1,17 +1,15 @@ require('dotenv').config(); -const {BCS, fromHEX, getSuiMoveConfig} = require("@mysten/bcs"); const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const secp256k1 = require('secp256k1'); +const { BCS, fromHEX, getSuiMoveConfig } = require('@mysten/bcs'); const { CosmWasmClient } = require('@cosmjs/cosmwasm-stargate'); const { utils: { keccak256 }, } = require('ethers'); +const secp256k1 = require('secp256k1'); function hashMessage(data) { // sorry for putting it here... - const messagePrefix = new Uint8Array( - Buffer.from("\x19Sui Signed Message:\n", "ascii") - ); + const messagePrefix = new Uint8Array(Buffer.from('\x19Sui Signed Message:\n', 'ascii')); let hashed = new Uint8Array(messagePrefix.length + data.length); hashed.set(messagePrefix); hashed.set(data, messagePrefix.length); @@ -23,45 +21,45 @@ function getBcsForGateway() { const bcs = new BCS(getSuiMoveConfig()); // input argument for the tx - bcs.registerStructType("Input", { - data: "vector", - proof: "vector", + bcs.registerStructType('Input', { + data: 'vector', + proof: 'vector', }); - bcs.registerStructType("Proof", { + bcs.registerStructType('Proof', { // operators is a 33 byte / for now at least - operators: "vector>", - weights: "vector", - threshold: "u128", - signatures: "vector>", + operators: 'vector>', + weights: 'vector', + threshold: 'u128', + signatures: 'vector>', }); // internals of the message - bcs.registerStructType("AxelarMessage", { - chain_id: "u64", - command_ids: "vector
", - commands: "vector", - params: "vector>", + bcs.registerStructType('AxelarMessage', { + chain_id: 'u64', + command_ids: 'vector
', + commands: 'vector', + params: 'vector>', }); // internals of the message - bcs.registerStructType("TransferOperatorshipMessage", { - operators: "vector>", - weights: "vector", - threshold: "u128", + bcs.registerStructType('TransferOperatorshipMessage', { + operators: 'vector>', + weights: 'vector', + threshold: 'u128', }); - bcs.registerStructType("GenericMessage", { - source_chain: "string", - source_address: "string", - target_id: "address", - payload_hash: "address", + bcs.registerStructType('GenericMessage', { + source_chain: 'string', + source_address: 'string', + target_id: 'address', + payload_hash: 'address', }); return bcs; } function getOperators(axelarInfo) { - if(!axelarInfo.activeOperators) { + if (!axelarInfo.activeOperators) { return { privKeys: [], weights: [], @@ -73,27 +71,25 @@ function getOperators(axelarInfo) { function getRandomOperators(n = 5) { let privKeys = []; - for(let i=0; i secp256k1.publicKeyCreate(Buffer.from(privKey, 'hex'))); - const indices = Array.from(pubKeys.keys()) + let pubKeys = privKeys.map((privKey) => secp256k1.publicKeyCreate(Buffer.from(privKey, 'hex'))); + const indices = Array.from(pubKeys.keys()); const pubKeyLength = 33; - indices.sort( (a, b) => { - for(let i = 0; i < pubKeyLength; i++) { + indices.sort((a, b) => { + for (let i = 0; i < pubKeyLength; i++) { const aByte = pubKeys[a][i]; const bByte = pubKeys[b][i]; - if(aByte != bByte) return aByte - bByte; + if (aByte != bByte) return aByte - bByte; } return 0; - } ); - pubKeys = indices.map(i => pubKeys[i]); - privKeys = indices.map(i => privKeys[i]); - const weights = privKeys.map(privKey => 3); + }); + pubKeys = indices.map((i) => pubKeys[i]); + privKeys = indices.map((i) => privKeys[i]); + const weights = privKeys.map((privKey) => 3); const threshold = privKeys.length * 2; return { @@ -101,23 +97,23 @@ function getRandomOperators(n = 5) { pubKeys, weights, threshold, - } + }; } function getInputForMessage(info, message) { const operators = getOperators(info); // get the public key in a compressed format - const pubKeys = operators.privKeys.map(privKey => secp256k1.publicKeyCreate(Buffer.from(privKey, 'hex'))); + const pubKeys = operators.privKeys.map((privKey) => secp256k1.publicKeyCreate(Buffer.from(privKey, 'hex'))); const hashed = fromHEX(hashMessage(message)); - const signatures = operators.privKeys.map(privKey => { - const {signature, recid} = secp256k1.ecdsaSign(hashed, Buffer.from(privKey, 'hex')); + const signatures = operators.privKeys.map((privKey) => { + const { signature, recid } = secp256k1.ecdsaSign(hashed, Buffer.from(privKey, 'hex')); return new Uint8Array([...signature, recid]); - }) + }); const bcs = getBcsForGateway(); - const proof = bcs - .ser("Proof", { + const proof = bcs + .ser('Proof', { operators: pubKeys, weights: operators.weights, threshold: operators.threshold, @@ -126,7 +122,7 @@ function getInputForMessage(info, message) { .toBytes(); const input = bcs - .ser("Input", { + .ser('Input', { data: message, proof: proof, }) @@ -134,17 +130,24 @@ function getInputForMessage(info, message) { return input; } -function approveContractCallInput(axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash, commandId = keccak256((new Date()).getTime())) { +function approveContractCallInput( + axelarInfo, + sourceChain, + sourceAddress, + destinationAddress, + payloadHash, + commandId = keccak256(new Date().getTime()), +) { const bcs = getBcsForGateway(); const message = bcs - .ser("AxelarMessage", { + .ser('AxelarMessage', { chain_id: 1, command_ids: [commandId], - commands: ["approveContractCall"], + commands: ['approveContractCall'], params: [ bcs - .ser("GenericMessage", { + .ser('GenericMessage', { source_chain: sourceChain, source_address: sourceAddress, payload_hash: payloadHash, @@ -155,19 +158,19 @@ function approveContractCallInput(axelarInfo, sourceChain, sourceAddress, destin }) .toBytes(); - return getInputForMessage(axelarInfo, message); + return getInputForMessage(axelarInfo, message); } -function TransferOperatorshipInput(info, newOperators, newWeights, newThreshold, commandId = keccak256((new Date()).getTime())) { +function TransferOperatorshipInput(info, newOperators, newWeights, newThreshold, commandId = keccak256(new Date().getTime())) { const bcs = getBcsForGateway(); const message = bcs - .ser("AxelarMessage", { + .ser('AxelarMessage', { chain_id: 1, command_ids: [commandId], - commands: ["transferOperatorship"], + commands: ['transferOperatorship'], params: [ bcs - .ser("TransferOperatorshipMessage", { + .ser('TransferOperatorshipMessage', { operators: newOperators, weights: newWeights, threshold: newThreshold, @@ -177,16 +180,16 @@ function TransferOperatorshipInput(info, newOperators, newWeights, newThreshold, }) .toBytes(); - return getInputForMessage(info, message); + return getInputForMessage(info, message); } async function approveContractCall(client, keypair, axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash) { - const commandId = keccak256((new Date()).getTime()); + const commandId = keccak256(new Date().getTime()); const input = approveContractCallInput(axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash, commandId); const packageId = axelarInfo.packageId; const validators = axelarInfo['gateway::Gateway']; - const tx = new TransactionBlock(); + const tx = new TransactionBlock(); tx.moveCall({ target: `${packageId}::gateway::process_commands`, arguments: [tx.object(validators.objectId), tx.pure(String.fromCharCode(...input))], @@ -208,7 +211,7 @@ async function getAmplifierWorkers(rpc, proverAddr) { const client = await CosmWasmClient.connect(rpc); const workerSet = await client.queryContractSmart(proverAddr, 'get_worker_set'); const signers = Object.values(workerSet.signers).sort((a, b) => - a.pub_key.ecdsa.toLowerCase().localeCompare(b.pub_key.ecdsa.toLowerCase()) + a.pub_key.ecdsa.toLowerCase().localeCompare(b.pub_key.ecdsa.toLowerCase()), ); const pubKeys = signers.map((signer) => Buffer.from(signer.pub_key.ecdsa, 'hex')); @@ -216,14 +219,14 @@ async function getAmplifierWorkers(rpc, proverAddr) { const threshold = Number(workerSet.threshold); return { pubKeys, weights, threshold }; -}; +} -async function transferOperatorship(info, client, keypair, newOperators, newWeights, newThreshold ) { +async function transferOperatorship(info, client, keypair, newOperators, newWeights, newThreshold) { const input = TransferOperatorshipInput(info, newOperators, newWeights, newThreshold); const packageId = info.packageId; const gateway = info['gateway::Gateway']; - const tx = new TransactionBlock(); + const tx = new TransactionBlock(); tx.moveCall({ target: `${packageId}::gateway::process_commands`, arguments: [tx.object(gateway.objectId), tx.pure(String.fromCharCode(...input))], @@ -248,4 +251,4 @@ module.exports = { getAmplifierWorkers, getBcsForGateway, hashMessage, -} +}; diff --git a/scripts/governance.js b/scripts/governance.js index d343da67..8debef5e 100644 --- a/scripts/governance.js +++ b/scripts/governance.js @@ -1,15 +1,13 @@ const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { setConfig, getConfig, getFullObject } = require("./utils"); - - +const { setConfig, getConfig, getFullObject } = require('./utils'); async function initializeGovernance(upgradeCap, client, keypair, env) { const governanceConfig = getConfig('governance', env.alias); const packageId = governanceConfig.packageId; let tx = new TransactionBlock(); - tx.moveCall({ - target: `${packageId}::governance::new`, + tx.moveCall({ + target: `${packageId}::governance::new`, arguments: [ tx.pure.string('Axelar'), tx.pure.string('the governance source addresss'), @@ -19,15 +17,15 @@ async function initializeGovernance(upgradeCap, client, keypair, env) { typeArguments: [], }); const publishTxn = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true - }, + transactionBlock: tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + }, requestType: 'WaitForLocalExecution', - }); + }); const governance = publishTxn.objectChanges.find((obj) => obj.objectType == `${packageId}::governance::Governance`); @@ -41,13 +39,10 @@ async function takeUpgradeCaps(upgradeCaps, client, keypair, env) { const governanceConfig = getConfig('governance', env.alias); const packageId = governanceConfig.packageId; tx = new TransactionBlock(); - for(const upgradeCap of upgradeCaps) { - tx.moveCall({ - target: `${packageId}::governance::take_upgrade_cap`, - arguments: [ - tx.object(governanceConfig['governance::Governance'].objectId), - tx.object(upgradeCap.objectId), - ], + for (const upgradeCap of upgradeCaps) { + tx.moveCall({ + target: `${packageId}::governance::take_upgrade_cap`, + arguments: [tx.object(governanceConfig['governance::Governance'].objectId), tx.object(upgradeCap.objectId)], typeArguments: [], }); } @@ -58,7 +53,7 @@ async function takeUpgradeCaps(upgradeCaps, client, keypair, env) { options: { showEffects: true, showObjectChanges: true, - showContent: true + showContent: true, }, requestType: 'WaitForLocalExecution', }); @@ -67,4 +62,4 @@ async function takeUpgradeCaps(upgradeCaps, client, keypair, env) { module.exports = { initializeGovernance, takeUpgradeCaps, -} \ No newline at end of file +}; diff --git a/scripts/its/discovery.js b/scripts/its/discovery.js index f9d22f72..823aece2 100644 --- a/scripts/its/discovery.js +++ b/scripts/its/discovery.js @@ -17,41 +17,33 @@ async function setItsDiscovery(client, keypair, envAlias) { tx.moveCall({ target: `${itsPackageId}::discovery::register_transaction`, - arguments: [ - tx.object(itsObjectId), - tx.object(relayerDecovery), - ], + arguments: [tx.object(itsObjectId), tx.object(relayerDecovery)], typeArguments: [], }); await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true - }, + transactionBlock: tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + }, requestType: 'WaitForLocalExecution', - }); + }); } module.exports = { setItsDiscovery, -} - +}; if (require.main === module) { const env = process.argv[2] || 'localnet'; const chainName = process.argv[3] || 'Ethereum'; const trustedAddress = process.argv[4] || '0x1234'; - + (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -59,10 +51,10 @@ if (require.main === module) { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); @@ -70,4 +62,4 @@ if (require.main === module) { await setItsDiscovery(client, keypair, env); })(); -} \ No newline at end of file +} diff --git a/scripts/its/publish-interchain-token.js b/scripts/its/publish-interchain-token.js index bccad11f..99f06c29 100644 --- a/scripts/its/publish-interchain-token.js +++ b/scripts/its/publish-interchain-token.js @@ -11,7 +11,6 @@ const { publishPackage } = require('../publish-package'); const packagePath = 'interchain_token'; async function publishInterchainToken(client, keypair, itsInfo, name, symbol, decimals, skipRegister = false) { - let file = fs.readFileSync(`scripts/its/interchain_token.move`, 'utf8'); let moduleName = getModuleNameFromSymbol(symbol); let witness = moduleName.toUpperCase(); @@ -23,71 +22,63 @@ async function publishInterchainToken(client, keypair, itsInfo, name, symbol, de fs.writeFileSync(`move/${packagePath}/sources/interchain_token.move`, file); const { packageId, publishTxn } = await publishPackage(`../move/${packagePath}`, client, keypair); - - const treasuryCap = publishTxn.objectChanges.find(object => { + + const treasuryCap = publishTxn.objectChanges.find((object) => { return object.objectType && object.objectType.startsWith('0x2::coin::TreasuryCap'); }); - const coinMetadata = publishTxn.objectChanges.find(object => { + const coinMetadata = publishTxn.objectChanges.find((object) => { return object.objectType && object.objectType.startsWith('0x2::coin::CoinMetadata'); }); coinType = `${packageId}::${moduleName}::${witness}`; - if(skipRegister) { - return { - coinType, - treasuryCap, - coinMetadata + if (skipRegister) { + return { + coinType, + treasuryCap, + coinMetadata, }; } - + const itsPackageId = itsInfo.packageId; const itsObjectId = itsInfo['its::ITS'].objectId; const tx = new TransactionBlock(); - + tx.moveCall({ target: `${itsPackageId}::service::give_unregistered_coin`, - arguments: [ - tx.object(itsObjectId), - tx.object(treasuryCap.objectId), - tx.object(coinMetadata.objectId), - ], + arguments: [tx.object(itsObjectId), tx.object(treasuryCap.objectId), tx.object(coinMetadata.objectId)], typeArguments: [`${packageId}::${moduleName}::${witness}`], }); await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true - }, + transactionBlock: tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + }, requestType: 'WaitForLocalExecution', - }); + }); return { - coinType - } + coinType, + }; } module.exports = { publishInterchainToken, -} +}; if (require.main === module) { const symbol = process.argv[2] || 'TT'; const decimals = process.argv[3] || 6; const skipRegister = process.argv[4] ? process.argv[4] != 'false' : false; const env = process.argv[5] || 'localnet'; - + (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -95,14 +86,14 @@ if (require.main === module) { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); } await publishInterchainToken(client, keypair, getConfig('its', env), '', symbol, decimals, skipRegister); })(); -} \ No newline at end of file +} diff --git a/scripts/its/receive-token.js b/scripts/its/receive-token.js index 159a89a7..4f530284 100644 --- a/scripts/its/receive-token.js +++ b/scripts/its/receive-token.js @@ -3,30 +3,39 @@ const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const {BCS, getSuiMoveConfig} = require("@mysten/bcs"); +const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); -const { registerInterchainToken } = require('./register-token'); const { arrayify, defaultAbiCoder } = require('ethers/lib/utils'); +const { registerInterchainToken } = require('./register-token'); const { receiveCall } = require('../test-receive-call'); const { getConfig } = require('../utils'); -async function receiveInterchainToken(client, keypair, axelarInfo, itsInfo, tokenId, sourceChain, sourceAddress, destinationAddress, amount) { +async function receiveInterchainToken( + client, + keypair, + axelarInfo, + itsInfo, + tokenId, + sourceChain, + sourceAddress, + destinationAddress, + amount, +) { const itsPackageId = itsInfo.packageId; const itsObjectId = itsInfo['its::ITS'].objectId; const channelId = itsInfo['its::ITS'].channel; const selector = 0; - const payload = defaultAbiCoder.encode(['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], [selector, tokenId, sourceAddress, destinationAddress, amount, '0x']); + const payload = defaultAbiCoder.encode( + ['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], + [selector, tokenId, sourceAddress, destinationAddress, amount, '0x'], + ); const tx = new TransactionBlock(); tx.moveCall({ target: `${itsPackageId}::its::get_trusted_address`, - arguments: [ - tx.object(itsObjectId), - tx.pure.string(sourceChain), - ] - + arguments: [tx.object(itsObjectId), tx.pure.string(sourceChain)], }); const resp = await client.devInspectTransactionBlock({ @@ -40,20 +49,15 @@ async function receiveInterchainToken(client, keypair, axelarInfo, itsInfo, toke await receiveCall(client, keypair, axelarInfo, sourceChain, trustedAddress, channelId, payload); } - -if (require.main === module) { +if (require.main === module) { const env = process.argv[2] || 'localnet'; - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use const client = new SuiClient({ url: getFullnodeUrl(env) }); - + const sourceChain = process.argv[3] || 'Ethereum'; const sourceAddress = process.argv[4] || '0x1234'; const destinationAddress = process.argv[5] || address; @@ -61,14 +65,14 @@ if (require.main === module) { const name = process.argv[7] || 'Test Token'; const symbol = process.argv[8] || 'TT'; const decimals = process.argv[9] || 6; - + (async () => { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); @@ -76,7 +80,17 @@ if (require.main === module) { const [tokenId, coinType] = await registerInterchainToken(client, keypair, getConfig('its', env), name, symbol, decimals); - await receiveInterchainToken(client, keypair, getConfig('axelar', env), getConfig('its', env), tokenId, sourceChain, sourceAddress, destinationAddress, amount); + await receiveInterchainToken( + client, + keypair, + getConfig('axelar', env), + getConfig('its', env), + tokenId, + sourceChain, + sourceAddress, + destinationAddress, + amount, + ); const coins = await client.getCoins({ owner: address, @@ -86,4 +100,4 @@ if (require.main === module) { console.log(balance); })(); -} \ No newline at end of file +} diff --git a/scripts/its/register-token.js b/scripts/its/register-token.js index f64a3e77..7065ca50 100644 --- a/scripts/its/register-token.js +++ b/scripts/its/register-token.js @@ -1,10 +1,10 @@ require('dotenv').config(); const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); +const { publishInterchainToken } = require('./publish-interchain-token'); const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { publishInterchainToken } = require('./publish-interchain-token'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const {BCS, getSuiMoveConfig} = require("@mysten/bcs"); +const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); const { getConfig } = require('../utils'); async function registerInterchainToken(client, keypair, itsInfo, name, symbol, decimals, mintAmount = false) { @@ -14,59 +14,51 @@ async function registerInterchainToken(client, keypair, itsInfo, name, symbol, d const itsObjectId = itsInfo['its::ITS'].objectId; let tx = new TransactionBlock(); - if(mintAmount) { + if (mintAmount) { tx.moveCall({ target: `0x2::coin::mint_and_transfer`, - arguments: [ - tx.object(treasuryCap.objectId), - tx.pure(mintAmount), - tx.pure.address(keypair.getPublicKey().toSuiAddress()), - ], + arguments: [tx.object(treasuryCap.objectId), tx.pure(mintAmount), tx.pure.address(keypair.getPublicKey().toSuiAddress())], typeArguments: [coinType], }); } const coinInfo = tx.moveCall({ target: `${itsPackageId}::coin_info::from_metadata`, - arguments: [ - tx.object(coinMetadata.objectId), - ], + arguments: [tx.object(coinMetadata.objectId)], typeArguments: [coinType], }); const coinManagement = tx.moveCall({ target: `${itsPackageId}::coin_management::new_with_cap`, - arguments: [ - tx.object(treasuryCap.objectId), - ], + arguments: [tx.object(treasuryCap.objectId)], typeArguments: [coinType], }); tx.moveCall({ target: `${itsPackageId}::service::register_coin`, - arguments: [ - tx.object(itsObjectId), - coinInfo, - coinManagement, - ], + arguments: [tx.object(itsObjectId), coinInfo, coinManagement], typeArguments: [coinType], }); const result = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true - }, + transactionBlock: tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + }, requestType: 'WaitForLocalExecution', - }); - const coinObjectId = mintAmount ? result.objectChanges.find(object => object.objectType === `0x2::coin::Coin<${coinType}>`).objectId : null; - - const eventData = (await client.queryEvents({query: { - MoveEventType: `${itsPackageId}::service::CoinRegistered<${coinType}>`, - }})); + }); + const coinObjectId = mintAmount + ? result.objectChanges.find((object) => object.objectType === `0x2::coin::Coin<${coinType}>`).objectId + : null; + + const eventData = await client.queryEvents({ + query: { + MoveEventType: `${itsPackageId}::service::CoinRegistered<${coinType}>`, + }, + }); const tokenId = eventData.data[0].parsedJson.token_id.id; return [tokenId, coinType, coinObjectId]; @@ -74,21 +66,16 @@ async function registerInterchainToken(client, keypair, itsInfo, name, symbol, d module.exports = { registerInterchainToken, -} - +}; if (require.main === module) { const name = process.argv[2] || 'Test Token'; const symbol = process.argv[3] || 'TT'; const decimals = process.argv[4] || 6; const env = process.argv[5] || 'localnet'; - + (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -96,10 +83,10 @@ if (require.main === module) { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); @@ -111,12 +98,10 @@ if (require.main === module) { const itsObjectId = itsInfo['its::ITS'].objectId; tx = new TransactionBlock(); - + const tokenIdObj = tx.moveCall({ target: `${itsPackageId}::token_id::from_address`, - arguments: [ - tx.pure.address(tokenId), - ], + arguments: [tx.pure.address(tokenId)], typeArguments: [], }); @@ -125,26 +110,26 @@ if (require.main === module) { arguments: [tx.object(itsObjectId), tokenIdObj], typeArguments: [coinType], }); - + tx.moveCall({ target: `${itsPackageId}::its::token_symbol`, arguments: [tx.object(itsObjectId), tokenIdObj], typeArguments: [coinType], }); - + tx.moveCall({ target: `${itsPackageId}::its::token_decimals`, arguments: [tx.object(itsObjectId), tokenIdObj], typeArguments: [coinType], }); - + let resp = await client.devInspectTransactionBlock({ sender: keypair.getPublicKey().toSuiAddress(), transactionBlock: tx, }); - + const bcs = new BCS(getSuiMoveConfig()); - + { const name = bcs.de('string', new Uint8Array(resp.results[1].returnValues[0][0])); const symbol = bcs.de('string', new Uint8Array(resp.results[2].returnValues[0][0])); @@ -152,4 +137,4 @@ if (require.main === module) { console.log(name, symbol, decimals); } })(); -} \ No newline at end of file +} diff --git a/scripts/its/send-token.js b/scripts/its/send-token.js index 6a58b243..dcdbc85a 100644 --- a/scripts/its/send-token.js +++ b/scripts/its/send-token.js @@ -3,10 +3,10 @@ const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const {BCS, getSuiMoveConfig} = require("@mysten/bcs"); +const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); -const { registerInterchainToken } = require('./register-token'); const { arrayify, defaultAbiCoder } = require('ethers/lib/utils'); +const { registerInterchainToken } = require('./register-token'); const { getConfig } = require('../utils'); async function sendInterchainToken(client, keypair, itsInfo, tokenId, coin, destinationChain, destiantionAddress) { @@ -17,18 +17,13 @@ async function sendInterchainToken(client, keypair, itsInfo, tokenId, coin, dest let tokenIdObj = tx.moveCall({ target: `${itsPackageId}::token_id::from_address`, - arguments: [ - tx.pure(tokenId), - ], + arguments: [tx.pure(tokenId)], typeArguments: [], }); tx.moveCall({ target: `${itsPackageId}::its::get_registered_coin_type`, - arguments: [ - tx.object(itsObjectId), - tokenIdObj, - ], + arguments: [tx.object(itsObjectId), tokenIdObj], typeArguments: [], }); @@ -45,9 +40,7 @@ async function sendInterchainToken(client, keypair, itsInfo, tokenId, coin, dest tokenIdObj = tx.moveCall({ target: `${itsPackageId}::token_id::from_address`, - arguments: [ - tx.pure(tokenId), - ], + arguments: [tx.pure(tokenId)], typeArguments: [], }); @@ -65,18 +58,17 @@ async function sendInterchainToken(client, keypair, itsInfo, tokenId, coin, dest }); await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true - }, + transactionBlock: tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + }, requestType: 'WaitForLocalExecution', - }); + }); } - if (require.main === module) { const env = process.argv[2] || 'localnet'; const destinationChain = process.argv[3] || 'Ethereum'; @@ -87,11 +79,7 @@ if (require.main === module) { const decimals = process.argv[8] || 6; (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -99,10 +87,10 @@ if (require.main === module) { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); @@ -120,12 +108,17 @@ if (require.main === module) { await sendInterchainToken(client, keypair, itsInfo, tokenId, coin, destinationChain, destiantionAddress); - const eventData = (await client.queryEvents({query: { - MoveEventType: `${axelarInfo.packageId}::gateway::ContractCall`, - }})); + const eventData = await client.queryEvents({ + query: { + MoveEventType: `${axelarInfo.packageId}::gateway::ContractCall`, + }, + }); const payload = eventData.data[0].parsedJson.payload; { - const [, tokenId, sourceAddress, destinationAddress, amount, data] = defaultAbiCoder.decode(['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], payload); + const [, tokenId, sourceAddress, destinationAddress, amount, data] = defaultAbiCoder.decode( + ['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], + payload, + ); console.log([tokenId, sourceAddress, destinationAddress, Number(amount), data]); } })(); diff --git a/scripts/its/set-trusted-address.js b/scripts/its/set-trusted-address.js index 6772d54f..2dadfafb 100644 --- a/scripts/its/set-trusted-address.js +++ b/scripts/its/set-trusted-address.js @@ -1,13 +1,12 @@ require('dotenv').config(); const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); +const { defaultAbiCoder, keccak256, arrayify } = require('ethers/lib/utils'); +const { getBcsForGateway, approveContractCall } = require('../gateway'); const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); +const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); const { getConfig } = require('../utils'); -const { defaultAbiCoder, keccak256, arrayify } = require('ethers/lib/utils'); -const { getBcsForGateway, approveContractCall } = require('../gateway'); -const {BCS, getSuiMoveConfig} = require("@mysten/bcs"); - async function setTrustedAddresses(client, keypair, envAlias, chainNames, trustedAddresses) { const itsInfo = getConfig('its', envAlias); @@ -20,16 +19,21 @@ async function setTrustedAddresses(client, keypair, envAlias, chainNames, truste const governance = getConfig('governance', envAlias)['governance::Governance']; const bcs = new BCS(getSuiMoveConfig()); - bcs.registerStructType("TrustedAddressInfo", { - chainNames: "vector", - trustedAddresses: "vector", + bcs.registerStructType('TrustedAddressInfo', { + chainNames: 'vector', + trustedAddresses: 'vector', }); - const trustedAddressInfo = bcs.ser('TrustedAddressInfo', { - chainNames: chainNames, - trustedAddresses: trustedAddresses, - } ).toBytes(); - const payload = defaultAbiCoder.encode(['bytes32', 'bytes'], ['0x2af37a0d5d48850a855b1aaaf57f726c107eb99b40eabf4cc1ba30410cfa2f68', trustedAddressInfo]); + const trustedAddressInfo = bcs + .ser('TrustedAddressInfo', { + chainNames: chainNames, + trustedAddresses: trustedAddresses, + }) + .toBytes(); + const payload = defaultAbiCoder.encode( + ['bytes32', 'bytes'], + ['0x2af37a0d5d48850a855b1aaaf57f726c107eb99b40eabf4cc1ba30410cfa2f68', trustedAddressInfo], + ); const payloadHash = keccak256(payload); @@ -59,11 +63,7 @@ async function setTrustedAddresses(client, keypair, envAlias, chainNames, truste }); tx.moveCall({ target: `${itsPackageId}::service::set_trusted_addresses`, - arguments: [ - tx.object(itsObjectId), - tx.object(governance.objectId), - ApprovedMessage, - ], + arguments: [tx.object(itsObjectId), tx.object(governance.objectId), ApprovedMessage], typeArguments: [], }); @@ -80,8 +80,7 @@ async function setTrustedAddresses(client, keypair, envAlias, chainNames, truste module.exports = { setTrustedAddresses, -} - +}; if (require.main === module) { const env = process.argv[2] || 'localnet'; @@ -89,11 +88,7 @@ if (require.main === module) { const trustedAddress = process.argv[4] || '0x1234'; (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -101,10 +96,10 @@ if (require.main === module) { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); diff --git a/scripts/publish-all.js b/scripts/publish-all.js index 946fd517..d9e53956 100644 --- a/scripts/publish-all.js +++ b/scripts/publish-all.js @@ -1,33 +1,33 @@ require('dotenv').config(); +const { initializeGovernance, takeUpgradeCaps } = require('./governance'); const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { publishPackageFull } = require('./publish-package'); -const { initializeGovernance, takeUpgradeCaps } = require('./governance'); -const { requestSuiFromFaucet } = require('./utils'); const { setSquidDiscovery } = require('./squid/discovery.js'); +const { publishPackageFull } = require('./publish-package'); const { setItsDiscovery } = require('./its/discovery.js'); - +const { requestSuiFromFaucet } = require('./utils'); async function publishAll(client, keypair, env) { const upgradeCaps = {}; const packageIds = {}; - for(const packagePath of ['abi', 'axelar', 'governance', 'gas_service', 'its', 'squid']) { + for (const packagePath of ['abi', 'axelar', 'governance', 'gas_service', 'its', 'squid']) { console.log(packagePath); - while (true) try { - const { packageId, publishTxn } = await publishPackageFull(packagePath, client, keypair, env); - upgradeCaps[packagePath] = publishTxn.objectChanges.find((obj) => obj.objectType == '0x2::package::UpgradeCap' ); - packageIds[packagePath] = packageId; - break; - } catch(e) { - console.log(e); - console.log(`Retrying for ${packagePath}`); - } + while (true) + try { + const { packageId, publishTxn } = await publishPackageFull(packagePath, client, keypair, env); + upgradeCaps[packagePath] = publishTxn.objectChanges.find((obj) => obj.objectType == '0x2::package::UpgradeCap'); + packageIds[packagePath] = packageId; + break; + } catch (e) { + console.log(e); + console.log(`Retrying for ${packagePath}`); + } } await initializeGovernance(upgradeCaps.governance, client, keypair, env); await takeUpgradeCaps( - ['abi', 'axelar', 'gas_service', 'its'].map(packagePath => upgradeCaps[packagePath]), + ['abi', 'axelar', 'gas_service', 'its'].map((packagePath) => upgradeCaps[packagePath]), client, keypair, env, @@ -35,12 +35,11 @@ async function publishAll(client, keypair, env) { await setItsDiscovery(client, keypair, env.alias); await setSquidDiscovery(client, keypair, env.alias); - } module.exports = { publishAll, -} +}; if (require.main === module) { const env = ((arg) => { @@ -49,19 +48,15 @@ if (require.main === module) { case 'devnet': case 'testnet': case 'mainnet': - return {alias: arg, url: getFullnodeUrl(arg)}; + return { alias: arg, url: getFullnodeUrl(arg) }; default: return JSON.parse(arg); - } + } })(process.argv[2] || 'localnet'); - const faucet = (process.argv[3]?.toLowerCase?.() === 'true'); - + const faucet = process.argv[3]?.toLowerCase?.() === 'true'; + (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -72,4 +67,4 @@ if (require.main === module) { } await publishAll(client, keypair, env); })(); -} \ No newline at end of file +} diff --git a/scripts/publish-package.js b/scripts/publish-package.js index 8585ca0f..3b5a45b0 100644 --- a/scripts/publish-package.js +++ b/scripts/publish-package.js @@ -1,62 +1,56 @@ require('dotenv').config(); -const { SuiClient } = require('@mysten/sui.js/client'); +const { setConfig, getFullObject, requestSuiFromFaucet } = require('./utils'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); +const { SuiClient } = require('@mysten/sui.js/client'); const { execSync } = require('child_process'); -const fs = require('fs'); -const tmp = require('tmp'); -const { setConfig, getFullObject, requestSuiFromFaucet } = require('./utils'); const { parseEnv } = require('./utils'); +const tmp = require('tmp'); +const fs = require('fs'); async function publishPackage(packagePath, client, keypair) { - let toml = fs.readFileSync(`${__dirname}/../move/${packagePath}/Move.toml`, 'utf8'); fs.writeFileSync(`${__dirname}/../move/${packagePath}/Move.toml`, fillAddresses(toml, '0x0')); - // remove all controlled temporary objects on process exit + // remove all controlled temporary objects on process exit const address = keypair.getPublicKey().toSuiAddress(); - tmp.setGracefulCleanup(); - - const tmpobj = tmp.dirSync({ unsafeCleanup: true }); - - const { modules, dependencies } = JSON.parse( - execSync( - `sui move build --dump-bytecode-as-base64 --path ${__dirname + '/../move/' + packagePath} --install-dir ${tmpobj.name}`, - { - encoding: 'utf-8', - stdio: 'pipe', // silent the output - }, - ), - ); - - const tx = new TransactionBlock(); - const cap = tx.publish({ - modules, - dependencies, - }); - - // Transfer the upgrade capability to the sender so they can upgrade the package later if they want. - tx.transferObjects([cap], tx.pure(address)); - - const publishTxn = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true - }, + tmp.setGracefulCleanup(); + + const tmpobj = tmp.dirSync({ unsafeCleanup: true }); + + const { modules, dependencies } = JSON.parse( + execSync(`sui move build --dump-bytecode-as-base64 --path ${__dirname + '/../move/' + packagePath} --install-dir ${tmpobj.name}`, { + encoding: 'utf-8', + stdio: 'pipe', // silent the output + }), + ); + + const tx = new TransactionBlock(); + const cap = tx.publish({ + modules, + dependencies, + }); + + // Transfer the upgrade capability to the sender so they can upgrade the package later if they want. + tx.transferObjects([cap], tx.pure(address)); + + const publishTxn = await client.signAndExecuteTransactionBlock({ + transactionBlock: tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + }, requestType: 'WaitForLocalExecution', - }); - if(publishTxn.effects?.status.status != 'success') throw new Error('Publish Tx failed'); + }); + if (publishTxn.effects?.status.status != 'success') throw new Error('Publish Tx failed'); - const packageId = ((publishTxn.objectChanges?.filter( - (a) => a.type === 'published', - )) ?? [])[0].packageId; + const packageId = (publishTxn.objectChanges?.filter((a) => a.type === 'published') ?? [])[0].packageId; - console.info(`Published package ${packageId} from address ${address}}`); + console.info(`Published package ${packageId} from address ${address}}`); - return { packageId, publishTxn }; + return { packageId, publishTxn }; } function updateMoveToml(packagePath, packageId) { @@ -67,8 +61,8 @@ function updateMoveToml(packagePath, packageId) { function insertPublishedAt(toml, packageId) { const lines = toml.split('\n'); - const versionLineIndex = lines.findIndex(line => line.slice(0, 7) === 'version'); - if(! (lines[versionLineIndex + 1].slice(0, 12) === 'published-at')) { + const versionLineIndex = lines.findIndex((line) => line.slice(0, 7) === 'version'); + if (!(lines[versionLineIndex + 1].slice(0, 12) === 'published-at')) { lines.splice(versionLineIndex + 1, 0, ''); } lines[versionLineIndex + 1] = `published-at = "${packageId}"`; @@ -77,50 +71,44 @@ function insertPublishedAt(toml, packageId) { function fillAddresses(toml, address) { const lines = toml.split('\n'); - const addressesIndex = lines.findIndex(line => line.slice(0, 11) === '[addresses]'); - for(let i = addressesIndex + 1; i line.slice(0, 11) === '[addresses]'); + for (let i = addressesIndex + 1; i < lines.length; i++) { const line = lines[i]; const eqIndex = line.indexOf('='); - lines[i] = line.slice(0, eqIndex+1) + ` "${address}"`; + lines[i] = line.slice(0, eqIndex + 1) + ` "${address}"`; } return lines.join('\n'); } async function publishPackageFull(packagePath, client, keypair, env) { - const { packageId, publishTxn } = await publishPackage(packagePath, client, keypair); const info = require(`${__dirname}/../move/${packagePath}/info.json`); const config = {}; config.packageId = packageId; - for(const singleton of info.singletons) { - const object = publishTxn.objectChanges.find(object => (object.objectType === `${packageId}::${singleton}`)); + for (const singleton of info.singletons) { + const object = publishTxn.objectChanges.find((object) => object.objectType === `${packageId}::${singleton}`); config[singleton] = await getFullObject(object, client); } - + setConfig(packagePath, env.alias, config); updateMoveToml(packagePath, packageId); - return {packageId, publishTxn}; + return { packageId, publishTxn }; } module.exports = { publishPackage, updateMoveToml, publishPackageFull, -} - +}; if (require.main === module) { const packagePath = process.argv[2] || 'axelar'; const env = parseEnv(process.argv[3] || 'localnet'); - const faucet = (process.argv[4]?.toLowerCase?.() === 'true'); - + const faucet = process.argv[4]?.toLowerCase?.() === 'true'; + (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -132,4 +120,4 @@ if (require.main === module) { await publishPackageFull(packagePath, client, keypair, env); })(); -} \ No newline at end of file +} diff --git a/scripts/squid/discovery.js b/scripts/squid/discovery.js index 3a57af16..9386d668 100644 --- a/scripts/squid/discovery.js +++ b/scripts/squid/discovery.js @@ -1,26 +1,18 @@ require('dotenv').config(); -const { getConfig } = require("../utils"); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { SuiClient } = require('@mysten/sui.js/client'); const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); +const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); +const { SuiClient } = require('@mysten/sui.js/client'); +const { getConfig } = require('../utils'); async function setSquidDiscovery(client, keypair, env) { const squid_info = getConfig('squid', env.alias); const itsId = getConfig('its', env.alias)['its::ITS'].objectId; const relayerDiscoveryId = getConfig('axelar', env.alias)['discovery::RelayerDiscovery'].objectId; const tx = new TransactionBlock(); - console.log( - squid_info['squid::Squid'].objectId, - itsId, - relayerDiscoveryId, - ); + console.log(squid_info['squid::Squid'].objectId, itsId, relayerDiscoveryId); tx.moveCall({ target: `${squid_info.packageId}::discovery::register_transaction`, - arguments: [ - tx.object(squid_info['squid::Squid'].objectId), - tx.object(itsId), - tx.object(relayerDiscoveryId), - ], + arguments: [tx.object(squid_info['squid::Squid'].objectId), tx.object(itsId), tx.object(relayerDiscoveryId)], type_arguments: [], }); @@ -37,17 +29,13 @@ async function setSquidDiscovery(client, keypair, env) { module.exports = { setSquidDiscovery, -} +}; if (require.main === module) { const env = process.argv[2] || 'localnet'; - + (async () => { - const privKey = - Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const keypair = Ed25519Keypair.fromSecretKey(privKey); const address = keypair.getPublicKey().toSuiAddress(); // create a new SuiClient object pointing to the network you want to use @@ -55,10 +43,10 @@ if (require.main === module) { try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env), + recipient: address, }); } catch (e) { console.log(e); @@ -66,4 +54,4 @@ if (require.main === module) { await setSquidDiscovery(client, keypair, env); })(); -} \ No newline at end of file +} diff --git a/scripts/squid/squid.js b/scripts/squid/squid.js index b5304cf6..b1ba1b4a 100644 --- a/scripts/squid/squid.js +++ b/scripts/squid/squid.js @@ -1,27 +1,26 @@ require('dotenv').config(); -const { publishInterchainToken } = require("../its/publish-interchain-token"); -const { parseEnv, setConfig, getConfig } = require("../utils"); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { SuiClient } = require('@mysten/sui.js/client'); const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); +const { publishInterchainToken } = require('../its/publish-interchain-token'); const { publishPackageFull, publishPackage } = require('../publish-package'); +const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); +const { setTrustedAddresses } = require('../its/set-trusted-address'); const { registerInterchainToken } = require('../its/register-token'); -const { bcs } = require('@mysten/bcs'); -const { - utils: { arrayify }, -} = require('ethers'); +const { TransactionBlock } = require('@mysten/sui.js/transactions'); const { hexlify, defaultAbiCoder } = require('ethers/lib/utils'); +const { parseEnv, setConfig, getConfig } = require('../utils'); const { receiveCall } = require('../test-receive-call'); const { setItsDiscovery } = require('../its/discovery'); -const { setTrustedAddresses } = require('../its/set-trusted-address'); +const { SuiClient } = require('@mysten/sui.js/client'); +const { + utils: { arrayify }, +} = require('ethers'); +const { bcs } = require('@mysten/bcs'); const deepbook = '0xdee9'; - const tickSize = 1e6; const lotSize = 1e3; -const amountBase = 1e6*1e9; +const amountBase = 1e6 * 1e9; const amountQuote = amountBase; const amount = lotSize * 1000000; const sourceChain = 'sourceAddress'; @@ -37,33 +36,23 @@ const MESSAGE_TYPE_INTERCHAIN_TRANSFER = 0; async function sleep(ms = 100) { await new Promise((resolve) => { setTimeout(resolve, ms); - }) + }); } async function placeLimitOrder(client, keypair, env, isBid, price, amount) { - const { - pool, - accountCap, - base, - quote, - } = getConfig('trading', env.alias); - + const { pool, accountCap, base, quote } = getConfig('trading', env.alias); const tx = new TransactionBlock(); - if(isBid) { + if (isBid) { const coin = tx.moveCall({ target: `0x2::coin::split`, - arguments: [tx.object(quote.objectId), tx.pure(Math.floor(amount * price / 1e9))], + arguments: [tx.object(quote.objectId), tx.pure(Math.floor((amount * price) / 1e9))], typeArguments: [quote.type], }); - + tx.moveCall({ target: `0xdee9::clob_v2::deposit_quote`, - arguments: [ - tx.object(pool), - coin, - tx.object(accountCap), - ], + arguments: [tx.object(pool), coin, tx.object(accountCap)], typeArguments: [base.type, quote.type], }); } else { @@ -72,19 +61,14 @@ async function placeLimitOrder(client, keypair, env, isBid, price, amount) { arguments: [tx.object(base.objectId), tx.pure(amount)], typeArguments: [base.type], }); - + tx.moveCall({ target: `0xdee9::clob_v2::deposit_base`, - arguments: [ - tx.object(pool), - coin, - tx.object(accountCap), - ], + arguments: [tx.object(pool), coin, tx.object(accountCap)], typeArguments: [base.type, quote.type], }); } - tx.moveCall({ target: `0xdee9::clob_v2::place_limit_order`, arguments: [ @@ -117,20 +101,20 @@ async function prepare(client, keypair, env) { const address = keypair.getPublicKey().toSuiAddress(); try { await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env.alias), - recipient: address, + // use getFaucetHost to make sure you're using correct faucet address + // you can also just use the address (see Sui Typescript SDK Quick Start for values) + host: getFaucetHost(env.alias), + recipient: address, }); } catch (e) { console.log(e); } - + //await publishPackageFull('trading', client, keypair, env); //const config = getConfig('trading', env.alias); - - const [baseId, baseType, baseCoin] = await registerInterchainToken( + + const [baseId, baseType, baseCoin] = await registerInterchainToken( client, keypair, getConfig('its', env.alias), @@ -138,7 +122,7 @@ async function prepare(client, keypair, env) { 'B', 9, amountBase, - ) + ); const [quoteId, quoteType, quoteCoin] = await registerInterchainToken( client, @@ -152,18 +136,11 @@ async function prepare(client, keypair, env) { let tx = new TransactionBlock(); - const creationFee = tx.splitCoins( - tx.gas, - [tx.pure(100*1e9)], - ); + const creationFee = tx.splitCoins(tx.gas, [tx.pure(100 * 1e9)]); tx.moveCall({ target: `${deepbook}::clob_v2::create_pool`, - arguments: [ - tx.pure(tickSize), - tx.pure(lotSize), - creationFee, - ], + arguments: [tx.pure(tickSize), tx.pure(lotSize), creationFee], typeArguments: [baseType, quoteType], }); @@ -171,7 +148,7 @@ async function prepare(client, keypair, env) { target: `${deepbook}::clob_v2::create_account`, arguments: [], typeArguments: [], - }); + }); tx.moveCall({ target: `0x2::transfer::public_transfer`, @@ -187,12 +164,12 @@ async function prepare(client, keypair, env) { showObjectChanges: true, }, requestType: 'WaitForLocalExecution', - }); - - const pool = result.objectChanges.find(object => object.objectType.startsWith('0xdee9::clob_v2::Pool<')).objectId; - const poolCap = result.objectChanges.find(object => object.objectType.startsWith('0xdee9::clob_v2::PoolOwnerCap')).objectId; - const accountCap = result.objectChanges.find(object => object.objectType.startsWith('0xdee9::custodian_v2::AccountCap')).objectId; - const suiCoin = result.objectChanges.find(object => object.objectType.startsWith('0x2::coin::Coin<')).objectId; + }); + + const pool = result.objectChanges.find((object) => object.objectType.startsWith('0xdee9::clob_v2::Pool<')).objectId; + const poolCap = result.objectChanges.find((object) => object.objectType.startsWith('0xdee9::clob_v2::PoolOwnerCap')).objectId; + const accountCap = result.objectChanges.find((object) => object.objectType.startsWith('0xdee9::custodian_v2::AccountCap')).objectId; + const suiCoin = result.objectChanges.find((object) => object.objectType.startsWith('0x2::coin::Coin<')).objectId; setConfig('trading', env.alias, { pool, @@ -218,8 +195,7 @@ async function prepare(client, keypair, env) { console.log(`Prepare Done`); } -async function postpare(client, keypair, env) { - +async function postpare(client, keypair, env) { await setItsDiscovery(client, keypair, env.alias); await sleep(300); await setTrustedAddresses(client, keypair, env.alias, [sourceChain], [sourceAddress]); @@ -228,59 +204,47 @@ async function postpare(client, keypair, env) { } async function placeLimitOrders(client, keypair, env, isBid, n = 10) { - if(isBid) { - for(let i=0; i event.parsedJson)); + console.log(response.data.map((event) => event.parsedJson)); - const quoteCoinId = result.objectChanges.find(change => change.objectType == `0x2::coin::Coin<${quote.type}>`).objectId; + const quoteCoinId = result.objectChanges.find((change) => change.objectType == `0x2::coin::Coin<${quote.type}>`).objectId; const quoteCoin = await client.getObject({ id: quoteCoinId, options: { showContent: true, - } + }, }); - const baseCoinId = result.objectChanges.find(change => change.objectType == `0x2::coin::Coin<${base.type}>` && change.type === 'created').objectId; + const baseCoinId = result.objectChanges.find( + (change) => change.objectType == `0x2::coin::Coin<${base.type}>` && change.type === 'created', + ).objectId; const baseCoin = await client.getObject({ id: baseCoinId, options: { showContent: true, - } + }, }); console.log({ @@ -366,27 +332,17 @@ async function testBaseForQuote(client, keypair, env) { async function testQuoteForBase(client, keypair, env) { await placeLimitOrders(client, keypair, env, false, 10); - const { - pool, - base, - quote, - } = getConfig('trading', env.alias); + const { pool, base, quote } = getConfig('trading', env.alias); const { packageId } = await publishPackage('trading', client, keypair); const tx = new TransactionBlock(); tx.moveCall({ target: `${packageId}::trading::predict_quote_for_base`, - arguments: [ - tx.object(pool), - tx.pure(amount), - tx.pure(lotSize), - tx.object('0x6'), - - ], + arguments: [tx.object(pool), tx.pure(amount), tx.pure(lotSize), tx.object('0x6')], typeArguments: [base.type, quote.type], }); - + const coin = tx.moveCall({ target: `0x2::coin::split`, arguments: [tx.object(quote.objectId), tx.pure(amount)], @@ -401,14 +357,7 @@ async function testQuoteForBase(client, keypair, env) { const [leftover_base, leftover_quote] = tx.moveCall({ target: `${deepbook}::clob_v2::swap_exact_quote_for_base`, - arguments: [ - tx.object(pool), - tx.pure(0), - accountCap, - tx.pure(amount), - tx.object('0x6'), - coin, - ], + arguments: [tx.object(pool), tx.pure(0), accountCap, tx.pure(amount), tx.object('0x6'), coin], typeArguments: [base.type, quote.type], }); @@ -444,22 +393,26 @@ async function testQuoteForBase(client, keypair, env) { MoveEventType: `${packageId}::trading::Event`, }, }); - console.log(response.data.map(event => event.parsedJson)); + console.log(response.data.map((event) => event.parsedJson)); - const quoteCoinId = result.objectChanges.find(change => change.objectType == `0x2::coin::Coin<${quote.type}>` && change.type === 'created').objectId; + const quoteCoinId = result.objectChanges.find( + (change) => change.objectType == `0x2::coin::Coin<${quote.type}>` && change.type === 'created', + ).objectId; const quoteCoin = await client.getObject({ id: quoteCoinId, options: { showContent: true, - } + }, }); - const baseCoinId = result.objectChanges.find(change => change.objectType == `0x2::coin::Coin<${base.type}>` && change.type === 'created').objectId; + const baseCoinId = result.objectChanges.find( + (change) => change.objectType == `0x2::coin::Coin<${base.type}>` && change.type === 'created', + ).objectId; const baseCoin = await client.getObject({ id: baseCoinId, options: { showContent: true, - } + }, }); console.log({ @@ -475,7 +428,7 @@ async function test(client, keypair, env) { }); const squid_info = getConfig('squid', env.alias); - const {pool, base, quote} = getConfig('trading', env.alias); + const { pool, base, quote } = getConfig('trading', env.alias); const its_info = getConfig('its', env.alias); const swapInfoStruct = bcs.struct('SwapInfo', { @@ -496,7 +449,7 @@ async function test(client, keypair, env) { const sweepDust = bcs.struct('SweepDust', { swap_type: bcs.u8(), type: bcs.string(), - }) + }); const suiTransfer = bcs.struct('SuiTransfer', { swap_type: bcs.u8(), @@ -506,69 +459,91 @@ async function test(client, keypair, env) { const itsTransfer = bcs.struct('ItsTransfer', { swap_type: bcs.u8(), - type: bcs.string(), + type: bcs.string(), token_id: address, destination_chain: bcs.string(), destination_address: bcs.string(), metadata: bcs.vector(bcs.u8()), }); - const swapInfoData = swapInfoStruct.serialize({ - swap_data: [ - deepbookSwapStruct.serialize({ - swap_type: DEEPBOOK_SWAP_TYPE, - pool_id: pool, - has_base: true, - min_out: 0, - base_type: base.type.substring(2), - quote_type: quote.type.substring(2), - lot_size: lotSize, - should_sweep: true, - }).toBytes(), - deepbookSwapStruct.serialize({ - swap_type: DEEPBOOK_SWAP_TYPE, - pool_id: pool, - has_base: false, - min_out: 0, - base_type: base.type.substring(2), - quote_type: quote.type.substring(2), - lot_size: lotSize, - should_sweep: true, - }).toBytes(), - deepbookSwapStruct.serialize({ - swap_type: DEEPBOOK_SWAP_TYPE, - pool_id: pool, - has_base: true, - min_out: 0, - base_type: base.type.substring(2), - quote_type: quote.type.substring(2), - lot_size: lotSize, - should_sweep: true, - }).toBytes(), - suiTransfer.serialize({ - swap_type: SUI_TRANSFER_SWAP_TYPE, - type: quote.type.substring(2), - destination: keypair.toSuiAddress(), - }).toBytes(), - ], - }).toBytes(); + const swapInfoData = swapInfoStruct + .serialize({ + swap_data: [ + deepbookSwapStruct + .serialize({ + swap_type: DEEPBOOK_SWAP_TYPE, + pool_id: pool, + has_base: true, + min_out: 0, + base_type: base.type.substring(2), + quote_type: quote.type.substring(2), + lot_size: lotSize, + should_sweep: true, + }) + .toBytes(), + deepbookSwapStruct + .serialize({ + swap_type: DEEPBOOK_SWAP_TYPE, + pool_id: pool, + has_base: false, + min_out: 0, + base_type: base.type.substring(2), + quote_type: quote.type.substring(2), + lot_size: lotSize, + should_sweep: true, + }) + .toBytes(), + deepbookSwapStruct + .serialize({ + swap_type: DEEPBOOK_SWAP_TYPE, + pool_id: pool, + has_base: true, + min_out: 0, + base_type: base.type.substring(2), + quote_type: quote.type.substring(2), + lot_size: lotSize, + should_sweep: true, + }) + .toBytes(), + suiTransfer + .serialize({ + swap_type: SUI_TRANSFER_SWAP_TYPE, + type: quote.type.substring(2), + destination: keypair.toSuiAddress(), + }) + .toBytes(), + ], + }) + .toBytes(); - const payload = defaultAbiCoder.encode(['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], [MESSAGE_TYPE_INTERCHAIN_TRANSFER, base.tokenId, '0x', squid_info['squid::Squid'].channel, amount, swapInfoData]); - const receipt = await receiveCall(client, keypair, getConfig('axelar', env.alias), sourceChain, sourceAddress, its_info['its::ITS'].channel, payload); + const payload = defaultAbiCoder.encode( + ['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], + [MESSAGE_TYPE_INTERCHAIN_TRANSFER, base.tokenId, '0x', squid_info['squid::Squid'].channel, amount, swapInfoData], + ); + const receipt = await receiveCall( + client, + keypair, + getConfig('axelar', env.alias), + sourceChain, + sourceAddress, + its_info['its::ITS'].channel, + payload, + ); - const quoteCoinId = receipt.objectChanges.find(change => change.type === 'created' && change.objectType === `0x2::coin::Coin<${quote.type}>`).objectId; + const quoteCoinId = receipt.objectChanges.find( + (change) => change.type === 'created' && change.objectType === `0x2::coin::Coin<${quote.type}>`, + ).objectId; const quoteCoin = await client.getObject({ id: quoteCoinId, options: { showContent: true, - } + }, }); console.log({ output: quoteCoin.data.content.fields.balance, }); - } async function registerTransaction(client, keypair, env) { @@ -576,18 +551,10 @@ async function registerTransaction(client, keypair, env) { const itsId = getConfig('its', env.alias)['its::ITS'].objectId; const relayerDiscoveryId = getConfig('axelar', env.alias)['discovery::RelayerDiscovery'].objectId; const tx = new TransactionBlock(); - console.log( - squid_info['squid::Squid'].objectId, - itsId, - relayerDiscoveryId, - ); + console.log(squid_info['squid::Squid'].objectId, itsId, relayerDiscoveryId); tx.moveCall({ target: `${squid_info.packageId}::discovery::register_transaction`, - arguments: [ - tx.object(squid_info['squid::Squid'].objectId), - tx.object(itsId), - tx.object(relayerDiscoveryId), - ], + arguments: [tx.object(squid_info['squid::Squid'].objectId), tx.object(itsId), tx.object(relayerDiscoveryId)], type_arguments: [], }); @@ -602,13 +569,9 @@ async function registerTransaction(client, keypair, env) { }); } - -(async() => { +(async () => { const env = parseEnv(process.argv[2] || 'localnet'); - const privKey = Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); // get the public key in a compressed format const keypair = Ed25519Keypair.fromSecretKey(privKey); @@ -620,4 +583,4 @@ async function registerTransaction(client, keypair, env) { await publishPackageFull('squid', client, keypair, env); await registerTransaction(client, keypair, env); await test(client, keypair, env); -})(); \ No newline at end of file +})(); diff --git a/scripts/test-receive-call.js b/scripts/test-receive-call.js index 309b48ec..a6b58339 100644 --- a/scripts/test-receive-call.js +++ b/scripts/test-receive-call.js @@ -1,12 +1,12 @@ require('dotenv').config(); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const {BcsReader, BCS, fromHEX, getSuiMoveConfig, bcs: bcsEncoder} = require("@mysten/bcs"); +const { BcsReader, BCS, fromHEX, getSuiMoveConfig, bcs: bcsEncoder } = require('@mysten/bcs'); const { utils: { keccak256, arrayify, hexlify }, } = require('ethers'); +const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); +const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); +const { TransactionBlock } = require('@mysten/sui.js/transactions'); const { approveContractCall } = require('./gateway'); async function receiveCall(client, keypair, axelarInfo, sourceChain, sourceAddress, destinationAddress, payload) { @@ -17,9 +17,11 @@ async function receiveCall(client, keypair, axelarInfo, sourceChain, sourceAddre await approveContractCall(client, keypair, axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash); - const eventData = (await client.queryEvents({query: { - MoveEventType: `${axelarPackageId}::gateway::ContractCallApproved`, - }})); + const eventData = await client.queryEvents({ + query: { + MoveEventType: `${axelarPackageId}::gateway::ContractCallApproved`, + }, + }); const event = eventData.data[0].parsedJson; const discoveryArg = [0]; @@ -35,10 +37,10 @@ async function receiveCall(client, keypair, axelarInfo, sourceChain, sourceAddre }, arguments: [discoveryArg, targetIdArg], type_arguments: [], - } + }, ]; let is_final = false; - while(!is_final) { + while (!is_final) { const tx = new TransactionBlock(); makeCalls(tx, moveCalls, payload); const resp = await client.devInspectTransactionBlock({ @@ -78,11 +80,9 @@ async function receiveCall(client, keypair, axelarInfo, sourceChain, sourceAddre function makeCalls(tx, moveCalls, payload, ApprovedMessage) { const returns = []; - for(const call of moveCalls) { - let result = tx.moveCall( - buildMoveCall(tx, call, payload, ApprovedMessage, returns) - ); - if(!Array.isArray(result)) result = [result]; + for (const call of moveCalls) { + let result = tx.moveCall(buildMoveCall(tx, call, payload, ApprovedMessage, returns)); + if (!Array.isArray(result)) result = [result]; returns.push(result); } } @@ -91,38 +91,39 @@ function getTransactionBcs() { const bcs = new BCS(getSuiMoveConfig()); // input argument for the tx - bcs.registerStructType("Function", { - package_id: "address", - module_name: "string", - name: "string", + bcs.registerStructType('Function', { + package_id: 'address', + module_name: 'string', + name: 'string', }); - bcs.registerStructType("MoveCall", { - function: "Function", - arguments: "vector>", - type_arguments: "vector", + bcs.registerStructType('MoveCall', { + function: 'Function', + arguments: 'vector>', + type_arguments: 'vector', + }); + bcs.registerStructType('Transaction', { + is_final: 'bool', + move_calls: 'vector', }); - bcs.registerStructType("Transaction", { - is_final: "bool", - move_calls: "vector", - }) return bcs; } function buildMoveCall(tx, moveCallInfo, payload, callContractObj, previousReturns) { - const decodeArgs = (args, tx) => args.map(arg => { - if(arg[0] === 0) { - return tx.object(hexlify(arg.slice(1))); - } else if (arg[0] === 1) { - return tx.pure(new Uint8Array(arg.slice(1))); - } else if (arg[0] === 2) { - return callContractObj - } else if (arg[0] === 3) { - return tx.pure(bcsEncoder.vector(bcsEncoder.u8()).serialize(arrayify(payload))); - } else if (arg[0] === 4) { - return previousReturns[arg[1]][arg[2]]; - } else { - throw new Error(`Invalid argument prefix: ${arg[0]}`); - } - }); + const decodeArgs = (args, tx) => + args.map((arg) => { + if (arg[0] === 0) { + return tx.object(hexlify(arg.slice(1))); + } else if (arg[0] === 1) { + return tx.pure(new Uint8Array(arg.slice(1))); + } else if (arg[0] === 2) { + return callContractObj; + } else if (arg[0] === 3) { + return tx.pure(bcsEncoder.vector(bcsEncoder.u8()).serialize(arrayify(payload))); + } else if (arg[0] === 4) { + return previousReturns[arg[1]][arg[2]]; + } else { + throw new Error(`Invalid argument prefix: ${arg[0]}`); + } + }); const decodeDescription = (description) => `${description.package_id}::${description.module_name}::${description.name}`; return { target: decodeDescription(moveCallInfo.function), @@ -134,16 +135,13 @@ function buildMoveCall(tx, moveCallInfo, payload, callContractObj, previousRetur module.exports = { receiveCall, getTransactionBcs, -} +}; if (require.main === module) { (async () => { const env = process.argv[2] || 'localnet'; const axelarInfo = require('../info/axelar.json')[env]; const testInfo = require('../info/test.json')[env]; - const privKey = Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); const discovery = axelarInfo['discovery::RelayerDiscovery']; @@ -174,11 +172,14 @@ if (require.main === module) { await receiveCall(client, keypair, axelarInfo, 'Ethereum', '0x0', test.channel, payload); - const event = (await client.queryEvents({query: { - MoveEventType: `${testPackageId}::test::Executed`, - }})).data[0].parsedJson; - - if ( hexlify(event.data) != payload ) throw new Error(`Emmited payload missmatch: ${hexlify(event.data)} != ${payload}`); + const event = ( + await client.queryEvents({ + query: { + MoveEventType: `${testPackageId}::test::Executed`, + }, + }) + ).data[0].parsedJson; + if (hexlify(event.data) != payload) throw new Error(`Emmited payload missmatch: ${hexlify(event.data)} != ${payload}`); })(); } diff --git a/scripts/test-send-call.js b/scripts/test-send-call.js index 5fb7b27d..005abc78 100644 --- a/scripts/test-send-call.js +++ b/scripts/test-send-call.js @@ -4,43 +4,36 @@ const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { utils: { hexlify }} = require('ethers'); +const { + utils: { hexlify }, +} = require('ethers'); const { toPure, parseEnv } = require('./utils'); - (async () => { const env = parseEnv(process.argv[2] || 'localnet'); const destinationChain = process.argv[3] || 'ethereum'; const destinationAddress = process.argv[4] || '0x68B93045fe7D8794a7cAF327e7f855CD6Cd03BB8'; - const payload = '0x' + Buffer.from((process.argv[5] || 'hello world'), 'utf8').toString('hex'); + const payload = '0x' + Buffer.from(process.argv[5] || 'hello world', 'utf8').toString('hex'); const axelarInfo = require('../info/axelar.json')[env.alias]; const testInfo = require('../info/test.json')[env.alias]; - const privKey = Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); // get the public key in a compressed format const keypair = Ed25519Keypair.fromSecretKey(privKey); // create a new SuiClient object pointing to the network you want to use const client = new SuiClient({ url: env.url }); - + const axlearPackageId = axelarInfo.packageId; const testPackageId = testInfo.packageId; const test = testInfo['test::Singleton']; - const tx = new TransactionBlock(); + const tx = new TransactionBlock(); tx.moveCall({ target: `${testPackageId}::test::send_call`, - arguments: [ - tx.object(test.objectId), - tx.pure(destinationChain), - tx.pure(destinationAddress), - tx.pure(toPure(payload)), - ], - typeArguments: [] + arguments: [tx.object(test.objectId), tx.pure(destinationChain), tx.pure(destinationAddress), tx.pure(toPure(payload))], + typeArguments: [], }); await client.signAndExecuteTransactionBlock({ @@ -53,11 +46,14 @@ const { toPure, parseEnv } = require('./utils'); requestType: 'WaitForLocalExecution', }); - const event = (await client.queryEvents({query: { - MoveEventType: `${axlearPackageId}::gateway::ContractCall`, - }})).data[0].parsedJson; + const event = ( + await client.queryEvents({ + query: { + MoveEventType: `${axlearPackageId}::gateway::ContractCall`, + }, + }) + ).data[0].parsedJson; console.log(event); - if ( hexlify(event.source_id) != test.channel ) throw new Error(`Emmited payload missmatch: ${hexlify(event.source)} != ${test.channel}`); - -})(); \ No newline at end of file + if (hexlify(event.source_id) != test.channel) throw new Error(`Emmited payload missmatch: ${hexlify(event.source)} != ${test.channel}`); +})(); diff --git a/scripts/test-transfer-operatorship.js b/scripts/test-transfer-operatorship.js index 10750621..96a82a34 100644 --- a/scripts/test-transfer-operatorship.js +++ b/scripts/test-transfer-operatorship.js @@ -1,18 +1,15 @@ require('dotenv').config(); -const { transferOperatorship, getRandomOperators } = require("./gateway"); -const secp256k1 = require('secp256k1'); -const { SuiClient } = require('@mysten/sui.js/client'); +const { transferOperatorship, getRandomOperators } = require('./gateway'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const fs = require('fs'); +const { SuiClient } = require('@mysten/sui.js/client'); const { parseEnv } = require('./utils'); +const secp256k1 = require('secp256k1'); +const fs = require('fs'); (async () => { const env = parseEnv(process.argv[2] || 'localnet'); const allInfo = require(`../info/axelar.json`); - const privKey = Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); // get the public key in a compressed format const keypair = Ed25519Keypair.fromSecretKey(privKey); @@ -26,4 +23,4 @@ const { parseEnv } = require('./utils'); allInfo[env.alias].activeOperators = operators; fs.writeFileSync(`info/axelar.json`, JSON.stringify(allInfo, null, 4)); -})(); \ No newline at end of file +})(); diff --git a/scripts/transfer-genesis-operatorship.js b/scripts/transfer-genesis-operatorship.js index e223d3b3..368b818c 100644 --- a/scripts/transfer-genesis-operatorship.js +++ b/scripts/transfer-genesis-operatorship.js @@ -1,19 +1,16 @@ require('dotenv').config(); -const { transferOperatorship, getAmplifierWorkers } = require("./gateway"); -const { SuiClient } = require('@mysten/sui.js/client'); +const { transferOperatorship, getAmplifierWorkers } = require('./gateway'); const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const fs = require('fs'); +const { SuiClient } = require('@mysten/sui.js/client'); const { parseEnv } = require('./utils'); +const fs = require('fs'); (async () => { const env = parseEnv(process.argv[2] || 'localnet'); const rpc = process.argv[3] || 'http://localhost:26657'; const proverAddr = process.argv[4]; const allInfo = require(`../info/axelar.json`); - const privKey = Buffer.from( - process.env.SUI_PRIVATE_KEY, - "hex" - ); + const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); // get the public key in a compressed format const keypair = Ed25519Keypair.fromSecretKey(privKey); @@ -24,7 +21,7 @@ const { parseEnv } = require('./utils'); await transferOperatorship(allInfo[env.alias], client, keypair, operators.pubKeys, operators.weights, operators.threshold); - allInfo[env.alias].activeOperators = operators + allInfo[env.alias].activeOperators = operators; fs.writeFileSync(`info/axelar.json`, JSON.stringify(allInfo, null, 4)); -})(); \ No newline at end of file +})(); diff --git a/scripts/utils.js b/scripts/utils.js index 4464dea5..4837cdea 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -2,8 +2,8 @@ const { arrayify } = require('ethers/lib/utils'); const fs = require('fs'); const configs = {}; +const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); const { getFullnodeUrl } = require('@mysten/sui.js/client'); -const { requestSuiFromFaucetV0, getFaucetHost, getFaucetRequestStatus } = require('@mysten/sui.js/faucet'); function toPure(hexString) { return String.fromCharCode(...arrayify(hexString)); @@ -22,38 +22,40 @@ function getModuleNameFromSymbol(symbol) { let i = 0; let length = symbol.length; - let moduleName = '' + let moduleName = ''; - while(isNumber(symbol[i])) { + while (isNumber(symbol[i])) { i++; - }; - while(i < length) { + } + while (i < length) { let char = symbol[i]; - if( isLowercase(char) || isNumber(char) ) { + if (isLowercase(char) || isNumber(char)) { moduleName += char; - } else if( isUppercase(char) ) { + } else if (isUppercase(char)) { moduleName += char.toLowerCase(); - } else if(char == '_' || char == ' ') { + } else if (char == '_' || char == ' ') { moduleName += '_'; - }; + } i++; - }; + } return moduleName; } function getConfig(packagePath, envAlias) { - if(!configs[packagePath]) { - configs[packagePath] = fs.existsSync(`${__dirname}/../info/${packagePath}.json`) ? JSON.parse(fs.readFileSync(`${__dirname}/../info/${packagePath}.json`)) : {}; + if (!configs[packagePath]) { + configs[packagePath] = fs.existsSync(`${__dirname}/../info/${packagePath}.json`) + ? JSON.parse(fs.readFileSync(`${__dirname}/../info/${packagePath}.json`)) + : {}; } return configs[packagePath][envAlias]; } function setConfig(packagePath, envAlias, config) { - if(!configs[packagePath]) { + if (!configs[packagePath]) { try { configs[packagePath] = require(`${__dirname}/../info/${packagePath}.json`); - } catch(e) { + } catch (e) { switch (e.code) { case 'MODULE_NOT_FOUND': case undefined: @@ -66,7 +68,7 @@ function setConfig(packagePath, envAlias, config) { } configs[packagePath][envAlias] = config; - if (!fs.existsSync(`${__dirname}/../info`)){ + if (!fs.existsSync(`${__dirname}/../info`)) { fs.mkdirSync(`${__dirname}/../info`); } fs.writeFileSync(`${__dirname}/../info/${packagePath}.json`, JSON.stringify(configs[packagePath], null, 4)); @@ -86,8 +88,8 @@ async function requestSuiFromFaucet(env, address) { } async function getFullObject(object, client) { - for(const field of ['type', 'sender', 'owner']) { - if(object[field]) { + for (const field of ['type', 'sender', 'owner']) { + if (object[field]) { delete object[field]; } } @@ -95,21 +97,21 @@ async function getFullObject(object, client) { id: object.objectId, options: { showContent: true, - } + }, }); const fields = objectResponce.data.content.fields; function decodeFields(fields, object) { - for(const key in fields) { - if(key === 'id') continue; - if(fields[key].fields) { - if(!fields[key].fields.id) { + for (const key in fields) { + if (key === 'id') continue; + if (fields[key].fields) { + if (!fields[key].fields.id) { object[key] = {}; decodeFields(fields[key].fields, object[key]); } else { object[key] = fields[key].fields.id.id || fields[key].fields.id; } - } else if(fields[key].id) { + } else if (fields[key].id) { object[key] = fields[key].id; } else { object[key] = fields[key]; @@ -127,10 +129,10 @@ function parseEnv(arg) { case 'devnet': case 'testnet': case 'mainnet': - return {alias: arg, url: getFullnodeUrl(arg)}; + return { alias: arg, url: getFullnodeUrl(arg) }; default: return JSON.parse(arg); - } + } } module.exports = {