From b1dc4c27f53b46a0a6c806a758d114a7221c3112 Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 13:02:24 -0700 Subject: [PATCH 1/7] chore: move prettier to individual packages & upgrade prettier This commit makes the following connected changes: - Removes prettier from `pre-commit` and instead moves it to be run by `turbo`, hooking into `test:format` and `fix:format` - Fixes some of the linting scripts where they were incorrectly configured for turbo (i.e. renames the scripts to `fix:lint` and `test:lint` as needed) - Upgrades prettier in all packgaes --- .pre-commit-config.yaml | 10 - .prettierignore | 54 +- apps/api-reference/package.json | 2 +- apps/hermes/client/js/package.json | 6 +- apps/price_pusher/package.json | 6 +- apps/staking/package.json | 2 +- contract_manager/package.json | 8 +- governance/pyth_staking_sdk/package.json | 2 +- .../packages/crank_executor/package.json | 3 +- .../crank_pythnet_relayer/package.json | 3 +- .../packages/proposer_server/package.json | 3 +- .../packages/xc_admin_cli/package.json | 5 +- .../packages/xc_admin_common/package.json | 9 +- .../packages/xc_admin_frontend/package.json | 4 +- lazer/contracts/solana/package.json | 2 +- lazer/sdk/js/package.json | 10 +- package.json | 4 +- pnpm-lock.yaml | 3173 ++++++++++++++--- pnpm-workspace.yaml | 1 + prettier.config.mjs | 10 + price_service/client/js/package.json | 6 +- price_service/sdk/js/package.json | 5 +- pythnet/message_buffer/package.json | 6 +- target_chains/aptos/cli/package.json | 6 +- target_chains/aptos/sdk/js/package.json | 6 +- .../cosmwasm/deploy-scripts/package.json | 7 +- target_chains/cosmwasm/tools/package.json | 4 +- .../ethereum/abi_generator/package.json | 5 +- target_chains/ethereum/contracts/package.json | 6 +- .../ethereum/contracts/prettier.config.mjs | 5 + .../entropy_sdk/solidity/package.json | 10 +- .../entropy_sdk/solidity/prettier.config.js | 5 + target_chains/ethereum/sdk/js/package.json | 6 +- .../ethereum/sdk/solidity/package.json | 10 +- .../ethereum/sdk/solidity/prettier.config.js | 5 + .../stylus/pyth-mock-solidity/package.json | 9 + .../pyth-mock-solidity/prettier.config.js | 5 + target_chains/fuel/sdk/js/package.json | 7 +- .../sdk/js/pyth_solana_receiver/package.json | 6 +- .../solana/sdk/js/solana_utils/package.json | 6 +- target_chains/starknet/sdk/js/package.json | 13 +- target_chains/sui/cli-iota/package.json | 6 +- target_chains/sui/cli/package.json | 6 +- target_chains/sui/sdk/js-iota/package.json | 6 +- target_chains/sui/sdk/js/package.json | 6 +- target_chains/ton/contracts/.prettierignore | 1 + target_chains/ton/contracts/package.json | 10 +- target_chains/ton/sdk/js/package.json | 15 +- 48 files changed, 2877 insertions(+), 628 deletions(-) create mode 100644 prettier.config.mjs create mode 100644 target_chains/ethereum/contracts/prettier.config.mjs create mode 100644 target_chains/ethereum/entropy_sdk/solidity/prettier.config.js create mode 100644 target_chains/ethereum/sdk/solidity/prettier.config.js create mode 100644 target_chains/ethereum/sdk/stylus/pyth-mock-solidity/prettier.config.js create mode 100644 target_chains/ton/contracts/.prettierignore diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f25e5c86bc..e683cf47a4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,16 +23,6 @@ repos: target_chains/sui/vendor/| patches/ ) - # Hook to format many type of files in the repo - # including solidity contracts. - - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v2.7.1" - hooks: - - id: prettier - additional_dependencies: - - "prettier@2.7.1" - - "prettier-plugin-solidity@1.0.0-rc.1" - exclude: target_chains/sui/vendor/ - repo: local hooks: # Hooks for the remote executor diff --git a/.prettierignore b/.prettierignore index 8d8c103457..d4484088a1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,25 +1,39 @@ pnpm-lock.yaml patches/ .turbo/ +target_chains/sui/vendor/ -# These apps have their own prettier config that uses a later version of -# prettier -# -# TODO(cprussin): eventually I'll figure out how to upgrade prettier everywhere -# and hook it in to pre-commit. For now, I don't want to downgrade prettier in -# the packages that are using the later version, and pre-commit doesn't support -# later versions of prettier directly. -# -# Ideally, we should probably hook up a pre-commit script to run auto-fixes in a -# generic way that packages can hook into by defining lifecycle scripts, or by -# using the nx task graph. Then, packages can use their own formatters / -# formatter versions and can also hook up other auto-fixes like eslint, etc. -# -# I'll explore doing this when I get around to spending some time on our nx -# build graph config. -apps/api-reference -apps/staking -apps/insights -apps/entropy-debugger -governance/pyth_staking_sdk +# This should stay in sync with the list of workspaces from +# `pnpm-workspace.yaml` +apps/* packages/* +apps/hermes/client/js +governance/xc_admin/packages/* +governance/pyth_staking_sdk +price_service/sdk/js +price_service/client/js +pythnet/message_buffer +target_chains/aptos/cli +target_chains/aptos/sdk/js +target_chains/cosmwasm/tools +target_chains/cosmwasm/deploy-scripts +target_chains/ethereum/contracts +target_chains/ethereum/abi_generator +target_chains/ethereum/entropy_sdk/solidity +target_chains/ethereum/sdk/js +target_chains/ethereum/sdk/solidity +target_chains/ethereum/sdk/stylus/pyth-mock-solidity +target_chains/ethereum/examples/coin_flip/app +target_chains/fuel/sdk/js +target_chains/starknet/sdk/js +target_chains/sui/sdk/js +target_chains/sui/sdk/js-iota +target_chains/sui/cli +target_chains/sui/cli-iota +target_chains/solana/sdk/js/solana_utils +target_chains/solana/sdk/js/pyth_solana_receiver +target_chains/ton/contracts +target_chains/ton/sdk/js +contract_manager +lazer/contracts/solana +lazer/sdk/js diff --git a/apps/api-reference/package.json b/apps/api-reference/package.json index 1bdd12affe..d72384589d 100644 --- a/apps/api-reference/package.json +++ b/apps/api-reference/package.json @@ -60,7 +60,7 @@ "eslint": "^9.5.0", "jest": "^29.7.0", "postcss": "^8.4.38", - "prettier": "^3.3.2", + "prettier": "catalog:", "tailwindcss": "^3.4.4", "typescript": "^5.5.2", "vercel": "^34.2.7" diff --git a/apps/hermes/client/js/package.json b/apps/hermes/client/js/package.json index cf02c6c446..d5b75e61fd 100644 --- a/apps/hermes/client/js/package.json +++ b/apps/hermes/client/js/package.json @@ -24,8 +24,10 @@ "build:schemas": "openapi-zod-client ./schema.json --output src/zodSchemas.ts", "pull:schema": "curl -o schema.json -z schema.json https://hermes.pyth.network/docs/openapi.json", "example": "node lib/examples/HermesClient.js", - "format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", "prepublishOnly": "pnpm run build:typescript && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -44,7 +46,7 @@ "eslint": "^8.14.0", "jest": "^29.4.0", "openapi-zod-client": "^1.18.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", "typescript": "catalog:", "yargs": "^17.4.1" diff --git a/apps/price_pusher/package.json b/apps/price_pusher/package.json index 011b17f92a..cd22063689 100644 --- a/apps/price_pusher/package.json +++ b/apps/price_pusher/package.json @@ -21,7 +21,9 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", "start": "node lib/index.js", "dev": "ts-node src/index.ts", @@ -50,7 +52,7 @@ "eslint": "^8.13.0", "jest": "^29.7.0", "pino-pretty": "^11.2.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "typescript": "^5.3.3" diff --git a/apps/staking/package.json b/apps/staking/package.json index b2885b3191..d4e4d57f62 100644 --- a/apps/staking/package.json +++ b/apps/staking/package.json @@ -68,7 +68,7 @@ "eslint": "^9.8.0", "jest": "^29.7.0", "postcss": "^8.4.40", - "prettier": "^3.3.2", + "prettier": "catalog:", "tailwindcss": "^3.4.7", "tailwindcss-animate": "^1.0.7", "tailwindcss-react-aria-components": "^1.1.5", diff --git a/contract_manager/package.json b/contract_manager/package.json index 8b18f04bd6..4855b85830 100644 --- a/contract_manager/package.json +++ b/contract_manager/package.json @@ -11,8 +11,10 @@ "scripts": { "build": "tsc", "shell": "ts-node ./src/shell.ts", + "fix:lint": "eslint src/ scripts/ --fix --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\" \"scripts/**/*.ts\"", "test:lint": "eslint src/ scripts/ --max-warnings 0", - "format": "prettier --write \"src/**/*.ts\" \"scripts/**/*.ts\"" + "test:format": "prettier --check \"src/**/*.ts\" \"scripts/**/*.ts\"" }, "author": "", "license": "Apache-2.0", @@ -34,10 +36,10 @@ "@pythnetwork/hermes-client": "workspace:*", "@pythnetwork/price-service-client": "workspace:*", "@pythnetwork/pyth-fuel-js": "workspace:*", + "@pythnetwork/pyth-iota-js": "workspace:*", "@pythnetwork/pyth-sdk-solidity": "workspace:^", "@pythnetwork/pyth-starknet-js": "^0.2.1", "@pythnetwork/pyth-sui-js": "workspace:*", - "@pythnetwork/pyth-iota-js": "workspace:*", "@pythnetwork/pyth-ton": "workspace:*", "@pythnetwork/pyth-ton-js": "workspace:*", "@pythnetwork/solana-utils": "workspace:^", @@ -67,7 +69,7 @@ "devDependencies": { "@types/web3": "^1.2.2", "eslint": "^8.0.0", - "prettier": "^2.6.2", + "prettier": "catalog:", "typedoc": "^0.25.7" } } diff --git a/governance/pyth_staking_sdk/package.json b/governance/pyth_staking_sdk/package.json index 4d52a31f29..b8b2038387 100644 --- a/governance/pyth_staking_sdk/package.json +++ b/governance/pyth_staking_sdk/package.json @@ -30,7 +30,7 @@ "@typescript-eslint/parser": "^8.3.0", "eslint": "^9.8.0", "jest": "^29.7.0", - "prettier": "^3.3.2", + "prettier": "catalog:", "typescript": "^5.5.4" }, "dependencies": { diff --git a/governance/xc_admin/packages/crank_executor/package.json b/governance/xc_admin/packages/crank_executor/package.json index a3b6bd688a..189f85bfe9 100644 --- a/governance/xc_admin/packages/crank_executor/package.json +++ b/governance/xc_admin/packages/crank_executor/package.json @@ -17,7 +17,8 @@ "scripts": { "build": "tsc", "start": "node lib/index.js", - "format": "prettier --write \"src/**/*.ts\"" + "fix:format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"" }, "dependencies": { "@certusone/wormhole-sdk": "^0.10.15", diff --git a/governance/xc_admin/packages/crank_pythnet_relayer/package.json b/governance/xc_admin/packages/crank_pythnet_relayer/package.json index 279cc977fa..1b72acaa69 100644 --- a/governance/xc_admin/packages/crank_pythnet_relayer/package.json +++ b/governance/xc_admin/packages/crank_pythnet_relayer/package.json @@ -17,7 +17,8 @@ "scripts": { "build": "tsc", "start": "node lib/index.js", - "format": "prettier --write \"src/**/*.ts\"" + "fix:format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"" }, "dependencies": { "@certusone/wormhole-sdk": "^0.10.15", diff --git a/governance/xc_admin/packages/proposer_server/package.json b/governance/xc_admin/packages/proposer_server/package.json index b8137d6064..7b63ba6b77 100644 --- a/governance/xc_admin/packages/proposer_server/package.json +++ b/governance/xc_admin/packages/proposer_server/package.json @@ -17,7 +17,8 @@ "scripts": { "build": "tsc", "start": "node lib/index.js", - "format": "prettier --write \"src/**/*.ts\"" + "fix:format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"" }, "dependencies": { "@coral-xyz/anchor": "^0.29.0", diff --git a/governance/xc_admin/packages/xc_admin_cli/package.json b/governance/xc_admin/packages/xc_admin_cli/package.json index a094015e4c..37cf8b6456 100644 --- a/governance/xc_admin/packages/xc_admin_cli/package.json +++ b/governance/xc_admin/packages/xc_admin_cli/package.json @@ -16,8 +16,9 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", - "cli": "pnpm run build && node lib/index.js" + "cli": "pnpm run build && node lib/index.js", + "fix:format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"" }, "dependencies": { "@coral-xyz/anchor": "^0.29.0", diff --git a/governance/xc_admin/packages/xc_admin_common/package.json b/governance/xc_admin/packages/xc_admin_common/package.json index 99d72a06e9..1669fbb859 100644 --- a/governance/xc_admin/packages/xc_admin_common/package.json +++ b/governance/xc_admin/packages/xc_admin_common/package.json @@ -16,8 +16,9 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", - "test:unit": "jest" + "test:unit": "jest", + "fix:format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"" }, "//": [ "The injectivelabs/token-metadata package is pinned to a specific version to ensure that", @@ -30,6 +31,7 @@ "@injectivelabs/token-metadata": "~1.10.42", "@project-serum/anchor": "^0.25.0", "@pythnetwork/client": "catalog:", + "@pythnetwork/pyth-lazer-sdk": "workspace:*", "@pythnetwork/pyth-solana-receiver": "workspace:*", "@pythnetwork/solana-utils": "workspace:*", "@solana/buffer-layout": "^4.0.1", @@ -40,7 +42,6 @@ "ethers": "^5.7.2", "lodash": "^4.17.21", "message_buffer": "workspace:^", - "@pythnetwork/pyth-lazer-sdk": "workspace:*", "typescript": "^4.9.4" }, "devDependencies": { @@ -49,7 +50,7 @@ "@types/lodash": "^4.14.191", "fast-check": "^3.10.0", "jest": "^29.3.1", - "prettier": "^2.8.1", + "prettier": "catalog:", "ts-jest": "^29.0.3" } } diff --git a/governance/xc_admin/packages/xc_admin_frontend/package.json b/governance/xc_admin/packages/xc_admin_frontend/package.json index 8aa19fc901..53ab649e97 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/package.json +++ b/governance/xc_admin/packages/xc_admin_frontend/package.json @@ -10,6 +10,8 @@ "pull:env": "[ $CI ] || VERCEL_ORG_ID=team_BKQrg3JJFLxZyTqpuYtIY0rj VERCEL_PROJECT_ID=prj_TCjesnm3pxM7Ay8oxlTH4xLkkmP9 vercel env pull", "start:dev": "next dev --port 3004", "start:prod": "next start --port 3004", + "fix:format": "prettier --write .", + "test:format": "prettier --check .", "test:lint": "next lint --max-warnings 0" }, "dependencies": { @@ -54,7 +56,7 @@ "eslint": "8.56.0", "eslint-config-next": "^14.2.3", "postcss": "^8.4.16", - "prettier": "^2.7.1", + "prettier": "catalog:", "prettier-plugin-tailwindcss": "^0.1.13", "tailwindcss": "^3.1.8", "typescript": "^5.4.5", diff --git a/lazer/contracts/solana/package.json b/lazer/contracts/solana/package.json index 31d794552c..7895b7c9c9 100644 --- a/lazer/contracts/solana/package.json +++ b/lazer/contracts/solana/package.json @@ -19,7 +19,7 @@ "@types/yargs": "^17.0.33", "chai": "^4.3.4", "mocha": "^9.0.3", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "typescript": "^4.3.5", diff --git a/lazer/sdk/js/package.json b/lazer/sdk/js/package.json index c534a9bd8f..1facbc18bc 100644 --- a/lazer/sdk/js/package.json +++ b/lazer/sdk/js/package.json @@ -26,6 +26,8 @@ "fix:lint": "eslint --fix . --max-warnings 0", "test:lint": "eslint . --max-warnings 0", "test:types": "tsc", + "test:format": "prettier --check .", + "fix:format": "prettier --write .", "example": "node --loader ts-node/esm examples/index.js", "doc": "typedoc --out docs/typedoc src", "publish": "pnpm run script -- publish" @@ -38,7 +40,7 @@ "@types/node": "^18.19.54", "@types/ws": "^8.5.12", "eslint": "^9.12.0", - "prettier": "^3.3.3", + "prettier": "catalog:", "ts-node": "^10.9.2", "typedoc": "^0.26.8", "typescript": ">=5.5.0 < 5.6.0", @@ -60,11 +62,11 @@ ], "license": "Apache-2.0", "dependencies": { + "@isaacs/ttlcache": "^1.4.1", "@solana/buffer-layout": "^4.0.1", "@solana/web3.js": "^1.98.0", "isomorphic-ws": "^5.0.0", - "ws": "^8.18.0", - "@isaacs/ttlcache": "^1.4.1", - "ts-log": "^2.2.7" + "ts-log": "^2.2.7", + "ws": "^8.18.0" } } diff --git a/package.json b/package.json index e999dca988..f2dde8de99 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,10 @@ "test:ci": "turbo test" }, "devDependencies": { + "@cprussin/prettier-config": "^2.2.1", "lerna": "^8.1.8", - "prettier": "2.7.1", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", "turbo": "^2.2.3" }, "pnpm": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76fb928703..a7e60537a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,6 +138,9 @@ catalogs: prettier: specifier: 3.3.3 version: 3.3.3 + prettier-plugin-solidity: + specifier: ^1.4.2 + version: 1.4.2 react: specifier: 19.0.0 version: 19.0.0 @@ -208,12 +211,18 @@ importers: .: devDependencies: + '@cprussin/prettier-config': + specifier: ^2.2.1 + version: 2.2.1(prettier@3.3.3) lerna: specifier: ^8.1.8 version: 8.1.8(encoding@0.1.13) prettier: - specifier: 2.7.1 - version: 2.7.1 + specifier: 'catalog:' + version: 3.3.3 + prettier-plugin-solidity: + specifier: 'catalog:' + version: 1.4.2(prettier@3.3.3) turbo: specifier: ^2.2.3 version: 2.2.3 @@ -301,7 +310,7 @@ importers: version: 4.9.1 '@cprussin/eslint-config': specifier: 'catalog:' - version: 3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))(typescript@5.5.4) + version: 3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))(typescript@5.5.4) '@cprussin/jest-config': specifier: 'catalog:' version: 1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/node@20.14.15)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))(utf-8-validate@5.0.10) @@ -342,7 +351,7 @@ importers: specifier: ^8.4.38 version: 8.4.47 prettier: - specifier: ^3.3.2 + specifier: 'catalog:' version: 3.3.3 tailwindcss: specifier: ^3.4.4 @@ -401,7 +410,7 @@ importers: devDependencies: '@cprussin/eslint-config': specifier: 'catalog:' - version: 3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(typescript@5.6.3) + version: 3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(typescript@5.6.3) '@cprussin/jest-config': specifier: 'catalog:' version: 1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/node@22.8.2)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(esbuild@0.22.0)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(utf-8-validate@6.0.4) @@ -482,8 +491,8 @@ importers: specifier: ^1.18.1 version: 1.18.1(react@19.0.0) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.6.3)))(typescript@5.6.3) @@ -658,7 +667,7 @@ importers: version: 1.3.0(svelte@4.2.18)(typescript@5.5.4) '@pythnetwork/hermes-client': specifier: ^1.3.1 - version: 1.3.1(axios@1.7.7) + version: 1.3.1(axios@1.8.3) '@pythnetwork/price-service-sdk': specifier: workspace:^ version: link:../../price_service/sdk/js @@ -745,8 +754,8 @@ importers: specifier: ^11.2.1 version: 11.2.1 prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.1.1 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(esbuild@0.22.0)(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(typescript@5.5.4) @@ -797,13 +806,13 @@ importers: version: 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': specifier: ^0.15.35 - version: 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-react-ui': specifier: ^0.9.35 - version: 0.9.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-dom@19.0.0(react@19.0.0))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.9.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@19.0.0(react@19.0.0))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-wallets': specifier: 0.19.10 - version: 0.19.10(@babel/runtime@7.25.7)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10) + version: 0.19.10(@babel/runtime@7.25.7)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: 1.92.3 version: 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -902,7 +911,7 @@ importers: specifier: ^8.4.40 version: 8.4.47 prettier: - specifier: ^3.3.2 + specifier: 'catalog:' version: 3.3.3 tailwindcss: specifier: ^3.4.7 @@ -1056,8 +1065,8 @@ importers: specifier: ^8.0.0 version: 8.56.0 prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 typedoc: specifier: ^0.25.7 version: 0.25.7(typescript@5.5.4) @@ -1097,7 +1106,7 @@ importers: version: 3.0.1 '@solana/wallet-adapter-react': specifier: ^0.15.28 - version: 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1114,7 +1123,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)) prettier: - specifier: ^3.3.2 + specifier: 'catalog:' version: 3.3.3 typescript: specifier: ^5.5.4 @@ -1337,8 +1346,8 @@ importers: specifier: ^29.3.1 version: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5)) prettier: - specifier: ^2.8.1 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.3 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5)))(typescript@4.9.5) @@ -1380,7 +1389,7 @@ importers: version: 0.9.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-dom@19.0.0(react@19.0.0))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-wallets': specifier: 0.19.10 - version: 0.19.10(@babel/runtime@7.25.7)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10) + version: 0.19.10(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: 1.92.3 version: 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -1464,11 +1473,11 @@ importers: specifier: ^8.4.16 version: 8.4.47 prettier: - specifier: ^2.7.1 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 prettier-plugin-tailwindcss: specifier: ^0.1.13 - version: 0.1.13(prettier@2.8.8) + version: 0.1.13(prettier@3.3.3) tailwindcss: specifier: ^3.1.8 version: 3.4.14(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.5.4)) @@ -1504,8 +1513,8 @@ importers: specifier: ^9.0.3 version: 9.2.2 prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-mocha: specifier: ^10.0.0 version: 10.0.0(mocha@9.2.2) @@ -1562,7 +1571,7 @@ importers: specifier: ^9.12.0 version: 9.13.0(jiti@1.21.0) prettier: - specifier: ^3.3.3 + specifier: 'catalog:' version: 3.3.3 ts-node: specifier: ^10.9.2 @@ -1914,8 +1923,8 @@ importers: specifier: ^29.4.0 version: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5)))(typescript@4.9.5) @@ -1951,8 +1960,8 @@ importers: specifier: ^29.4.0 version: 29.7.0(@types/node@16.18.101)(ts-node@10.9.2(@types/node@16.18.101)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 quicktype: specifier: ^23.0.76 version: 23.0.76(encoding@0.1.13) @@ -1994,8 +2003,8 @@ importers: specifier: ^9.0.3 version: 9.2.2 prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-mocha: specifier: ^10.0.0 version: 10.0.0(mocha@9.2.2) @@ -2031,8 +2040,8 @@ importers: specifier: ^17.0.13 version: 17.0.33 prettier: - specifier: 2.8.0 - version: 2.8.0 + specifier: 'catalog:' + version: 3.3.3 typescript: specifier: ^5.3.3 version: 5.5.4 @@ -2080,8 +2089,8 @@ importers: specifier: ^29.4.1 version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)))(typescript@4.9.5) @@ -2134,6 +2143,9 @@ importers: '@types/yargs': specifier: ^17.0.18 version: 17.0.33 + prettier: + specifier: 'catalog:' + version: 3.3.3 target_chains/cosmwasm/tools: dependencies: @@ -2229,8 +2241,8 @@ importers: target_chains/ethereum/abi_generator: devDependencies: prettier: - specifier: ^2.7.1 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 solc: specifier: ^0.8.15 version: 0.8.26(debug@4.3.7) @@ -2340,6 +2352,12 @@ importers: mocha: specifier: ^8.2.1 version: 8.4.0 + prettier: + specifier: 'catalog:' + version: 3.3.3 + prettier-plugin-solidity: + specifier: 'catalog:' + version: 1.4.2(prettier@3.3.3) truffle: specifier: ^5.7.4 version: 5.11.5(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) @@ -2359,11 +2377,11 @@ importers: specifier: workspace:* version: link:../../abi_generator prettier: - specifier: ^2.7.1 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 prettier-plugin-solidity: - specifier: ^1.0.0-rc.1 - version: 1.3.1(prettier@2.8.8) + specifier: 'catalog:' + version: 1.4.2(prettier@3.3.3) target_chains/ethereum/sdk/js: dependencies: @@ -2408,8 +2426,8 @@ importers: specifier: ^29.4.1 version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)))(typescript@4.9.5) @@ -2429,11 +2447,11 @@ importers: specifier: workspace:* version: link:../../abi_generator prettier: - specifier: ^2.7.1 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 prettier-plugin-solidity: - specifier: ^1.0.0-rc.1 - version: 1.3.1(prettier@2.8.8) + specifier: 'catalog:' + version: 1.4.2(prettier@3.3.3) solc: specifier: ^0.8.25 version: 0.8.26(debug@4.3.7) @@ -2443,6 +2461,13 @@ importers: '@pythnetwork/pyth-sdk-solidity': specifier: ^4.0.0 version: 4.0.0 + devDependencies: + prettier: + specifier: 'catalog:' + version: 3.3.3 + prettier-plugin-solidity: + specifier: 'catalog:' + version: 1.4.2(prettier@3.3.3) target_chains/fuel/sdk/js: dependencies: @@ -2466,8 +2491,8 @@ importers: specifier: ^8.14.0 version: 8.56.0 prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.8.2)(typescript@5.5.4) @@ -2512,8 +2537,8 @@ importers: specifier: ^29.4.0 version: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 quicktype: specifier: ^23.0.76 version: 23.0.76(encoding@0.1.13) @@ -2564,8 +2589,8 @@ importers: specifier: ^29.4.0 version: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 quicktype: specifier: ^23.0.76 version: 23.0.76(encoding@0.1.13) @@ -2594,8 +2619,8 @@ importers: specifier: ^29.4.1 version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)))(typescript@4.9.5) @@ -2610,7 +2635,7 @@ importers: dependencies: '@certusone/wormhole-sdk': specifier: ^0.9.12 - version: 0.9.24(bufferutil@4.0.8)(encoding@0.1.13)(google-protobuf@3.21.4)(utf-8-validate@5.0.10) + version: 0.9.24(bufferutil@4.0.8)(encoding@0.1.13)(google-protobuf@3.21.4)(utf-8-validate@6.0.4) '@mysten/sui': specifier: ^1.3.0 version: 1.3.0(svelte@4.2.18)(typescript@5.5.4) @@ -2619,7 +2644,7 @@ importers: version: link:../../../contract_manager '@pythnetwork/price-service-client': specifier: ^1.4.0 - version: 1.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 1.9.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@pythnetwork/price-service-sdk': specifier: ^1.2.0 version: 1.7.1 @@ -2627,8 +2652,8 @@ importers: specifier: workspace:* version: link:../../../governance/xc_admin/packages/xc_admin_common prettier: - specifier: ^2.8.7 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@22.8.2)(typescript@5.5.4) @@ -2686,8 +2711,8 @@ importers: specifier: ^29.4.1 version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.5.4)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.5.4)))(typescript@5.5.4) @@ -2744,8 +2769,8 @@ importers: specifier: ^29.4.1 version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)))(typescript@5.6.3) @@ -2804,7 +2829,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) prettier: - specifier: ^3.3.2 + specifier: 'catalog:' version: 3.3.3 ts-jest: specifier: ^29.2.0 @@ -2843,8 +2868,8 @@ importers: specifier: ^29.4.1 version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) prettier: - specifier: ^2.6.2 - version: 2.8.8 + specifier: 'catalog:' + version: 3.3.3 ts-jest: specifier: ^29.0.5 version: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)))(typescript@4.9.5) @@ -3047,10 +3072,18 @@ packages: resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.8': resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.25.8': resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} engines: {node: '>=6.9.0'} @@ -3066,10 +3099,18 @@ packages: resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.10': + resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.7': resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} @@ -3078,23 +3119,44 @@ packages: resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.25.7': resolution: {integrity: sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.26.9': + resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.25.7': resolution: {integrity: sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.26.3': + resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-define-polyfill-provider@0.6.2': resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-environment-visitor@7.24.7': resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} @@ -3107,36 +3169,70 @@ packages: resolution: {integrity: sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.7': resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.7': resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.25.7': resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==} engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.25.7': resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.25.7': resolution: {integrity: sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.25.7': resolution: {integrity: sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-simple-access@7.25.7': resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} @@ -3145,22 +3241,42 @@ packages: resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.7': resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.7': resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.25.7': resolution: {integrity: sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==} engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.7': resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} engines: {node: '>=6.9.0'} @@ -3174,6 +3290,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.10': + resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7': resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} engines: {node: '>=6.9.0'} @@ -3212,8 +3333,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-export-default-from@7.25.8': - resolution: {integrity: sha512-5SLPHA/Gk7lNdaymtSVS9jH77Cs7yuHTR3dYj+9q+M7R7tNLXhNuvnmOfafRIzpWL+dtMibuu1I4ofrc768Gkw==} + '@babel/plugin-proposal-export-default-from@7.25.9': + resolution: {integrity: sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3292,8 +3413,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-export-default-from@7.25.7': - resolution: {integrity: sha512-LRUCsC0YucSjabsmxx6yly8+Q/5mxKdp9gemlpR9ro3bfpcOQOXx/CHivs7QCbjgygd6uQ2GcRfHu1FVax/hgg==} + '@babel/plugin-syntax-export-default-from@7.25.9': + resolution: {integrity: sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3303,8 +3424,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.25.7': - resolution: {integrity: sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w==} + '@babel/plugin-syntax-flow@7.26.0': + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3337,6 +3458,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -3385,6 +3512,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -3397,6 +3530,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-generator-functions@7.24.7': resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==} engines: {node: '>=6.9.0'} @@ -3409,6 +3548,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoped-functions@7.24.7': resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} @@ -3421,6 +3566,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.24.7': resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} engines: {node: '>=6.9.0'} @@ -3439,18 +3590,36 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.25.7': resolution: {integrity: sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.25.7': resolution: {integrity: sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dotall-regex@7.24.7': resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} @@ -3481,8 +3650,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.25.7': - resolution: {integrity: sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==} + '@babel/plugin-transform-flow-strip-types@7.26.5': + resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3499,6 +3668,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-json-strings@7.24.7': resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} @@ -3511,6 +3686,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-logical-assignment-operators@7.24.7': resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} @@ -3535,6 +3716,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.24.7': resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==} engines: {node: '>=6.9.0'} @@ -3553,6 +3740,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/plugin-transform-new-target@7.24.7': resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} @@ -3601,18 +3794,36 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-methods@7.25.7': resolution: {integrity: sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-property-in-object@7.25.8': resolution: {integrity: sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-property-literals@7.24.7': resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} @@ -3631,20 +3842,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.22.5': resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.7': - resolution: {integrity: sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==} + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.7': - resolution: {integrity: sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==} + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3655,6 +3872,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-pure-annotations@7.24.1': resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} engines: {node: '>=6.9.0'} @@ -3679,24 +3902,48 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-runtime@7.26.10': + resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.25.7': resolution: {integrity: sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.25.7': resolution: {integrity: sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.25.7': resolution: {integrity: sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-template-literals@7.24.7': resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} @@ -3715,6 +3962,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.26.8': + resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.24.7': resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} @@ -3733,6 +3986,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-sets-regex@7.24.7': resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} engines: {node: '>=6.9.0'} @@ -3745,8 +4004,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.25.7': - resolution: {integrity: sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==} + '@babel/preset-flow@7.25.9': + resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3768,8 +4027,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.25.7': - resolution: {integrity: sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==} + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.25.9': + resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3782,18 +4047,34 @@ packages: resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.7': resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} engines: {node: '>=6.9.0'} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.7': resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.10': + resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.8': resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.10': + resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -3818,6 +4099,9 @@ packages: peerDependencies: '@solana/web3.js': 1.92.3 + '@bytecodealliance/preview2-shim@0.17.0': + resolution: {integrity: sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==} + '@censo-custody/solana-wallet-adapter@0.1.0': resolution: {integrity: sha512-iM1jFVzBMfk7iokgUVfA2xvGUegixklUISgMARa/VA2mFIjoi32t4xmD8PtWHht81fmg107aYhLnTV1cM7NkAg==} @@ -4009,6 +4293,11 @@ packages: '@cprussin/prettier-config@2.1.1': resolution: {integrity: sha512-vxFxG6L1GbL0Mfmt/Q7CY9ENTbM3IQQxUbihcvt9OTA5gtmF9cbYF1ZMFlFLAmgKZ23xmQMTcpCMrJJwXG754w==} + '@cprussin/prettier-config@2.2.1': + resolution: {integrity: sha512-d1VP2QkAE5K5CN8PhZ/5h4V1ddxUfgBRmokh54KIILrKQsJIXWfCXEHWbVPABmQ/lQ9SAgnj329mwGEYensCbQ==} + peerDependencies: + prettier: ^3.5.3 + '@cprussin/tsconfig@3.0.1': resolution: {integrity: sha512-OBS2ew/pNjiWBI12kEt++8xKFE1rwZhitHOLHmqhNUs/1b4noi6k8nN0ZriV5ltTDP1l1jzYuaA69gwujaR28A==} @@ -4478,36 +4767,63 @@ packages: '@ethersproject/abi@5.7.0': resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + '@ethersproject/abstract-provider@5.7.0': resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + '@ethersproject/abstract-signer@5.7.0': resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + '@ethersproject/address@5.7.0': resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + '@ethersproject/base64@5.7.0': resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + '@ethersproject/basex@5.7.0': resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} '@ethersproject/bignumber@5.7.0': resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + '@ethersproject/bytes@5.7.0': resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + '@ethersproject/constants@5.7.0': resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + '@ethersproject/contracts@5.7.0': resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} '@ethersproject/hash@5.7.0': resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + '@ethersproject/hdnode@5.7.0': resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} @@ -4517,18 +4833,30 @@ packages: '@ethersproject/keccak256@5.7.0': resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + '@ethersproject/logger@5.7.0': resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + '@ethersproject/networks@5.7.1': resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + '@ethersproject/pbkdf2@5.7.0': resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} '@ethersproject/properties@5.7.0': resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + '@ethersproject/providers@5.7.2': resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} @@ -4538,21 +4866,33 @@ packages: '@ethersproject/rlp@5.7.0': resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + '@ethersproject/sha2@5.7.0': resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} '@ethersproject/signing-key@5.7.0': resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + '@ethersproject/solidity@5.7.0': resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} '@ethersproject/strings@5.7.0': resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + '@ethersproject/transactions@5.7.0': resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + '@ethersproject/units@5.7.0': resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} @@ -4562,6 +4902,9 @@ packages: '@ethersproject/web@5.7.1': resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} @@ -4840,11 +5183,20 @@ packages: resolution: {integrity: sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==} engines: {node: '>=12.10.0'} + '@grpc/grpc-js@1.13.0': + resolution: {integrity: sha512-pMuxInZjUnUkgMT2QLZclRqwk2ykJbIU05aZgPgJYXEpN9+2I7z7aNwcjWZSycRPl232FfhPszyBFJyOxTHNog==} + engines: {node: '>=12.10.0'} + '@grpc/proto-loader@0.7.12': resolution: {integrity: sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==} engines: {node: '>=6'} hasBin: true + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -5203,6 +5555,10 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -5317,12 +5673,12 @@ packages: hardhat: ^2.14.0 zksync-web3: ^0.14.3 - '@matterlabs/hardhat-zksync-deploy@1.5.0': - resolution: {integrity: sha512-7LAgYYwoKWHeR+3CyWEvA3NKBKtt7ktcr7SX6ZPgbEYqHAdXH02vxJZGwNADtMWpyYm8h+fEQkpPIgErD4NhmA==} + '@matterlabs/hardhat-zksync-deploy@1.6.0': + resolution: {integrity: sha512-yaOfhw7hmLOriBc+TnHrFOVKyi79XFqJN5D1Z4T6CadaSNLeq7pgBV81kkgVzaCJVoA/La2RGxPowsG7riZGbw==} peerDependencies: ethers: ^6.12.2 hardhat: ^2.22.5 - zksync-ethers: ^6.8.0 + zksync-ethers: ^6.11.2 '@matterlabs/hardhat-zksync-ethers@1.1.0': resolution: {integrity: sha512-iX3ZxmA1WaVs1JQOk+Hs90dufGVKaYxn37dx08m4P+qiKWRCeJWj67UnA7bv/b13l5Yip8Qy3UvoY6BvQcVyWQ==} @@ -5345,8 +5701,8 @@ packages: peerDependencies: hardhat: ^2.14.0 - '@matterlabs/hardhat-zksync-solc@1.2.5': - resolution: {integrity: sha512-iZyznWl1Hoe/Z46hnUe1s2drBZBjJOS/eN+Ql2lIBX9B6NevBl9DYzkKzH5HEIMCLGnX9sWpRAJqUQJWy9UB6w==} + '@matterlabs/hardhat-zksync-solc@1.2.6': + resolution: {integrity: sha512-9hje3aOKsW90hDxL7THW8ZuJGnGSS1rcaRNPkDXP7ROCgcF5AYKYpf+NPa6zXZRpVexxJM1e2HKyLgos2Fe8ZQ==} peerDependencies: hardhat: ^2.22.5 @@ -5766,34 +6122,66 @@ packages: resolution: {integrity: sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ==} engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-arm64@0.8.0': + resolution: {integrity: sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.6.4': resolution: {integrity: sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg==} engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.8.0': + resolution: {integrity: sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.6.4': resolution: {integrity: sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': + resolution: {integrity: sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.6.4': resolution: {integrity: sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.8.0': + resolution: {integrity: sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.6.4': resolution: {integrity: sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.8.0': + resolution: {integrity: sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.6.4': resolution: {integrity: sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.8.0': + resolution: {integrity: sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.6.4': resolution: {integrity: sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw==} engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.8.0': + resolution: {integrity: sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr@0.6.4': resolution: {integrity: sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw==} engines: {node: '>= 18'} + '@nomicfoundation/edr@0.8.0': + resolution: {integrity: sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==} + engines: {node: '>= 18'} + '@nomicfoundation/ethereumjs-common@4.0.4': resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} @@ -5871,6 +6259,9 @@ packages: resolution: {integrity: sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ==} engines: {node: '>= 10'} + '@nomicfoundation/slang@0.18.3': + resolution: {integrity: sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==} + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} engines: {node: '>= 12'} @@ -6159,6 +6550,10 @@ packages: resolution: {integrity: sha512-4bPSXdEqHsNRL5T1ybPLneWGYjzGl6XWGWkv7aUoFFgz8mOdarstRBX1Wi4XJFw6IeHPUI7mMSQr2jdz8Y2ypQ==} hasBin: true + '@openzeppelin/upgrades-core@1.42.1': + resolution: {integrity: sha512-8qnz2XfQrco8R8u9NjV+KiSLrVn7DnWFd+3BuhTUjhVy0bzCSu2SMKCVpZLtXbxf4f2dpz8jYPQYRa6s23PhLA==} + hasBin: true + '@orbs-network/ton-access@2.3.3': resolution: {integrity: sha512-b1miCPts7wBG9JKYgzXIRZQm/LMy5Uk1mNK8NzlcXHL3HRHJkkFbuYJGuj3IkWCiIicW3Ipp4sYnn3Fwo4oB0g==} @@ -8052,8 +8447,8 @@ packages: peerDependencies: '@solana/web3.js': 1.92.3 - '@solidity-parser/parser@0.17.0': - resolution: {integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==} + '@solidity-parser/parser@0.19.0': + resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} '@sqds/mesh@1.0.6': resolution: {integrity: sha512-z+x1GjixJm8K3uPwaDebTsssU3B71zJzRCkywmtz2ZZoMvoz9w/C4nY+v7v6Wg/9OTbfSDgcX/Hoo/FlphkWvg==} @@ -8112,8 +8507,8 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@starknet-io/types-js@0.7.7': - resolution: {integrity: sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ==} + '@starknet-io/types-js@0.7.10': + resolution: {integrity: sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==} '@storybook/addon-actions@8.3.5': resolution: {integrity: sha512-t8D5oo+4XfD+F8091wLa2y/CDd/W2lExCeol5Vm1tp5saO+u6f2/d7iykLhTowWV84Uohi3D073uFeyTAlGebg==} @@ -9104,9 +9499,15 @@ packages: '@types/node@18.19.57': resolution: {integrity: sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==} + '@types/node@18.19.80': + resolution: {integrity: sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==} + '@types/node@20.14.15': resolution: {integrity: sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==} + '@types/node@20.17.24': + resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} + '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -10040,6 +10441,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} @@ -10543,6 +10949,9 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.8.3: + resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} + axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} @@ -10581,16 +10990,31 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.10.6: resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.2: resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-styled-components@2.1.4: resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: @@ -10737,6 +11161,9 @@ packages: bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + bn.js@5.2.0: resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==} @@ -10817,6 +11244,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -10915,10 +11347,6 @@ packages: resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} engines: {node: '>=12.17'} - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - bytes@3.1.0: resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} engines: {node: '>= 0.8'} @@ -10947,6 +11375,10 @@ packages: resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -11006,6 +11438,9 @@ packages: caniuse-lite@1.0.30001669: resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} + caniuse-lite@1.0.30001704: + resolution: {integrity: sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==} + capability@0.2.5: resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==} @@ -11030,6 +11465,10 @@ packages: cbor-sync@1.0.4: resolution: {integrity: sha512-GWlXN4wiz0vdWWXBU71Dvc1q3aBo0HytqwAZnXF1wOwjqNnDWA1vZ1gDMFLlqohak31VQzmhiYfiCX5QSSfagA==} + cbor@10.0.3: + resolution: {integrity: sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw==} + engines: {node: '>=18'} + cbor@5.2.0: resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} engines: {node: '>=6.0.0'} @@ -11148,6 +11587,10 @@ packages: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -11438,8 +11881,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} engines: {node: '>= 0.8.0'} computeds@0.0.1: @@ -11580,6 +12023,9 @@ packages: core-js-compat@3.38.0: resolution: {integrity: sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==} + core-js-compat@3.41.0: + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-pure@3.38.1: resolution: {integrity: sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==} @@ -11979,6 +12425,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -12204,8 +12659,8 @@ packages: resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} engines: {node: '>= 8.0'} - docker-modem@5.0.3: - resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==} + docker-modem@5.0.6: + resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} engines: {node: '>= 8.0'} dockerode@2.5.8: @@ -12216,8 +12671,8 @@ packages: resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} engines: {node: '>= 8.0'} - dockerode@4.0.2: - resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==} + dockerode@4.0.4: + resolution: {integrity: sha512-6GYP/EdzEY50HaOxTVTJ2p+mB5xDHTMJhS+UoGrVyS6VC+iQRh7kZ4FRpUYq6nziby7hPqWhOrFFUFTMUZJJ5w==} engines: {node: '>= 8.0'} doctrine@2.1.0: @@ -12315,6 +12770,10 @@ packages: resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} engines: {node: '>=0.10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -12351,6 +12810,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + electron-to-chromium@1.5.118: + resolution: {integrity: sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA==} + electron-to-chromium@1.5.41: resolution: {integrity: sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==} @@ -12360,6 +12822,9 @@ packages: elliptic@6.5.6: resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emittery@0.10.0: resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} engines: {node: '>=12'} @@ -12496,6 +12961,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -12514,10 +12983,18 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} @@ -13091,6 +13568,10 @@ packages: resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} engines: {node: '>=14.0.0'} + ethers@6.13.5: + resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + engines: {node: '>=14.0.0'} + ethjs-abi@0.2.1: resolution: {integrity: sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -13188,6 +13669,9 @@ packages: exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} @@ -13253,6 +13737,10 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-parse@1.0.3: resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} @@ -13275,8 +13763,8 @@ packages: fast-uri@3.0.1: resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} - fast-xml-parser@4.5.0: - resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true fastest-levenshtein@1.0.16: @@ -13298,6 +13786,14 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-cookie@0.11.0: resolution: {integrity: sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==} engines: {node: '>=8'} @@ -13420,8 +13916,8 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-parser@0.250.0: - resolution: {integrity: sha512-8mkLh/CotlvqA9vCyQMbhJoPx2upEg9oKxARAayz8zQ58wCdABnTZy6U4xhMHvHvbTUFgZQk4uH2cglOCOel5A==} + flow-parser@0.265.0: + resolution: {integrity: sha512-C+bg/TZsDVlLMF14+q9P9FB2pjQSgWwYs0pkIMPE1FsZWS4A0kk1M28V6YphpxAPr3AISVRZ6VgpDepvCk6dGw==} engines: {node: '>=0.4.0'} follow-redirects@1.15.9: @@ -13486,6 +13982,10 @@ packages: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -13568,6 +14068,10 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} @@ -13689,6 +14193,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -13709,6 +14217,10 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-size@3.0.0: resolution: {integrity: sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==} @@ -13868,6 +14380,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} @@ -13964,6 +14480,18 @@ packages: typescript: optional: true + hardhat@2.22.19: + resolution: {integrity: sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -13986,6 +14514,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -14267,6 +14799,11 @@ packages: engines: {node: '>=16.x'} hasBin: true + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} + engines: {node: '>=16.x'} + hasBin: true + immediate@3.3.0: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} @@ -14458,6 +14995,10 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} @@ -14597,8 +15138,8 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -15087,6 +15628,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -15548,6 +16094,9 @@ packages: long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + long@5.3.1: + resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -15622,6 +16171,9 @@ packages: magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -15673,6 +16225,10 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} @@ -16120,6 +16676,11 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + mocha@8.4.0: resolution: {integrity: sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==} engines: {node: '>= 10.12.0'} @@ -16488,6 +17049,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} @@ -17111,6 +17675,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -17384,6 +17952,9 @@ packages: preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + preact@10.26.4: + resolution: {integrity: sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==} + preact@10.4.1: resolution: {integrity: sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==} @@ -17400,9 +17971,9 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-solidity@1.3.1: - resolution: {integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==} - engines: {node: '>=16'} + prettier-plugin-solidity@1.4.2: + resolution: {integrity: sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==} + engines: {node: '>=18'} peerDependencies: prettier: '>=2.3.0' @@ -17412,6 +17983,61 @@ packages: peerDependencies: prettier: '>=2.2.0' + prettier-plugin-tailwindcss@0.6.11: + resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-tailwindcss@0.6.5: resolution: {integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==} engines: {node: '>=14.21.3'} @@ -17464,16 +18090,6 @@ packages: prettier-plugin-svelte: optional: true - prettier@2.7.1: - resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@2.8.0: - resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} - engines: {node: '>=10.13.0'} - hasBin: true - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -17484,6 +18100,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} @@ -17580,6 +18201,10 @@ packages: resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} engines: {node: '>=12.0.0'} + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} @@ -18056,6 +18681,10 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -18157,6 +18786,10 @@ packages: resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} engines: {node: '>=4'} + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} @@ -18168,6 +18801,10 @@ packages: resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==} hasBin: true + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + rehype-external-links@3.0.0: resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} @@ -18266,6 +18903,11 @@ packages: resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -18535,6 +19177,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -18633,6 +19280,10 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -18756,9 +19407,6 @@ packages: solidity-ast@0.4.59: resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} - solidity-comments-extractor@0.0.8: - resolution: {integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==} - sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} @@ -18863,6 +19511,10 @@ packages: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + starknet-types@0.7.2: resolution: {integrity: sha512-r3JJ0rrK0g3FnVRGcFiLY+9YT5WZgxB4TKBfR44wYGevHtKEM6BM5B+Gn1eou1zV7xEAwz3GpmvLSQTUAzDhsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -19046,8 +19698,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} strong-log-transformer@2.1.0: resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} @@ -19365,6 +20017,11 @@ packages: engines: {node: '>=10'} hasBin: true + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} + hasBin: true + teslabot@1.5.0: resolution: {integrity: sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg==} @@ -19445,6 +20102,10 @@ packages: tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} @@ -19700,6 +20361,9 @@ packages: tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -19966,10 +20630,18 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + undici@5.28.5: + resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} + engines: {node: '>=14.0'} + undici@6.20.1: resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} engines: {node: '>=18.17'} + undici@6.21.2: + resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==} + engines: {node: '>=18.17'} + unenv@1.9.0: resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} @@ -20123,6 +20795,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + upper-case-first@1.1.2: resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} @@ -21031,6 +21709,7 @@ packages: yaeti@0.0.6: resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} engines: {node: '>=0.10.32'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -21047,6 +21726,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} @@ -21133,6 +21817,12 @@ packages: peerDependencies: ethers: ^6.7.1 + zksync-ethers@6.16.1: + resolution: {integrity: sha512-D5fcs34P4b87+XMs7E+E4ZeASMPl0wAqWqp0RV/pztH14pVWrwS+C/rN63oIOD825GL+FmRmyZb4SrA1Ifff4A==} + engines: {node: '>=18.9.0'} + peerDependencies: + ethers: ^6.7.1 + zksync-web3@0.13.4: resolution: {integrity: sha512-AjCKhn9TRqsk2T9VLKxlod22rnVWOWGOjq+QXppFe2yTxZx9dVaai325OJ0aa7a3m5wx+9yhPqBu23jG2xPo5Q==} deprecated: This package has been deprecated in favor of zksync-ethers@5.0.0 @@ -21417,11 +22107,11 @@ snapshots: '@aws-sdk/types@3.609.0': dependencies: '@smithy/types': 3.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@axe-core/react@4.9.1': dependencies: @@ -21433,8 +22123,16 @@ snapshots: '@babel/highlight': 7.25.7 picocolors: 1.1.1 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.25.8': {} + '@babel/compat-data@7.26.8': {} + '@babel/core@7.25.8': dependencies: '@ampproject/remapping': 2.3.0 @@ -21470,10 +22168,22 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.26.10': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.25.7': dependencies: '@babel/types': 7.25.8 + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.10 + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: '@babel/traverse': 7.25.7 @@ -21489,6 +22199,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21502,6 +22220,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.25.8) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.10 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-regexp-features-plugin@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21509,6 +22240,13 @@ snapshots: regexpu-core: 6.1.1 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21520,6 +22258,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-environment-visitor@7.24.7': dependencies: '@babel/types': 7.25.8 @@ -21535,6 +22284,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.25.7': dependencies: '@babel/traverse': 7.25.7 @@ -21549,6 +22305,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21559,12 +22322,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.25.7': dependencies: '@babel/types': 7.25.8 + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.10 + '@babel/helper-plugin-utils@7.25.7': {} + '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-remap-async-to-generator@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21574,6 +22352,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21583,6 +22370,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.26.5(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-simple-access@7.25.7': dependencies: '@babel/traverse': 7.25.7 @@ -21597,12 +22393,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.25.7': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-wrap-function@7.25.7': dependencies: '@babel/template': 7.25.7 @@ -21611,6 +22420,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/helpers@7.25.7': dependencies: '@babel/template': 7.25.7 @@ -21627,6 +22444,10 @@ snapshots: dependencies: '@babel/types': 7.25.8 + '@babel/parser@7.26.10': + dependencies: + '@babel/types': 7.26.10 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21657,8 +22478,8 @@ snapshots: dependencies: '@babel/core': 7.25.8 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.8) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.8) transitivePeerDependencies: - supports-color @@ -21666,54 +22487,54 @@ snapshots: '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.8) - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.25.8(@babel/core@7.25.8)': + '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.8) '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.8) '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.8) '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.8)': dependencies: - '@babel/compat-data': 7.25.8 + '@babel/compat-data': 7.26.8 '@babel/core': 7.25.8 - '@babel/helper-compilation-targets': 7.25.7 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-transform-parameters': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.8) '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.8) '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.8) transitivePeerDependencies: - supports-color @@ -21747,20 +22568,20 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-export-default-from@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.8)': dependencies: @@ -21787,6 +22608,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21832,6 +22658,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21843,6 +22674,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21862,6 +22698,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.8) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21872,6 +22717,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21901,17 +22751,40 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.25.8) + '@babel/traverse': 7.26.10 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-computed-properties@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 '@babel/template': 7.25.7 + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.26.9 + '@babel/plugin-transform-destructuring@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21943,11 +22816,11 @@ snapshots: '@babel/helper-plugin-utils': 7.25.7 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-transform-flow-strip-types@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-flow': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.25.8) '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.8)': dependencies: @@ -21966,6 +22839,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -21977,6 +22859,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22005,6 +22892,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22029,6 +22924,12 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22082,6 +22983,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-private-methods@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22090,6 +22996,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-property-in-object@7.25.8(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22099,6 +23013,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22114,6 +23037,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22121,15 +23049,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.8)': dependencies: @@ -22142,6 +23070,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.8) + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22171,11 +23110,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.25.8) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.25.8) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.25.8) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-shorthand-properties@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-spread@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22184,11 +23140,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-sticky-regex@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22210,6 +23179,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.25.8) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22227,6 +23207,12 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -22320,12 +23306,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.25.7(@babel/core@7.25.8)': + '@babel/preset-flow@7.25.9(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/helper-validator-option': 7.25.7 - '@babel/plugin-transform-flow-strip-types': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.25.8) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.8)': dependencies: @@ -22357,7 +23343,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/register@7.25.7(@babel/core@7.25.8)': + '@babel/preset-typescript@7.26.0(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.25.8) + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.25.8) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.25.9(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 clone-deep: 4.0.1 @@ -22374,12 +23371,22 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.26.10': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.25.7': dependencies: '@babel/code-frame': 7.25.7 '@babel/parser': 7.25.8 '@babel/types': 7.25.8 + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + '@babel/traverse@7.25.7': dependencies: '@babel/code-frame': 7.25.7 @@ -22404,12 +23411,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.26.10': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/types': 7.26.10 + debug: 4.4.0(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.8': dependencies: '@babel/helper-string-parser': 7.25.7 '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 + '@babel/types@7.26.10': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@balena/dockerignore@1.0.2': {} '@base2/pretty-print-object@1.0.1': {} @@ -22453,6 +23477,8 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@bytecodealliance/preview2-shim@0.17.0': {} + '@censo-custody/solana-wallet-adapter@0.1.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -22590,6 +23616,41 @@ snapshots: - subscriptions-transport-ws - utf-8-validate + '@certusone/wormhole-sdk@0.9.24(bufferutil@4.0.8)(encoding@0.1.13)(google-protobuf@3.21.4)(utf-8-validate@6.0.4)': + dependencies: + '@certusone/wormhole-sdk-proto-web': 0.0.6(google-protobuf@3.21.4) + '@certusone/wormhole-sdk-wasm': 0.0.1 + '@coral-xyz/borsh': 0.2.6(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)) + '@mysten/sui.js': 0.32.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@project-serum/anchor': 0.25.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + '@solana/spl-token': 0.3.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + '@terra-money/terra.js': 3.1.9 + '@xpla/xpla.js': 0.2.3 + algosdk: 2.7.0 + aptos: 1.5.0 + axios: 0.24.0 + bech32: 2.0.0 + binary-parser: 2.2.1 + bs58: 4.0.1 + elliptic: 6.5.6 + js-base64: 3.7.5 + near-api-js: 1.1.0(encoding@0.1.13) + optionalDependencies: + '@injectivelabs/networks': 1.10.12(google-protobuf@3.21.4) + '@injectivelabs/sdk-ts': 1.10.72(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@injectivelabs/utils': 1.10.12(google-protobuf@3.21.4) + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - google-protobuf + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - utf-8-validate + '@chain-registry/types@0.28.1': {} '@chain-registry/types@0.43.10': {} @@ -22616,7 +23677,7 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.24.3 + preact: 10.26.4 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -22736,6 +23797,12 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 + '@coral-xyz/borsh@0.2.6(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))': + dependencies: + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + '@coral-xyz/borsh@0.27.0(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -22909,6 +23976,17 @@ snapshots: - bufferutil - utf-8-validate + '@cosmjs/socket@0.30.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@cosmjs/stream': 0.30.1 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4) + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + optional: true + '@cosmjs/socket@0.32.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@cosmjs/stream': 0.32.3 @@ -22958,6 +24036,26 @@ snapshots: - debug - utf-8-validate + '@cosmjs/stargate@0.30.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stream': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + optional: true + '@cosmjs/stargate@0.32.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@confio/ics23': 0.6.8 @@ -23035,6 +24133,24 @@ snapshots: - debug - utf-8-validate + '@cosmjs/tendermint-rpc@0.30.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/json-rpc': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/socket': 0.30.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@cosmjs/stream': 0.30.1 + '@cosmjs/utils': 0.30.1 + axios: 0.21.4(debug@4.3.7) + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + optional: true + '@cosmjs/tendermint-rpc@0.32.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@cosmjs/crypto': 0.32.3 @@ -23079,7 +24195,7 @@ snapshots: transitivePeerDependencies: - debug - '@cprussin/eslint-config@3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(typescript@5.6.3)': + '@cprussin/eslint-config@3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))(typescript@5.5.4)': dependencies: '@babel/core': 7.25.8 '@babel/eslint-parser': 7.24.7(@babel/core@7.25.8)(eslint@9.13.0(jiti@1.21.0)) @@ -23091,22 +24207,22 @@ snapshots: eslint: 9.13.0(jiti@1.21.0) eslint-config-prettier: 9.1.0(eslint@9.13.0(jiti@1.21.0)) eslint-config-turbo: 2.2.3(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(typescript@5.6.3) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0)) + eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(typescript@5.5.4) eslint-plugin-jest-dom: 5.4.0(@testing-library/dom@10.4.0)(eslint@9.13.0(jiti@1.21.0)) eslint-plugin-jsonc: 2.16.0(eslint@9.13.0(jiti@1.21.0)) eslint-plugin-jsx-a11y: 6.8.0(eslint@9.13.0(jiti@1.21.0)) eslint-plugin-n: 17.9.0(eslint@9.13.0(jiti@1.21.0)) eslint-plugin-react: 7.34.2(eslint@9.13.0(jiti@1.21.0)) eslint-plugin-react-hooks: 4.6.2(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-storybook: 0.8.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) - eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))) - eslint-plugin-testing-library: 6.2.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + eslint-plugin-storybook: 0.8.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) + eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))) + eslint-plugin-testing-library: 6.2.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) eslint-plugin-tsdoc: 0.3.0 eslint-plugin-unicorn: 53.0.0(eslint@9.13.0(jiti@1.21.0)) globals: 15.6.0 - tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)) - typescript-eslint: 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) + typescript-eslint: 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) transitivePeerDependencies: - '@testing-library/dom' - '@typescript-eslint/eslint-plugin' @@ -23159,46 +24275,6 @@ snapshots: - ts-node - typescript - '@cprussin/eslint-config@3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))(typescript@5.5.4)': - dependencies: - '@babel/core': 7.25.8 - '@babel/eslint-parser': 7.24.7(@babel/core@7.25.8)(eslint@9.13.0(jiti@1.21.0)) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.8) - '@eslint/compat': 1.1.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.13.0 - '@next/eslint-plugin-next': 14.2.3 - eslint: 9.13.0(jiti@1.21.0) - eslint-config-prettier: 9.1.0(eslint@9.13.0(jiti@1.21.0)) - eslint-config-turbo: 2.2.3(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(typescript@5.5.4) - eslint-plugin-jest-dom: 5.4.0(@testing-library/dom@10.4.0)(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-jsonc: 2.16.0(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-jsx-a11y: 6.8.0(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-n: 17.9.0(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-react: 7.34.2(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-react-hooks: 4.6.2(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-storybook: 0.8.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) - eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))) - eslint-plugin-testing-library: 6.2.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) - eslint-plugin-tsdoc: 0.3.0 - eslint-plugin-unicorn: 53.0.0(eslint@9.13.0(jiti@1.21.0)) - globals: 15.6.0 - tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) - typescript-eslint: 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) - transitivePeerDependencies: - - '@testing-library/dom' - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - jiti - - supports-color - - ts-node - - typescript - '@cprussin/eslint-config@3.0.0(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(jiti@1.21.0)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4))(typescript@5.5.4)': dependencies: '@babel/core': 7.25.8 @@ -23281,13 +24357,13 @@ snapshots: '@cprussin/jest-config@1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/node@20.14.15)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))(utf-8-validate@5.0.10)': dependencies: - '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(prettier@3.3.3) + '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(prettier@3.5.3) '@testing-library/jest-dom': 6.5.0 jest: 29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) jest-environment-jsdom: 29.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) jest-runner-eslint: 2.2.0(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))) next: 14.2.15(@babel/core@7.25.8)(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(sass@1.80.7) - prettier: 3.3.3 + prettier: 3.5.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ts-jest: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(typescript@5.5.4) @@ -23315,13 +24391,13 @@ snapshots: '@cprussin/jest-config@1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/node@22.8.2)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(esbuild@0.22.0)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(utf-8-validate@6.0.4)': dependencies: - '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(prettier@3.3.3) + '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(prettier@3.5.3) '@testing-library/jest-dom': 6.5.0 jest: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)) jest-environment-jsdom: 29.7.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) jest-runner-eslint: 2.2.0(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))) next: 14.2.15(@babel/core@7.25.8)(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(sass@1.80.7) - prettier: 3.3.3 + prettier: 3.5.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ts-jest: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(esbuild@0.22.0)(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(typescript@5.5.4) @@ -23349,13 +24425,13 @@ snapshots: '@cprussin/jest-config@1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/node@22.8.2)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4))(utf-8-validate@5.0.10)': dependencies: - '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(prettier@3.3.3) + '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(prettier@3.5.3) '@testing-library/jest-dom': 6.5.0 jest: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)) jest-environment-jsdom: 29.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) jest-runner-eslint: 2.2.0(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4))) next: 14.2.15(@babel/core@7.25.8)(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(sass@1.80.7) - prettier: 3.3.3 + prettier: 3.5.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ts-jest: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(esbuild@0.22.0)(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(typescript@5.5.4) @@ -23383,13 +24459,13 @@ snapshots: '@cprussin/jest-config@1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/node@22.8.2)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(utf-8-validate@5.0.10)': dependencies: - '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(prettier@3.3.3) + '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(prettier@3.5.3) '@testing-library/jest-dom': 6.5.0 jest: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)) jest-environment-jsdom: 29.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) jest-runner-eslint: 2.2.0(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))) next: 14.2.15(@babel/core@7.25.8)(react-dom@18.3.1(react@19.0.0))(react@18.3.1)(sass@1.80.7) - prettier: 3.3.3 + prettier: 3.5.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ts-jest: 29.2.4(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(esbuild@0.22.0)(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(typescript@5.5.4) @@ -23415,29 +24491,29 @@ snapshots: - ts-node - utf-8-validate - '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(prettier@3.3.3)': + '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(prettier@3.5.3)': dependencies: create-lite-jest-runner: 1.1.0(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))) emphasize: 5.0.0 jest: 29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) jest-diff: 29.7.0 - prettier: 3.3.3 + prettier: 3.5.3 - '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(prettier@3.3.3)': + '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(prettier@3.5.3)': dependencies: create-lite-jest-runner: 1.1.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4))) emphasize: 5.0.0 jest: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)) jest-diff: 29.7.0 - prettier: 3.3.3 + prettier: 3.5.3 - '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(prettier@3.3.3)': + '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(prettier@3.5.3)': dependencies: create-lite-jest-runner: 1.1.0(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))) emphasize: 5.0.0 jest: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)) jest-diff: 29.7.0 - prettier: 3.3.3 + prettier: 3.5.3 '@cprussin/prettier-config@2.1.1(prettier@3.3.3)': dependencies: @@ -23460,6 +24536,28 @@ snapshots: - prettier-plugin-style-order - prettier-plugin-svelte + '@cprussin/prettier-config@2.2.1(prettier@3.3.3)': + dependencies: + prettier: 3.3.3 + prettier-plugin-tailwindcss: 0.6.11(prettier@3.3.3) + transitivePeerDependencies: + - '@ianvs/prettier-plugin-sort-imports' + - '@prettier/plugin-pug' + - '@shopify/prettier-plugin-liquid' + - '@trivago/prettier-plugin-sort-imports' + - '@zackad/prettier-plugin-twig' + - prettier-plugin-astro + - prettier-plugin-css-order + - prettier-plugin-import-sort + - prettier-plugin-jsdoc + - prettier-plugin-marko + - prettier-plugin-multiline-arrays + - prettier-plugin-organize-attributes + - prettier-plugin-organize-imports + - prettier-plugin-sort-imports + - prettier-plugin-style-order + - prettier-plugin-svelte + '@cprussin/tsconfig@3.0.1': {} '@cspotcode/source-map-support@0.8.1': @@ -23498,7 +24596,7 @@ snapshots: '@emnapi/core@1.3.1': dependencies: '@emnapi/wasi-threads': 1.0.1 - tslib: 2.8.0 + tslib: 2.8.1 '@emnapi/runtime@1.2.0': dependencies: @@ -23506,7 +24604,7 @@ snapshots: '@emnapi/wasi-threads@1.0.1': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@emotion/is-prop-valid@0.8.8': dependencies: @@ -23530,7 +24628,7 @@ snapshots: dependencies: bech32: 1.1.4 blakejs: 1.2.1 - bn.js: 4.12.0 + bn.js: 4.12.1 bs58: 4.0.1 crypto-addr-codec: 0.1.8 nano-base32: 1.0.1 @@ -23828,6 +24926,18 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/abstract-provider@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 @@ -23838,6 +24948,16 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/abstract-signer@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -23846,6 +24966,14 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/address@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 @@ -23854,10 +24982,22 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/base64@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/basex@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -23869,14 +25009,28 @@ snapshots: '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.1 + '@ethersproject/bytes@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + '@ethersproject/constants@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/contracts@5.7.0': dependencies: '@ethersproject/abi': 5.7.0 @@ -23902,6 +25056,18 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/hdnode@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -23938,12 +25104,23 @@ snapshots: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + '@ethersproject/logger@5.7.0': {} + '@ethersproject/logger@5.8.0': {} + '@ethersproject/networks@5.7.1': dependencies: '@ethersproject/logger': 5.7.0 + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -23953,6 +25130,10 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + '@ethersproject/providers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)': dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -24005,6 +25186,33 @@ snapshots: - bufferutil - utf-8-validate + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + optional: true + '@ethersproject/random@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -24015,6 +25223,11 @@ snapshots: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -24030,6 +25243,15 @@ snapshots: elliptic: 6.5.4 hash.js: 1.1.7 + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.1 + elliptic: 6.6.1 + hash.js: 1.1.7 + '@ethersproject/solidity@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 @@ -24045,6 +25267,12 @@ snapshots: '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/transactions@5.7.0': dependencies: '@ethersproject/address': 5.7.0 @@ -24057,6 +25285,18 @@ snapshots: '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/units@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 @@ -24089,6 +25329,14 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/wordlists@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -24142,26 +25390,26 @@ snapshots: '@formatjs/ecma402-abstract@2.0.0': dependencies: '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.8.0 + tslib: 2.8.1 '@formatjs/fast-memoize@2.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@formatjs/icu-messageformat-parser@2.7.8': dependencies: '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/icu-skeleton-parser': 1.8.2 - tslib: 2.8.0 + tslib: 2.8.1 '@formatjs/icu-skeleton-parser@1.8.2': dependencies: '@formatjs/ecma402-abstract': 2.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@formatjs/intl-localematcher@0.5.4': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@fractalwagmi/popup-connection@1.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -24559,7 +25807,7 @@ snapshots: '@graphql-tools/utils': 8.9.0(graphql@15.9.0) dataloader: 2.1.0 graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 value-or-promise: 1.0.11 optional: true @@ -24578,14 +25826,14 @@ snapshots: dependencies: '@graphql-tools/utils': 8.9.0(graphql@15.9.0) graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@graphql-tools/merge@8.4.2(graphql@15.9.0)': dependencies: '@graphql-tools/utils': 9.2.1(graphql@15.9.0) graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@graphql-tools/mock@8.7.20(graphql@15.9.0)': @@ -24594,7 +25842,7 @@ snapshots: '@graphql-tools/utils': 9.2.1(graphql@15.9.0) fast-json-stable-stringify: 2.1.0 graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@graphql-tools/schema@8.5.1(graphql@15.9.0)': @@ -24611,21 +25859,21 @@ snapshots: '@graphql-tools/merge': 8.4.2(graphql@15.9.0) '@graphql-tools/utils': 9.2.1(graphql@15.9.0) graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 value-or-promise: 1.0.12 optional: true '@graphql-tools/utils@8.9.0(graphql@15.9.0)': dependencies: graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@graphql-tools/utils@9.2.1(graphql@15.9.0)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) graphql: 15.9.0 - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@graphql-typed-document-node/core@3.2.0(graphql@15.9.0)': @@ -24642,6 +25890,11 @@ snapshots: '@grpc/proto-loader': 0.7.12 '@js-sdsl/ordered-map': 4.4.2 + '@grpc/grpc-js@1.13.0': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + '@grpc/proto-loader@0.7.12': dependencies: lodash.camelcase: 4.3.0 @@ -24649,6 +25902,13 @@ snapshots: protobufjs: 7.2.6 yargs: 17.7.2 + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.1 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -24966,6 +26226,54 @@ snapshots: - subscriptions-transport-ws - utf-8-validate + '@injectivelabs/sdk-ts@1.10.72(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@apollo/client': 3.7.13(graphql@16.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@cosmjs/amino': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@ethersproject/bytes': 5.7.0 + '@injectivelabs/core-proto-ts': 0.0.14 + '@injectivelabs/exceptions': 1.14.6(google-protobuf@3.21.4) + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.4) + '@injectivelabs/grpc-web-node-http-transport': 0.0.2(@injectivelabs/grpc-web@0.0.1(google-protobuf@3.21.4)) + '@injectivelabs/grpc-web-react-native-transport': 0.0.2(@injectivelabs/grpc-web@0.0.1(google-protobuf@3.21.4)) + '@injectivelabs/indexer-proto-ts': 1.10.8-rc.4 + '@injectivelabs/mito-proto-ts': 1.0.9 + '@injectivelabs/networks': 1.14.6(google-protobuf@3.21.4) + '@injectivelabs/test-utils': 1.14.4 + '@injectivelabs/token-metadata': 1.10.42(google-protobuf@3.21.4) + '@injectivelabs/ts-types': 1.14.6 + '@injectivelabs/utils': 1.14.6(google-protobuf@3.21.4) + '@metamask/eth-sig-util': 4.0.1 + axios: 0.27.2 + bech32: 2.0.0 + bip39: 3.0.4 + cosmjs-types: 0.7.2 + eth-crypto: 2.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + ethereumjs-util: 7.1.5 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + google-protobuf: 3.21.4 + graphql: 16.9.0 + http-status-codes: 2.2.0 + js-sha3: 0.8.0 + jscrypto: 1.0.3 + keccak256: 1.0.6 + link-module-alias: 1.2.0 + rxjs: 7.8.1 + secp256k1: 4.0.3 + shx: 0.3.4 + snakecase-keys: 5.4.5 + transitivePeerDependencies: + - bufferutil + - debug + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - utf-8-validate + optional: true + '@injectivelabs/sdk-ts@1.14.7(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)': dependencies: '@apollo/client': 3.7.13(graphql@16.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -25620,7 +26928,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.15 + '@types/node': 20.17.24 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -25668,6 +26976,12 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -25756,14 +27070,14 @@ snapshots: '@ledgerhq/errors': 6.19.1 '@ledgerhq/logs': 6.12.0 rxjs: 6.6.7 - semver: 7.6.3 + semver: 7.7.1 '@ledgerhq/devices@8.4.4': dependencies: '@ledgerhq/errors': 6.19.1 '@ledgerhq/logs': 6.12.0 rxjs: 7.8.1 - semver: 7.6.3 + semver: 7.7.1 '@ledgerhq/errors@6.19.1': {} @@ -25862,7 +27176,7 @@ snapshots: read-cmd-shim: 4.0.0 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.6.3 + semver: 7.7.1 set-blocking: 2.0.0 signal-exit: 3.0.7 slash: 3.0.0 @@ -25928,7 +27242,7 @@ snapshots: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.6.3 + semver: 7.7.1 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -25960,15 +27274,15 @@ snapshots: - encoding - supports-color - '@matterlabs/hardhat-zksync-deploy@1.5.0(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)))': + '@matterlabs/hardhat-zksync-deploy@1.6.0(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)))': dependencies: - '@matterlabs/hardhat-zksync-solc': 1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) + '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) chai: 4.5.0 chalk: 4.1.2 ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) - fs-extra: 11.2.0 + fs-extra: 11.3.0 glob: 10.4.5 - hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) + hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) lodash: 4.17.21 sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) @@ -25978,32 +27292,32 @@ snapshots: - encoding - supports-color - '@matterlabs/hardhat-zksync-deploy@1.5.0(encoding@0.1.13)(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)))': + '@matterlabs/hardhat-zksync-deploy@1.6.0(encoding@0.1.13)(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)))': dependencies: - '@matterlabs/hardhat-zksync-solc': 1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) + '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) chai: 4.5.0 chalk: 4.1.2 - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) - fs-extra: 11.2.0 + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + fs-extra: 11.3.0 glob: 10.4.5 - hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) + hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) lodash: 4.17.21 sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) ts-morph: 22.0.0 - zksync-ethers: 6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + zksync-ethers: 6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)) transitivePeerDependencies: - encoding - supports-color '@matterlabs/hardhat-zksync-ethers@1.1.0(bufferutil@4.0.7)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)))': dependencies: - '@matterlabs/hardhat-zksync-deploy': 1.5.0(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))) - '@matterlabs/hardhat-zksync-solc': 1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) + '@matterlabs/hardhat-zksync-deploy': 1.6.0(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))) + '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) chai: 4.5.0 chalk: 4.1.2 ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) - hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) + hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) zksync-ethers: 6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)) transitivePeerDependencies: - bufferutil @@ -26016,16 +27330,16 @@ snapshots: '@matterlabs/hardhat-zksync-node@1.1.1(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': dependencies: - '@matterlabs/hardhat-zksync-solc': 1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) - axios: 1.7.7(debug@4.3.7) + '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) + axios: 1.8.3 chai: 4.5.0 chalk: 4.1.2 - fs-extra: 11.2.0 + fs-extra: 11.3.0 hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) proxyquire: 2.1.3 sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) - undici: 6.20.1 + undici: 6.21.2 transitivePeerDependencies: - debug - encoding @@ -26049,45 +27363,63 @@ snapshots: fs-extra: 11.2.0 hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) proper-lockfile: 4.1.2 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - encoding - supports-color - '@matterlabs/hardhat-zksync-solc@1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': + '@matterlabs/hardhat-zksync-solc@1.2.6(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': dependencies: '@nomiclabs/hardhat-docker': 2.0.2(encoding@0.1.13) chai: 4.5.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) - dockerode: 4.0.2 - fs-extra: 11.2.0 + debug: 4.4.0(supports-color@8.1.1) + dockerode: 4.0.4 + fs-extra: 11.3.0 hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) proper-lockfile: 4.1.2 - semver: 7.6.3 + semver: 7.7.1 sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) - undici: 6.20.1 + undici: 6.21.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@matterlabs/hardhat-zksync-solc@1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': + dependencies: + '@nomiclabs/hardhat-docker': 2.0.2(encoding@0.1.13) + chai: 4.5.0 + chalk: 4.1.2 + debug: 4.4.0(supports-color@8.1.1) + dockerode: 4.0.4 + fs-extra: 11.3.0 + hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) + proper-lockfile: 4.1.2 + semver: 7.7.1 + sinon: 18.0.1 + sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) + undici: 6.21.2 transitivePeerDependencies: - encoding - supports-color '@matterlabs/hardhat-zksync-upgradable@1.5.2(bufferutil@4.0.7)(encoding@0.1.13)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)': dependencies: - '@matterlabs/hardhat-zksync-deploy': 1.5.0(encoding@0.1.13)(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.14.0(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))) - '@matterlabs/hardhat-zksync-solc': 1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) + '@matterlabs/hardhat-zksync-deploy': 1.6.0(encoding@0.1.13)(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))(zksync-ethers@6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3))) + '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) '@openzeppelin/contracts-hardhat-zksync-upgradable': '@openzeppelin/contracts@4.9.6' - '@openzeppelin/upgrades-core': 1.40.0 + '@openzeppelin/upgrades-core': 1.42.1 chalk: 4.1.2 compare-versions: 6.1.1 ethereumjs-util: 7.1.5 - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) - fs-extra: 11.2.0 - hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + fs-extra: 11.3.0 + hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) proper-lockfile: 4.1.2 - semver: 7.6.3 + semver: 7.7.1 solidity-ast: 0.4.59 - zksync-ethers: 6.14.0(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + zksync-ethers: 6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)) transitivePeerDependencies: - bufferutil - c-kzg @@ -26099,17 +27431,17 @@ snapshots: '@matterlabs/hardhat-zksync-verify@1.6.0(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)))(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.7.0 - '@matterlabs/hardhat-zksync-solc': 1.2.5(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) + '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) - axios: 1.7.7(debug@4.3.7) + axios: 1.8.3(debug@4.4.0) cbor: 9.0.2 chai: 4.5.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) hardhat: 2.22.13(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) - semver: 7.6.3 + semver: 7.7.1 sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) transitivePeerDependencies: @@ -26299,8 +27631,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.3.7(supports-color@8.1.1) - semver: 7.6.3 + debug: 4.4.0(supports-color@8.1.1) + semver: 7.7.1 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -26312,9 +27644,9 @@ snapshots: '@noble/hashes': 1.7.1 '@scure/base': 1.2.4 '@types/debug': 4.1.12 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) pony-cause: 2.1.11 - semver: 7.6.3 + semver: 7.7.1 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -26351,12 +27683,12 @@ snapshots: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 hey-listen: 1.0.8 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/easing@10.18.0': dependencies: '@motionone/utils': 10.18.0 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/generators@10.18.0': dependencies: @@ -26367,7 +27699,7 @@ snapshots: '@motionone/svelte@10.16.4': dependencies: '@motionone/dom': 10.18.0 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/types@10.17.1': {} @@ -26380,7 +27712,7 @@ snapshots: '@motionone/vue@10.16.4': dependencies: '@motionone/dom': 10.18.0 - tslib: 2.8.0 + tslib: 2.8.1 '@multiformats/murmur3@1.1.3': dependencies: @@ -26427,6 +27759,22 @@ snapshots: - bufferutil - utf-8-validate + '@mysten/sui.js@0.32.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@mysten/bcs': 0.7.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + '@suchipi/femver': 1.0.0 + jayson: 4.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + rpc-websockets: 7.5.1 + superstruct: 1.0.4 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@mysten/sui@1.3.0(svelte@4.2.18)(typescript@5.5.4)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) @@ -26693,18 +28041,32 @@ snapshots: '@nomicfoundation/edr-darwin-arm64@0.6.4': {} + '@nomicfoundation/edr-darwin-arm64@0.8.0': {} + '@nomicfoundation/edr-darwin-x64@0.6.4': {} + '@nomicfoundation/edr-darwin-x64@0.8.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.6.4': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': {} + '@nomicfoundation/edr-linux-arm64-musl@0.6.4': {} + '@nomicfoundation/edr-linux-arm64-musl@0.8.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.6.4': {} + '@nomicfoundation/edr-linux-x64-gnu@0.8.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.6.4': {} + '@nomicfoundation/edr-linux-x64-musl@0.8.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.6.4': {} + '@nomicfoundation/edr-win32-x64-msvc@0.8.0': {} + '@nomicfoundation/edr@0.6.4': dependencies: '@nomicfoundation/edr-darwin-arm64': 0.6.4 @@ -26715,6 +28077,16 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.6.4 '@nomicfoundation/edr-win32-x64-msvc': 0.6.4 + '@nomicfoundation/edr@0.8.0': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.8.0 + '@nomicfoundation/edr-darwin-x64': 0.8.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.8.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.8.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.8.0 + '@nomicfoundation/edr-linux-x64-musl': 0.8.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.8.0 + '@nomicfoundation/ethereumjs-common@4.0.4': dependencies: '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -26789,6 +28161,10 @@ snapshots: '@nomicfoundation/slang-win32-ia32-msvc': 0.17.0 '@nomicfoundation/slang-win32-x64-msvc': 0.17.0 + '@nomicfoundation/slang@0.18.3': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.0 + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true @@ -26893,7 +28269,7 @@ snapshots: promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.2 read-package-json-fast: 3.0.2 - semver: 7.6.3 + semver: 7.7.1 ssri: 10.0.6 treeverse: 3.0.0 walk-up-path: 3.0.1 @@ -26903,7 +28279,7 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.6.3 + semver: 7.7.1 '@npmcli/git@5.0.8': dependencies: @@ -26914,7 +28290,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.6.3 + semver: 7.7.1 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -26937,7 +28313,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - bluebird - supports-color @@ -26954,7 +28330,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - bluebird @@ -27003,7 +28379,7 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.3 nx: 19.8.7 - semver: 7.6.3 + semver: 7.7.1 tmp: 0.2.3 tslib: 2.8.0 yargs-parser: 21.1.1 @@ -27220,6 +28596,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@openzeppelin/upgrades-core@1.42.1': + dependencies: + '@nomicfoundation/slang': 0.18.3 + cbor: 10.0.3 + chalk: 4.1.2 + compare-versions: 6.1.1 + debug: 4.4.0(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + minimatch: 9.0.5 + minimist: 1.2.8 + proper-lockfile: 4.1.2 + solidity-ast: 0.4.59 + transitivePeerDependencies: + - supports-color + '@orbs-network/ton-access@2.3.3(encoding@0.1.13)': dependencies: isomorphic-fetch: 3.0.0(encoding@0.1.13) @@ -27307,6 +28698,12 @@ snapshots: crypto-js: 4.2.0 uuidv4: 6.2.13 + '@particle-network/solana-wallet@1.3.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)': + dependencies: + '@particle-network/auth': 1.3.1 + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + bs58: 5.0.0 + '@particle-network/solana-wallet@1.3.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)': dependencies: '@particle-network/auth': 1.3.1 @@ -27387,6 +28784,28 @@ snapshots: - encoding - utf-8-validate + '@project-serum/anchor@0.25.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)': + dependencies: + '@project-serum/borsh': 0.2.5(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + base64-js: 1.5.1 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 5.3.1 + cross-fetch: 3.1.8(encoding@0.1.13) + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + js-sha256: 0.9.0 + pako: 2.1.0 + snake-case: 3.0.4 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@project-serum/borsh@0.2.5(@solana/web3.js@1.92.3(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3))': dependencies: '@solana/web3.js': 1.92.3(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) @@ -27399,6 +28818,12 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 + '@project-serum/borsh@0.2.5(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))': + dependencies: + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + '@project-serum/sol-wallet-adapter@0.2.6(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -27461,23 +28886,23 @@ snapshots: - encoding - utf-8-validate - '@pythnetwork/hermes-client@1.3.1(axios@1.7.7)': + '@pythnetwork/hermes-client@1.3.1(axios@1.8.3)': dependencies: - '@zodios/core': 10.9.6(axios@1.7.7)(zod@3.23.8) + '@zodios/core': 10.9.6(axios@1.8.3)(zod@3.23.8) eventsource: 2.0.2 zod: 3.23.8 transitivePeerDependencies: - axios - '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)': dependencies: '@pythnetwork/price-service-sdk': 1.7.1 '@types/ws': 8.5.13 axios: 1.7.7(debug@4.3.7) axios-retry: 3.9.1 - isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) ts-log: 2.2.7 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - bufferutil - debug @@ -28828,7 +30253,7 @@ snapshots: '@react-native-community/cli-tools': 13.6.8(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 transitivePeerDependencies: - encoding @@ -28838,7 +30263,7 @@ snapshots: chalk: 4.1.2 cosmiconfig: 5.2.1 deepmerge: 4.3.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 joi: 17.13.3 transitivePeerDependencies: - encoding @@ -28864,10 +30289,10 @@ snapshots: hermes-profile-transformer: 0.0.6 node-stream-zip: 1.15.0 ora: 5.4.1 - semver: 7.6.3 + semver: 7.7.1 strip-ansi: 5.2.0 wcwidth: 1.0.1 - yaml: 2.6.0 + yaml: 2.7.0 transitivePeerDependencies: - encoding @@ -28885,8 +30310,8 @@ snapshots: '@react-native-community/cli-tools': 13.6.8(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.5.0 + fast-glob: 3.3.3 + fast-xml-parser: 4.5.3 logkitty: 0.7.1 transitivePeerDependencies: - encoding @@ -28896,8 +30321,8 @@ snapshots: '@react-native-community/cli-tools': 13.6.8(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.5.0 + fast-glob: 3.3.3 + fast-xml-parser: 4.5.3 ora: 5.4.1 transitivePeerDependencies: - encoding @@ -28912,7 +30337,7 @@ snapshots: dependencies: '@react-native-community/cli-debugger-ui': 13.6.8 '@react-native-community/cli-tools': 13.6.8(encoding@0.1.13) - compression: 1.7.4 + compression: 1.8.0 connect: 3.7.0 errorhandler: 1.5.1 nocache: 3.0.4 @@ -28935,8 +30360,8 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) open: 6.4.0 ora: 5.4.1 - semver: 7.6.3 - shell-quote: 1.8.1 + semver: 7.7.1 + shell-quote: 1.8.2 sudo-prompt: 9.2.1 transitivePeerDependencies: - encoding @@ -28963,7 +30388,7 @@ snapshots: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - bufferutil - encoding @@ -28984,7 +30409,7 @@ snapshots: '@babel/core': 7.25.8 '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.25.8) '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.8) - '@babel/plugin-proposal-export-default-from': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.25.8) '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.25.8) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.8) '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.25.8) @@ -28992,35 +30417,35 @@ snapshots: '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.25.8) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.8) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-export-default-from': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-syntax-flow': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.25.8) '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.8) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-transform-arrow-functions': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-async-to-generator': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-block-scoping': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-classes': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-computed-properties': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-destructuring': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-flow-strip-types': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-function-name': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-literals': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-modules-commonjs': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-parameters': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-private-methods': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-private-property-in-object': 7.25.8(@babel/core@7.25.8) - '@babel/plugin-transform-react-display-name': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-react-jsx-self': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-react-jsx-source': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-runtime': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-shorthand-properties': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-spread': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-sticky-regex': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-unicode-regex': 7.25.7(@babel/core@7.25.8) - '@babel/template': 7.25.7 + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.25.8) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.25.8) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.25.8) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.25.8) + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.25.8) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.25.8) + '@babel/template': 7.26.9 '@react-native/babel-plugin-codegen': 0.74.84(@babel/preset-env@7.24.7(@babel/core@7.25.8)) babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.25.8) react-refresh: 0.14.2 @@ -29030,7 +30455,7 @@ snapshots: '@react-native/codegen@0.74.84(@babel/preset-env@7.24.7(@babel/core@7.25.8))': dependencies: - '@babel/parser': 7.25.8 + '@babel/parser': 7.26.10 '@babel/preset-env': 7.24.7(@babel/core@7.25.8) glob: 7.2.3 hermes-parser: 0.19.1 @@ -29543,7 +30968,7 @@ snapshots: '@rnx-kit/chromium-edge-launcher@1.0.0': dependencies: - '@types/node': 18.19.57 + '@types/node': 18.19.80 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -29808,7 +31233,7 @@ snapshots: '@smithy/types@3.3.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@socket.io/component-emitter@3.1.1': {} @@ -29908,6 +31333,17 @@ snapshots: - encoding - utf-8-validate + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + bigint-buffer: 1.1.5 + bignumber.js: 9.1.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 @@ -30007,6 +31443,17 @@ snapshots: - encoding - utf-8-validate + '@solana/spl-token@0.3.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@solana/spl-token@0.4.6(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -30040,6 +31487,15 @@ snapshots: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-base-ui@0.1.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': + dependencies: + '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + react: 19.0.0 + transitivePeerDependencies: + - bs58 + - react-native + '@solana/wallet-adapter-base-ui@0.1.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': dependencies: '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) @@ -30196,6 +31652,14 @@ snapshots: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-particle@0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)': + dependencies: + '@particle-network/solana-wallet': 1.3.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bs58 + '@solana/wallet-adapter-particle@0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)': dependencies: '@particle-network/solana-wallet': 1.3.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0) @@ -30209,6 +31673,18 @@ snapshots: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-react-ui@0.9.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@19.0.0(react@19.0.0))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': + dependencies: + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-base-ui': 0.1.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + transitivePeerDependencies: + - bs58 + - react-native + '@solana/wallet-adapter-react-ui@0.9.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-dom@19.0.0(react@19.0.0))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30232,18 +31708,18 @@ snapshots: - bs58 - react-native - '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': + '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': dependencies: '@solana-mobile/wallet-adapter-mobile': 2.1.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-react': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.0.0) '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) react: 19.0.0 transitivePeerDependencies: - bs58 - react-native - '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': + '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': dependencies: '@solana-mobile/wallet-adapter-mobile': 2.1.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30254,6 +31730,17 @@ snapshots: - bs58 - react-native + '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': + dependencies: + '@solana-mobile/wallet-adapter-mobile': 2.1.2(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-react': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.0.0) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + react: 19.0.0 + transitivePeerDependencies: + - bs58 + - react-native + '@solana/wallet-adapter-safepal@0.5.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30343,6 +31830,23 @@ snapshots: - supports-color - utf-8-validate + '@solana/wallet-adapter-torus@0.11.28(@babel/runtime@7.26.10)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@toruslabs/solana-embed': 0.3.4(@babel/runtime@7.26.10)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + assert: 2.1.0 + crypto-browserify: 3.12.0 + process: 0.11.10 + stream-browserify: 3.0.0 + transitivePeerDependencies: + - '@babel/runtime' + - '@sentry/types' + - bufferutil + - encoding + - supports-color + - utf-8-validate + '@solana/wallet-adapter-trust@0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30380,7 +31884,7 @@ snapshots: - uWebSockets.js - utf-8-validate - '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.25.7)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10)': + '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.25.7)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10)': dependencies: '@solana/wallet-adapter-alpha': 0.1.10(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30408,7 +31912,7 @@ snapshots: '@solana/wallet-adapter-nightly': 0.1.16(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-nufi': 0.1.17(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-onto': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0) '@solana/wallet-adapter-phantom': 0.9.24(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-safepal': 0.5.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-saifu': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30454,6 +31958,80 @@ snapshots: - uWebSockets.js - utf-8-validate + '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10)': + dependencies: + '@solana/wallet-adapter-alpha': 0.1.10(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-avana': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-backpack': 0.1.14(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-bitkeep': 0.3.20(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-bitpie': 0.5.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-blocto': 0.5.22(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-brave': 0.1.17(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-censo': 0.1.4(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-clover': 0.4.19(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coin98': 0.5.20(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coinbase': 0.1.19(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coinhub': 0.3.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-exodus': 0.1.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-fractal': 0.1.8(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@solana/wallet-adapter-glow': 0.1.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-huobi': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-hyperpay': 0.1.14(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-keystone': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-krystal': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-ledger': 0.9.25(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-magiceden': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-mathwallet': 0.9.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-neko': 0.2.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-nightly': 0.1.16(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-nufi': 0.1.17(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-onto': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/wallet-adapter-phantom': 0.9.24(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-safepal': 0.5.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-saifu': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-salmon': 0.1.14(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-sky': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-slope': 0.5.21(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-solflare': 0.6.28(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-sollet': 0.11.17(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-solong': 0.9.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-spot': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-strike': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-tokenary': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-tokenpocket': 0.4.19(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-torus': 0.11.28(@babel/runtime@7.26.10)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-trust': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-unsafe-burner': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-walletconnect': 0.1.16(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-xdefi': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/runtime' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@sentry/types' + - '@upstash/redis' + - '@vercel/kv' + - bs58 + - bufferutil + - debug + - encoding + - ioredis + - react + - react-dom + - supports-color + - uWebSockets.js + - utf-8-validate + '@solana/wallet-adapter-xdefi@0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -30614,6 +32192,28 @@ snapshots: - encoding - utf-8-validate + '@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)': + dependencies: + '@babel/runtime': 7.25.7 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + node-fetch: 2.7.0(encoding@0.1.13) + rpc-websockets: 8.0.1 + superstruct: 1.0.4 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@solana/web3.js@1.92.3(encoding@0.1.13)': dependencies: '@babel/runtime': 7.25.7 @@ -30627,7 +32227,7 @@ snapshots: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + jayson: 4.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) node-fetch: 2.7.0(encoding@0.1.13) rpc-websockets: 8.0.1 superstruct: 1.0.4 @@ -30674,7 +32274,7 @@ snapshots: eventemitter3: 5.0.1 uuid: 9.0.1 - '@solidity-parser/parser@0.17.0': {} + '@solidity-parser/parser@0.19.0': {} '@sqds/mesh@1.0.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: @@ -30766,7 +32366,7 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - '@starknet-io/types-js@0.7.7': {} + '@starknet-io/types-js@0.7.10': {} '@storybook/addon-actions@8.3.5(storybook@8.3.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: @@ -30924,7 +32524,7 @@ snapshots: magic-string: 0.30.12 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.6.3 + semver: 7.7.1 storybook: 8.3.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) style-loader: 3.3.4(webpack@5.91.0(esbuild@0.22.0)) terser-webpack-plugin: 5.3.10(esbuild@0.22.0)(webpack@5.91.0(esbuild@0.22.0)) @@ -30968,7 +32568,7 @@ snapshots: jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.9 - semver: 7.6.3 + semver: 7.7.1 util: 0.12.5 ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: @@ -31100,7 +32700,7 @@ snapshots: react-docgen: 7.0.3 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 - semver: 7.6.3 + semver: 7.7.1 storybook: 8.3.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) tsconfig-paths: 4.2.0 webpack: 5.91.0(esbuild@0.22.0) @@ -31719,6 +33319,26 @@ snapshots: - supports-color - utf-8-validate + '@toruslabs/base-controllers@2.9.0(@babel/runtime@7.26.10)(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.10 + '@ethereumjs/util': 8.1.0 + '@toruslabs/broadcast-channel': 6.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@toruslabs/http-helpers': 3.4.0(@babel/runtime@7.26.10) + '@toruslabs/openlogin-jrpc': 4.7.2(@babel/runtime@7.26.10) + async-mutex: 0.4.1 + bignumber.js: 9.1.2 + bowser: 2.11.0 + eth-rpc-errors: 4.0.3 + json-rpc-random-id: 1.0.1 + lodash: 4.17.21 + loglevel: 1.9.1 + transitivePeerDependencies: + - '@sentry/types' + - bufferutil + - supports-color + - utf-8-validate + '@toruslabs/broadcast-channel@6.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.25.7 @@ -31745,6 +33365,12 @@ snapshots: lodash.merge: 4.6.2 loglevel: 1.9.1 + '@toruslabs/http-helpers@3.4.0(@babel/runtime@7.26.10)': + dependencies: + '@babel/runtime': 7.26.10 + lodash.merge: 4.6.2 + loglevel: 1.9.1 + '@toruslabs/metadata-helpers@3.2.0(@babel/runtime@7.25.7)': dependencies: '@babel/runtime': 7.25.7 @@ -31768,6 +33394,18 @@ snapshots: pump: 3.0.0 readable-stream: 3.6.2 + '@toruslabs/openlogin-jrpc@3.2.0(@babel/runtime@7.26.10)': + dependencies: + '@babel/runtime': 7.26.10 + '@toruslabs/openlogin-utils': 3.0.0(@babel/runtime@7.26.10) + end-of-stream: 1.4.4 + eth-rpc-errors: 4.0.3 + events: 3.3.0 + fast-safe-stringify: 2.1.1 + once: 1.4.0 + pump: 3.0.0 + readable-stream: 3.6.2 + '@toruslabs/openlogin-jrpc@4.7.2(@babel/runtime@7.25.7)': dependencies: '@babel/runtime': 7.25.7 @@ -31782,6 +33420,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@toruslabs/openlogin-jrpc@4.7.2(@babel/runtime@7.26.10)': + dependencies: + '@babel/runtime': 7.26.10 + '@metamask/rpc-errors': 5.1.1 + '@toruslabs/openlogin-utils': 4.7.0(@babel/runtime@7.26.10) + end-of-stream: 1.4.4 + events: 3.3.0 + fast-safe-stringify: 2.1.1 + once: 1.4.0 + pump: 3.0.0 + readable-stream: 4.5.2 + transitivePeerDependencies: + - supports-color + '@toruslabs/openlogin-utils@3.0.0(@babel/runtime@7.25.7)': dependencies: '@babel/runtime': 7.25.7 @@ -31789,11 +33441,23 @@ snapshots: keccak: 3.0.4 randombytes: 2.1.0 + '@toruslabs/openlogin-utils@3.0.0(@babel/runtime@7.26.10)': + dependencies: + '@babel/runtime': 7.26.10 + base64url: 3.0.1 + keccak: 3.0.4 + randombytes: 2.1.0 + '@toruslabs/openlogin-utils@4.7.0(@babel/runtime@7.25.7)': dependencies: '@babel/runtime': 7.25.7 base64url: 3.0.1 + '@toruslabs/openlogin-utils@4.7.0(@babel/runtime@7.26.10)': + dependencies: + '@babel/runtime': 7.26.10 + base64url: 3.0.1 + '@toruslabs/solana-embed@0.3.4(@babel/runtime@7.25.7)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.25.7 @@ -31814,6 +33478,26 @@ snapshots: - supports-color - utf-8-validate + '@toruslabs/solana-embed@0.3.4(@babel/runtime@7.26.10)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.10 + '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@toruslabs/base-controllers': 2.9.0(@babel/runtime@7.26.10)(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@toruslabs/http-helpers': 3.4.0(@babel/runtime@7.26.10) + '@toruslabs/openlogin-jrpc': 3.2.0(@babel/runtime@7.26.10) + eth-rpc-errors: 4.0.3 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + lodash-es: 4.17.21 + loglevel: 1.9.1 + pump: 3.0.0 + transitivePeerDependencies: + - '@sentry/types' + - bufferutil + - encoding + - supports-color + - utf-8-validate + '@truffle/abi-utils@1.0.3': dependencies: change-case: 3.0.2 @@ -31835,7 +33519,7 @@ snapshots: cbor: 5.2.0 debug: 4.3.7(supports-color@8.1.1) lodash: 4.17.21 - semver: 7.6.3 + semver: 7.7.1 utf8: 3.0.0 web3-utils: 1.10.0 transitivePeerDependencies: @@ -31862,7 +33546,7 @@ snapshots: node-abort-controller: 3.1.1 original-require: 1.0.1 require-from-string: 2.0.2 - semver: 7.6.3 + semver: 7.7.1 solc: 0.8.21(debug@4.3.7) transitivePeerDependencies: - bufferutil @@ -31926,8 +33610,8 @@ snapshots: dependencies: '@truffle/dashboard-message-bus-common': 0.1.7 '@truffle/promise-tracker': 0.1.7 - axios: 1.5.0(debug@4.3.7) - debug: 4.3.7(supports-color@8.1.1) + axios: 1.5.0(debug@4.4.0) + debug: 4.4.0(supports-color@8.1.1) delay: 5.0.0 isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3)) node-abort-controller: 3.1.1 @@ -32002,7 +33686,7 @@ snapshots: redux: 3.7.2 redux-saga: 1.0.0 reselect-tree: 1.3.7 - semver: 7.6.3 + semver: 7.7.1 web3: 1.10.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) web3-eth-abi: 1.10.0 transitivePeerDependencies: @@ -32200,7 +33884,7 @@ snapshots: '@ts-morph/common@0.23.0': dependencies: - fast-glob: 3.3.2 + fast-glob: 3.3.3 minimatch: 9.0.5 mkdirp: 3.0.1 path-browserify: 1.0.1 @@ -32222,7 +33906,7 @@ snapshots: '@tybys/wasm-util@0.9.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@types/accepts@1.3.7': dependencies: @@ -32472,7 +34156,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 20.14.15 + '@types/node': 20.17.24 '@types/node@10.12.18': {} @@ -32491,10 +34175,18 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@18.19.80': + dependencies: + undici-types: 5.26.5 + '@types/node@20.14.15': dependencies: undici-types: 5.26.5 + '@types/node@20.17.24': + dependencies: + undici-types: 6.19.8 + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -33090,7 +34782,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 @@ -33104,7 +34796,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -33118,7 +34810,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -33132,7 +34824,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -33147,7 +34839,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -33162,7 +34854,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -33177,7 +34869,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -33192,7 +34884,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -33207,7 +34899,7 @@ snapshots: fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -33222,7 +34914,7 @@ snapshots: fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -33240,7 +34932,7 @@ snapshots: eslint: 8.56.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.56.0) - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -33255,7 +34947,7 @@ snapshots: eslint: 8.56.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.56.0) - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -33270,7 +34962,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) eslint: 9.13.0(jiti@1.21.0) eslint-scope: 5.1.1 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -33285,7 +34977,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) eslint: 9.13.0(jiti@1.21.0) eslint-scope: 5.1.1 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -33299,7 +34991,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) eslint: 8.56.0 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -33313,7 +35005,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) eslint: 8.56.0 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -34372,6 +36064,11 @@ snapshots: axios: 1.7.7(debug@4.3.7) zod: 3.23.8 + '@zodios/core@10.9.6(axios@1.8.3)(zod@3.23.8)': + dependencies: + axios: 1.8.3 + zod: 3.23.8 + JSONStream@1.3.2: dependencies: jsonparse: 1.3.1 @@ -34395,11 +36092,11 @@ snapshots: ajv: 6.12.6 better-ajv-errors: 0.8.2(ajv@6.12.6) neodoc: 2.0.2 - semver: 7.6.3 + semver: 7.7.1 source-map-support: 0.5.21 optionalDependencies: prettier: 2.8.8 - prettier-plugin-solidity: 1.3.1(prettier@2.8.8) + prettier-plugin-solidity: 1.4.2(prettier@2.8.8) transitivePeerDependencies: - supports-color @@ -34528,6 +36225,8 @@ snapshots: acorn@8.13.0: {} + acorn@8.14.1: {} + add-stream@1.0.0: {} address@1.2.2: {} @@ -34547,13 +36246,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -34959,7 +36658,7 @@ snapshots: asn1.js@5.4.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 @@ -34986,7 +36685,7 @@ snapshots: ast-types@0.15.2: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 ast-types@0.16.1: dependencies: @@ -35010,11 +36709,11 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 async-mutex@0.4.1: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 async-retry@1.3.3: dependencies: @@ -35109,6 +36808,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.5.0(debug@4.4.0): + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axios@1.6.0: dependencies: follow-redirects: 1.15.9(debug@4.3.7) @@ -35125,6 +36832,22 @@ snapshots: transitivePeerDependencies: - debug + axios@1.8.3: + dependencies: + follow-redirects: 1.15.9(debug@4.3.7) + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axios@1.8.3(debug@4.4.0): + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@3.2.1: dependencies: dequal: 2.0.3 @@ -35181,6 +36904,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.25.8): + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.25.8 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.8) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.8): dependencies: '@babel/core': 7.25.8 @@ -35189,6 +36921,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.25.8): + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.8) + core-js-compat: 3.41.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.8): dependencies: '@babel/core': 7.25.8 @@ -35196,6 +36936,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.25.8): + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.8) + transitivePeerDependencies: + - supports-color + babel-plugin-styled-components@2.1.4(@babel/core@7.25.8)(styled-components@5.3.11(@babel/core@7.25.8)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0))(supports-color@5.5.0): dependencies: '@babel/helper-annotate-as-pure': 7.25.7 @@ -35210,7 +36957,7 @@ snapshots: babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.25.8): dependencies: - '@babel/plugin-syntax-flow': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.25.8) transitivePeerDependencies: - '@babel/core' @@ -35380,6 +37127,8 @@ snapshots: bn.js@4.12.0: {} + bn.js@4.12.1: {} + bn.js@5.2.0: {} bn.js@5.2.1: {} @@ -35506,6 +37255,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001704 + electron-to-chromium: 1.5.118 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 @@ -35610,8 +37366,6 @@ snapshots: byte-size@8.1.1: {} - bytes@3.0.0: {} - bytes@3.1.0: {} bytes@3.1.2: {} @@ -35647,6 +37401,11 @@ snapshots: normalize-url: 6.1.0 responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -35699,6 +37458,8 @@ snapshots: caniuse-lite@1.0.30001669: {} + caniuse-lite@1.0.30001704: {} + capability@0.2.5: {} capital-case@1.0.4: @@ -35720,6 +37481,10 @@ snapshots: cbor-sync@1.0.4: {} + cbor@10.0.3: + dependencies: + nofilter: 3.1.0 + cbor@5.2.0: dependencies: bignumber.js: 9.1.2 @@ -35922,13 +37687,17 @@ snapshots: dependencies: readdirp: 4.0.2 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} chownr@2.0.0: {} chrome-launcher@0.15.2: dependencies: - '@types/node': 20.14.15 + '@types/node': 20.17.24 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -36086,7 +37855,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 - acorn: 8.13.0 + acorn: 8.14.1 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -36186,14 +37955,14 @@ snapshots: dependencies: mime-db: 1.53.0 - compression@1.7.4: + compression@1.8.0: dependencies: - accepts: 1.3.8 - bytes: 3.0.0 + bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 + negotiator: 0.6.4 on-headers: 1.0.2 - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -36227,7 +37996,7 @@ snapshots: json-schema-typed: 7.0.3 onetime: 5.1.2 pkg-up: 3.1.0 - semver: 7.6.3 + semver: 7.7.1 confbox@0.1.7: {} @@ -36319,7 +38088,7 @@ snapshots: handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.6.3 + semver: 7.7.1 split: 1.0.1 conventional-commits-filter@3.0.0: @@ -36380,6 +38149,10 @@ snapshots: dependencies: browserslist: 4.24.0 + core-js-compat@3.41.0: + dependencies: + browserslist: 4.24.4 + core-js-pure@3.38.1: {} core-js@3.38.0: {} @@ -36464,7 +38237,7 @@ snapshots: create-ecdh@4.0.4: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 elliptic: 6.5.6 create-hash@1.2.0: @@ -36712,7 +38485,7 @@ snapshots: postcss-modules-scope: 3.2.0(postcss@8.4.47) postcss-modules-values: 4.0.0(postcss@8.4.47) postcss-value-parser: 4.2.0 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: webpack: 5.91.0(esbuild@0.22.0) @@ -36940,6 +38713,12 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.4.0(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -37087,7 +38866,7 @@ snapshots: diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -37121,9 +38900,9 @@ snapshots: transitivePeerDependencies: - supports-color - docker-modem@5.0.3: + docker-modem@5.0.6: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) readable-stream: 3.6.2 split-ca: 1.0.1 ssh2: 1.16.0 @@ -37146,11 +38925,15 @@ snapshots: transitivePeerDependencies: - supports-color - dockerode@4.0.2: + dockerode@4.0.4: dependencies: '@balena/dockerignore': 1.0.2 - docker-modem: 5.0.3 + '@grpc/grpc-js': 1.13.0 + '@grpc/proto-loader': 0.7.13 + docker-modem: 5.0.6 + protobufjs: 7.4.0 tar-fs: 2.0.1 + uuid: 10.0.0 transitivePeerDependencies: - supports-color @@ -37259,6 +39042,12 @@ snapshots: create-hmac: 1.1.7 optional: true + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer@0.1.2: {} duplexify@4.1.3: @@ -37316,6 +39105,8 @@ snapshots: dependencies: jake: 10.8.5 + electron-to-chromium@1.5.118: {} + electron-to-chromium@1.5.41: {} elliptic@6.5.4: @@ -37338,6 +39129,16 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + elliptic@6.6.1: + dependencies: + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emittery@0.10.0: {} emittery@0.13.1: {} @@ -37521,6 +39322,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-iterator-helpers@1.0.19: @@ -37548,12 +39351,23 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 @@ -37753,7 +39567,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@1.21.0)): dependencies: eslint: 9.13.0(jiti@1.21.0) - semver: 7.6.3 + semver: 7.7.1 eslint-config-next@14.2.3(eslint@8.56.0)(typescript@5.5.4): dependencies: @@ -37822,11 +39636,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@1.21.0)): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@1.21.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/parser': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) eslint: 9.13.0(jiti@1.21.0) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -37859,7 +39673,7 @@ snapshots: eslint: 9.13.0(jiti@1.21.0) eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0)): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -37869,7 +39683,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.13.0(jiti@1.21.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@1.21.0)) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@1.21.0)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -37880,7 +39694,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/parser': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -37975,13 +39789,13 @@ snapshots: optionalDependencies: '@testing-library/dom': 10.4.0 - eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(typescript@5.6.3): + eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(typescript@5.5.4): dependencies: - '@typescript-eslint/utils': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/utils': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) eslint: 9.13.0(jiti@1.21.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) - jest: 29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)) + '@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) + jest: 29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) transitivePeerDependencies: - supports-color - typescript @@ -37997,17 +39811,6 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)))(typescript@5.5.4): - dependencies: - '@typescript-eslint/utils': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) - eslint: 9.13.0(jiti@1.21.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) - jest: 29.7.0(@types/node@20.14.15)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.14.0(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.13.0(jiti@1.21.0))(jest@29.7.0(@types/node@22.8.2)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.5.4)))(typescript@5.5.4): dependencies: '@typescript-eslint/utils': 7.13.1(eslint@9.13.0(jiti@1.21.0))(typescript@5.5.4) @@ -38091,7 +39894,7 @@ snapshots: globals: 15.6.0 ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.7.1 eslint-plugin-react-hooks@4.6.2(eslint@8.56.0): dependencies: @@ -38234,7 +40037,7 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.6.3 + semver: 7.7.1 strip-indent: 3.0.0 transitivePeerDependencies: - supports-color @@ -38444,6 +40247,20 @@ snapshots: - bufferutil - utf-8-validate + eth-crypto@2.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): + dependencies: + '@babel/runtime': 7.20.13 + '@ethereumjs/tx': 3.5.2 + '@types/bn.js': 5.1.1 + eccrypto: 1.1.6(patch_hash=rjcfmtfgn3z72mudpdif5oxmye) + ethereumjs-util: 7.1.5 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + secp256k1: 5.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + optional: true + eth-ens-namehash@2.0.8: dependencies: idna-uts46-hx: 2.3.1 @@ -38495,7 +40312,7 @@ snapshots: eth-lib@0.1.29(bufferutil@4.0.7)(utf-8-validate@6.0.3): dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 elliptic: 6.5.6 nano-json-stream-parser: 0.1.2 servify: 0.1.12 @@ -38508,7 +40325,7 @@ snapshots: eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 elliptic: 6.5.6 nano-json-stream-parser: 0.1.2 servify: 0.1.12 @@ -38521,7 +40338,7 @@ snapshots: eth-lib@0.2.8: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 elliptic: 6.5.6 xhr-request-promise: 0.1.3 @@ -38599,7 +40416,7 @@ snapshots: ethereumjs-abi@https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 ethereumjs-util: 6.2.1 ethereumjs-account@2.0.5: @@ -38638,7 +40455,7 @@ snapshots: ethereumjs-util@5.2.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 create-hash: 1.2.0 elliptic: 6.5.6 ethereum-cryptography: 0.1.3 @@ -38681,7 +40498,7 @@ snapshots: ethers@4.0.49: dependencies: aes-js: 3.0.0 - bn.js: 4.12.0 + bn.js: 4.12.1 elliptic: 6.5.4 hash.js: 1.1.3 js-sha3: 0.5.7 @@ -38762,6 +40579,43 @@ snapshots: - bufferutil - utf-8-validate + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.4): + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + optional: true + ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3): dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -38775,6 +40629,19 @@ snapshots: - bufferutil - utf-8-validate + ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethjs-abi@0.2.1: dependencies: bn.js: 4.11.6 @@ -38896,6 +40763,8 @@ snapshots: exponential-backoff@3.1.1: {} + exponential-backoff@3.1.2: {} + express@4.19.2: dependencies: accepts: 1.3.8 @@ -38989,6 +40858,14 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-parse@1.0.3: {} fast-json-stable-stringify@2.1.0: {} @@ -39003,9 +40880,9 @@ snapshots: fast-uri@3.0.1: {} - fast-xml-parser@4.5.0: + fast-xml-parser@4.5.3: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 fastest-levenshtein@1.0.16: {} @@ -39027,6 +40904,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fetch-cookie@0.11.0: dependencies: tough-cookie: 4.1.4 @@ -39170,12 +41051,16 @@ snapshots: flow-enums-runtime@0.0.6: {} - flow-parser@0.250.0: {} + flow-parser@0.265.0: {} follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: debug: 4.3.7(supports-color@8.1.1) + follow-redirects@1.15.9(debug@4.4.0): + optionalDependencies: + debug: 4.4.0(supports-color@8.1.1) + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -39202,7 +41087,7 @@ snapshots: memfs: 3.5.1 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.6.3 + semver: 7.7.1 tapable: 1.1.3 typescript: 4.9.5 webpack: 5.91.0 @@ -39221,7 +41106,7 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.6.3 + semver: 7.7.1 tapable: 2.2.1 typescript: 5.6.3 webpack: 5.91.0(esbuild@0.22.0) @@ -39252,6 +41137,13 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + format@0.2.2: {} forwarded@0.2.0: {} @@ -39343,6 +41235,12 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@4.0.3: dependencies: graceful-fs: 4.2.11 @@ -39541,6 +41439,19 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} get-package-type@0.1.0: {} @@ -39556,6 +41467,11 @@ snapshots: get-port@5.1.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-size@3.0.0: {} get-starknet-core@4.0.0-next.5: @@ -39600,7 +41516,7 @@ snapshots: git-semver-tags@5.0.1: dependencies: meow: 8.1.2 - semver: 7.6.3 + semver: 7.7.1 git-up@7.0.0: dependencies: @@ -39753,6 +41669,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 @@ -39947,6 +41865,61 @@ snapshots: - supports-color - utf-8-validate + hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3): + dependencies: + '@ethersproject/abi': 5.8.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.8.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.6 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.0(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.0) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.12 + tsort: 0.0.1 + undici: 5.28.5 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + optionalDependencies: + ts-node: 10.9.2(@types/node@22.8.2)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -39961,6 +41934,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -40207,7 +42182,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -40243,7 +42218,7 @@ snapshots: https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -40297,6 +42272,10 @@ snapshots: dependencies: queue: 6.0.2 + image-size@1.2.0: + dependencies: + queue: 6.0.2 + immediate@3.3.0: {} immer@9.0.21: {} @@ -40345,7 +42324,7 @@ snapshots: npm-package-arg: 11.0.2 promzard: 1.0.2 read: 3.0.1 - semver: 7.6.3 + semver: 7.7.1 validate-npm-package-license: 3.0.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -40512,6 +42491,10 @@ snapshots: dependencies: hasown: 2.0.2 + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 @@ -40607,7 +42590,7 @@ snapshots: is-potential-custom-element-name@1.0.1: {} - is-reference@3.0.2: + is-reference@3.0.3: dependencies: '@types/estree': 1.0.6 @@ -40727,9 +42710,9 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - isomorphic-ws@4.0.1(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4) isomorphic-ws@4.0.1(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: @@ -40771,7 +42754,7 @@ snapshots: '@babel/parser': 7.25.8 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color @@ -40879,6 +42862,24 @@ snapshots: - bufferutil - utf-8-validate + jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -41804,7 +43805,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color @@ -42035,18 +44036,18 @@ snapshots: jscodeshift@0.14.0(@babel/preset-env@7.24.7(@babel/core@7.25.8)): dependencies: '@babel/core': 7.25.8 - '@babel/parser': 7.25.8 + '@babel/parser': 7.26.10 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.8) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.8) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.8) - '@babel/plugin-transform-modules-commonjs': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.25.8) '@babel/preset-env': 7.24.7(@babel/core@7.25.8) - '@babel/preset-flow': 7.25.7(@babel/core@7.25.8) - '@babel/preset-typescript': 7.25.7(@babel/core@7.25.8) - '@babel/register': 7.25.7(@babel/core@7.25.8) + '@babel/preset-flow': 7.25.9(@babel/core@7.25.8) + '@babel/preset-typescript': 7.26.0(@babel/core@7.25.8) + '@babel/register': 7.25.9(@babel/core@7.25.8) babel-core: 7.0.0-bridge.0(@babel/core@7.25.8) chalk: 4.1.2 - flow-parser: 0.250.0 + flow-parser: 0.265.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -42131,6 +44132,8 @@ snapshots: jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 @@ -42203,7 +44206,7 @@ snapshots: acorn: 8.13.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.3 + semver: 7.7.1 jsonc-parser@3.2.0: {} @@ -42525,7 +44528,7 @@ snapshots: npm-package-arg: 11.0.2 npm-registry-fetch: 17.1.0 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.1 sigstore: 2.3.1 ssri: 10.0.6 transitivePeerDependencies: @@ -42723,6 +44726,8 @@ snapshots: long@5.2.3: {} + long@5.3.1: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -42745,7 +44750,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -42788,6 +44793,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -42799,7 +44808,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 make-error@1.3.6: {} @@ -42851,6 +44860,8 @@ snapshots: marky@1.2.5: {} + math-intrinsics@1.1.0: {} + mathml-tag-names@2.1.3: {} md5.js@1.3.5: @@ -43039,7 +45050,7 @@ snapshots: metro-cache@0.80.12: dependencies: - exponential-backoff: 3.1.1 + exponential-backoff: 3.1.2 flow-enums-runtime: 0.0.6 metro-core: 0.80.12 @@ -43085,7 +45096,7 @@ snapshots: metro-minify-terser@0.80.12: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.36.0 + terser: 5.39.0 metro-resolver@0.80.12: dependencies: @@ -43093,13 +45104,13 @@ snapshots: metro-runtime@0.80.12: dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.10 flow-enums-runtime: 0.0.6 metro-source-map@0.80.12: dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 flow-enums-runtime: 0.0.6 invariant: 2.2.4 metro-symbolicate: 0.80.12 @@ -43125,9 +45136,9 @@ snapshots: metro-transform-plugins@0.80.12: dependencies: '@babel/core': 7.25.8 - '@babel/generator': 7.25.7 - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 + '@babel/generator': 7.26.10 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.10 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -43136,9 +45147,9 @@ snapshots: metro-transform-worker@0.80.12(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.25.8 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 flow-enums-runtime: 0.0.6 metro: 0.80.12(bufferutil@4.0.8)(utf-8-validate@5.0.10) metro-babel-transformer: 0.80.12 @@ -43155,13 +45166,13 @@ snapshots: metro@0.80.12(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@babel/code-frame': 7.25.7 + '@babel/code-frame': 7.26.2 '@babel/core': 7.25.8 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -43172,7 +45183,7 @@ snapshots: flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 hermes-parser: 0.23.1 - image-size: 1.1.1 + image-size: 1.2.0 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 @@ -43350,7 +45361,7 @@ snapshots: miller-rabin@4.0.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 brorand: 1.1.0 mime-db@1.52.0: {} @@ -43571,6 +45582,29 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.0(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + mocha@8.4.0: dependencies: '@ungap/promise-all-settled': 1.1.2 @@ -43924,7 +45958,7 @@ snapshots: node-abi@3.31.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-abort-controller@3.1.1: {} @@ -43983,7 +46017,7 @@ snapshots: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.1 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -44036,6 +46070,8 @@ snapshots: node-releases@2.0.18: {} + node-releases@2.0.19: {} + node-stream-zip@1.15.0: {} nofilter@1.0.4: {} @@ -44066,13 +46102,13 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.15.1 - semver: 7.6.3 + semver: 7.7.1 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.6.3 + semver: 7.7.1 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -44087,7 +46123,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 npm-normalize-package-bin@3.0.1: {} @@ -44095,7 +46131,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.1 validate-npm-package-name: 5.0.1 npm-packlist@8.0.2: @@ -44107,7 +46143,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.2 - semver: 7.6.3 + semver: 7.7.1 npm-registry-fetch@17.1.0: dependencies: @@ -44186,7 +46222,7 @@ snapshots: npm-run-path: 4.0.1 open: 8.4.2 ora: 5.3.0 - semver: 7.6.3 + semver: 7.7.1 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 @@ -44774,7 +46810,7 @@ snapshots: dependencies: '@types/estree': 1.0.6 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.3 picocolors@1.0.0: {} @@ -44782,6 +46818,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -45199,6 +47237,8 @@ snapshots: preact@10.24.3: {} + preact@10.26.4: {} + preact@10.4.1: {} prebuild-install@7.1.1: @@ -45220,29 +47260,37 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-solidity@1.3.1(prettier@2.8.8): + prettier-plugin-solidity@1.4.2(prettier@2.8.8): dependencies: - '@solidity-parser/parser': 0.17.0 + '@solidity-parser/parser': 0.19.0 prettier: 2.8.8 - semver: 7.6.3 - solidity-comments-extractor: 0.0.8 + semver: 7.7.1 + optional: true - prettier-plugin-tailwindcss@0.1.13(prettier@2.8.8): + prettier-plugin-solidity@1.4.2(prettier@3.3.3): dependencies: - prettier: 2.8.8 + '@solidity-parser/parser': 0.19.0 + prettier: 3.3.3 + semver: 7.7.1 - prettier-plugin-tailwindcss@0.6.5(prettier@3.3.3): + prettier-plugin-tailwindcss@0.1.13(prettier@3.3.3): dependencies: prettier: 3.3.3 - prettier@2.7.1: {} + prettier-plugin-tailwindcss@0.6.11(prettier@3.3.3): + dependencies: + prettier: 3.3.3 - prettier@2.8.0: {} + prettier-plugin-tailwindcss@0.6.5(prettier@3.3.3): + dependencies: + prettier: 3.3.3 prettier@2.8.8: {} prettier@3.3.3: {} + prettier@3.5.3: {} + pretty-error@4.0.0: dependencies: lodash: 4.17.21 @@ -45361,6 +47409,21 @@ snapshots: '@types/node': 22.8.2 long: 5.2.3 + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.17.24 + long: 5.3.1 + protocols@2.0.1: {} proxy-addr@2.0.7: @@ -45382,7 +47445,7 @@ snapshots: dependencies: fill-keys: 1.0.2 module-not-found-error: 1.0.1 - resolve: 1.22.8 + resolve: 1.22.10 prr@1.0.1: {} @@ -45390,7 +47453,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 browserify-rsa: 4.1.0 create-hash: 1.2.0 parse-asn1: 5.1.6 @@ -45813,7 +47876,7 @@ snapshots: react-devtools-core@5.3.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - shell-quote: 1.8.1 + shell-quote: 1.8.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -45877,7 +47940,7 @@ snapshots: react-i18next@13.5.0(i18next@22.5.1)(react-dom@19.0.0(react@19.0.0))(react-native@0.74.2(@babel/core@7.25.8)(@babel/preset-env@7.24.7(@babel/core@7.25.8))(@types/react@19.0.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.10 html-parse-stringify: 3.0.1 i18next: 22.5.1 react: 19.0.0 @@ -45964,7 +48027,7 @@ snapshots: react-shallow-renderer: 16.15.0(react@19.0.0) regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 + stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 @@ -46014,7 +48077,7 @@ snapshots: react-shallow-renderer: 16.15.0(react@19.0.0) regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 + stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 @@ -46253,6 +48316,8 @@ snapshots: readdirp@4.0.2: {} + readdirp@4.1.2: {} + readline@1.3.0: {} readonly-date@1.0.0: {} @@ -46266,7 +48331,7 @@ snapshots: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.8.0 + tslib: 2.8.1 recast@0.23.9: dependencies: @@ -46375,6 +48440,15 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.0 + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + regjsgen@0.8.0: {} regjsparser@0.10.0: @@ -46385,6 +48459,10 @@ snapshots: dependencies: jsesc: 3.0.2 + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + rehype-external-links@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -46513,6 +48591,12 @@ snapshots: dependencies: path-parse: 1.0.7 + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -46735,7 +48819,7 @@ snapshots: dependencies: bindings: 1.5.0 bip66: 1.1.5 - bn.js: 4.12.0 + bn.js: 4.12.1 create-hash: 1.2.0 drbg.js: 1.0.1 elliptic: 6.5.6 @@ -46778,6 +48862,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.1: {} + send@0.18.0: dependencies: debug: 2.6.9 @@ -46946,6 +49032,8 @@ snapshots: shell-quote@1.8.1: {} + shell-quote@1.8.2: {} + shelljs@0.8.5: dependencies: glob: 7.2.3 @@ -47083,7 +49171,7 @@ snapshots: socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -47125,6 +49213,18 @@ snapshots: transitivePeerDependencies: - debug + solc@0.8.26(debug@4.4.0): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.4.0) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + solc@0.8.4: dependencies: command-exists: 1.2.9 @@ -47141,8 +49241,6 @@ snapshots: solidity-ast@0.4.59: {} - solidity-comments-extractor@0.0.8: {} - sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 @@ -47248,6 +49346,10 @@ snapshots: dependencies: type-fest: 0.7.1 + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + starknet-types@0.7.2: {} starknet@6.10.0(encoding@0.1.13): @@ -47262,7 +49364,7 @@ snapshots: isomorphic-fetch: 3.0.0(encoding@0.1.13) lossless-json: 4.0.1 pako: 2.1.0 - starknet-types-07: '@starknet-io/types-js@0.7.7' + starknet-types-07: '@starknet-io/types-js@0.7.10' ts-mixer: 6.0.4 url-join: 4.0.1 transitivePeerDependencies: @@ -47461,7 +49563,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.1.2: {} strong-log-transformer@2.1.0: dependencies: @@ -47671,15 +49773,15 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.6 - acorn: 8.13.0 + acorn: 8.14.1 aria-query: 5.3.2 axobject-query: 4.1.0 code-red: 1.0.4 css-tree: 2.3.1 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.12 + magic-string: 0.30.17 periscopic: 3.1.0 svg-parser@2.0.4: {} @@ -48020,6 +50122,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.39.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 + commander: 2.20.3 + source-map-support: 0.5.21 + teslabot@1.5.0: {} test-exclude@6.0.0: @@ -48090,13 +50199,18 @@ snapshots: tiny-secp256k1@1.1.6: dependencies: bindings: 1.5.0 - bn.js: 4.12.0 + bn.js: 4.12.1 create-hmac: 1.1.7 elliptic: 6.5.6 nan: 2.22.0 tiny-typed-emitter@2.1.0: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinyrainbow@1.2.0: {} tinyspy@3.0.2: {} @@ -48718,6 +50832,8 @@ snapshots: tslib@2.8.0: {} + tslib@2.8.1: {} + tsort@0.0.1: {} tsutils@3.21.0(typescript@4.9.5): @@ -48740,7 +50856,7 @@ snapshots: tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -48972,8 +51088,14 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@5.28.5: + dependencies: + '@fastify/busboy': 2.1.1 + undici@6.20.1: {} + undici@6.21.2: {} + unenv@1.9.0: dependencies: consola: 3.2.3 @@ -49107,19 +51229,25 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + upper-case-first@1.1.2: dependencies: upper-case: 1.1.3 upper-case-first@2.0.2: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 upper-case@1.1.3: {} upper-case@2.0.2: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 uqr@0.1.2: {} @@ -50591,6 +52719,12 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@6.0.4): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.4 + optional: true + ws@7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.7 @@ -50601,6 +52735,11 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.4): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.4 + ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 @@ -50701,6 +52840,8 @@ snapshots: yaml@2.6.0: {} + yaml@2.7.0: {} + yargs-parser@13.1.2: dependencies: camelcase: 5.3.1 @@ -50836,6 +52977,10 @@ snapshots: dependencies: ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + zksync-ethers@6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)): + dependencies: + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + zksync-web3@0.13.4(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)): dependencies: ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 19dfbbacef..2f882c064d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -78,6 +78,7 @@ catalog: pino: 9.5.0 postcss-loader: 8.1.1 postcss: 8.4.47 + prettier-plugin-solidity: ^1.4.2 prettier: 3.3.3 react-aria-components: 1.5.0 react-aria: 3.36.0 diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000000..02c4db200d --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,10 @@ +import { base, mergeConfigs } from "@cprussin/prettier-config"; +import solidity from "prettier-plugin-solidity"; + +const config = mergeConfigs([ + base, + { + plugins: [solidity], + }, +]); +export default config; diff --git a/price_service/client/js/package.json b/price_service/client/js/package.json index c75405a1bf..97bb0b3590 100644 --- a/price_service/client/js/package.json +++ b/price_service/client/js/package.json @@ -23,7 +23,9 @@ "test:e2e": "jest --testPathPattern=.*.e2e.test.ts", "build": "tsc", "example": "pnpm run build && node lib/examples/PriceServiceClient.js", - "format": "prettier --write \"src/**/*.ts\"", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", "prepublishOnly": "pnpm run build && pnpm run test:lint", "preversion": "pnpm run test:lint", @@ -41,7 +43,7 @@ "@typescript-eslint/parser": "^5.21.0", "eslint": "^8.14.0", "jest": "^29.4.0", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", "typescript": "^4.6.3", "yargs": "^17.4.1" diff --git a/price_service/sdk/js/package.json b/price_service/sdk/js/package.json index 40088d14a8..d58d97fd27 100644 --- a/price_service/sdk/js/package.json +++ b/price_service/sdk/js/package.json @@ -18,10 +18,11 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", "gen-ts-schema": "quicktype --src-lang schema src/schemas/price_feed.json -o src/schemas/PriceFeed.ts --raw-type any --converters all-objects && prettier --write \"src/schemas/*.ts\"", "test:unit": "jest", "test:lint": "eslint src/ --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", "prepublishOnly": "pnpm run build && pnpm test:unit && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -38,7 +39,7 @@ "@typescript-eslint/parser": "^5.20.0", "eslint": "^8.13.0", "jest": "^29.4.0", - "prettier": "^2.6.2", + "prettier": "catalog:", "quicktype": "^23.0.76", "ts-jest": "^29.0.5", "typescript": "^4.6.3" diff --git a/pythnet/message_buffer/package.json b/pythnet/message_buffer/package.json index 0a91af34ec..a351e68889 100644 --- a/pythnet/message_buffer/package.json +++ b/pythnet/message_buffer/package.json @@ -3,7 +3,9 @@ "version": "0.1.0", "private": "true", "scripts": { - "init-buffer": "pnpm exec ts-node scripts/setup_message_buffer.ts" + "init-buffer": "pnpm exec ts-node scripts/setup_message_buffer.ts", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "dependencies": { "@coral-xyz/anchor": "^0.27.0", @@ -17,7 +19,7 @@ "@types/mocha": "^9.0.0", "chai": "^4.3.4", "mocha": "^9.0.3", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-mocha": "^10.0.0", "typescript": "^4.3.5" } diff --git a/target_chains/aptos/cli/package.json b/target_chains/aptos/cli/package.json index 29d4fecfbb..98d8e572b5 100644 --- a/target_chains/aptos/cli/package.json +++ b/target_chains/aptos/cli/package.json @@ -6,7 +6,9 @@ "main": "index.js", "scripts": { "cli": "ts-node src/cli.ts", - "build": "tsc" + "build": "tsc", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "author": "", "license": "ISC", @@ -16,7 +18,7 @@ "devDependencies": { "@types/node": "^18.7.21", "@types/yargs": "^17.0.13", - "prettier": "2.8.0", + "prettier": "catalog:", "typescript": "^5.3.3" }, "dependencies": { diff --git a/target_chains/aptos/sdk/js/package.json b/target_chains/aptos/sdk/js/package.json index 7dffa2dade..0a64a0011f 100644 --- a/target_chains/aptos/sdk/js/package.json +++ b/target_chains/aptos/sdk/js/package.json @@ -22,7 +22,9 @@ "scripts": { "build": "tsc", "example-relay": "pnpm run build && node lib/examples/AptosRelay.js", - "format": "prettier --write \"src/**/*.ts\"", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", "prepublishOnly": "pnpm run build && pnpm test:lint", "preversion": "pnpm run test:lint", @@ -44,7 +46,7 @@ "@typescript-eslint/parser": "^5.21.0", "eslint": "^8.14.0", "jest": "^29.4.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", "typescript": "^4.6.3", "web3": "^1.8.2", diff --git a/target_chains/cosmwasm/deploy-scripts/package.json b/target_chains/cosmwasm/deploy-scripts/package.json index 9f17ca7e20..39775d206b 100644 --- a/target_chains/cosmwasm/deploy-scripts/package.json +++ b/target_chains/cosmwasm/deploy-scripts/package.json @@ -7,7 +7,9 @@ "build": "tsc", "build-contract": "ts-node ./src/build-contract.ts", "instantiate-wormhole": "ts-node ./src/instantiate-wormhole.ts", - "instantiate-pyth": "ts-node ./src/instantiate-pyth.ts" + "instantiate-pyth": "ts-node ./src/instantiate-pyth.ts", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "author": "", "license": "Apache-2.0", @@ -25,6 +27,7 @@ }, "devDependencies": { "@types/adm-zip": "^0.5.0", - "@types/yargs": "^17.0.18" + "@types/yargs": "^17.0.18", + "prettier": "catalog:" } } diff --git a/target_chains/cosmwasm/tools/package.json b/target_chains/cosmwasm/tools/package.json index 9e1e322355..d595835b05 100644 --- a/target_chains/cosmwasm/tools/package.json +++ b/target_chains/cosmwasm/tools/package.json @@ -6,7 +6,9 @@ "private": "true", "scripts": { "build": "tsc", - "deploy": "ts-node ./src/ci/deploy.ts" + "deploy": "ts-node ./src/ci/deploy.ts", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "author": "", "license": "Apache-2.0", diff --git a/target_chains/ethereum/abi_generator/package.json b/target_chains/ethereum/abi_generator/package.json index 8255d41f43..b7d8fbc54a 100644 --- a/target_chains/ethereum/abi_generator/package.json +++ b/target_chains/ethereum/abi_generator/package.json @@ -18,11 +18,12 @@ "generate-abis": "src/generate.js" }, "scripts": { - "format": "prettier --write .", + "test:format": "prettier --check .", + "fix:format": "prettier --write .", "generate": "node src/generate.js" }, "devDependencies": { - "prettier": "^2.7.1", + "prettier": "catalog:", "solc": "^0.8.15" } } diff --git a/target_chains/ethereum/contracts/package.json b/target_chains/ethereum/contracts/package.json index 24b569eed7..1ddeb497d5 100644 --- a/target_chains/ethereum/contracts/package.json +++ b/target_chains/ethereum/contracts/package.json @@ -10,6 +10,8 @@ "@types/chai": "^4.3.4", "chai": "^4.2.0", "mocha": "^8.2.1", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", "truffle": "^5.7.4", "truffle-deploy-registry": "^0.5.1", "truffle-plugin-stdjsonin": "github:mhrsalehi/truffle-plugin-stdjsonin", @@ -22,7 +24,9 @@ "receiver-submit-guardian-sets": "truffle exec scripts/receiverSubmitGuardianSetUpgrades.js", "verify": "truffle run verify $npm_config_module@$npm_config_contract_address --network $npm_config_network", "install-forge-deps": "forge install foundry-rs/forge-std@v1.7.6 --no-git --no-commit", - "coverage": "./coverage.sh" + "coverage": "./coverage.sh", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "author": "", "license": "Apache-2.0", diff --git a/target_chains/ethereum/contracts/prettier.config.mjs b/target_chains/ethereum/contracts/prettier.config.mjs new file mode 100644 index 0000000000..9ddff614ce --- /dev/null +++ b/target_chains/ethereum/contracts/prettier.config.mjs @@ -0,0 +1,5 @@ +import solidity from "prettier-plugin-solidity"; + +export default { + plugins: [solidity], +}; diff --git a/target_chains/ethereum/entropy_sdk/solidity/package.json b/target_chains/ethereum/entropy_sdk/solidity/package.json index c1ab0243fb..a01c391a90 100644 --- a/target_chains/ethereum/entropy_sdk/solidity/package.json +++ b/target_chains/ethereum/entropy_sdk/solidity/package.json @@ -2,6 +2,7 @@ "name": "@pythnetwork/entropy-sdk-solidity", "version": "1.5.0", "description": "Generate secure random numbers with Pyth Entropy", + "type": "module", "repository": { "type": "git", "url": "https://github.com/pyth-network/pyth-crosschain", @@ -11,7 +12,8 @@ "access": "public" }, "scripts": { - "format": "prettier --write .", + "test:format": "prettier --check .", + "fix:format": "prettier --write .", "build": "generate-abis IEntropy IEntropyConsumer EntropyErrors EntropyEvents EntropyStructs PRNG", "test": "git diff --exit-code abis" }, @@ -27,8 +29,8 @@ }, "homepage": "https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/ethereum/entropy_sdk/solidity", "devDependencies": { - "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-rc.1", - "abi_generator": "workspace:*" + "abi_generator": "workspace:*", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:" } } diff --git a/target_chains/ethereum/entropy_sdk/solidity/prettier.config.js b/target_chains/ethereum/entropy_sdk/solidity/prettier.config.js new file mode 100644 index 0000000000..9ddff614ce --- /dev/null +++ b/target_chains/ethereum/entropy_sdk/solidity/prettier.config.js @@ -0,0 +1,5 @@ +import solidity from "prettier-plugin-solidity"; + +export default { + plugins: [solidity], +}; diff --git a/target_chains/ethereum/sdk/js/package.json b/target_chains/ethereum/sdk/js/package.json index 1a1326adbb..b62d6ca8c9 100644 --- a/target_chains/ethereum/sdk/js/package.json +++ b/target_chains/ethereum/sdk/js/package.json @@ -24,8 +24,10 @@ "example-client": "pnpm run build && node lib/examples/EvmPriceServiceClient.js", "example-relay": "pnpm run build && node lib/examples/EvmRelay.js", "example-benchmark": "pnpm run build && node lib/examples/EvmBenchmark.js", - "format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", "prepublishOnly": "pnpm run build && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -47,7 +49,7 @@ "@typescript-eslint/parser": "^5.21.0", "eslint": "^8.14.0", "jest": "^29.4.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", "typescript": "^4.6.3", "web3": "^1.8.2", diff --git a/target_chains/ethereum/sdk/solidity/package.json b/target_chains/ethereum/sdk/solidity/package.json index 03f5b7a08b..2aa86d0876 100644 --- a/target_chains/ethereum/sdk/solidity/package.json +++ b/target_chains/ethereum/sdk/solidity/package.json @@ -2,6 +2,7 @@ "name": "@pythnetwork/pyth-sdk-solidity", "version": "4.0.0", "description": "Read prices from the Pyth oracle", + "type": "module", "repository": { "type": "git", "url": "https://github.com/pyth-network/pyth-crosschain", @@ -9,8 +10,9 @@ }, "scripts": { "build:abis": "generate-abis IPyth IPythEvents AbstractPyth MockPyth PythErrors PythUtils PythAggregatorV3", - "build:bin:": "solcjs --bin MockPyth.sol --base-path . -o build/", - "format": "prettier --write .", + "build:bin": "solcjs --bin MockPyth.sol --base-path . -o build/", + "fix:format": "prettier --write .", + "test:format": "prettier --check .", "test": "git diff --exit-code abis" }, "keywords": [ @@ -26,8 +28,8 @@ "homepage": "https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/ethereum/sdk/solidity", "devDependencies": { "abi_generator": "workspace:*", - "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-rc.1", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", "solc": "^0.8.25" } } diff --git a/target_chains/ethereum/sdk/solidity/prettier.config.js b/target_chains/ethereum/sdk/solidity/prettier.config.js new file mode 100644 index 0000000000..9ddff614ce --- /dev/null +++ b/target_chains/ethereum/sdk/solidity/prettier.config.js @@ -0,0 +1,5 @@ +import solidity from "prettier-plugin-solidity"; + +export default { + plugins: [solidity], +}; diff --git a/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/package.json b/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/package.json index 3fe52183ef..94668e7a9a 100644 --- a/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/package.json +++ b/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/package.json @@ -2,14 +2,23 @@ "name": "pyth-mock-solidity", "version": "1.0.0", "description": "** Deploy mock solidity pyth contract using the pyth solidity sdk **", + "type": "module", "directories": { "lib": "lib", "test": "test" }, + "scripts": { + "test:format": "prettier --check .", + "fix:format": "prettier --write ." + }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@pythnetwork/pyth-sdk-solidity": "^4.0.0" + }, + "devDependencies": { + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:" } } diff --git a/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/prettier.config.js b/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/prettier.config.js new file mode 100644 index 0000000000..9ddff614ce --- /dev/null +++ b/target_chains/ethereum/sdk/stylus/pyth-mock-solidity/prettier.config.js @@ -0,0 +1,5 @@ +import solidity from "prettier-plugin-solidity"; + +export default { + plugins: [solidity], +}; diff --git a/target_chains/fuel/sdk/js/package.json b/target_chains/fuel/sdk/js/package.json index c6bbc93758..ffc4a3e384 100644 --- a/target_chains/fuel/sdk/js/package.json +++ b/target_chains/fuel/sdk/js/package.json @@ -23,8 +23,9 @@ "usage-example": "ts-node src/examples/usage.ts", "build": "pnpm run generate-fuel-types && tsc && copyfiles -u 1 \"src/**/*.d.ts\" lib", "test:format": "prettier --check \"src/**/*.ts\"", - "fix:format": "prettier --write \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", "prepublishOnly": "pnpm run build && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run test:format && git add -A src", @@ -36,12 +37,12 @@ ], "license": "Apache-2.0", "devDependencies": { + "@pythnetwork/hermes-client": "workspace:*", "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", - "@pythnetwork/hermes-client": "workspace:*", "copyfiles": "^2.4.1", "eslint": "^8.14.0", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-node": "^10.9.2", "typescript": "^5.4.5" }, diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/package.json b/target_chains/solana/sdk/js/pyth_solana_receiver/package.json index 5212e4a9d1..84ffe8a48e 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/package.json +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/package.json @@ -18,8 +18,10 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", "prepublishOnly": "pnpm run build && pnpm test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -36,7 +38,7 @@ "@typescript-eslint/parser": "^5.20.0", "eslint": "^8.13.0", "jest": "^29.4.0", - "prettier": "^2.6.2", + "prettier": "catalog:", "quicktype": "^23.0.76", "ts-jest": "^29.0.5", "ts-node": "^10.9.2", diff --git a/target_chains/solana/sdk/js/solana_utils/package.json b/target_chains/solana/sdk/js/solana_utils/package.json index 29a512f5a2..d647e92b53 100644 --- a/target_chains/solana/sdk/js/solana_utils/package.json +++ b/target_chains/solana/sdk/js/solana_utils/package.json @@ -18,9 +18,11 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", "test:unit": "jest", "test:lint": "eslint src/ --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", "prepublishOnly": "pnpm run build && pnpm test:unit && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -38,7 +40,7 @@ "@typescript-eslint/parser": "^5.20.0", "eslint": "^8.13.0", "jest": "^29.4.0", - "prettier": "^2.6.2", + "prettier": "catalog:", "quicktype": "^23.0.76", "ts-jest": "^29.0.5", "typescript": "^4.6.3" diff --git a/target_chains/starknet/sdk/js/package.json b/target_chains/starknet/sdk/js/package.json index 9755fc5425..fd0969c0ed 100644 --- a/target_chains/starknet/sdk/js/package.json +++ b/target_chains/starknet/sdk/js/package.json @@ -22,8 +22,10 @@ "scripts": { "build": "tsc", "usage-example": "ts-node src/examples/usage.ts", - "format": "prettier --write \"src/**/*.ts\"", + "test:format": "prettier --check \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", "prepublishOnly": "pnpm run build && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -39,10 +41,9 @@ "@typescript-eslint/parser": "^5.21.0", "eslint": "^8.14.0", "jest": "^29.4.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", - "typescript": "^4.6.3", - "ts-node": "^10.9.2" - }, - "dependencies": {} + "ts-node": "^10.9.2", + "typescript": "^4.6.3" + } } diff --git a/target_chains/sui/cli-iota/package.json b/target_chains/sui/cli-iota/package.json index 189d8bc0d4..7a85912895 100644 --- a/target_chains/sui/cli-iota/package.json +++ b/target_chains/sui/cli-iota/package.json @@ -6,7 +6,9 @@ "license": "Apache-2.0", "scripts": { "cli": "ts-node src/cli.ts", - "build": "tsc" + "build": "tsc", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "private": "true", "dependencies": { @@ -16,7 +18,7 @@ "@pythnetwork/price-service-client": "^1.4.0", "@pythnetwork/price-service-sdk": "^1.2.0", "@pythnetwork/xc-admin-common": "workspace:*", - "prettier": "^2.8.7", + "prettier": "catalog:", "ts-node": "^10.9.1", "typescript": "^5.0.4", "yargs": "^17.7.2" diff --git a/target_chains/sui/cli/package.json b/target_chains/sui/cli/package.json index 8aebfa4f33..f0a508587f 100644 --- a/target_chains/sui/cli/package.json +++ b/target_chains/sui/cli/package.json @@ -6,7 +6,9 @@ "license": "Apache-2.0", "scripts": { "cli": "ts-node src/cli.ts", - "build": "tsc" + "build": "tsc", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "private": "true", "dependencies": { @@ -16,7 +18,7 @@ "@pythnetwork/price-service-client": "^1.4.0", "@pythnetwork/price-service-sdk": "^1.2.0", "@pythnetwork/xc-admin-common": "workspace:*", - "prettier": "^2.8.7", + "prettier": "catalog:", "ts-node": "^10.9.1", "typescript": "^5.0.4", "yargs": "^17.7.2" diff --git a/target_chains/sui/sdk/js-iota/package.json b/target_chains/sui/sdk/js-iota/package.json index b3622e3949..373c18c26a 100644 --- a/target_chains/sui/sdk/js-iota/package.json +++ b/target_chains/sui/sdk/js-iota/package.json @@ -22,8 +22,10 @@ "scripts": { "build": "tsc", "example-relay": "pnpm run build && node lib/examples/SuiRelay.js", - "format": "prettier --write \"src/**/*.ts\"", "test:lint": "eslint src/", + "test:format": "prettier --check \"src/**/*.ts\"", + "fix:lint": "eslint --fix src/", + "fix:format": "prettier --write \"src/**/*.ts\"", "prepublishOnly": "pnpm run build && pnpm test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -45,7 +47,7 @@ "@typescript-eslint/parser": "^6.0.0", "eslint": "^8.14.0", "jest": "^29.4.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", "typescript": "^5.3.3", "web3": "^1.8.2", diff --git a/target_chains/sui/sdk/js/package.json b/target_chains/sui/sdk/js/package.json index c4bd6de07a..881cd69ebb 100644 --- a/target_chains/sui/sdk/js/package.json +++ b/target_chains/sui/sdk/js/package.json @@ -22,8 +22,10 @@ "scripts": { "build": "tsc", "example-relay": "node lib/examples/SuiRelay.js", - "format": "prettier --write \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", "prepublishOnly": "pnpm run build && pnpm test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -45,7 +47,7 @@ "@typescript-eslint/parser": "^6.0.0", "eslint": "^8.14.0", "jest": "^29.4.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", "typescript": "^5.3.3", "web3": "^1.8.2", diff --git a/target_chains/ton/contracts/.prettierignore b/target_chains/ton/contracts/.prettierignore new file mode 100644 index 0000000000..d16386367f --- /dev/null +++ b/target_chains/ton/contracts/.prettierignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/target_chains/ton/contracts/package.json b/target_chains/ton/contracts/package.json index be24b04819..d841c532da 100644 --- a/target_chains/ton/contracts/package.json +++ b/target_chains/ton/contracts/package.json @@ -5,13 +5,15 @@ "scripts": { "start": "blueprint run", "build": "blueprint build Main", - "test:unit": "jest --verbose" + "test:unit": "jest --verbose", + "test:format": "prettier --check .", + "fix:format": "prettier --write ." }, "devDependencies": { - "@pythnetwork/pyth-ton-js": "workspace:*", + "@pythnetwork/hermes-client": "workspace:*", "@pythnetwork/price-service-sdk": "workspace:*", + "@pythnetwork/pyth-ton-js": "workspace:*", "@pythnetwork/xc-admin-common": "workspace:*", - "@pythnetwork/hermes-client": "workspace:*", "@ton/blueprint": "^0.22.0", "@ton/core": "^0.59.0", "@ton/crypto": "^3.3.0", @@ -22,7 +24,7 @@ "@types/node": "^20.14.10", "@wormhole-foundation/sdk-definitions": "^0.10.7", "jest": "^29.7.0", - "prettier": "^3.3.2", + "prettier": "catalog:", "ts-jest": "^29.2.0", "ts-node": "^10.9.2", "typescript": "^5.5.3" diff --git a/target_chains/ton/sdk/js/package.json b/target_chains/ton/sdk/js/package.json index a5af45ba8b..742101cd2f 100644 --- a/target_chains/ton/sdk/js/package.json +++ b/target_chains/ton/sdk/js/package.json @@ -21,8 +21,10 @@ }, "scripts": { "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", "test:lint": "eslint src/ --max-warnings 0", + "test:format": "prettier --check \"src/**/*.ts\"", + "fix:lint": "eslint src/ --fix --max-warnings 0", + "fix:format": "prettier --write \"src/**/*.ts\"", "prepublishOnly": "pnpm run build && pnpm run test:lint", "preversion": "pnpm run test:lint", "version": "pnpm run format && git add -A src" @@ -34,17 +36,16 @@ "license": "Apache-2.0", "devDependencies": { "@ton/core": "^0.59.0", - "@ton/ton": "^15.1.0", "@ton/crypto": "^3.3.0", + "@ton/ton": "^15.1.0", "@types/node": "^18.11.18", "@typescript-eslint/eslint-plugin": "^5.21.0", "@typescript-eslint/parser": "^5.21.0", "eslint": "^8.14.0", "jest": "^29.4.1", - "prettier": "^2.6.2", + "prettier": "catalog:", "ts-jest": "^29.0.5", - "typescript": "^4.6.3", - "ts-node": "^10.9.2" - }, - "dependencies": {} + "ts-node": "^10.9.2", + "typescript": "^4.6.3" + } } From 1b5195aa0ae37f4fa20262ec5fb7e48fb299ff23 Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 14:31:52 -0700 Subject: [PATCH 2/7] fix: run turbo fix This commit fixes formatting & linting issues caused by reconfiguring prettier & eslint in the prior commit --- apps/hermes/client/js/src/HermesClient.ts | 22 +- .../client/js/src/examples/HermesClient.ts | 4 +- apps/hermes/client/js/src/utils.ts | 2 +- apps/price_pusher/src/aptos/aptos.ts | 32 +-- apps/price_pusher/src/aptos/command.ts | 12 +- apps/price_pusher/src/controller.ts | 6 +- apps/price_pusher/src/evm/command.ts | 14 +- .../src/evm/custom-gas-station.ts | 4 +- apps/price_pusher/src/evm/evm.ts | 68 +++--- apps/price_pusher/src/evm/pyth-contract.ts | 2 +- apps/price_pusher/src/evm/super-wallet.ts | 2 +- apps/price_pusher/src/fuel/command.ts | 10 +- apps/price_pusher/src/fuel/fuel.ts | 16 +- apps/price_pusher/src/injective/command.ts | 10 +- apps/price_pusher/src/injective/injective.ts | 20 +- apps/price_pusher/src/interface.ts | 10 +- apps/price_pusher/src/near/command.ts | 12 +- apps/price_pusher/src/near/near.ts | 30 +-- apps/price_pusher/src/price-config.ts | 12 +- apps/price_pusher/src/pyth-price-listener.ts | 10 +- apps/price_pusher/src/solana/command.ts | 20 +- apps/price_pusher/src/solana/solana.ts | 41 ++-- apps/price_pusher/src/sui/command.ts | 14 +- apps/price_pusher/src/sui/sui.ts | 75 +++--- apps/price_pusher/src/ton/command.ts | 10 +- apps/price_pusher/src/ton/ton.ts | 14 +- apps/price_pusher/src/utils.ts | 10 +- contract_manager/scripts/check_proposal.ts | 30 +-- contract_manager/scripts/common.ts | 48 ++-- contract_manager/scripts/deploy_cosmwasm.ts | 6 +- .../scripts/deploy_evm_contract.ts | 4 +- .../scripts/deploy_evm_entropy_contracts.ts | 32 +-- .../scripts/deploy_evm_pricefeed_contracts.ts | 20 +- .../scripts/deploy_evm_pulse_contracts.ts | 26 +- .../entropy-accept-admin-and-ownership.ts | 4 +- .../scripts/entropy_debug_reveal.ts | 6 +- contract_manager/scripts/execute_vaas.ts | 8 +- .../scripts/fetch_account_balance.ts | 14 +- contract_manager/scripts/fetch_fees.ts | 4 +- .../generate_governance_set_fee_payload.ts | 4 +- ...generate_upgrade_near_contract_proposal.ts | 4 +- .../generate_upgrade_ton_contract_proposal.ts | 8 +- .../scripts/get_entropy_registration.ts | 6 +- contract_manager/scripts/latency_entropy.ts | 6 +- .../scripts/latency_entropy_with_callback.ts | 10 +- contract_manager/scripts/load_test_entropy.ts | 6 +- .../scripts/send_message_to_wormhole.ts | 6 +- .../scripts/sync_governance_vaas.ts | 10 +- .../scripts/sync_wormhole_guardian_set.ts | 2 +- .../scripts/update_all_pricefeeds.ts | 12 +- contract_manager/scripts/update_pricefeed.ts | 12 +- .../scripts/upgrade_evm_entropy_contracts.ts | 12 +- .../upgrade_evm_pricefeed_contracts.ts | 8 +- .../scripts/upgrade_ton_contract.ts | 6 +- contract_manager/scripts/upload_cosmwasm.ts | 4 +- contract_manager/src/base.ts | 4 +- contract_manager/src/chains.ts | 90 +++---- contract_manager/src/contracts/aptos.ts | 37 +-- contract_manager/src/contracts/cosmwasm.ts | 30 ++- contract_manager/src/contracts/evm.ts | 114 +++++---- contract_manager/src/contracts/fuel.ts | 26 +- contract_manager/src/contracts/iota.ts | 57 ++--- contract_manager/src/contracts/near.ts | 33 +-- contract_manager/src/contracts/starknet.ts | 28 ++- contract_manager/src/contracts/sui.ts | 57 ++--- contract_manager/src/contracts/ton.ts | 36 +-- contract_manager/src/contracts/wormhole.ts | 4 +- contract_manager/src/executor.ts | 12 +- contract_manager/src/governance.ts | 50 ++-- contract_manager/src/shell.ts | 2 +- contract_manager/src/store.ts | 14 +- contract_manager/src/token.ts | 2 +- .../packages/crank_executor/src/index.ts | 4 +- .../crank_pythnet_relayer/src/index.ts | 39 ++- .../packages/proposer_server/src/index.ts | 6 +- .../packages/xc_admin_cli/src/index.ts | 212 ++++++++--------- .../packages/xc_admin_cli/src/ledger.ts | 24 +- .../BpfUpgradableLoaderInstruction.test.ts | 26 +- .../src/__tests__/BufferLayoutExt.test.ts | 2 +- .../src/__tests__/GovernancePayload.test.ts | 102 ++++---- .../LazerMultisigInstruction.test.ts | 2 +- .../MessageBufferMultisigInstruction.test.ts | 92 +++---- .../PriceStoreProgramInstruction.test.ts | 8 +- .../__tests__/PythMultisigInstruction.test.ts | 68 +++--- .../SystemProgramInstruction.test.ts | 10 +- .../src/__tests__/TransactionSize.test.ts | 30 +-- .../src/__tests__/UpgradeContract.test.ts | 6 +- .../WormholeMultisigInstruction.test.ts | 174 +++++++------- .../src/bpf_upgradable_loader.ts | 4 +- .../packages/xc_admin_common/src/chains.ts | 2 +- .../src/deterministic_oracle_accounts.ts | 10 +- .../src/deterministic_stake_accounts.ts | 4 +- .../packages/xc_admin_common/src/executor.ts | 30 +-- .../src/governance_payload/BufferLayoutExt.ts | 2 +- .../src/governance_payload/ExecuteAction.ts | 6 +- .../governance_payload/ExecutePostedVaa.ts | 8 +- .../GovernanceDataSourceTransfer.ts | 17 +- .../PythGovernanceAction.ts | 16 +- .../src/governance_payload/SetDataSources.ts | 4 +- .../src/governance_payload/SetFee.ts | 14 +- .../src/governance_payload/SetValidPeriod.ts | 9 +- .../governance_payload/SetWormholeAddress.ts | 18 +- .../src/governance_payload/UpgradeContract.ts | 23 +- .../src/governance_payload/index.ts | 2 +- .../xc_admin_common/src/message_buffer.ts | 10 +- .../packages/xc_admin_common/src/multisig.ts | 28 ++- .../BpfUpgradableLoaderMultisigInstruction.ts | 10 +- .../LazerMultisigInstruction.ts | 8 +- .../MessageBufferMultisigInstruction.ts | 14 +- .../PythMultisigInstruction.ts | 8 +- .../SolanaStakingMultisigInstruction.ts | 16 +- .../SystemProgramInstruction.ts | 6 +- .../WormholeMultisigInstruction.ts | 16 +- .../src/multisig_transaction/anchor.ts | 6 +- .../src/multisig_transaction/index.ts | 20 +- .../xc_admin_common/src/price_store.ts | 43 ++-- .../packages/xc_admin_common/src/propose.ts | 100 ++++---- .../xc_admin_common/src/remote_executor.ts | 4 +- .../packages/xc_admin_common/src/wormhole.ts | 4 +- .../WormholeInstructionView.tsx | 16 +- .../components/tabs/General.tsx | 4 +- .../components/tabs/Proposals/Proposal.tsx | 12 +- .../components/tabs/Proposals/utils.ts | 2 +- .../solana/scripts/check_trusted_signer.ts | 10 +- lazer/contracts/solana/scripts/setup.ts | 6 +- lazer/sdk/js/examples/index.ts | 4 +- lazer/sdk/js/src/client.ts | 6 +- lazer/sdk/js/src/constants.ts | 4 +- lazer/sdk/js/src/ed25519.ts | 6 +- .../sdk/js/src/socket/resilient-websocket.ts | 10 +- lazer/sdk/js/src/socket/websocket-pool.ts | 10 +- .../client/js/src/PriceServiceConnection.ts | 20 +- .../client/js/src/ResillientWebSocket.ts | 6 +- .../js/src/__tests__/connection.e2e.test.ts | 6 +- .../js/src/examples/PriceServiceClient.ts | 4 +- .../sdk/js/src/AccumulatorUpdateData.ts | 6 +- .../__tests__/AccumulatorUpdateData.test.ts | 36 +-- .../sdk/js/src/__tests__/PriceFeed.test.ts | 4 +- price_service/sdk/js/src/schemas/PriceFeed.ts | 22 +- pythnet/message_buffer/idl/message_buffer.ts | 80 +++---- .../scripts/setup_message_buffer.ts | 80 +++---- .../message_buffer/tests/message_buffer.ts | 168 ++++++------- target_chains/aptos/cli/README.md | 6 +- target_chains/aptos/cli/src/commands/aptos.ts | 84 +++---- .../aptos/sdk/js/src/examples/AptosRelay.ts | 8 +- .../deploy-scripts/src/build-contract.ts | 6 +- .../cosmwasm/deploy-scripts/src/configs.ts | 4 +- .../cosmwasm/deploy-scripts/src/helper.ts | 10 +- .../deploy-scripts/src/instantiate-pyth.ts | 6 +- .../src/instantiate-wormhole.ts | 10 +- .../src/chains-manager/chain-executor.ts | 8 +- .../tools/src/chains-manager/chain-querier.ts | 9 +- .../tools/src/chains-manager/cosmwasm.ts | 38 +-- .../tools/src/chains-manager/injective.ts | 20 +- target_chains/cosmwasm/tools/src/ci/deploy.ts | 24 +- .../cosmwasm/tools/src/ci/deployer/index.ts | 2 +- .../tools/src/ci/deployer/injective.ts | 16 +- .../cosmwasm/tools/src/ci/deployer/osmosis.ts | 27 ++- .../cosmwasm/tools/src/ci/deployer/terra.ts | 24 +- .../cosmwasm/tools/src/pyth-wrapper.ts | 6 +- .../ethereum/abi_generator/src/index.js | 4 +- .../contracts/libraries/external/BytesLib.sol | 4 +- .../libraries/external/UnsafeBytesLib.sol | 4 +- .../contracts/deploy/zkSyncDeployEntropy.ts | 23 +- .../deploy/zkSyncDeployNewPythImpl.ts | 4 +- .../contracts/deploy/zkSyncDeployPriceFeed.ts | 4 +- .../contracts/deploy/zkSyncDeployWormhole.ts | 17 +- .../ethereum/contracts/forge-test/Pyth.t.sol | 23 +- .../migrations/test/2_deploy_wormhole.js | 2 +- .../migrations/test/3_deploy_pyth.js | 4 +- target_chains/ethereum/contracts/mine.js | 2 +- .../scripts/assertVaaPayloadEquals.js | 4 +- .../contracts/scripts/batchDeployReceivers.ts | 17 +- .../scripts/contractManagerConfig.js | 8 +- .../scripts/createLocalnetGovernanceVaa.js | 8 +- target_chains/ethereum/contracts/test/pyth.js | 162 ++++++------- .../ethereum/entropy_sdk/solidity/README.md | 3 +- .../sdk/js/src/EvmPriceServiceConnection.ts | 2 +- .../sdk/js/src/examples/EvmBenchmark.ts | 6 +- .../js/src/examples/EvmPriceServiceClient.ts | 4 +- .../ethereum/sdk/js/src/examples/EvmRelay.ts | 9 +- target_chains/ethereum/sdk/solidity/README.md | 1 - .../fuel/sdk/js/src/examples/usage.ts | 12 +- .../fuel/sdk/js/src/types/PythContract.ts | 8 +- .../sdk/js/src/types/PythContractFactory.ts | 6 +- .../src/PythSolanaReceiver.ts | 135 +++++------ .../js/pyth_solana_receiver/src/address.ts | 16 +- .../src/idl/pyth_push_oracle.ts | 14 +- .../src/idl/pyth_solana_receiver.ts | 94 ++++---- .../src/idl/wormhole_core_bridge_solana.ts | 224 +++++++++--------- .../sdk/js/pyth_solana_receiver/src/vaa.ts | 26 +- .../src/__tests__/TransactionSize.test.ts | 18 +- .../solana/sdk/js/solana_utils/src/jito.ts | 6 +- .../sdk/js/solana_utils/src/transaction.ts | 72 +++--- target_chains/sui/cli/src/cli.ts | 48 ++-- target_chains/sui/cli/src/pyth_deploy.ts | 26 +- target_chains/sui/cli/src/upgrade_pyth.ts | 14 +- target_chains/sui/sdk/js-iota/src/client.ts | 24 +- .../sui/sdk/js-iota/src/examples/IotaRelay.ts | 2 +- target_chains/sui/sdk/js/src/client.ts | 24 +- .../sui/sdk/js/src/examples/SuiRelay.ts | 2 +- .../ton/contracts/scripts/deployPyth.ts | 18 +- .../ton/contracts/tests/Main.spec.ts | 2 +- .../ton/contracts/tests/PythTest.spec.ts | 171 +++++++------ .../ton/contracts/tests/WormholeTest.spec.ts | 34 +-- .../ton/contracts/tests/utils/wormhole.ts | 8 +- .../ton/contracts/wrappers/BaseWrapper.ts | 36 +-- target_chains/ton/contracts/wrappers/Main.ts | 18 +- .../ton/contracts/wrappers/PythTest.ts | 38 +-- .../ton/contracts/wrappers/WormholeTest.ts | 10 +- target_chains/ton/sdk/js/src/index.ts | 20 +- 211 files changed, 2495 insertions(+), 2439 deletions(-) diff --git a/apps/hermes/client/js/src/HermesClient.ts b/apps/hermes/client/js/src/HermesClient.ts index 220f3b77b9..0d918a5b43 100644 --- a/apps/hermes/client/js/src/HermesClient.ts +++ b/apps/hermes/client/js/src/HermesClient.ts @@ -63,7 +63,7 @@ export class HermesClient { schema: z.ZodSchema, options?: RequestInit, retries = this.httpRetries, - backoff = 100 + Math.floor(Math.random() * 100) // Adding randomness to the initial backoff to avoid "thundering herd" scenario where a lot of clients that get kicked off all at the same time (say some script or something) and fail to connect all retry at exactly the same time too + backoff = 100 + Math.floor(Math.random() * 100), // Adding randomness to the initial backoff to avoid "thundering herd" scenario where a lot of clients that get kicked off all at the same time (say some script or something) and fail to connect all retry at exactly the same time too ): Promise { try { const response = await fetch(url, { @@ -79,7 +79,7 @@ export class HermesClient { throw new Error( `HTTP error! status: ${response.status}${ errorBody ? `, body: ${errorBody}` : "" - }` + }`, ); } const data = await response.json(); @@ -124,7 +124,7 @@ export class HermesClient { return await this.httpRequest( url.toString(), schemas.PriceFeedMetadata.array(), - fetchOptions + fetchOptions, ); } @@ -154,7 +154,7 @@ export class HermesClient { return await this.httpRequest( url.toString(), schemas.LatestPublisherStakeCapsUpdateDataResponse, - fetchOptions + fetchOptions, ); } @@ -178,7 +178,7 @@ export class HermesClient { parsed?: boolean; ignoreInvalidPriceIds?: boolean; }, - fetchOptions?: RequestInit + fetchOptions?: RequestInit, ): Promise { const url = this.buildURL("updates/price/latest"); for (const id of ids) { @@ -215,7 +215,7 @@ export class HermesClient { parsed?: boolean; ignoreInvalidPriceIds?: boolean; }, - fetchOptions?: RequestInit + fetchOptions?: RequestInit, ): Promise { const url = this.buildURL(`updates/price/${publishTime}`); for (const id of ids) { @@ -255,7 +255,7 @@ export class HermesClient { allowUnordered?: boolean; benchmarksOnly?: boolean; ignoreInvalidPriceIds?: boolean; - } + }, ): Promise { const url = this.buildURL("updates/price/stream"); ids.forEach((id) => { @@ -302,7 +302,7 @@ export class HermesClient { parsed?: boolean; ignoreInvalidPriceIds?: boolean; }, - fetchOptions?: RequestInit + fetchOptions?: RequestInit, ): Promise { const url = this.buildURL(`updates/twap/${window_seconds}/latest`); for (const id of ids) { @@ -317,13 +317,13 @@ export class HermesClient { return this.httpRequest( url.toString(), schemas.TwapsResponse, - fetchOptions + fetchOptions, ); } private appendUrlSearchParams( url: URL, - params: Record + params: Record, ) { Object.entries(params).forEach(([key, value]) => { if (value !== undefined) { @@ -337,7 +337,7 @@ export class HermesClient { `./v2/${endpoint}`, // We ensure the `baseURL` ends with a `/` so that URL doesn't resolve the // path relative to the parent. - `${this.baseURL}${this.baseURL.endsWith("/") ? "" : "/"}` + `${this.baseURL}${this.baseURL.endsWith("/") ? "" : "/"}`, ); } } diff --git a/apps/hermes/client/js/src/examples/HermesClient.ts b/apps/hermes/client/js/src/examples/HermesClient.ts index 6cb7f31fd7..dfbd03af82 100644 --- a/apps/hermes/client/js/src/examples/HermesClient.ts +++ b/apps/hermes/client/js/src/examples/HermesClient.ts @@ -43,7 +43,7 @@ function extractBasicAuthorizationHeadersFromUrl(urlString: string): { if (url.username && url.password) { headers["Authorization"] = `Basic ${btoa( - `${url.username}:${url.password}` + `${url.username}:${url.password}`, )}`; url.username = ""; url.password = ""; @@ -54,7 +54,7 @@ function extractBasicAuthorizationHeadersFromUrl(urlString: string): { async function run() { const { endpoint, headers } = extractBasicAuthorizationHeadersFromUrl( - argv.endpoint + argv.endpoint, ); const connection = new HermesClient(endpoint, { headers }); diff --git a/apps/hermes/client/js/src/utils.ts b/apps/hermes/client/js/src/utils.ts index bac6b59f43..36776f8e39 100644 --- a/apps/hermes/client/js/src/utils.ts +++ b/apps/hermes/client/js/src/utils.ts @@ -3,7 +3,7 @@ function camelToSnakeCase(str: string): string { } export function camelToSnakeCaseObject( - obj: Record + obj: Record, ): Record { const result: Record = {}; Object.keys(obj).forEach((key) => { diff --git a/apps/price_pusher/src/aptos/aptos.ts b/apps/price_pusher/src/aptos/aptos.ts index 6341dfbe96..fe95a5f73d 100644 --- a/apps/price_pusher/src/aptos/aptos.ts +++ b/apps/price_pusher/src/aptos/aptos.ts @@ -17,7 +17,7 @@ export class AptosPriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); } @@ -27,7 +27,7 @@ export class AptosPriceListener extends ChainPriceListener { const res = await client.getAccountResource( this.pythModule, - `${this.pythModule}::state::LatestPriceInfo` + `${this.pythModule}::state::LatestPriceInfo`, ); try { @@ -50,8 +50,8 @@ export class AptosPriceListener extends ChainPriceListener { this.logger.debug( `Polled an Aptos on-chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); return { @@ -62,7 +62,7 @@ export class AptosPriceListener extends ChainPriceListener { } catch (err) { this.logger.error( err, - `Polling Aptos on-chain price for ${priceId} failed.` + `Polling Aptos on-chain price for ${priceId} failed.`, ); return undefined; } @@ -94,7 +94,7 @@ export class AptosPricePusher implements IPricePusher { private pythContractAddress: string, private endpoint: string, private mnemonic: string, - private overrideGasPriceMultiplier: number + private overrideGasPriceMultiplier: number, ) { this.sequenceNumberLocked = false; } @@ -111,13 +111,13 @@ export class AptosPricePusher implements IPricePusher { encoding: "base64", }); return response.binary.data.map((data) => - Array.from(Buffer.from(data, "base64")) + Array.from(Buffer.from(data, "base64")), ); } async updatePriceFeed( priceIds: string[], - pubTimesToPush: number[] + pubTimesToPush: number[], ): Promise { if (priceIds.length === 0) { return; @@ -137,7 +137,7 @@ export class AptosPricePusher implements IPricePusher { const account = AptosAccount.fromDerivePath( APTOS_ACCOUNT_HD_PATH, - this.mnemonic + this.mnemonic, ); const client = new AptosClient(this.endpoint); @@ -151,7 +151,7 @@ export class AptosPricePusher implements IPricePusher { }, { sequence_number: sequenceNumber.toFixed(), - } + }, ); try { @@ -160,7 +160,7 @@ export class AptosPricePusher implements IPricePusher { this.logger.debug( { hash: pendingTx.hash }, - "Successfully broadcasted tx." + "Successfully broadcasted tx.", ); // Sometimes broadcasted txs don't make it on-chain and they cause our sequence number @@ -183,7 +183,7 @@ export class AptosPricePusher implements IPricePusher { // Wait for the transaction to be confirmed. If it fails, reset the sequence number. private async waitForTransactionConfirmation( client: AptosClient, - txHash: string + txHash: string, ): Promise { try { await client.waitForTransaction(txHash, { @@ -195,7 +195,7 @@ export class AptosPricePusher implements IPricePusher { } catch (err) { this.logger.error( { err, hash: txHash }, - `Transaction failed to confirm.` + `Transaction failed to confirm.`, ); this.lastSequenceNumber = undefined; @@ -207,7 +207,7 @@ export class AptosPricePusher implements IPricePusher { // the blockchain itself (and caches it for later). private async tryGetNextSequenceNumber( client: AptosClient, - account: AptosAccount + account: AptosAccount, ): Promise { if (this.lastSequenceNumber !== undefined) { this.lastSequenceNumber += 1; @@ -220,10 +220,10 @@ export class AptosPricePusher implements IPricePusher { try { this.sequenceNumberLocked = true; this.lastSequenceNumber = Number( - (await client.getAccount(account.address())).sequence_number + (await client.getAccount(account.address())).sequence_number, ); this.logger.debug( - `Fetched account sequence number: ${this.lastSequenceNumber}` + `Fetched account sequence number: ${this.lastSequenceNumber}`, ); return this.lastSequenceNumber; } catch (e: any) { diff --git a/apps/price_pusher/src/aptos/command.ts b/apps/price_pusher/src/aptos/command.ts index 74a3adf0c0..675b451d05 100644 --- a/apps/price_pusher/src/aptos/command.ts +++ b/apps/price_pusher/src/aptos/command.ts @@ -64,7 +64,7 @@ export default { const mnemonic = fs.readFileSync(mnemonicFile, "utf-8").trim(); const account = AptosAccount.fromDerivePath( APTOS_ACCOUNT_HD_PATH, - mnemonic + mnemonic, ); logger.info(`Pushing from account address: ${account.address()}`); @@ -78,7 +78,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -87,7 +87,7 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const aptosListener = new AptosPriceListener( @@ -95,7 +95,7 @@ export default { endpoint, priceItems, logger.child({ module: "AptosPriceListener" }), - { pollingFrequency } + { pollingFrequency }, ); const aptosPusher = new AptosPricePusher( @@ -104,7 +104,7 @@ export default { pythContractAddress, endpoint, mnemonic, - overrideGasPriceMultiplier + overrideGasPriceMultiplier, ); const controller = new Controller( @@ -113,7 +113,7 @@ export default { aptosListener, aptosPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); controller.start(); diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 2788066e1c..418f1ea732 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -14,7 +14,7 @@ export class Controller { private logger: Logger, config: { pushingFrequency: DurationInSeconds; - } + }, ) { this.pushingFrequency = config.pushingFrequency; } @@ -48,7 +48,7 @@ export class Controller { priceConfig, sourceLatestPrice, targetLatestPrice, - this.logger + this.logger, ); if (priceShouldUpdate == UpdateCondition.YES) { pushThresholdMet = true; @@ -70,7 +70,7 @@ export class Controller { alias: priceConfig.alias, })), }, - "Some of the checks triggered pushing update. Will push the updates for some feeds." + "Some of the checks triggered pushing update. Will push the updates for some feeds.", ); // note that the priceIds are without leading "0x" diff --git a/apps/price_pusher/src/evm/command.ts b/apps/price_pusher/src/evm/command.ts index 40f0967c41..be6f3af08f 100644 --- a/apps/price_pusher/src/evm/command.ts +++ b/apps/price_pusher/src/evm/command.ts @@ -125,7 +125,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -134,14 +134,14 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const client = await createClient(endpoint, mnemonic); const pythContract = createPythContract(client, pythContractAddress); logger.info( - `Pushing updates from wallet address: ${client.account.address}` + `Pushing updates from wallet address: ${client.account.address}`, ); // It is possible to watch the events in the non-ws endpoints, either by getFilter @@ -156,13 +156,13 @@ export default { logger.child({ module: "EvmPriceListener" }), { pollingFrequency, - } + }, ); const gasStation = getCustomGasStation( logger.child({ module: "CustomGasStation" }), customGasStation, - txSpeed + txSpeed, ); const evmPusher = new EvmPricePusher( hermesClient, @@ -174,7 +174,7 @@ export default { updateFeeMultiplier, gasLimit, gasStation, - gasPrice + gasPrice, ); const controller = new Controller( @@ -183,7 +183,7 @@ export default { evmListener, evmPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); controller.start(); diff --git a/apps/price_pusher/src/evm/custom-gas-station.ts b/apps/price_pusher/src/evm/custom-gas-station.ts index 0e84dc04ac..3658d56e31 100644 --- a/apps/price_pusher/src/evm/custom-gas-station.ts +++ b/apps/price_pusher/src/evm/custom-gas-station.ts @@ -36,7 +36,7 @@ export class CustomGasStation { } catch (err) { this.logger.error( err, - "Failed to fetch gas price from Matic mainnet. Returning undefined" + "Failed to fetch gas price from Matic mainnet. Returning undefined", ); return undefined; } @@ -46,7 +46,7 @@ export class CustomGasStation { export function getCustomGasStation( logger: Logger, customGasStation?: number, - txSpeed?: string + txSpeed?: string, ) { if (customGasStation && txSpeed) { return new CustomGasStation(logger, customGasStation, txSpeed); diff --git a/apps/price_pusher/src/evm/evm.ts b/apps/price_pusher/src/evm/evm.ts index 8f8b22e2fd..744fc638a0 100644 --- a/apps/price_pusher/src/evm/evm.ts +++ b/apps/price_pusher/src/evm/evm.ts @@ -41,7 +41,7 @@ export class EvmPriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); @@ -58,7 +58,7 @@ export class EvmPriceListener extends ChainPriceListener { } else { this.logger.info( "The target network RPC endpoint is not Websocket. " + - "Listening for updates only via polling...." + "Listening for updates only via polling....", ); } @@ -69,12 +69,12 @@ export class EvmPriceListener extends ChainPriceListener { private async startWatching() { this.pythContract.watchEvent.PriceFeedUpdate( { id: this.priceItems.map((item) => addLeading0x(item.id)) }, - { strict: true, onLogs: this.onPriceFeedUpdate.bind(this) } + { strict: true, onLogs: this.onPriceFeedUpdate.bind(this) }, ); } private onPriceFeedUpdate( - logs: WatchContractEventOnLogsParameter + logs: WatchContractEventOnLogsParameter, ) { for (const log of logs) { const priceId = removeLeading0x(assertDefined(log.args.id)); @@ -88,8 +88,8 @@ export class EvmPriceListener extends ChainPriceListener { this.logger.debug( { priceInfo }, `Received a new Evm PriceFeedUpdate event for price feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); this.updateLatestPriceInfo(priceId, priceInfo); @@ -97,7 +97,7 @@ export class EvmPriceListener extends ChainPriceListener { } async getOnChainPriceInfo( - priceId: HexString + priceId: HexString, ): Promise { let priceRaw: any; try { @@ -111,8 +111,8 @@ export class EvmPriceListener extends ChainPriceListener { this.logger.debug( `Polled an EVM on chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); return { @@ -137,7 +137,7 @@ export class EvmPricePusher implements IPricePusher { private updateFeeMultiplier: number, private gasLimit?: number, private customGasStation?: CustomGasStation, - private gasPrice?: number + private gasPrice?: number, ) {} // The pubTimes are passed here to use the values that triggered the push. @@ -148,7 +148,7 @@ export class EvmPricePusher implements IPricePusher { // is not landed yet. async updatePriceFeed( priceIds: string[], - pubTimesToPush: UnixTimestamp[] + pubTimesToPush: UnixTimestamp[], ): Promise { if (priceIds.length === 0) { return; @@ -158,11 +158,11 @@ export class EvmPricePusher implements IPricePusher { throw new Error("Invalid arguments"); const priceFeedUpdateData = (await this.getPriceFeedsUpdateData( - priceIds + priceIds, )) as `0x${string}`[]; const priceFeedUpdateDataWith0x = priceFeedUpdateData.map((data) => - addLeading0x(data) + addLeading0x(data), ); let updateFee; @@ -172,13 +172,13 @@ export class EvmPricePusher implements IPricePusher { priceFeedUpdateDataWith0x, ]); updateFee = BigInt( - Math.round(Number(updateFee) * (this.updateFeeMultiplier || 1)) + Math.round(Number(updateFee) * (this.updateFeeMultiplier || 1)), ); this.logger.debug(`Update fee: ${updateFee}`); } catch (e: any) { this.logger.error( e, - "An unidentified error has occured when getting the update fee." + "An unidentified error has occured when getting the update fee.", ); throw e; } @@ -191,7 +191,7 @@ export class EvmPricePusher implements IPricePusher { this.gasPrice ?? Number( await (this.customGasStation?.getCustomGasPrice() ?? - this.client.getGasPrice()) + this.client.getGasPrice()), ); // Try to re-use the same nonce and increase the gas if the last tx is not landed yet. @@ -221,7 +221,7 @@ export class EvmPricePusher implements IPricePusher { ) { gasPrice = Math.min( gasPriceToOverride, - gasPrice * this.overrideGasPriceMultiplierCap + gasPrice * this.overrideGasPriceMultiplierCap, ); } @@ -230,7 +230,7 @@ export class EvmPricePusher implements IPricePusher { this.logger.debug(`Using gas price: ${gasPrice} and nonce: ${txNonce}`); const pubTimesToPushParam = pubTimesToPush.map((pubTime) => - BigInt(pubTime) + BigInt(pubTime), ); const priceIdsWith0x = priceIds.map((priceId) => addLeading0x(priceId)); @@ -247,7 +247,7 @@ export class EvmPricePusher implements IPricePusher { this.gasLimit !== undefined ? BigInt(Math.ceil(this.gasLimit)) : undefined, - } + }, ); this.logger.debug({ request }, "Simulated request successfully"); @@ -265,11 +265,11 @@ export class EvmPricePusher implements IPricePusher { err.walk( (e) => e instanceof ContractFunctionRevertedError && - e.data?.errorName === "NoFreshUpdate" + e.data?.errorName === "NoFreshUpdate", ) ) { this.logger.info( - "Simulation reverted because none of the updates are fresh. This is an expected behaviour to save gas. Skipping this push." + "Simulation reverted because none of the updates are fresh. This is an expected behaviour to save gas. Skipping this push.", ); return; } @@ -278,7 +278,7 @@ export class EvmPricePusher implements IPricePusher { this.logger.error( { err }, "Wallet doesn't have enough balance. In rare cases, there might be issues with gas price " + - "calculation in the RPC." + "calculation in the RPC.", ); throw err; } @@ -288,14 +288,14 @@ export class EvmPricePusher implements IPricePusher { err.walk( (e) => e instanceof InternalRpcError && - e.details.includes("replacement transaction underpriced") + e.details.includes("replacement transaction underpriced"), ) ) { this.logger.warn( "The gas price of the transaction is too low or there is an existing transaction with higher gas with the same nonce. " + "The price will be increased in the next push. Skipping this push. " + "If this keeps happening or transactions are not landing you need to increase the override gas price " + - "multiplier and the cap to increase the likelihood of the transaction landing on-chain." + "multiplier and the cap to increase the likelihood of the transaction landing on-chain.", ); return; } @@ -305,11 +305,11 @@ export class EvmPricePusher implements IPricePusher { (e) => e instanceof TransactionExecutionError && (e.details.includes("nonce too low") || - e.message.includes("Nonce provided for the transaction")) + e.message.includes("Nonce provided for the transaction")), ) ) { this.logger.info( - "The nonce is incorrect. This is an expected behaviour in high frequency or multi-instance setup. Skipping this push." + "The nonce is incorrect. This is an expected behaviour in high frequency or multi-instance setup. Skipping this push.", ); return; } @@ -319,7 +319,7 @@ export class EvmPricePusher implements IPricePusher { this.logger.warn( { err }, "The contract function execution failed in simulation. This is an expected behaviour in high frequency or multi-instance setup. " + - "Please review this error and file an issue if it is a bug. Skipping this push." + "Please review this error and file an issue if it is a bug. Skipping this push.", ); return; } @@ -330,7 +330,7 @@ export class EvmPricePusher implements IPricePusher { this.logger.error( { err }, "Transaction execution failed. This is an expected behaviour in high frequency or multi-instance setup. " + - "Please review this error and file an issue if it is a bug. Skipping this push." + "Please review this error and file an issue if it is a bug. Skipping this push.", ); return; } @@ -343,7 +343,7 @@ export class EvmPricePusher implements IPricePusher { err.message.includes("invalid nonce") ) { this.logger.info( - "The nonce is incorrect (are multiple users using this account?). Skipping this push." + "The nonce is incorrect (are multiple users using this account?). Skipping this push.", ); return; } @@ -355,7 +355,7 @@ export class EvmPricePusher implements IPricePusher { // and increase the gas price accordingly. this.logger.warn( "The transaction failed with error: max fee per gas less than block base fee. " + - "The fee will be increased in the next push. Skipping this push." + "The fee will be increased in the next push. Skipping this push.", ); return; } @@ -369,7 +369,7 @@ export class EvmPricePusher implements IPricePusher { if (err.message.includes("could not replace existing tx")) { this.logger.error( - "A transaction with the same nonce has been mined and this one is no longer needed. Skipping this push." + "A transaction with the same nonce has been mined and this one is no longer needed. Skipping this push.", ); return; } @@ -379,7 +379,7 @@ export class EvmPricePusher implements IPricePusher { this.logger.error( { err }, "The transaction failed with an unhandled error. crashing the process. " + - "Please review this error and file an issue if it is a bug." + "Please review this error and file an issue if it is a bug.", ); throw err; } @@ -406,7 +406,7 @@ export class EvmPricePusher implements IPricePusher { this.logger.info( { hash, receipt }, "Price update did not succeed or its transaction did not land. " + - "This is an expected behaviour in high frequency or multi-instance setup." + "This is an expected behaviour in high frequency or multi-instance setup.", ); } } catch (err: any) { @@ -415,7 +415,7 @@ export class EvmPricePusher implements IPricePusher { } private async getPriceFeedsUpdateData( - priceIds: HexString[] + priceIds: HexString[], ): Promise { const response = await this.hermesClient.getLatestPriceUpdates(priceIds, { encoding: "hex", diff --git a/apps/price_pusher/src/evm/pyth-contract.ts b/apps/price_pusher/src/evm/pyth-contract.ts index f5092696e4..5edcca8ff0 100644 --- a/apps/price_pusher/src/evm/pyth-contract.ts +++ b/apps/price_pusher/src/evm/pyth-contract.ts @@ -9,7 +9,7 @@ export type PythContract = GetContractReturnType< export const createPythContract = ( client: SuperWalletClient, - address: Address + address: Address, ): PythContract => getContract({ client, diff --git a/apps/price_pusher/src/evm/super-wallet.ts b/apps/price_pusher/src/evm/super-wallet.ts index 9462ec81fa..809f47af1e 100644 --- a/apps/price_pusher/src/evm/super-wallet.ts +++ b/apps/price_pusher/src/evm/super-wallet.ts @@ -55,7 +55,7 @@ const getChainById = (chainId: number): Chain => export const createClient = async ( endpoint: string, - mnemonic: string + mnemonic: string, ): Promise => { const transport = getTransport(endpoint); diff --git a/apps/price_pusher/src/fuel/command.ts b/apps/price_pusher/src/fuel/command.ts index 1f344e79e4..e066a2611c 100644 --- a/apps/price_pusher/src/fuel/command.ts +++ b/apps/price_pusher/src/fuel/command.ts @@ -64,7 +64,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -73,7 +73,7 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const provider = await Provider.create(endpoint); @@ -85,14 +85,14 @@ export default { pythContractAddress, priceItems, logger.child({ module: "FuelPriceListener" }), - { pollingFrequency } + { pollingFrequency }, ); const fuelPricePusher = new FuelPricePusher( wallet, pythContractAddress, hermesClient, - logger.child({ module: "FuelPricePusher" }) + logger.child({ module: "FuelPricePusher" }), ); const controller = new Controller( @@ -101,7 +101,7 @@ export default { fuelPriceListener, fuelPricePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); await controller.start(); diff --git a/apps/price_pusher/src/fuel/fuel.ts b/apps/price_pusher/src/fuel/fuel.ts index 25e7a71e5e..0d6edb9f1a 100644 --- a/apps/price_pusher/src/fuel/fuel.ts +++ b/apps/price_pusher/src/fuel/fuel.ts @@ -31,13 +31,13 @@ export class FuelPriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); this.contract = new Contract( this.pythContractId, PYTH_CONTRACT_ABI, - this.provider + this.provider, ); } @@ -56,8 +56,8 @@ export class FuelPriceListener extends ChainPriceListener { this.logger.debug( `Polled a Fuel on chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); return { @@ -79,19 +79,19 @@ export class FuelPricePusher implements IPricePusher { private wallet: Wallet, private pythContractId: string, private hermesClient: HermesClient, - private logger: Logger + private logger: Logger, ) { this.contract = new Contract( this.pythContractId, PYTH_CONTRACT_ABI, - this.wallet as Provider + this.wallet as Provider, ); } async updatePriceFeed( priceIds: string[], // eslint-disable-next-line @typescript-eslint/no-unused-vars - pubTimesToPush: number[] + pubTimesToPush: number[], ): Promise { if (priceIds.length === 0) { return; @@ -124,7 +124,7 @@ export class FuelPricePusher implements IPricePusher { this.logger.info( { transactionId: result.transactionId }, - "updatePriceFeed successful" + "updatePriceFeed successful", ); } catch (err: any) { this.logger.error(err, "updatePriceFeed failed"); diff --git a/apps/price_pusher/src/injective/command.ts b/apps/price_pusher/src/injective/command.ts index a73d200cfb..9eea474023 100644 --- a/apps/price_pusher/src/injective/command.ts +++ b/apps/price_pusher/src/injective/command.ts @@ -80,7 +80,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -89,7 +89,7 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const injectiveListener = new InjectivePriceListener( @@ -99,7 +99,7 @@ export default { logger.child({ module: "InjectivePriceListener" }), { pollingFrequency, - } + }, ); const injectivePusher = new InjectivePricePusher( hermesClient, @@ -111,7 +111,7 @@ export default { chainId: getNetworkInfo(network).chainId, gasPrice, gasMultiplier, - } + }, ); const controller = new Controller( @@ -120,7 +120,7 @@ export default { injectiveListener, injectivePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); controller.start(); diff --git a/apps/price_pusher/src/injective/injective.ts b/apps/price_pusher/src/injective/injective.ts index e6d5c367a2..95ac929e0c 100644 --- a/apps/price_pusher/src/injective/injective.ts +++ b/apps/price_pusher/src/injective/injective.ts @@ -49,20 +49,20 @@ export class InjectivePriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); } async getOnChainPriceInfo( - priceId: HexString + priceId: HexString, ): Promise { let priceQueryResponse: PriceQueryResponse; try { const api = new ChainGrpcWasmApi(this.grpcEndpoint); const { data } = await api.fetchSmartContractState( this.pythContractAddress, - Buffer.from(`{"price_feed":{"id":"${priceId}"}}`).toString("base64") + Buffer.from(`{"price_feed":{"id":"${priceId}"}}`).toString("base64"), ); const json = Buffer.from(data).toString(); @@ -74,8 +74,8 @@ export class InjectivePriceListener extends ChainPriceListener { this.logger.debug( `Polled an Injective on chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); return { @@ -102,7 +102,7 @@ export class InjectivePricePusher implements IPricePusher { private grpcEndpoint: string, private logger: Logger, mnemonic: string, - chainConfig?: Partial + chainConfig?: Partial, ) { this.wallet = PrivateKey.fromMnemonic(mnemonic); @@ -121,7 +121,7 @@ export class InjectivePricePusher implements IPricePusher { const chainGrpcAuthApi = new ChainGrpcAuthApi(this.grpcEndpoint); // Fetch the latest account details only if it's not stored. this.account ??= await chainGrpcAuthApi.fetchAccount( - this.injectiveAddress() + this.injectiveAddress(), ); const { txRaw: simulateTxRaw } = createTransactionFromMsg({ @@ -198,7 +198,7 @@ export class InjectivePricePusher implements IPricePusher { async updatePriceFeed( priceIds: string[], - pubTimesToPush: number[] + pubTimesToPush: number[], ): Promise { if (priceIds.length === 0) { return; @@ -226,8 +226,8 @@ export class InjectivePricePusher implements IPricePusher { get_update_fee: { vaas: priceFeedUpdateObject.update_price_feeds.data, }, - }) - ).toString("base64") + }), + ).toString("base64"), ); const json = Buffer.from(data).toString(); diff --git a/apps/price_pusher/src/interface.ts b/apps/price_pusher/src/interface.ts index a09ddb7927..cb945b2c33 100644 --- a/apps/price_pusher/src/interface.ts +++ b/apps/price_pusher/src/interface.ts @@ -24,11 +24,11 @@ export abstract class ChainPriceListener implements IPriceListener { constructor( private pollingFrequency: DurationInSeconds, - protected priceItems: PriceItem[] + protected priceItems: PriceItem[], ) { this.latestPriceInfo = new Map(); this.priceIdToAlias = new Map( - priceItems.map(({ id, alias }) => [id, alias]) + priceItems.map(({ id, alias }) => [id, alias]), ); } @@ -49,7 +49,7 @@ export abstract class ChainPriceListener implements IPriceListener { protected updateLatestPriceInfo( priceId: HexString, - observedPrice: PriceInfo + observedPrice: PriceInfo, ) { const cachedLatestPriceInfo = this.getLatestPriceInfo(priceId); @@ -72,13 +72,13 @@ export abstract class ChainPriceListener implements IPriceListener { } abstract getOnChainPriceInfo( - priceId: HexString + priceId: HexString, ): Promise; } export interface IPricePusher { updatePriceFeed( priceIds: string[], - pubTimesToPush: UnixTimestamp[] + pubTimesToPush: UnixTimestamp[], ): Promise; } diff --git a/apps/price_pusher/src/near/command.ts b/apps/price_pusher/src/near/command.ts index b4f5aaf7d4..8c83b99c33 100644 --- a/apps/price_pusher/src/near/command.ts +++ b/apps/price_pusher/src/near/command.ts @@ -72,7 +72,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -81,7 +81,7 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger + logger, ); const nearAccount = new NearAccount( @@ -89,7 +89,7 @@ export default { accountId, nodeUrl, privateKeyPath, - pythContractAddress + pythContractAddress, ); const nearListener = new NearPriceListener( @@ -98,13 +98,13 @@ export default { logger.child({ module: "NearPriceListener" }), { pollingFrequency, - } + }, ); const nearPusher = new NearPricePusher( nearAccount, hermesClient, - logger.child({ module: "NearPricePusher" }) + logger.child({ module: "NearPricePusher" }), ); const controller = new Controller( @@ -113,7 +113,7 @@ export default { nearListener, nearPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); controller.start(); diff --git a/apps/price_pusher/src/near/near.ts b/apps/price_pusher/src/near/near.ts index ffc1e77053..41a3000557 100644 --- a/apps/price_pusher/src/near/near.ts +++ b/apps/price_pusher/src/near/near.ts @@ -27,7 +27,7 @@ export class NearPriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); } @@ -38,8 +38,8 @@ export class NearPriceListener extends ChainPriceListener { this.logger.debug( `Polled a NEAR on chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}) ${JSON.stringify(priceRaw)}.` + priceId, + )} (${priceId}) ${JSON.stringify(priceRaw)}.`, ); if (priceRaw) { @@ -62,12 +62,12 @@ export class NearPricePusher implements IPricePusher { constructor( private account: NearAccount, private hermesClient: HermesClient, - private logger: Logger + private logger: Logger, ) {} async updatePriceFeed( priceIds: string[], - pubTimesToPush: number[] + pubTimesToPush: number[], ): Promise { if (priceIds.length === 0) { return; @@ -102,7 +102,7 @@ export class NearPricePusher implements IPricePusher { if ( Object.prototype.hasOwnProperty.call( receipt["outcome"]["status"], - "Failure" + "Failure", ) ) { failureMessages.push(receipt["outcome"]["status"]); @@ -110,12 +110,12 @@ export class NearPricePusher implements IPricePusher { } return is_success; }, - true + true, ); if (is_success) { this.logger.info( { hash: outcome["transaction"]["hash"] }, - "updatePriceFeeds successful." + "updatePriceFeeds successful.", ); } else { this.logger.error({ failureMessages }, "updatePriceFeeds failed"); @@ -127,7 +127,7 @@ export class NearPricePusher implements IPricePusher { } private async getPriceFeedsUpdateData( - priceIds: HexString[] + priceIds: HexString[], ): Promise { const response = await this.hermesClient.getLatestPriceUpdates(priceIds, { encoding: "base64", @@ -144,13 +144,13 @@ export class NearAccount { accountId: string, nodeUrl: string, privateKeyPath: string | undefined, - private pythAccountId: string + private pythAccountId: string, ) { const connection = this.getConnection( network, accountId, nodeUrl, - privateKeyPath + privateKeyPath, ); this.account = new Account(connection, accountId); } @@ -177,7 +177,7 @@ export class NearAccount { async updatePriceFeeds( data: string, - updateFee: any + updateFee: any, ): Promise { return await this.account.functionCall({ contractId: this.pythAccountId, @@ -194,7 +194,7 @@ export class NearAccount { network: string, accountId: string, nodeUrl: string, - privateKeyPath: string | undefined + privateKeyPath: string | undefined, ): Connection { const content = fs.readFileSync( privateKeyPath || @@ -202,8 +202,8 @@ export class NearAccount { os.homedir(), ".near-credentials", network, - accountId + ".json" - ) + accountId + ".json", + ), ); const accountInfo = JSON.parse(content.toString()); let privateKey = accountInfo.private_key; diff --git a/apps/price_pusher/src/price-config.ts b/apps/price_pusher/src/price-config.ts index bbd8d1be3e..3a1679c94c 100644 --- a/apps/price_pusher/src/price-config.ts +++ b/apps/price_pusher/src/price-config.ts @@ -21,7 +21,7 @@ const PriceConfigFileSchema: Joi.Schema = Joi.array() price_deviation: Joi.number().optional(), confidence_ratio: Joi.number().optional(), }).optional(), - }) + }), ) .unique("id") .unique("alias") @@ -92,7 +92,7 @@ export function shouldUpdate( priceConfig: PriceConfig, sourceLatestPrice: PriceInfo | undefined, targetLatestPrice: PriceInfo | undefined, - logger: Logger + logger: Logger, ): UpdateCondition { const priceId = priceConfig.id; @@ -104,7 +104,7 @@ export function shouldUpdate( // It means that price never existed there. So we should push the latest price feed. if (targetLatestPrice === undefined) { logger.info( - `${priceConfig.alias} (${priceId}) is not available on the target network. Pushing the price.` + `${priceConfig.alias} (${priceId}) is not available on the target network. Pushing the price.`, ); return UpdateCondition.YES; } @@ -119,12 +119,12 @@ export function shouldUpdate( const priceDeviationPct = (Math.abs( - Number(sourceLatestPrice.price) - Number(targetLatestPrice.price) + Number(sourceLatestPrice.price) - Number(targetLatestPrice.price), ) / Number(targetLatestPrice.price)) * 100; const confidenceRatioPct = Math.abs( - (Number(sourceLatestPrice.conf) / Number(sourceLatestPrice.price)) * 100 + (Number(sourceLatestPrice.conf) / Number(sourceLatestPrice.price)) * 100, ); logger.info( @@ -140,7 +140,7 @@ export function shouldUpdate( }%? / early: < ${priceConfig.earlyUpdatePriceDeviation}%?) OR ` + `Confidence ratio: ${confidenceRatioPct.toFixed(5)}% (< ${ priceConfig.confidenceRatio - }%? / early: < ${priceConfig.earlyUpdatePriceDeviation}%?)` + }%? / early: < ${priceConfig.earlyUpdatePriceDeviation}%?)`, ); if ( diff --git a/apps/price_pusher/src/pyth-price-listener.ts b/apps/price_pusher/src/pyth-price-listener.ts index f54a1a0bfd..6a70a3c7a3 100644 --- a/apps/price_pusher/src/pyth-price-listener.ts +++ b/apps/price_pusher/src/pyth-price-listener.ts @@ -20,12 +20,12 @@ export class PythPriceListener implements IPriceListener { constructor( hermesClient: HermesClient, priceItems: PriceItem[], - logger: Logger + logger: Logger, ) { this.hermesClient = hermesClient; this.priceIds = priceItems.map((priceItem) => priceItem.id); this.priceIdToAlias = new Map( - priceItems.map((priceItem) => [priceItem.id, priceItem.alias]) + priceItems.map((priceItem) => [priceItem.id, priceItem.alias]), ); this.latestPriceInfo = new Map(); this.logger = logger; @@ -39,15 +39,15 @@ export class PythPriceListener implements IPriceListener { { parsed: true, ignoreInvalidPriceIds: true, - } + }, ); eventSource.onmessage = (event: MessageEvent) => { const priceUpdates = JSON.parse(event.data) as PriceUpdate; priceUpdates.parsed?.forEach((priceUpdate) => { this.logger.debug( `Received new price feed update from Pyth price service: ${this.priceIdToAlias.get( - priceUpdate.id - )} ${priceUpdate.id}` + priceUpdate.id, + )} ${priceUpdate.id}`, ); // Consider price to be currently available if it is not older than 60s diff --git a/apps/price_pusher/src/solana/command.ts b/apps/price_pusher/src/solana/command.ts index f0077ffbdd..6070126e06 100644 --- a/apps/price_pusher/src/solana/command.ts +++ b/apps/price_pusher/src/solana/command.ts @@ -140,7 +140,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -149,13 +149,13 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const wallet = new NodeWallet( Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(fs.readFileSync(keypairFile, "ascii"))) - ) + Uint8Array.from(JSON.parse(fs.readFileSync(keypairFile, "ascii"))), + ), ); const connection = new Connection(endpoint, "processed"); @@ -176,7 +176,7 @@ export default { let solanaPricePusher; if (jitoTipLamports) { const jitoKeypair = Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(fs.readFileSync(jitoKeypairFile, "ascii"))) + Uint8Array.from(JSON.parse(fs.readFileSync(jitoKeypairFile, "ascii"))), ); const jitoClient = searcherClient(jitoEndpoint, jitoKeypair); @@ -191,7 +191,7 @@ export default { jitoClient, jitoBundleSize, updatesPerJitoBundle, - lookupTableAccount + lookupTableAccount, ); onBundleResult(jitoClient, logger.child({ module: "JitoClient" })); @@ -202,7 +202,7 @@ export default { logger.child({ module: "SolanaPricePusher" }), shardId, computeUnitPriceMicroLamports, - lookupTableAccount + lookupTableAccount, ); } @@ -211,7 +211,7 @@ export default { shardId, priceItems, logger.child({ module: "SolanaPriceListener" }), - { pollingFrequency } + { pollingFrequency }, ); const controller = new Controller( @@ -220,7 +220,7 @@ export default { solanaPriceListener, solanaPricePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); controller.start(); @@ -232,6 +232,6 @@ export const onBundleResult = (c: SearcherClient, logger: Logger) => { () => undefined, (err) => { logger.error(err, "Error in bundle result"); - } + }, ); }; diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 32256b7691..5aae716bf7 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -26,7 +26,7 @@ export class SolanaPriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); } @@ -36,9 +36,8 @@ export class SolanaPriceListener extends ChainPriceListener { private async checkHealth() { const slot = await this.pythSolanaReceiver.connection.getSlot("finalized"); try { - const blockTime = await this.pythSolanaReceiver.connection.getBlockTime( - slot - ); + const blockTime = + await this.pythSolanaReceiver.connection.getBlockTime(slot); if ( blockTime === null || blockTime < Date.now() / 1000 - HEALTH_CHECK_TIMEOUT_SECONDS @@ -47,7 +46,7 @@ export class SolanaPriceListener extends ChainPriceListener { this.logger.info( `Solana connection is behind by ${ Date.now() / 1000 - blockTime - } seconds` + } seconds`, ); } } @@ -68,12 +67,12 @@ export class SolanaPriceListener extends ChainPriceListener { const priceFeedAccount = await this.pythSolanaReceiver.fetchPriceFeedAccount( this.shardId, - Buffer.from(priceId, "hex") + Buffer.from(priceId, "hex"), ); this.logger.debug( `Polled a Solana on chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); if (priceFeedAccount) { return { @@ -98,7 +97,7 @@ export class SolanaPricePusher implements IPricePusher { private logger: Logger, private shardId: number, private computeUnitPriceMicroLamports: number, - private addressLookupTableAccount?: AddressLookupTableAccount + private addressLookupTableAccount?: AddressLookupTableAccount, ) {} async updatePriceFeed(priceIds: string[]): Promise { @@ -119,7 +118,7 @@ export class SolanaPricePusher implements IPricePusher { shuffledPriceIds, { encoding: "base64", - } + }, ); priceFeedUpdateData = response.binary.data; } catch (err: any) { @@ -131,11 +130,11 @@ export class SolanaPricePusher implements IPricePusher { { closeUpdateAccounts: true, }, - this.addressLookupTableAccount + this.addressLookupTableAccount, ); await transactionBuilder.addUpdatePriceFeed( priceFeedUpdateData, - this.shardId + this.shardId, ); const transactions = await transactionBuilder.buildVersionedTransactions({ @@ -147,7 +146,7 @@ export class SolanaPricePusher implements IPricePusher { const signatures = await sendTransactions( transactions, this.pythSolanaReceiver.connection, - this.pythSolanaReceiver.wallet + this.pythSolanaReceiver.wallet, ); this.logger.info({ signatures }, "updatePriceFeed successful"); } catch (err: any) { @@ -169,24 +168,24 @@ export class SolanaPricePusherJito implements IPricePusher { private searcherClient: SearcherClient, private jitoBundleSize: number, private updatesPerJitoBundle: number, - private addressLookupTableAccount?: AddressLookupTableAccount + private addressLookupTableAccount?: AddressLookupTableAccount, ) {} async getRecentJitoTipLamports(): Promise { try { const response = await fetch( - "http://bundles-api-rest.jito.wtf/api/v1/bundles/tip_floor" + "http://bundles-api-rest.jito.wtf/api/v1/bundles/tip_floor", ); if (!response.ok) { this.logger.error( { status: response.status, statusText: response.statusText }, - "getRecentJitoTips http request failed" + "getRecentJitoTips http request failed", ); return undefined; } const data = await response.json(); return Math.floor( - Number(data[0].landed_tips_50th_percentile) * LAMPORTS_PER_SOL + Number(data[0].landed_tips_50th_percentile) * LAMPORTS_PER_SOL, ); } catch (err: any) { this.logger.error({ err }, "getRecentJitoTips failed"); @@ -224,17 +223,17 @@ export class SolanaPricePusherJito implements IPricePusher { { closeUpdateAccounts: true, }, - this.addressLookupTableAccount + this.addressLookupTableAccount, ); await transactionBuilder.addUpdatePriceFeed( priceFeedUpdateData.map((x) => { return sliceAccumulatorUpdateData( Buffer.from(x, "base64"), i, - i + this.updatesPerJitoBundle + i + this.updatesPerJitoBundle, ).toString("base64"); }), - this.shardId + this.shardId, ); const transactions = await transactionBuilder.buildVersionedTransactions({ @@ -249,7 +248,7 @@ export class SolanaPricePusherJito implements IPricePusher { await sendTransactionsJito( transactions, this.searcherClient, - this.pythSolanaReceiver.wallet + this.pythSolanaReceiver.wallet, ); break; } catch (err: any) { diff --git a/apps/price_pusher/src/sui/command.ts b/apps/price_pusher/src/sui/command.ts index 3b869d6207..800e185384 100644 --- a/apps/price_pusher/src/sui/command.ts +++ b/apps/price_pusher/src/sui/command.ts @@ -99,12 +99,12 @@ export default { const mnemonic = fs.readFileSync(mnemonicFile, "utf-8").trim(); const keypair = Ed25519Keypair.deriveKeypair( mnemonic, - `m/44'/784'/${accountIndex}'/0'/0'` + `m/44'/784'/${accountIndex}'/0'/0'`, ); logger.info( `Pushing updates from wallet address: ${keypair .getPublicKey() - .toSuiAddress()}` + .toSuiAddress()}`, ); let priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias })); @@ -117,7 +117,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -126,7 +126,7 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const suiListener = new SuiPriceListener( @@ -135,7 +135,7 @@ export default { endpoint, priceItems, logger.child({ module: "SuiPriceListener" }), - { pollingFrequency } + { pollingFrequency }, ); const suiPusher = await SuiPricePusher.createWithAutomaticGasPool( hermesClient, @@ -146,7 +146,7 @@ export default { keypair, gasBudget, numGasObjects, - ignoreGasObjects + ignoreGasObjects, ); const controller = new Controller( @@ -155,7 +155,7 @@ export default { suiListener, suiPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); controller.start(); diff --git a/apps/price_pusher/src/sui/sui.ts b/apps/price_pusher/src/sui/sui.ts index b3cd53ac3f..96c6541d37 100644 --- a/apps/price_pusher/src/sui/sui.ts +++ b/apps/price_pusher/src/sui/sui.ts @@ -32,23 +32,22 @@ export class SuiPriceListener extends ChainPriceListener { logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); this.provider = new SuiClient({ url: endpoint }); this.pythClient = new SuiPythClient( this.provider, pythStateId, - wormholeStateId + wormholeStateId, ); this.logger = logger; } async getOnChainPriceInfo(priceId: string): Promise { try { - const priceInfoObjectId = await this.pythClient.getPriceFeedObjectId( - priceId - ); + const priceInfoObjectId = + await this.pythClient.getPriceFeedObjectId(priceId); if (priceInfoObjectId === undefined) { throw new Error("Price not found on chain for price id " + priceId); } @@ -84,7 +83,7 @@ export class SuiPriceListener extends ChainPriceListener { } catch (err) { this.logger.error( err, - `Polling Sui on-chain price for ${priceId} failed.` + `Polling Sui on-chain price for ${priceId} failed.`, ); return undefined; } @@ -113,7 +112,7 @@ export class SuiPricePusher implements IPricePusher { private hermesClient: HermesClient, private gasBudget: number, private gasPool: SuiObjectRef[], - private pythClient: SuiPythClient + private pythClient: SuiPythClient, ) {} /** @@ -125,7 +124,7 @@ export class SuiPricePusher implements IPricePusher { */ static async getPackageId( provider: SuiClient, - objectId: ObjectId + objectId: ObjectId, ): Promise { const state = await provider .getObject({ @@ -164,11 +163,11 @@ export class SuiPricePusher implements IPricePusher { keypair: Ed25519Keypair, gasBudget: number, numGasObjects: number, - ignoreGasObjects: string[] + ignoreGasObjects: string[], ): Promise { if (numGasObjects > MAX_NUM_OBJECTS_IN_ARGUMENT) { throw new Error( - `numGasObjects cannot be greater than ${MAX_NUM_OBJECTS_IN_ARGUMENT} until we implement split chunking` + `numGasObjects cannot be greater than ${MAX_NUM_OBJECTS_IN_ARGUMENT} until we implement split chunking`, ); } @@ -179,13 +178,13 @@ export class SuiPricePusher implements IPricePusher { provider, numGasObjects, ignoreGasObjects, - logger + logger, ); const pythClient = new SuiPythClient( provider, pythStateId, - wormholeStateId + wormholeStateId, ); return new SuiPricePusher( @@ -195,13 +194,13 @@ export class SuiPricePusher implements IPricePusher { hermesClient, gasBudget, gasPool, - pythClient + pythClient, ); } async updatePriceFeed( priceIds: string[], - pubTimesToPush: number[] + pubTimesToPush: number[], ): Promise { if (priceIds.length === 0) { return; @@ -226,11 +225,11 @@ export class SuiPricePusher implements IPricePusher { priceIdChunk, { encoding: "base64", - } + }, ); if (response.binary.data.length !== 1) { throw new Error( - `Expected a single VAA for all priceIds ${priceIdChunk} but received ${response.binary.data.length} VAAs: ${response.binary.data}` + `Expected a single VAA for all priceIds ${priceIdChunk} but received ${response.binary.data.length} VAAs: ${response.binary.data}`, ); } const vaa = response.binary.data[0]; @@ -238,10 +237,10 @@ export class SuiPricePusher implements IPricePusher { await this.pythClient.updatePriceFeeds( tx, [Buffer.from(vaa, "base64")], - priceIdChunk + priceIdChunk, ); txBlocks.push(tx); - }) + }), ); await this.sendTransactionBlocks(txBlocks); @@ -278,7 +277,7 @@ export class SuiPricePusher implements IPricePusher { this.logger.info( { hash: result.digest }, - "Successfully updated price with transaction digest" + "Successfully updated price with transaction digest", ); } catch (err: any) { if ( @@ -291,12 +290,12 @@ export class SuiPricePusher implements IPricePusher { } else { this.logger.error( err, - "Failed to update price. Trying to refresh gas object references." + "Failed to update price. Trying to refresh gas object references.", ); // Refresh the coin object here in case the error is caused by an object version mismatch. nextGasObject = await SuiPricePusher.tryRefreshObjectReference( this.provider, - gasObject + gasObject, ); } } @@ -315,14 +314,14 @@ export class SuiPricePusher implements IPricePusher { provider: SuiClient, numGasObjects: number, ignoreGasObjects: string[], - logger: Logger + logger: Logger, ): Promise { const signerAddress = signer.toSuiAddress(); if (ignoreGasObjects.length > 0) { logger.info( { ignoreGasObjects }, - "Ignoring some gas objects for coin merging" + "Ignoring some gas objects for coin merging", ); } @@ -331,7 +330,7 @@ export class SuiPricePusher implements IPricePusher { provider, signerAddress, ignoreGasObjects, - logger + logger, ); const coinResult = await provider.getObject({ id: consolidatedCoin.objectId, @@ -356,7 +355,7 @@ export class SuiPricePusher implements IPricePusher { signerAddress, Number(splitAmount), numGasObjects, - consolidatedCoin + consolidatedCoin, ); logger.info({ gasPool }, "Gas pool is filled with coins"); return gasPool; @@ -366,7 +365,7 @@ export class SuiPricePusher implements IPricePusher { // of the object. Throws an error if the object cannot be refreshed. private static async tryRefreshObjectReference( provider: SuiClient, - ref: SuiObjectRef + ref: SuiObjectRef, ): Promise { const objectResponse = await provider.getObject({ id: ref.objectId }); if (objectResponse.data !== undefined) { @@ -382,7 +381,7 @@ export class SuiPricePusher implements IPricePusher { private static async getAllGasCoins( provider: SuiClient, - owner: SuiAddress + owner: SuiAddress, ): Promise { let hasNextPage = true; let cursor; @@ -400,8 +399,8 @@ export class SuiPricePusher implements IPricePusher { objectId: c.coinObjectId, version: c.version, digest: c.digest, - }) - ) + }), + ), ); hasNextPage = paginatedCoins.hasNextPage; cursor = paginatedCoins.nextCursor; @@ -419,18 +418,18 @@ export class SuiPricePusher implements IPricePusher { signerAddress: SuiAddress, splitAmount: number, numGasObjects: number, - gasCoin: SuiObjectRef + gasCoin: SuiObjectRef, ): Promise { // TODO: implement chunking if numGasObjects exceeds MAX_NUM_CREATED_OBJECTS const tx = new Transaction(); const coins = tx.splitCoins( tx.gas, - Array.from({ length: numGasObjects }, () => tx.pure.u64(splitAmount)) + Array.from({ length: numGasObjects }, () => tx.pure.u64(splitAmount)), ); tx.transferObjects( Array.from({ length: numGasObjects }, (_, i) => coins[i]), - tx.pure.address(signerAddress) + tx.pure.address(signerAddress), ); tx.setGasPayment([gasCoin]); const result = await provider.signAndExecuteTransaction({ @@ -441,13 +440,13 @@ export class SuiPricePusher implements IPricePusher { const error = result?.effects?.status.error; if (error) { throw new Error( - `Failed to initialize gas pool: ${error}. Try re-running the script` + `Failed to initialize gas pool: ${error}. Try re-running the script`, ); } const newCoins = result.effects!.created!.map((obj) => obj.reference); if (newCoins.length !== numGasObjects) { throw new Error( - `Failed to initialize gas pool. Expected ${numGasObjects}, got: ${newCoins}` + `Failed to initialize gas pool. Expected ${numGasObjects}, got: ${newCoins}`, ); } return newCoins; @@ -458,7 +457,7 @@ export class SuiPricePusher implements IPricePusher { provider: SuiClient, owner: SuiAddress, initialLockedAddresses: string[], - logger: Logger + logger: Logger, ): Promise { const gasCoins = await SuiPricePusher.getAllGasCoins(provider, owner); // skip merging if there is only one coin @@ -468,7 +467,7 @@ export class SuiPricePusher implements IPricePusher { const gasCoinsChunks = chunkArray( gasCoins, - MAX_NUM_GAS_OBJECTS_IN_PTB - 2 + MAX_NUM_GAS_OBJECTS_IN_PTB - 2, ); let finalCoin; const lockedAddresses: Set = new Set(); @@ -493,7 +492,7 @@ export class SuiPricePusher implements IPricePusher { if ( String(err).includes( - "quorum of validators because of locked objects. Retried a conflicting transaction" + "quorum of validators because of locked objects. Retried a conflicting transaction", ) ) { Object.values((err as any).data).forEach((lockedObjects: any) => { @@ -510,7 +509,7 @@ export class SuiPricePusher implements IPricePusher { const error = mergeResult?.effects?.status.error; if (error) { throw new Error( - `Failed to merge coins when initializing gas pool: ${error}. Try re-running the script` + `Failed to merge coins when initializing gas pool: ${error}. Try re-running the script`, ); } finalCoin = mergeResult.effects!.mutated!.map((obj) => obj.reference)[0]; diff --git a/apps/price_pusher/src/ton/command.ts b/apps/price_pusher/src/ton/command.ts index 17ed6439d4..ee8682895b 100644 --- a/apps/price_pusher/src/ton/command.ts +++ b/apps/price_pusher/src/ton/command.ts @@ -65,7 +65,7 @@ export default { logger.error( `Invalid price id submitted for: ${invalidPriceItems .map(({ alias }) => alias) - .join(", ")}` + .join(", ")}`, ); } @@ -74,7 +74,7 @@ export default { const pythListener = new PythPriceListener( hermesClient, priceItems, - logger.child({ module: "PythPriceListener" }) + logger.child({ module: "PythPriceListener" }), ); const client = new TonClient({ endpoint }); @@ -87,7 +87,7 @@ export default { contractAddress, priceItems, logger.child({ module: "TonPriceListener" }), - { pollingFrequency } + { pollingFrequency }, ); const tonPricePusher = new TonPricePusher( @@ -95,7 +95,7 @@ export default { privateKey, contractAddress, hermesClient, - logger.child({ module: "TonPricePusher" }) + logger.child({ module: "TonPricePusher" }), ); const controller = new Controller( @@ -104,7 +104,7 @@ export default { tonPriceListener, tonPricePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency } + { pushingFrequency }, ); await controller.start(); diff --git a/apps/price_pusher/src/ton/ton.ts b/apps/price_pusher/src/ton/ton.ts index af9e14a140..d527ba3c66 100644 --- a/apps/price_pusher/src/ton/ton.ts +++ b/apps/price_pusher/src/ton/ton.ts @@ -31,11 +31,11 @@ export class TonPriceListener extends ChainPriceListener { private logger: Logger, config: { pollingFrequency: DurationInSeconds; - } + }, ) { super(config.pollingFrequency, priceItems); this.contract = this.provider.open( - PythContract.createFromAddress(this.contractAddress) + PythContract.createFromAddress(this.contractAddress), ); } @@ -46,8 +46,8 @@ export class TonPriceListener extends ChainPriceListener { this.logger.debug( `Polled a TON on chain price for feed ${this.priceIdToAlias.get( - priceId - )} (${priceId}).` + priceId, + )} (${priceId}).`, ); return { @@ -71,7 +71,7 @@ export class TonPricePusher implements IPricePusher { private privateKey: string, private contractAddress: Address, private hermesClient: HermesClient, - private logger: Logger + private logger: Logger, ) { this.contract = this.client .provider(this.contractAddress) @@ -88,7 +88,7 @@ export class TonPricePusher implements IPricePusher { async updatePriceFeed( priceIds: string[], // eslint-disable-next-line @typescript-eslint/no-unused-vars - pubTimesToPush: number[] + pubTimesToPush: number[], ): Promise { if (priceIds.length === 0) { return; @@ -116,7 +116,7 @@ export class TonPricePusher implements IPricePusher { await this.contract.sendUpdatePriceFeeds( this.sender, updateDataBuffer, - totalFee + totalFee, ); } diff --git a/apps/price_pusher/src/utils.ts b/apps/price_pusher/src/utils.ts index 4c87a6c157..c2d3a70cf5 100644 --- a/apps/price_pusher/src/utils.ts +++ b/apps/price_pusher/src/utils.ts @@ -4,9 +4,9 @@ import { PriceItem } from "./interface"; export type PctNumber = number; export type DurationInSeconds = number; export const txSpeeds = ["slow", "standard", "fast"] as const; -export type TxSpeed = typeof txSpeeds[number]; +export type TxSpeed = (typeof txSpeeds)[number]; export const customGasChainIds = [137] as const; -export type CustomGasChainId = typeof customGasChainIds[number]; +export type CustomGasChainId = (typeof customGasChainIds)[number]; export async function sleep(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); @@ -38,7 +38,7 @@ export function isWsEndpoint(endpoint: string): boolean { export function verifyValidOption< options extends Readonly>, - validOption extends options[number] + validOption extends options[number], >(option: any, validOptions: options) { if (validOptions.includes(option)) { return option as validOption; @@ -58,7 +58,7 @@ export const assertDefined = (value: T | undefined): T => { export async function filterInvalidPriceItems( hermesClient: HermesClient, - priceItems: PriceItem[] + priceItems: PriceItem[], ): Promise<{ existingPriceItems: PriceItem[]; invalidPriceItems: PriceItem[]; @@ -79,7 +79,7 @@ export async function filterInvalidPriceItems( } return acc; }, - { existingPriceItems: [], invalidPriceItems: [] } + { existingPriceItems: [], invalidPriceItems: [] }, ); return { existingPriceItems, invalidPriceItems }; diff --git a/contract_manager/scripts/check_proposal.ts b/contract_manager/scripts/check_proposal.ts index 1e072c02ec..1411675cfd 100644 --- a/contract_manager/scripts/check_proposal.ts +++ b/contract_manager/scripts/check_proposal.ts @@ -47,7 +47,7 @@ async function main() { const cluster = argv.cluster as PythCluster; const squad = SquadsMesh.endpoint( getPythClusterApiUrl(cluster), - new NodeWallet(Keypair.generate()) // dummy wallet + new NodeWallet(Keypair.generate()), // dummy wallet ); const transaction = await squad.getTransaction(new PublicKey(argv.proposal)); const instructions = await getProposalInstructions(squad, transaction); @@ -64,7 +64,7 @@ async function main() { if (instruction instanceof WormholeMultisigInstruction) { if (instruction.governanceAction instanceof EvmSetWormholeAddress) { console.log( - `Verifying EVM set wormhole address on ${instruction.governanceAction.targetChainId}` + `Verifying EVM set wormhole address on ${instruction.governanceAction.targetChainId}`, ); for (const chain of Object.values(DefaultStore.chains)) { if ( @@ -83,23 +83,23 @@ async function main() { await proxyContract.getImplementationAddress(); const implementationCode = await new EvmPriceFeedContract( chain, - receiverImplementation + receiverImplementation, ).getCode(); const proxyDigest = Web3.utils.keccak256(proxyCode); const implementationDigest = Web3.utils.keccak256(implementationCode); const guardianSetDigest = Web3.utils.keccak256( - JSON.stringify(guardianSet) + JSON.stringify(guardianSet), ); console.log( - `${chain.getId()} Address:\t\t${address}\nproxy digest:\t\t${proxyDigest}\nimplementation digest:\t${implementationDigest} \nguardian set index:\t${currentIndex} \nguardian set:\t\t${guardianSetDigest}` + `${chain.getId()} Address:\t\t${address}\nproxy digest:\t\t${proxyDigest}\nimplementation digest:\t${implementationDigest} \nguardian set index:\t${currentIndex} \nguardian set:\t\t${guardianSetDigest}`, ); } } } if (instruction.governanceAction instanceof EvmUpgradeContract) { console.log( - `Verifying EVM Upgrade Contract on ${instruction.governanceAction.targetChainId}` + `Verifying EVM Upgrade Contract on ${instruction.governanceAction.targetChainId}`, ); for (const chain of Object.values(DefaultStore.chains)) { if ( @@ -118,7 +118,7 @@ async function main() { } if (instruction.governanceAction instanceof CosmosUpgradeContract) { console.log( - `Verifying Cosmos Upgrade Contract on ${instruction.governanceAction.targetChainId}` + `Verifying Cosmos Upgrade Contract on ${instruction.governanceAction.targetChainId}`, ); for (const chain of Object.values(DefaultStore.chains)) { if ( @@ -132,7 +132,7 @@ async function main() { console.log( `${chain.getId()} Code Id:${codeId} digest:${createHash("sha256") .update(code) - .digest("hex")}` + .digest("hex")}`, ); } } @@ -140,7 +140,7 @@ async function main() { if (instruction.governanceAction instanceof EvmExecute) { // Note: it only checks for upgrade entropy contracts right now console.log( - `Verifying EVMExecute on ${instruction.governanceAction.targetChainId}` + `Verifying EVMExecute on ${instruction.governanceAction.targetChainId}`, ); for (const chain of Object.values(DefaultStore.chains)) { if ( @@ -165,7 +165,7 @@ async function main() { console.log( `Executor Address: ${executorAddress.toUpperCase()} is not equal to Owner Address: ${owner .replace("0x", "") - .toUpperCase()}` + .toUpperCase()}`, ); continue; } @@ -183,27 +183,27 @@ async function main() { if (calldataHex.startsWith(methodSignature)) { newImplementationAddress = web3.eth.abi.decodeParameter( "address", - calldataHex.replace(methodSignature, "") + calldataHex.replace(methodSignature, ""), ) as unknown as string; } if (newImplementationAddress === undefined) { console.log( - `We couldn't parse the instruction for ${chain.getId()}` + `We couldn't parse the instruction for ${chain.getId()}`, ); continue; } const newImplementationCode = await getCodeDigestWithoutAddress( chain.getWeb3(), - newImplementationAddress + newImplementationAddress, ); // this should be the same keccak256 of the deployedCode property generated by truffle console.log( - `${chain.getId()} call ${invokedMethod} with arguments (${newImplementationAddress}) on ${contract.getType()} at address:${callAddress} from executor:${executorAddress}.` + `${chain.getId()} call ${invokedMethod} with arguments (${newImplementationAddress}) on ${contract.getType()} at address:${callAddress} from executor:${executorAddress}.`, ); console.log( - `${chain.getId()} new implementation address:${newImplementationAddress} has code digest:${newImplementationCode}` + `${chain.getId()} new implementation address:${newImplementationAddress} has code digest:${newImplementationCode}`, ); } } diff --git a/contract_manager/scripts/common.ts b/contract_manager/scripts/common.ts index 2137a9c4fd..b32b13ac80 100644 --- a/contract_manager/scripts/common.ts +++ b/contract_manager/scripts/common.ts @@ -29,13 +29,13 @@ export async function deployIfNotCached( config: BaseDeployConfig, artifactName: string, deployArgs: any[], // eslint-disable-line @typescript-eslint/no-explicit-any - cacheKey?: string + cacheKey?: string, ): Promise { const runIfNotCached = makeCacheFunction(cacheFile); const key = cacheKey ?? `${chain.getId()}-${artifactName}`; return runIfNotCached(key, async () => { const artifact = JSON.parse( - readFileSync(join(config.jsonOutputDir, `${artifactName}.json`), "utf8") + readFileSync(join(config.jsonOutputDir, `${artifactName}.json`), "utf8"), ); // Handle bytecode which can be either a string or an object with an 'object' property @@ -60,7 +60,7 @@ export async function deployIfNotCached( bytecode, deployArgs, config.gasMultiplier, - config.gasPriceMultiplier + config.gasPriceMultiplier, ); console.log(`✅ Deployed ${artifactName} on ${chain.getId()} at ${addr}`); @@ -71,10 +71,10 @@ export async function deployIfNotCached( export function getWeb3Contract( jsonOutputDir: string, artifactName: string, - address: string + address: string, ): Contract { const artifact = JSON.parse( - readFileSync(join(jsonOutputDir, `${artifactName}.json`), "utf8") + readFileSync(join(jsonOutputDir, `${artifactName}.json`), "utf8"), ); const web3 = new Web3(); return new web3.eth.Contract(artifact["abi"], address); @@ -156,11 +156,11 @@ export const COMMON_UPGRADE_OPTIONS = { } as const; export function makeCacheFunction( - cacheFile: string + cacheFile: string, ): (cacheKey: string, fn: () => Promise) => Promise { async function runIfNotCached( cacheKey: string, - fn: () => Promise + fn: () => Promise, ): Promise { const cache = existsSync(cacheFile) ? JSON.parse(readFileSync(cacheFile, "utf8")) @@ -178,9 +178,9 @@ export function makeCacheFunction( } export function getSelectedChains(argv: { - chain: InferredOptionType; - testnet: InferredOptionType; - allChains: InferredOptionType; + chain: InferredOptionType<(typeof COMMON_UPGRADE_OPTIONS)["chain"]>; + testnet: InferredOptionType<(typeof COMMON_UPGRADE_OPTIONS)["testnet"]>; + allChains: InferredOptionType<(typeof COMMON_UPGRADE_OPTIONS)["all-chains"]>; }) { const selectedChains: EvmChain[] = []; if (argv.allChains && argv.chain) @@ -199,7 +199,7 @@ export function getSelectedChains(argv: { throw new Error( `Some chains were not found ${selectedChains .map((chain) => chain.getId()) - .toString()}` + .toString()}`, ); for (const chain of selectedChains) { if (chain.isMainnet() != selectedChains[0].isMainnet()) @@ -229,7 +229,7 @@ export function findEntropyContract(chain: EvmChain): EvmEntropyContract { * @returns If found, the wormhole contract for the given EVM chain. Else, undefined */ export function findWormholeContract( - chain: EvmChain + chain: EvmChain, ): EvmWormholeContract | undefined { for (const contract of Object.values(DefaultStore.wormhole_contracts)) { if ( @@ -256,14 +256,14 @@ export interface DeployWormholeReceiverContractsConfig export async function deployWormholeContract( chain: EvmChain, config: DeployWormholeReceiverContractsConfig, - cacheFile: string + cacheFile: string, ): Promise { const receiverSetupAddr = await deployIfNotCached( cacheFile, chain, config, "ReceiverSetup", - [] + [], ); const receiverImplAddr = await deployIfNotCached( @@ -271,14 +271,14 @@ export async function deployWormholeContract( chain, config, "ReceiverImplementation", - [] + [], ); // Craft the init data for the proxy contract const setupContract = getWeb3Contract( config.jsonOutputDir, "ReceiverSetup", - receiverSetupAddr + receiverSetupAddr, ); const { wormholeConfig } = getDefaultDeploymentConfig(config.type); @@ -289,7 +289,7 @@ export async function deployWormholeContract( wormholeConfig.initialGuardianSet.map((addr: string) => "0x" + addr), chain.getWormholeChainId(), wormholeConfig.governanceChainId, - "0x" + wormholeConfig.governanceContract + "0x" + wormholeConfig.governanceContract, ) .encodeABI(); @@ -298,7 +298,7 @@ export async function deployWormholeContract( chain, config, "WormholeReceiver", - [receiverSetupAddr, initData] + [receiverSetupAddr, initData], ); const wormholeContract = new EvmWormholeContract(chain, wormholeReceiverAddr); @@ -330,7 +330,7 @@ export async function deployWormholeContract( export async function getOrDeployWormholeContract( chain: EvmChain, config: DeployWormholeReceiverContractsConfig, - cacheFile: string + cacheFile: string, ): Promise { return ( findWormholeContract(chain) ?? @@ -347,7 +347,7 @@ export async function topupAccountsIfNecessary( chain: EvmChain, deploymentConfig: BaseDeployConfig, accounts: Array<[string, DefaultAddresses]>, - minBalance = 0.01 + minBalance = 0.01, ) { for (const [accountName, defaultAddresses] of accounts) { const accountAddress = chain.isMainnet() @@ -355,15 +355,15 @@ export async function topupAccountsIfNecessary( : defaultAddresses.testnet; const web3 = chain.getWeb3(); const balance = Number( - web3.utils.fromWei(await web3.eth.getBalance(accountAddress), "ether") + web3.utils.fromWei(await web3.eth.getBalance(accountAddress), "ether"), ); console.log(`${accountName} balance: ${balance} ETH`); if (balance < minBalance) { console.log( - `Balance is less than ${minBalance}. Topping up the ${accountName} address...` + `Balance is less than ${minBalance}. Topping up the ${accountName} address...`, ); const signer = web3.eth.accounts.privateKeyToAccount( - deploymentConfig.privateKey + deploymentConfig.privateKey, ); web3.eth.accounts.wallet.add(signer); const estimatedGas = await web3.eth.estimateGas({ @@ -381,7 +381,7 @@ export async function topupAccountsIfNecessary( console.log( `Topped up the ${accountName} address. Tx: `, - tx.transactionHash + tx.transactionHash, ); } } diff --git a/contract_manager/scripts/deploy_cosmwasm.ts b/contract_manager/scripts/deploy_cosmwasm.ts index b5852fddb9..90d4c4cf14 100644 --- a/contract_manager/scripts/deploy_cosmwasm.ts +++ b/contract_manager/scripts/deploy_cosmwasm.ts @@ -9,7 +9,7 @@ import { COMMON_DEPLOY_OPTIONS } from "./common"; const parser = yargs(hideBin(process.argv)) .scriptName("deploy_cosmwasm.ts") .usage( - "Usage: $0 --code --private-key --chain " + "Usage: $0 --code --private-key --chain ", ) .options({ code: { @@ -38,8 +38,8 @@ async function main() { DefaultStore.chains[argv.chain] as CosmWasmChain, wormholeContract, argv["private-key"], - code - ) + code, + ), ); } diff --git a/contract_manager/scripts/deploy_evm_contract.ts b/contract_manager/scripts/deploy_evm_contract.ts index 5757f95fb3..076c6fbfdb 100644 --- a/contract_manager/scripts/deploy_evm_contract.ts +++ b/contract_manager/scripts/deploy_evm_contract.ts @@ -10,7 +10,7 @@ import { COMMON_DEPLOY_OPTIONS } from "./common"; const parser = yargs(hideBin(process.argv)) .scriptName("deploy_evm_contract.ts") .usage( - "Usage: $0 --std-output --private-key --chain [--deploy-args [... ]]" + "Usage: $0 --std-output --private-key --chain [--deploy-args [... ]]", ) .options({ "std-output": { @@ -39,7 +39,7 @@ async function main() { toPrivateKey(argv["private-key"]), artifact["abi"], artifact["bytecode"], - argv["deploy-args"] || [] + argv["deploy-args"] || [], ); console.log(`Deployed contract at ${address}`); diff --git a/contract_manager/scripts/deploy_evm_entropy_contracts.ts b/contract_manager/scripts/deploy_evm_entropy_contracts.ts index d44b06b20b..c1546d3b7d 100644 --- a/contract_manager/scripts/deploy_evm_entropy_contracts.ts +++ b/contract_manager/scripts/deploy_evm_entropy_contracts.ts @@ -31,7 +31,7 @@ const CACHE_FILE = ".cache-deploy-evm-entropy-contracts"; const parser = yargs(hideBin(process.argv)) .scriptName("deploy_evm_entropy_contracts.ts") .usage( - "Usage: $0 --std-output-dir --private-key --chain --wormhole-addr " + "Usage: $0 --std-output-dir --private-key --chain --wormhole-addr ", ) .options({ ...COMMON_DEPLOY_OPTIONS, @@ -45,14 +45,14 @@ const parser = yargs(hideBin(process.argv)) async function deployExecutorContracts( chain: EvmChain, config: DeploymentConfig, - wormholeAddr: string + wormholeAddr: string, ): Promise { const executorImplAddr = await deployIfNotCached( CACHE_FILE, chain, config, "ExecutorUpgradable", - [] + [], ); // Craft the init data for the proxy contract @@ -61,7 +61,7 @@ async function deployExecutorContracts( const executorImplContract = getWeb3Contract( config.jsonOutputDir, "ExecutorUpgradable", - executorImplAddr + executorImplAddr, ); const executorInitData = executorImplContract.methods @@ -70,7 +70,7 @@ async function deployExecutorContracts( 0, // lastExecutedSequence, chain.getWormholeChainId(), governanceDataSource.emitterChain, - `0x${governanceDataSource.emitterAddress}` + `0x${governanceDataSource.emitterAddress}`, ) .encodeABI(); @@ -83,20 +83,20 @@ async function deployExecutorContracts( async function deployEntropyContracts( chain: EvmChain, config: DeploymentConfig, - executorAddr: string + executorAddr: string, ): Promise { const entropyImplAddr = await deployIfNotCached( CACHE_FILE, chain, config, "EntropyUpgradable", - [] + [], ); const entropyImplContract = getWeb3Contract( config.jsonOutputDir, "EntropyUpgradable", - entropyImplAddr + entropyImplAddr, ); const entropyInitData = entropyImplContract.methods @@ -107,7 +107,7 @@ async function deployEntropyContracts( chain.isMainnet() ? ENTROPY_DEFAULT_PROVIDER.mainnet : ENTROPY_DEFAULT_PROVIDER.testnet, - true // prefillRequestStorage + true, // prefillRequestStorage ) .encodeABI(); @@ -120,13 +120,13 @@ async function deployEntropyContracts( // NOTE: we are deploying a ERC1967Proxy when deploying executor // we need to provide a different cache key. As the `artifactname` // is same in both case which means the cache key will be same - `${chain.getId()}-ERC1967Proxy-ENTROPY` + `${chain.getId()}-ERC1967Proxy-ENTROPY`, ); } async function topupEntropyAccountsIfNecessary( chain: EvmChain, - deploymentConfig: DeploymentConfig + deploymentConfig: DeploymentConfig, ) { const accounts: Array<[string, DefaultAddresses]> = [ ["keeper", ENTROPY_DEFAULT_KEEPER], @@ -153,13 +153,13 @@ async function main() { const wormholeContract = await getOrDeployWormholeContract( chain, deploymentConfig, - CACHE_FILE + CACHE_FILE, ); await topupEntropyAccountsIfNecessary(chain, deploymentConfig); console.log( - `Deployment config: ${JSON.stringify(deploymentConfig, null, 2)}\n` + `Deployment config: ${JSON.stringify(deploymentConfig, null, 2)}\n`, ); console.log(`Deploying entropy contracts on ${chain.getId()}...`); @@ -167,12 +167,12 @@ async function main() { const executorAddr = await deployExecutorContracts( chain, deploymentConfig, - wormholeContract.address + wormholeContract.address, ); const entropyAddr = await deployEntropyContracts( chain, deploymentConfig, - executorAddr + executorAddr, ); if (deploymentConfig.saveContract) { @@ -183,7 +183,7 @@ async function main() { } console.log( - `✅ Deployed entropy contracts on ${chain.getId()} at ${entropyAddr}\n\n` + `✅ Deployed entropy contracts on ${chain.getId()} at ${entropyAddr}\n\n`, ); } diff --git a/contract_manager/scripts/deploy_evm_pricefeed_contracts.ts b/contract_manager/scripts/deploy_evm_pricefeed_contracts.ts index 265d10a2f0..794fc88cda 100644 --- a/contract_manager/scripts/deploy_evm_pricefeed_contracts.ts +++ b/contract_manager/scripts/deploy_evm_pricefeed_contracts.ts @@ -29,7 +29,7 @@ const CACHE_FILE = ".cache-deploy-evm"; const parser = yargs(hideBin(process.argv)) .scriptName("deploy_evm_pricefeed_contracts.ts") .usage( - "Usage: $0 --std-output-dir --private-key --chain --chain " + "Usage: $0 --std-output-dir --private-key --chain --chain ", ) .options({ ...COMMON_DEPLOY_OPTIONS, @@ -50,25 +50,25 @@ const parser = yargs(hideBin(process.argv)) async function deployPriceFeedContracts( chain: EvmChain, config: DeploymentConfig, - wormholeAddr: string + wormholeAddr: string, ): Promise { const pythImplAddr = await deployIfNotCached( CACHE_FILE, chain, config, "PythUpgradable", - [] + [], ); // Craft the init data for the proxy contract const { dataSources, governanceDataSource } = getDefaultDeploymentConfig( - config.type + config.type, ); const pythImplContract = getWeb3Contract( config.jsonOutputDir, "PythUpgradable", - pythImplAddr + pythImplAddr, ); const pythInitData = pythImplContract.methods @@ -80,7 +80,7 @@ async function deployPriceFeedContracts( "0x" + governanceDataSource.emitterAddress, 0, // governanceInitialSequence config.validTimePeriodSeconds, - config.singleUpdateFeeInWei + config.singleUpdateFeeInWei, ) .encodeABI(); @@ -105,7 +105,7 @@ async function main() { }; console.log( - `Deployment config: ${JSON.stringify(deploymentConfig, null, 2)}\n` + `Deployment config: ${JSON.stringify(deploymentConfig, null, 2)}\n`, ); const chainNames = argv.chain; @@ -118,13 +118,13 @@ async function main() { const wormholeContract = await getOrDeployWormholeContract( chain, deploymentConfig, - CACHE_FILE + CACHE_FILE, ); const priceFeedAddr = await deployPriceFeedContracts( chain, deploymentConfig, - wormholeContract.address + wormholeContract.address, ); if (deploymentConfig.saveContract) { @@ -135,7 +135,7 @@ async function main() { } console.log( - `✅ Deployed price feed contracts on ${chain.getId()} at ${priceFeedAddr}\n\n` + `✅ Deployed price feed contracts on ${chain.getId()} at ${priceFeedAddr}\n\n`, ); } } diff --git a/contract_manager/scripts/deploy_evm_pulse_contracts.ts b/contract_manager/scripts/deploy_evm_pulse_contracts.ts index df487abba3..85510101ff 100644 --- a/contract_manager/scripts/deploy_evm_pulse_contracts.ts +++ b/contract_manager/scripts/deploy_evm_pulse_contracts.ts @@ -32,7 +32,7 @@ const CACHE_FILE = ".cache-deploy-evm-pulse-contracts"; const parser = yargs(hideBin(process.argv)) .scriptName("deploy_evm_pulse_contracts.ts") .usage( - "Usage: $0 --std-output-dir --private-key --chain --default-provider --wormhole-addr " + "Usage: $0 --std-output-dir --private-key --chain --default-provider --wormhole-addr ", ) .options({ ...COMMON_DEPLOY_OPTIONS, @@ -46,7 +46,7 @@ const parser = yargs(hideBin(process.argv)) async function deployPulseContracts( chain: EvmChain, config: DeploymentConfig, - executorAddr: string + executorAddr: string, ): Promise { console.log("Deploying PulseUpgradeable on", chain.getId(), "..."); @@ -54,8 +54,8 @@ async function deployPulseContracts( const pulseArtifact = JSON.parse( fs.readFileSync( path.join(config.jsonOutputDir, "PulseUpgradeable.json"), - "utf8" - ) + "utf8", + ), ); console.log("PulseArtifact bytecode type:", typeof pulseArtifact.bytecode); @@ -64,7 +64,7 @@ async function deployPulseContracts( chain, config, "PulseUpgradeable", - [] + [], ); console.log("PulseUpgradeable implementation deployed at:", pulseImplAddr); @@ -72,7 +72,7 @@ async function deployPulseContracts( const pulseImplContract = getWeb3Contract( config.jsonOutputDir, "PulseUpgradeable", - pulseImplAddr + pulseImplAddr, ); console.log("Preparing initialization data..."); @@ -87,7 +87,7 @@ async function deployPulseContracts( ? PULSE_DEFAULT_PROVIDER.mainnet : PULSE_DEFAULT_PROVIDER.testnet, true, // prefillRequestStorage - 3600 // exclusivityPeriodSeconds - 1 hour + 3600, // exclusivityPeriodSeconds - 1 hour ) .encodeABI(); @@ -102,13 +102,13 @@ async function deployPulseContracts( // NOTE: we are deploying a ERC1967Proxy when deploying executor // we need to provide a different cache key. As the `artifactname` // is same in both case which means the cache key will be same - `${chain.getId()}-ERC1967Proxy-PULSE1` + `${chain.getId()}-ERC1967Proxy-PULSE1`, ); } async function topupPulseAccountsIfNecessary( chain: EvmChain, - deploymentConfig: DeploymentConfig + deploymentConfig: DeploymentConfig, ) { const accounts: Array<[string, DefaultAddresses]> = [ ["keeper", PULSE_DEFAULT_KEEPER], @@ -141,13 +141,13 @@ async function main() { const wormholeContract = await getOrDeployWormholeContract( chain, deploymentConfig, - CACHE_FILE + CACHE_FILE, ); await topupPulseAccountsIfNecessary(chain, deploymentConfig); console.log( - `Deployment config: ${JSON.stringify(deploymentConfig, null, 2)}\n` + `Deployment config: ${JSON.stringify(deploymentConfig, null, 2)}\n`, ); console.log(`Deploying pulse contracts on ${chain.getId()}...`); @@ -156,7 +156,7 @@ async function main() { const pulseAddr = await deployPulseContracts( chain, deploymentConfig, - executorAddr + executorAddr, ); if (deploymentConfig.saveContract) { @@ -167,7 +167,7 @@ async function main() { } console.log( - `✅ Deployed pulse contracts on ${chain.getId()} at ${pulseAddr}\n\n` + `✅ Deployed pulse contracts on ${chain.getId()} at ${pulseAddr}\n\n`, ); } diff --git a/contract_manager/scripts/entropy-accept-admin-and-ownership.ts b/contract_manager/scripts/entropy-accept-admin-and-ownership.ts index 8d1ba4652c..797f061374 100644 --- a/contract_manager/scripts/entropy-accept-admin-and-ownership.ts +++ b/contract_manager/scripts/entropy-accept-admin-and-ownership.ts @@ -5,7 +5,7 @@ import { DefaultStore, EvmChain, loadHotWallet } from "../src"; const parser = yargs(hideBin(process.argv)) .usage( "Creates governance proposal to accept pending admin or ownership transfer for Pyth entropy contracts.\n" + - "Usage: $0 --chain --chain --ops-key-path " + "Usage: $0 --chain --chain --ops-key-path ", ) .options({ testnet: { @@ -50,7 +50,7 @@ async function main() { throw new Error( `Some chains were not found ${selectedChains .map((chain) => chain.getId()) - .toString()}` + .toString()}`, ); for (const chain of selectedChains) { if (chain.isMainnet() != selectedChains[0].isMainnet()) diff --git a/contract_manager/scripts/entropy_debug_reveal.ts b/contract_manager/scripts/entropy_debug_reveal.ts index 36ebc38ae2..d17a4bcdbc 100644 --- a/contract_manager/scripts/entropy_debug_reveal.ts +++ b/contract_manager/scripts/entropy_debug_reveal.ts @@ -7,7 +7,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Tries to reveal an entropy request with callback using the provided private key.\n" + "This can be used to manually debug why a callback was not triggered.\n" + - "Usage: $0 --chain --private-key --sequence-number " + "Usage: $0 --chain --private-key --sequence-number ", ) .options({ chain: { @@ -41,7 +41,7 @@ async function main() { const userRandomNumber = await contract.getUserRandomNumber( provider, sequenceNumber, - parseInt(request.blockNumber) + parseInt(request.blockNumber), ); console.log("User random number: ", userRandomNumber); const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`; @@ -57,7 +57,7 @@ async function main() { providerRevelation, provider, sequenceNumber, - privateKey + privateKey, ); } diff --git a/contract_manager/scripts/execute_vaas.ts b/contract_manager/scripts/execute_vaas.ts index 84123f753e..f289a300a6 100644 --- a/contract_manager/scripts/execute_vaas.ts +++ b/contract_manager/scripts/execute_vaas.ts @@ -13,7 +13,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Tries to execute all vaas on a vault.\n" + "Useful for batch upgrades.\n" + - "Usage: $0 --vault --private-key --offset [--dryrun]" + "Usage: $0 --vault --private-key --offset [--dryrun]", ) .options({ vault: { @@ -52,12 +52,12 @@ async function main() { console.log("Executing VAAs for vault", vault.getId()); console.log( "Executing VAAs for emitter", - (await vault.getEmitter()).toBase58() + (await vault.getEmitter()).toBase58(), ); const lastSequenceNumber = await vault.getLastSequenceNumber(); const startSequenceNumber = lastSequenceNumber - argv.offset; console.log( - `Going from sequence number ${startSequenceNumber} to ${lastSequenceNumber}` + `Going from sequence number ${startSequenceNumber} to ${lastSequenceNumber}`, ); for ( let seqNumber = startSequenceNumber; @@ -67,7 +67,7 @@ async function main() { const submittedWormholeMessage = new SubmittedWormholeMessage( await vault.getEmitter(), seqNumber, - vault.cluster + vault.cluster, ); const vaa = await submittedWormholeMessage.fetchVaa(); const decodedAction = decodeGovernancePayload(parseVaa(vaa).payload); diff --git a/contract_manager/scripts/fetch_account_balance.ts b/contract_manager/scripts/fetch_account_balance.ts index 789da6b658..412d632400 100644 --- a/contract_manager/scripts/fetch_account_balance.ts +++ b/contract_manager/scripts/fetch_account_balance.ts @@ -25,16 +25,14 @@ type AccountBalance = { async function getBalance( chain: string, - privateKey: PrivateKey + privateKey: PrivateKey, ): Promise { - const address = await DefaultStore.chains[chain].getAccountAddress( - privateKey - ); + const address = + await DefaultStore.chains[chain].getAccountAddress(privateKey); try { - const balance = await DefaultStore.chains[chain].getAccountBalance( - privateKey - ); + const balance = + await DefaultStore.chains[chain].getAccountBalance(privateKey); return { chain, address, balance }; } catch (e) { console.error(`Error fetching balance for ${chain}`, e); @@ -51,7 +49,7 @@ async function main() { const privateKey = toPrivateKey(argv["private-key"]); const balances = await Promise.all( - chains.map((chain) => getBalance(chain, privateKey)) + chains.map((chain) => getBalance(chain, privateKey)), ); console.table(balances); diff --git a/contract_manager/scripts/fetch_fees.ts b/contract_manager/scripts/fetch_fees.ts index 12730b9a7c..0ef690d7b0 100644 --- a/contract_manager/scripts/fetch_fees.ts +++ b/contract_manager/scripts/fetch_fees.ts @@ -47,11 +47,11 @@ async function main() { feeUsd = Number(fee.amount) * prices[fee.denom]; totalFeeUsd += feeUsd; console.log( - `${contract.getId()} ${fee.amount} ${fee.denom} ($${feeUsd})` + `${contract.getId()} ${fee.amount} ${fee.denom} ($${feeUsd})`, ); } else { console.log( - `${contract.getId()} ${fee.amount} ${fee.denom} ($ value unknown)` + `${contract.getId()} ${fee.amount} ${fee.denom} ($ value unknown)`, ); } } catch (e) { diff --git a/contract_manager/scripts/generate_governance_set_fee_payload.ts b/contract_manager/scripts/generate_governance_set_fee_payload.ts index b5ce99f62e..d0d9a29007 100644 --- a/contract_manager/scripts/generate_governance_set_fee_payload.ts +++ b/contract_manager/scripts/generate_governance_set_fee_payload.ts @@ -38,12 +38,12 @@ async function main() { const chain = DefaultStore.getChainOrThrow(setFeeEntry.chainName); const payload = chain.generateGovernanceSetFeePayload( setFeeEntry.fee, - setFeeEntry.exponent + setFeeEntry.exponent, ); updatePayloads.push(payload); console.log( `Generated payload for chain ${setFeeEntry.chainName}:`, - payload.toString("hex") + payload.toString("hex"), ); } diff --git a/contract_manager/scripts/generate_upgrade_near_contract_proposal.ts b/contract_manager/scripts/generate_upgrade_near_contract_proposal.ts index 5b15834edc..838cabff8f 100644 --- a/contract_manager/scripts/generate_upgrade_near_contract_proposal.ts +++ b/contract_manager/scripts/generate_upgrade_near_contract_proposal.ts @@ -6,7 +6,7 @@ import { NearChain } from "../src/chains"; const parser = yargs(hideBin(process.argv)) .usage( "Creates a governance proposal to upgrade the price feeds contract on Near.\n" + - "Usage: $0 --network --code-hash --ops-key-path \n" + "Usage: $0 --network --code-hash --ops-key-path \n", ) .options({ network: { @@ -45,7 +45,7 @@ async function main() { throw new Error("invalid code hash format"); } console.log( - `Upgrading contract on Near ${argv.network} to code hash: ${codeHash}` + `Upgrading contract on Near ${argv.network} to code hash: ${codeHash}`, ); // Generate governance payload for the upgrade diff --git a/contract_manager/scripts/generate_upgrade_ton_contract_proposal.ts b/contract_manager/scripts/generate_upgrade_ton_contract_proposal.ts index b5aa06e4c0..29bc4930f7 100644 --- a/contract_manager/scripts/generate_upgrade_ton_contract_proposal.ts +++ b/contract_manager/scripts/generate_upgrade_ton_contract_proposal.ts @@ -12,7 +12,7 @@ const parser = yargs(hideBin(process.argv)) "Usage: $0 --network --contract-address
--ops-key-path \n" + "Required environment variables:\n" + " - ENV_TON_MAINNET_API_KEY: API key for TON mainnet\n" + - " - ENV_TON_TESTNET_API_KEY: API key for TON testnet" + " - ENV_TON_TESTNET_API_KEY: API key for TON testnet", ) .options({ network: { @@ -44,7 +44,7 @@ async function main() { // Get the TON chain instance from DefaultStore based on network const chain = DefaultStore.getChainOrThrow( isMainnet ? "ton_mainnet" : "ton_testnet", - TonChain + TonChain, ); const vault = @@ -53,14 +53,14 @@ async function main() { ]; console.log( - `Upgrading contract on TON ${argv.network} (Chain ID: ${chainId}, Wormhole Chain Name: ${wormholeChainName})` + `Upgrading contract on TON ${argv.network} (Chain ID: ${chainId}, Wormhole Chain Name: ${wormholeChainName})`, ); // Read the compiled contract from the build directory // NOTE: Remember to rebuild contract_manager before running this script because it will also build the ton contract const compiledPath = path.resolve( __dirname, - "../../target_chains/ton/contracts/build/Main.compiled.json" + "../../target_chains/ton/contracts/build/Main.compiled.json", ); const compiled = JSON.parse(fs.readFileSync(compiledPath, "utf8")); const newCodeHash = compiled.hash; diff --git a/contract_manager/scripts/get_entropy_registration.ts b/contract_manager/scripts/get_entropy_registration.ts index 06d0f3d6cf..bfe6b92cf5 100644 --- a/contract_manager/scripts/get_entropy_registration.ts +++ b/contract_manager/scripts/get_entropy_registration.ts @@ -39,12 +39,12 @@ async function main() { const commitmentMetadata = providerInfo.commitmentMetadata.replace( "0x", - "" + "", ); // const binaryData = hexToBytes(commitmentMetadata); const metadata = deserializeCommitmentMetadata( - Buffer.from(commitmentMetadata, "hex") + Buffer.from(commitmentMetadata, "hex"), ); console.log("=".repeat(100)); console.log(`Fetched info for ${contract.getId()}`); @@ -56,7 +56,7 @@ async function main() { console.log(`chainLength : ${metadata.chainLength}`); console.log(`seed : [${metadata.seed}]`); console.log( - `original seq no : ${providerInfo.originalCommitmentSequenceNumber}` + `original seq no : ${providerInfo.originalCommitmentSequenceNumber}`, ); } } diff --git a/contract_manager/scripts/latency_entropy.ts b/contract_manager/scripts/latency_entropy.ts index 0f0e9266b0..22e940b5dd 100644 --- a/contract_manager/scripts/latency_entropy.ts +++ b/contract_manager/scripts/latency_entropy.ts @@ -7,7 +7,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Requests and reveals a random number from an entropy contract while measuing the\n" + "latency between request submission and availablity of the provider revelation from fortuna.\n" + - "Usage: $0 --chain --private-key " + "Usage: $0 --chain --private-key ", ) .options({ chain: { @@ -30,7 +30,7 @@ async function main() { const requestResponse = await contract.requestRandomness( userRandomNumber, provider, - privateKey + privateKey, ); console.log("Request tx hash: ", requestResponse.transactionHash); const startTime = Date.now(); @@ -50,7 +50,7 @@ async function main() { providerRevelation, provider, sequenceNumber, - privateKey + privateKey, ); console.log("Reveal tx hash: ", revealResponse.transactionHash); break; diff --git a/contract_manager/scripts/latency_entropy_with_callback.ts b/contract_manager/scripts/latency_entropy_with_callback.ts index 33480efa5b..63259f1042 100644 --- a/contract_manager/scripts/latency_entropy_with_callback.ts +++ b/contract_manager/scripts/latency_entropy_with_callback.ts @@ -13,7 +13,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Requests a random number from an entropy contract and measures the\n" + "latency between request submission and fulfillment by the Fortuna keeper service.\n" + - "Usage: $0 --private-key --chain | --all-chains " + "Usage: $0 --private-key --chain | --all-chains ", ) .options({ chain: { @@ -32,7 +32,7 @@ const parser = yargs(hideBin(process.argv)) async function testLatency( contract: EvmEntropyContract, - privateKey: PrivateKey + privateKey: PrivateKey, ) { const provider = await contract.getDefaultProvider(); const userRandomNumber = contract.generateUserRandomNumber(); @@ -40,7 +40,7 @@ async function testLatency( userRandomNumber, provider, privateKey, - true // with callback + true, // with callback ); console.log(`Request tx hash : ${requestResponse.transactionHash}`); // Read the sequence number for the request from the transaction events. @@ -69,7 +69,7 @@ async function testLatency( }); const event = events.find( - (event) => event.returnValues.request[1] == sequenceNumber + (event) => event.returnValues.request[1] == sequenceNumber, ); if (event !== undefined) { @@ -79,7 +79,7 @@ async function testLatency( console.log( `Revealed after : ${ currentBlock - requestResponse.blockNumber - } blocks` + } blocks`, ); break; } diff --git a/contract_manager/scripts/load_test_entropy.ts b/contract_manager/scripts/load_test_entropy.ts index bd9bbad7a1..9dda5ce2f2 100644 --- a/contract_manager/scripts/load_test_entropy.ts +++ b/contract_manager/scripts/load_test_entropy.ts @@ -7,7 +7,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Load tests the entropy contract using the EntropyTester contract with many requests in a single transaction\n" + "it does not monitor whether the callbacks are actually submitted or not.\n" + - "Usage: $0 --private-key --chain --tester-address " + "Usage: $0 --private-key --chain --tester-address ", ) .options({ chain: { @@ -72,7 +72,7 @@ async function main() { const transactionObject = testerContract.methods.batchRequests( provider, argv.successCount, - argv.revertCount + argv.revertCount, ); const totalCount = argv.successCount + argv.revertCount; const result = await contract.chain.estiamteAndSendTransaction( @@ -80,7 +80,7 @@ async function main() { { from: address, value: (fee * totalCount).toString(), - } + }, ); console.log("Submitted transaction ", result.transactionHash); } diff --git a/contract_manager/scripts/send_message_to_wormhole.ts b/contract_manager/scripts/send_message_to_wormhole.ts index 8e4ec0204f..097ec5b8a9 100644 --- a/contract_manager/scripts/send_message_to_wormhole.ts +++ b/contract_manager/scripts/send_message_to_wormhole.ts @@ -4,7 +4,7 @@ import { WormholeEmitter, loadHotWallet } from "../src/governance"; const parser = yargs(hideBin(process.argv)) .usage( - "Usage: $0 --cluster --wallet-path --message " + "Usage: $0 --cluster --wallet-path --message ", ) .options({ cluster: { @@ -38,14 +38,14 @@ async function main() { console.log( `Message sent. Emitter: ${submittedMessage.emitter.toBase58()}, Sequence Number: ${ submittedMessage.sequenceNumber - }` + }`, ); console.log(`Sleeping for 5 seconds to allow the message to be processed...`); await new Promise((resolve) => setTimeout(resolve, 5000)); console.log( `Fetching VAA for message ${submittedMessage.emitter.toBase58()}, Sequence Number: ${ submittedMessage.sequenceNumber - }...` + }...`, ); const vaa = await submittedMessage.fetchVaa(); console.log(`VAA: ${vaa.toString("hex")}`); diff --git a/contract_manager/scripts/sync_governance_vaas.ts b/contract_manager/scripts/sync_governance_vaas.ts index 0b5ba362c9..00fe5e2f9c 100644 --- a/contract_manager/scripts/sync_governance_vaas.ts +++ b/contract_manager/scripts/sync_governance_vaas.ts @@ -10,7 +10,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Tries to execute all vaas on a contract.\n" + "Useful for recently deployed contracts.\n" + - "Usage: $0 --contract --private-key " + "Usage: $0 --contract --private-key ", ) .options({ contract: { @@ -57,7 +57,7 @@ async function main() { matchedVault = mainnetVault; } else { throw new Error( - "can not find a multisig that matches the governance source of the contract" + "can not find a multisig that matches the governance source of the contract", ); } let lastExecuted = await contract.getLastExecutedGovernanceSequence(); @@ -72,7 +72,7 @@ async function main() { const submittedWormholeMessage = new SubmittedWormholeMessage( await matchedVault.getEmitter(), lastExecuted + 1, - matchedVault.cluster + matchedVault.cluster, ); let vaa: Buffer; try { @@ -93,13 +93,13 @@ async function main() { console.log("executing vaa", lastExecuted + 1); await contract.executeGovernanceInstruction( toPrivateKey(argv["private-key"]), - vaa + vaa, ); } else { console.log( `vaa is not for this chain (${ contract.getChain().wormholeChainName - } != ${action.targetChainId}, skipping` + } != ${action.targetChainId}, skipping`, ); } lastExecuted++; diff --git a/contract_manager/scripts/sync_wormhole_guardian_set.ts b/contract_manager/scripts/sync_wormhole_guardian_set.ts index 392cc83d71..0440f01bfc 100644 --- a/contract_manager/scripts/sync_wormhole_guardian_set.ts +++ b/contract_manager/scripts/sync_wormhole_guardian_set.ts @@ -79,7 +79,7 @@ async function main() { // } console.log( - `Current Guardianset for ${contract.getId()}: ${await wormhole.getCurrentGuardianSetIndex()}` + `Current Guardianset for ${contract.getId()}: ${await wormhole.getCurrentGuardianSetIndex()}`, ); await wormhole.syncMainnetGuardianSets(privateKey); diff --git a/contract_manager/scripts/update_all_pricefeeds.ts b/contract_manager/scripts/update_all_pricefeeds.ts index 7f8a600e81..2f6ffe362c 100644 --- a/contract_manager/scripts/update_all_pricefeeds.ts +++ b/contract_manager/scripts/update_all_pricefeeds.ts @@ -39,7 +39,7 @@ async function main() { const argv = await parser.argv; let priceFeedsMetadata: PriceFeedMetadata[] = []; const client = new HermesClient( - argv.endpoint || "https://hermes.pyth.network" + argv.endpoint || "https://hermes.pyth.network", ); const contract = DefaultStore.contracts[argv.contract]; const privateKey = toPrivateKey(argv["private-key"]); @@ -56,8 +56,8 @@ async function main() { for (let i = 0; i < priceFeedIds.length; i += chunkSize) { console.log( `Processing chunk ${i / chunkSize + 1} of ${Math.ceil( - priceFeedIds.length / chunkSize - )}` + priceFeedIds.length / chunkSize, + )}`, ); const chunk = priceFeedIds.slice(i, i + chunkSize); console.log(`length: ${chunk.length}`); @@ -70,9 +70,9 @@ async function main() { updates.binary.data.map((update) => encoding === "hex" ? Buffer.from(update, "hex") - : Buffer.from(update, "base64") - ) - ) + : Buffer.from(update, "base64"), + ), + ), ); } } diff --git a/contract_manager/scripts/update_pricefeed.ts b/contract_manager/scripts/update_pricefeed.ts index da211ce4cb..a8fb43af42 100644 --- a/contract_manager/scripts/update_pricefeed.ts +++ b/contract_manager/scripts/update_pricefeed.ts @@ -5,7 +5,7 @@ import { PriceServiceConnection } from "@pythnetwork/price-service-client"; const parser = yargs(hideBin(process.argv)) .usage( - "Usage: $0 --contract --feed-id --private-key " + "Usage: $0 --contract --feed-id --private-key ", ) .options({ contract: { @@ -35,20 +35,20 @@ async function main() { if (!contract) { throw new Error( `Contract ${argv.contract} not found. Contracts found: ${Object.keys( - DefaultStore.contracts - )}` + DefaultStore.contracts, + )}`, ); } const priceService = new PriceServiceConnection( - argv.endpoint || "https://hermes.pyth.network" + argv.endpoint || "https://hermes.pyth.network", ); const vaas = await priceService.getLatestVaas(argv["feed-id"] as string[]); const privateKey = toPrivateKey(argv["private-key"]); console.log( await contract.executeUpdatePriceFeed( privateKey, - vaas.map((vaa) => Buffer.from(vaa, "base64")) - ) + vaas.map((vaa) => Buffer.from(vaa, "base64")), + ), ); } diff --git a/contract_manager/scripts/upgrade_evm_entropy_contracts.ts b/contract_manager/scripts/upgrade_evm_entropy_contracts.ts index 8797d5b866..4822bde3e1 100644 --- a/contract_manager/scripts/upgrade_evm_entropy_contracts.ts +++ b/contract_manager/scripts/upgrade_evm_entropy_contracts.ts @@ -17,7 +17,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Deploys a new Upgradeable contract for Executor or Entropy to a set of chains where Entropy is deployed and creates a governance proposal for it.\n" + `Uses a cache file to avoid deploying contracts twice\n` + - "Usage: $0 --chain --chain --private-key --ops-key-path --std-output " + "Usage: $0 --chain --chain --private-key --ops-key-path --std-output ", ) .options({ ...COMMON_UPGRADE_OPTIONS, @@ -75,12 +75,12 @@ async function main() { artifact["abi"], artifact["bytecode"], [], - 2 + 2, ); - } + }, ); console.log( - `Deployed contract at ${address} on ${contract.chain.getId()}` + `Deployed contract at ${address} on ${contract.chain.getId()}`, ); const payload = argv["contract-type"] === "executor" @@ -99,8 +99,8 @@ async function main() { if (failures.length > 0) { throw new Error( `Some chains could not be deployed: ${failures.join( - ", " - )}. Scroll up to see the errors from each chain.` + ", ", + )}. Scroll up to see the errors from each chain.`, ); } diff --git a/contract_manager/scripts/upgrade_evm_pricefeed_contracts.ts b/contract_manager/scripts/upgrade_evm_pricefeed_contracts.ts index aee6547c65..a17e7c9e60 100644 --- a/contract_manager/scripts/upgrade_evm_pricefeed_contracts.ts +++ b/contract_manager/scripts/upgrade_evm_pricefeed_contracts.ts @@ -16,7 +16,7 @@ const parser = yargs(hideBin(process.argv)) .usage( "Deploys a new PythUpgradable contract to a set of chains and creates a governance proposal for it.\n" + `Uses a cache file (${CACHE_FILE}) to avoid deploying contracts twice\n` + - "Usage: $0 --chain --chain --private-key --ops-key-path --std-output " + "Usage: $0 --chain --chain --private-key --ops-key-path --std-output ", ) .options(COMMON_UPGRADE_OPTIONS); @@ -32,7 +32,7 @@ async function main() { console.log("Using cache file", CACHE_FILE); console.log( "Upgrading on chains", - selectedChains.map((c) => c.getId()) + selectedChains.map((c) => c.getId()), ); const payloads: Buffer[] = []; @@ -44,12 +44,12 @@ async function main() { toPrivateKey(argv["private-key"]), artifact["abi"], artifact["bytecode"], - [] + [], ); }); console.log(`Deployed contract at ${address} on ${chain.getId()}`); payloads.push( - chain.generateGovernanceUpgradePayload(address.replace("0x", "")) + chain.generateGovernanceUpgradePayload(address.replace("0x", "")), ); } diff --git a/contract_manager/scripts/upgrade_ton_contract.ts b/contract_manager/scripts/upgrade_ton_contract.ts index 1baa0156ce..078e933e3c 100644 --- a/contract_manager/scripts/upgrade_ton_contract.ts +++ b/contract_manager/scripts/upgrade_ton_contract.ts @@ -13,7 +13,7 @@ import { Cell } from "@ton/ton"; const parser = yargs(hideBin(process.argv)) .usage( "Upgrades the Pyth contract on TON and creates a governance proposal for it.\n" + - "Usage: $0 --contract --private-key " + "Usage: $0 --contract --private-key ", ) .options({ contract: { @@ -39,7 +39,7 @@ async function main() { // NOTE: Remember to rebuild contract_manager before running this script because it will also build the ton contract const compiledPath = path.resolve( __dirname, - "../../target_chains/ton/contracts/build/Main.compiled.json" + "../../target_chains/ton/contracts/build/Main.compiled.json", ); const compiled = JSON.parse(fs.readFileSync(compiledPath, "utf8")); const newCode = Cell.fromHex(compiled.hex); @@ -47,7 +47,7 @@ async function main() { const tx = await contract.upgradeContract( toPrivateKey(argv["private-key"]), - newCode + newCode, ); console.log("Upgrade transaction:", tx); } diff --git a/contract_manager/scripts/upload_cosmwasm.ts b/contract_manager/scripts/upload_cosmwasm.ts index 2cbc0faf3c..ed74ecd78a 100644 --- a/contract_manager/scripts/upload_cosmwasm.ts +++ b/contract_manager/scripts/upload_cosmwasm.ts @@ -7,7 +7,7 @@ import { toPrivateKey } from "../src"; const parser = yargs(hideBin(process.argv)) .usage( - "Usage: $0 --code --private-key --chain " + "Usage: $0 --code --private-key --chain ", ) .options({ code: { @@ -33,7 +33,7 @@ async function main() { const { codeId } = await CosmWasmPriceFeedContract.storeCode( DefaultStore.chains[argv.chain] as CosmWasmChain, toPrivateKey(argv["private-key"]), - code + code, ); console.log(`Successfully uploaded code with id ${codeId}`); } diff --git a/contract_manager/src/base.ts b/contract_manager/src/base.ts index 9e3059f650..cec89b9f6e 100644 --- a/contract_manager/src/base.ts +++ b/contract_manager/src/base.ts @@ -101,7 +101,7 @@ export abstract class PriceFeedContract extends Storable { */ abstract executeUpdatePriceFeed( senderPrivateKey: PrivateKey, - vaas: Buffer[] + vaas: Buffer[], ): Promise; /** @@ -111,7 +111,7 @@ export abstract class PriceFeedContract extends Storable { */ abstract executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise; /** diff --git a/contract_manager/src/chains.ts b/contract_manager/src/chains.ts index 5f729ef90b..5c4226c2e0 100644 --- a/contract_manager/src/chains.ts +++ b/contract_manager/src/chains.ts @@ -55,7 +55,7 @@ export function parseRpcUrl(rpcUrl: string): string { const envValue = process.env[envName]; if (!envValue) { throw new Error( - `Missing env variable ${envName} required for this RPC: ${rpcUrl}` + `Missing env variable ${envName} required for this RPC: ${rpcUrl}`, ); } rpcUrl = rpcUrl.replace(envMatch, envValue); @@ -86,7 +86,7 @@ export abstract class Chain extends Storable { protected id: string, protected mainnet: boolean, wormholeChainName: string, - protected nativeToken: TokenId | undefined + protected nativeToken: TokenId | undefined, ) { super(); this.wormholeChainName = wormholeChainName as ChainName; @@ -119,7 +119,7 @@ export abstract class Chain extends Storable { return new SetFee( this.wormholeChainName, BigInt(fee), - BigInt(exponent) + BigInt(exponent), ).encode(); } @@ -136,11 +136,11 @@ export abstract class Chain extends Storable { * @param newValidStalePriceThreshold the new stale price threshold in seconds */ generateGovernanceSetStalePriceThreshold( - newValidStalePriceThreshold: bigint + newValidStalePriceThreshold: bigint, ): Buffer { return new SetValidPeriod( this.wormholeChainName, - newValidStalePriceThreshold + newValidStalePriceThreshold, ).encode(); } @@ -175,7 +175,7 @@ export class GlobalChain extends Chain { generateGovernanceUpgradePayload(): Buffer { throw new Error( - "Can not create a governance message for upgrading contracts on all chains!" + "Can not create a governance message for upgrading contracts on all chains!", ); } @@ -214,7 +214,7 @@ export class CosmWasmChain extends Chain { public endpoint: string, public gasPrice: string, public prefix: string, - public feeDenom: string + public feeDenom: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -229,7 +229,7 @@ export class CosmWasmChain extends Chain { parsed.endpoint, parsed.gasPrice, parsed.prefix, - parsed.feeDenom + parsed.feeDenom, ); } @@ -260,18 +260,18 @@ export class CosmWasmChain extends Chain { } async getExecutor( - privateKey: PrivateKey + privateKey: PrivateKey, ): Promise { if (this.getId().indexOf("injective") > -1) { return InjectiveExecutor.fromPrivateKey( this.isMainnet() ? Network.Mainnet : Network.Testnet, - privateKey + privateKey, ); } return new CosmwasmExecutor( this.endpoint, await CosmwasmExecutor.getSignerFromPrivateKey(privateKey, this.prefix), - this.gasPrice + this.feeDenom + this.gasPrice + this.feeDenom, ); } @@ -298,7 +298,7 @@ export class SuiChain extends Chain { mainnet: boolean, wormholeChainName: string, nativeToken: TokenId | undefined, - public rpcUrl: string + public rpcUrl: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -310,7 +310,7 @@ export class SuiChain extends Chain { parsed.mainnet, parsed.wormholeChainName, parsed.nativeToken, - parsed.rpcUrl + parsed.rpcUrl, ); } @@ -342,7 +342,7 @@ export class SuiChain extends Chain { async getAccountAddress(privateKey: PrivateKey): Promise { const keypair = SuiEd25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(privateKey, "hex")) + new Uint8Array(Buffer.from(privateKey, "hex")), ); return keypair.toSuiAddress(); } @@ -364,7 +364,7 @@ export class IotaChain extends Chain { mainnet: boolean, wormholeChainName: string, nativeToken: TokenId | undefined, - public rpcUrl: string + public rpcUrl: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -376,7 +376,7 @@ export class IotaChain extends Chain { parsed.mainnet, parsed.wormholeChainName, parsed.nativeToken, - parsed.rpcUrl + parsed.rpcUrl, ); } @@ -408,7 +408,7 @@ export class IotaChain extends Chain { async getAccountAddress(privateKey: PrivateKey): Promise { const keypair = IotaEd25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(privateKey, "hex")) + new Uint8Array(Buffer.from(privateKey, "hex")), ); return keypair.toIotaAddress(); } @@ -430,7 +430,7 @@ export class EvmChain extends Chain { mainnet: boolean, nativeToken: TokenId | undefined, private rpcUrl: string, - private networkId: number + private networkId: number, ) { // On EVM networks we use the chain id as the wormhole chain name super(id, mainnet, id, nativeToken); @@ -450,7 +450,7 @@ export class EvmChain extends Chain { parsed.mainnet, parsed.nativeToken, parsed.rpcUrl, - parsed.networkId + parsed.networkId, ); } @@ -488,14 +488,14 @@ export class EvmChain extends Chain { generateExecutorPayload( executor: string, callAddress: string, - calldata: string + calldata: string, ): Buffer { return new EvmExecute( this.wormholeChainName, executor.replace("0x", ""), callAddress.replace("0x", ""), 0n, - Buffer.from(calldata.replace("0x", ""), "hex") + Buffer.from(calldata.replace("0x", ""), "hex"), ).encode(); } @@ -529,7 +529,7 @@ export class EvmChain extends Chain { async estiamteAndSendTransaction( transactionObject: any, // eslint-disable-line @typescript-eslint/no-explicit-any - txParams: { from?: string; value?: string } + txParams: { from?: string; value?: string }, ) { const GAS_ESTIMATE_MULTIPLIER = 2; const gasEstimate = await transactionObject.estimateGas(txParams); @@ -556,7 +556,7 @@ export class EvmChain extends Chain { bytecode: string, deployArgs: any[], // eslint-disable-line @typescript-eslint/no-explicit-any gasMultiplier = 1, - gasPriceMultiplier = 1 + gasPriceMultiplier = 1, ): Promise { const web3 = this.getWeb3(); const signer = web3.eth.accounts.privateKeyToAccount(privateKey); @@ -573,7 +573,7 @@ export class EvmChain extends Chain { BigInt(gas) * BigInt(gasPrice) } wei, but only have ${deployerBalance} wei. We need ${ Number(gasDiff) / 10 ** 18 - } ETH more.` + } ETH more.`, ); } @@ -601,7 +601,7 @@ export class EvmChain extends Chain { async getAccountBalance(privateKey: PrivateKey): Promise { const web3 = this.getWeb3(); const balance = await web3.eth.getBalance( - await this.getAccountAddress(privateKey) + await this.getAccountAddress(privateKey), ); return Number(balance) / 10 ** 18; } @@ -615,7 +615,7 @@ export class AptosChain extends Chain { mainnet: boolean, wormholeChainName: string, nativeToken: TokenId | undefined, - public rpcUrl: string + public rpcUrl: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -653,13 +653,13 @@ export class AptosChain extends Chain { parsed.mainnet, parsed.wormholeChainName, parsed.nativeToken, - parsed.rpcUrl + parsed.rpcUrl, ); } async getAccountAddress(privateKey: PrivateKey): Promise { const account = new AptosAccount( - new Uint8Array(Buffer.from(privateKey, "hex")) + new Uint8Array(Buffer.from(privateKey, "hex")), ); return account.address().toString(); } @@ -667,7 +667,7 @@ export class AptosChain extends Chain { async getAccountBalance(privateKey: PrivateKey): Promise { const client = this.getClient(); const account = new AptosAccount( - new Uint8Array(Buffer.from(privateKey, "hex")) + new Uint8Array(Buffer.from(privateKey, "hex")), ); const coinClient = new CoinClient(client); return Number(await coinClient.checkBalance(account)) / 10 ** 8; @@ -675,18 +675,18 @@ export class AptosChain extends Chain { async sendTransaction( senderPrivateKey: PrivateKey, - txPayload: TxnBuilderTypes.TransactionPayloadEntryFunction + txPayload: TxnBuilderTypes.TransactionPayloadEntryFunction, ): Promise { const client = this.getClient(); const sender = new AptosAccount( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await client.generateSignSubmitWaitForTransaction( sender, txPayload, { maxGasAmount: BigInt(30000), - } + }, ); return { id: result.hash, info: result }; } @@ -700,7 +700,7 @@ export class FuelChain extends Chain { mainnet: boolean, wormholeChainName: string, nativeToken: TokenId | undefined, - public gqlUrl: string + public gqlUrl: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -744,7 +744,7 @@ export class FuelChain extends Chain { parsed.mainnet, parsed.wormholeChainName, parsed.nativeToken, - parsed.gqlUrl + parsed.gqlUrl, ); } @@ -767,7 +767,7 @@ export class StarknetChain extends Chain { id: string, mainnet: boolean, wormholeChainName: string, - public rpcUrl: string + public rpcUrl: string, ) { super(id, mainnet, wormholeChainName, undefined); } @@ -792,7 +792,7 @@ export class StarknetChain extends Chain { parsed.id, parsed.mainnet, parsed.wormholeChainName, - parsed.rpcUrl + parsed.rpcUrl, ); } @@ -856,7 +856,7 @@ export class TonChain extends Chain { mainnet: boolean, wormholeChainName: string, nativeToken: TokenId | undefined, - private rpcUrl: string + private rpcUrl: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -876,7 +876,7 @@ export class TonChain extends Chain { async getContract(address: string): Promise> { const client = await this.getClient(); const contract = client.open( - PythContract.createFromAddress(Address.parse(address)) + PythContract.createFromAddress(Address.parse(address)), ); return contract; } @@ -934,7 +934,7 @@ export class TonChain extends Chain { parsed.mainnet, parsed.wormholeChainName, parsed.nativeToken, - parsed.rpcUrl + parsed.rpcUrl, ); } @@ -960,7 +960,7 @@ export class NearChain extends Chain { wormholeChainName: string, nativeToken: TokenId | undefined, private rpcUrl: string, - private networkId: string + private networkId: string, ) { super(id, mainnet, wormholeChainName, nativeToken); } @@ -973,7 +973,7 @@ export class NearChain extends Chain { parsed.wormholeChainName, parsed.nativeToken, parsed.rpcUrl, - parsed.networkId + parsed.networkId, ); } @@ -1003,10 +1003,10 @@ export class NearChain extends Chain { async getAccountAddress(privateKey: PrivateKey): Promise { return Buffer.from( SuiEd25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(privateKey, "hex")) + new Uint8Array(Buffer.from(privateKey, "hex")), ) .getPublicKey() - .toRawBytes() + .toRawBytes(), ).toString("hex"); } @@ -1019,12 +1019,12 @@ export class NearChain extends Chain { async getNearAccount( accountId: string, - senderPrivateKey?: PrivateKey + senderPrivateKey?: PrivateKey, ): Promise { const keyStore = new nearAPI.keyStores.InMemoryKeyStore(); if (typeof senderPrivateKey !== "undefined") { const key = bs58.encode( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const keyPair = nearAPI.KeyPair.fromString(key); const address = await this.getAccountAddress(senderPrivateKey); diff --git a/contract_manager/src/contracts/aptos.ts b/contract_manager/src/contracts/aptos.ts index 640105d99d..d5c4e8ec61 100644 --- a/contract_manager/src/contracts/aptos.ts +++ b/contract_manager/src/contracts/aptos.ts @@ -41,7 +41,7 @@ export class AptosWormholeContract extends WormholeContract { parsed: { type: string; address: string; - } + }, ): AptosWormholeContract { if (parsed.type !== AptosWormholeContract.type) throw new Error("Invalid type"); @@ -50,7 +50,10 @@ export class AptosWormholeContract extends WormholeContract { return new AptosWormholeContract(chain, parsed.address); } - constructor(public chain: AptosChain, public address: string) { + constructor( + public chain: AptosChain, + public address: string, + ) { super(); } @@ -93,15 +96,15 @@ export class AptosWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const txPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction( TxnBuilderTypes.EntryFunction.natural( `${this.address}::guardian_set_upgrade`, "submit_vaa_entry", [], - [BCS.bcsSerializeBytes(vaa)] - ) + [BCS.bcsSerializeBytes(vaa)], + ), ); return this.chain.sendTransaction(senderPrivateKey, txPayload); } @@ -121,7 +124,7 @@ export class AptosPriceFeedContract extends PriceFeedContract { constructor( public chain: AptosChain, public stateId: string, - public wormholeStateId: string + public wormholeStateId: string, ) { super(); } @@ -132,7 +135,7 @@ export class AptosPriceFeedContract extends PriceFeedContract { type: string; stateId: string; wormholeStateId: string; - } + }, ): AptosPriceFeedContract { if (parsed.type !== AptosPriceFeedContract.type) throw new Error("Invalid type"); @@ -141,21 +144,21 @@ export class AptosPriceFeedContract extends PriceFeedContract { return new AptosPriceFeedContract( chain, parsed.stateId, - parsed.wormholeStateId + parsed.wormholeStateId, ); } async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const txPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction( TxnBuilderTypes.EntryFunction.natural( `${this.stateId}::governance`, "execute_governance_instruction", [], - [BCS.bcsSerializeBytes(vaa)] - ) + [BCS.bcsSerializeBytes(vaa)], + ), ); return this.chain.sendTransaction(senderPrivateKey, txPayload); } @@ -166,15 +169,15 @@ export class AptosPriceFeedContract extends PriceFeedContract { async executeUpdatePriceFeed( senderPrivateKey: PrivateKey, - vaas: Buffer[] + vaas: Buffer[], ): Promise { const txPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction( TxnBuilderTypes.EntryFunction.natural( `${this.stateId}::pyth`, "update_price_feeds_with_funder", [], - [BCS.serializeVectorWithFunc(vaas, "serializeBytes")] - ) + [BCS.serializeVectorWithFunc(vaas, "serializeBytes")], + ), ); return this.chain.sendTransaction(senderPrivateKey, txPayload); } @@ -264,7 +267,7 @@ export class AptosPriceFeedContract extends PriceFeedContract { emitterChain: Number(source.emitter_chain), emitterAddress: source.emitter_address.external_address.replace( "0x", - "" + "", ), }; }); @@ -281,14 +284,14 @@ export class AptosPriceFeedContract extends PriceFeedContract { emitterChain: Number(data.source.emitter_chain), emitterAddress: data.source.emitter_address.external_address.replace( "0x", - "" + "", ), }; } async getLastExecutedGovernanceSequence() { const data = (await this.findResource( - "LastExecutedGovernanceSequence" + "LastExecutedGovernanceSequence", )) as { sequence: string }; return Number(data.sequence); } diff --git a/contract_manager/src/contracts/cosmwasm.ts b/contract_manager/src/contracts/cosmwasm.ts index 26280be5dc..5272be0780 100644 --- a/contract_manager/src/contracts/cosmwasm.ts +++ b/contract_manager/src/contracts/cosmwasm.ts @@ -59,7 +59,7 @@ export class CosmWasmWormholeContract extends WormholeContract { static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): CosmWasmWormholeContract { if (parsed.type !== CosmWasmWormholeContract.type) throw new Error("Invalid type"); @@ -68,7 +68,10 @@ export class CosmWasmWormholeContract extends WormholeContract { return new CosmWasmWormholeContract(chain, parsed.address); } - constructor(public chain: CosmWasmChain, public address: string) { + constructor( + public chain: CosmWasmChain, + public address: string, + ) { super(); } @@ -100,13 +103,13 @@ export class CosmWasmWormholeContract extends WormholeContract { const guardianSet = JSON.parse(config[key])["addresses"]; return guardianSet.map((entry: { bytes: string }) => - Buffer.from(entry.bytes, "base64").toString("hex") + Buffer.from(entry.bytes, "base64").toString("hex"), ); } async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const executor = await this.chain.getExecutor(senderPrivateKey); const result = await executor.executeContract({ @@ -129,7 +132,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { emitterChain: Number(chain_id), emitterAddress: Buffer.from(emitter, "base64").toString("hex"), }; - } + }, ); } @@ -143,13 +146,16 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { }; } - constructor(public chain: CosmWasmChain, public address: string) { + constructor( + public chain: CosmWasmChain, + public address: string, + ) { super(); } static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): CosmWasmPriceFeedContract { if (parsed.type !== CosmWasmPriceFeedContract.type) throw new Error("Invalid type"); @@ -172,7 +178,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { static async storeCode( chain: CosmWasmChain, privateKey: PrivateKey, - wasmPath: string + wasmPath: string, ) { const contractBytes = readFileSync(wasmPath); const executor = await chain.getExecutor(privateKey); @@ -190,7 +196,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { chain: CosmWasmChain, codeId: number, config: DeploymentConfig, - privateKey: PrivateKey + privateKey: PrivateKey, ): Promise { const executor = await chain.getExecutor(privateKey); const result = await executor.instantiateContract({ @@ -276,7 +282,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { equalDataSources( dataSources1: WormholeSource[], - dataSources2: WormholeSource[] + dataSources2: WormholeSource[], ): boolean { if (dataSources1.length !== dataSources2.length) return false; for (let i = 0; i < dataSources1.length; i++) { @@ -368,7 +374,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { const client = await CosmWasmClient.connect(this.chain.endpoint); const coin = await client.getBalance( this.address, - this.getChain().feeDenom + this.getChain().feeDenom, ); return { amount: BigInt(coin.amount), @@ -380,7 +386,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract { const client = await CosmWasmClient.connect(this.chain.endpoint); const result = await client.queryContractSmart( this.address, - "get_valid_time_period" + "get_valid_time_period", ); return Number(result.secs + result.nanos * 1e-9); } diff --git a/contract_manager/src/contracts/evm.ts b/contract_manager/src/contracts/evm.ts index d703008315..41642c4695 100644 --- a/contract_manager/src/contracts/evm.ts +++ b/contract_manager/src/contracts/evm.ts @@ -25,12 +25,12 @@ import { */ export async function getCodeDigestWithoutAddress( web3: Web3, - address: string + address: string, ): Promise { const code = await web3.eth.getCode(address); const strippedCode = code.replaceAll( address.toLowerCase().replace("0x", ""), - "0000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000", ); return Web3.utils.keccak256(strippedCode); } @@ -57,7 +57,7 @@ export class EvmWormholeContract extends WormholeContract { static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): EvmWormholeContract { if (parsed.type !== EvmWormholeContract.type) throw new Error("Invalid type"); @@ -66,7 +66,10 @@ export class EvmWormholeContract extends WormholeContract { return new EvmWormholeContract(chain, parsed.address); } - constructor(public chain: EvmChain, public address: string) { + constructor( + public chain: EvmChain, + public address: string, + ) { super(); } getContract(): Contract { @@ -77,7 +80,7 @@ export class EvmWormholeContract extends WormholeContract { async getCurrentGuardianSetIndex(): Promise { const wormholeContract = this.getContract(); return Number( - await wormholeContract.methods.getCurrentGuardianSetIndex().call() + await wormholeContract.methods.getCurrentGuardianSetIndex().call(), ); } @@ -103,11 +106,11 @@ export class EvmWormholeContract extends WormholeContract { const { address } = web3.eth.accounts.wallet.add(senderPrivateKey); const wormholeContract = new web3.eth.Contract(WORMHOLE_ABI, this.address); const transactionObject = wormholeContract.methods.submitNewGuardianSet( - "0x" + vaa.toString("hex") + "0x" + vaa.toString("hex"), ); const result = await this.chain.estiamteAndSendTransaction( transactionObject, - { from: address } + { from: address }, ); return { id: result.transactionHash, info: result }; } @@ -158,7 +161,10 @@ export const ENTROPY_DEFAULT_KEEPER = { export class EvmEntropyContract extends Storable { static type = "EvmEntropyContract"; - constructor(public chain: EvmChain, public address: string) { + constructor( + public chain: EvmChain, + public address: string, + ) { super(); } @@ -181,7 +187,7 @@ export class EvmEntropyContract extends Storable { static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): EvmEntropyContract { if (parsed.type !== EvmEntropyContract.type) throw new Error("Invalid type"); @@ -205,20 +211,20 @@ export class EvmEntropyContract extends Storable { } async generateUpgradeEntropyContractPayload( - newImplementation: string + newImplementation: string, ): Promise { const contract = this.getContract(); const data = contract.methods.upgradeTo(newImplementation).encodeABI(); return this.chain.generateExecutorPayload( await this.getOwner(), this.address, - data + data, ); } // Generates a payload to upgrade the executor contract, the owner of entropy contracts async generateUpgradeExecutorContractsPayload( - newImplementation: string + newImplementation: string, ): Promise { // Executor contract is the owner of entropy contract const executorAddr = await this.getOwner(); @@ -280,7 +286,7 @@ export class EvmEntropyContract extends Storable { */ async getRequest( provider: string, - sequenceNumber: number + sequenceNumber: number, ): Promise { const contract = this.getContract(); return contract.methods.getRequest(provider, sequenceNumber).call(); @@ -298,7 +304,7 @@ export class EvmEntropyContract extends Storable { async getUserRandomNumber( provider: string, sequenceNumber: number, - block: number + block: number, ): Promise { const contract = this.getContract(); const result = await contract.getPastEvents("RequestedWithCallback", { @@ -325,7 +331,7 @@ export class EvmEntropyContract extends Storable { providerRevelation: string, provider: string, sequenceNumber: number, - senderPrivateKey: PrivateKey + senderPrivateKey: PrivateKey, ) { const web3 = this.chain.getWeb3(); // can not use `this.getContract()` because it uses another web3 instance without the wallet @@ -335,7 +341,7 @@ export class EvmEntropyContract extends Storable { provider, sequenceNumber, userRandomNumber, - providerRevelation + providerRevelation, ); return this.chain.estiamteAndSendTransaction(transactionObject, { from: address, @@ -356,7 +362,7 @@ export class EvmEntropyContract extends Storable { userRandomNumber: string, provider: string, senderPrivateKey: PrivateKey, - withCallback?: boolean + withCallback?: boolean, ) { const web3 = this.chain.getWeb3(); const userCommitment = web3.utils.keccak256(userRandomNumber); @@ -368,14 +374,14 @@ export class EvmEntropyContract extends Storable { if (withCallback) { transactionObject = contract.methods.requestWithCallback( provider, - userCommitment + userCommitment, ); } else { const useBlockHash = false; transactionObject = contract.methods.request( provider, userCommitment, - useBlockHash + useBlockHash, ); } @@ -390,7 +396,7 @@ export class EvmEntropyContract extends Storable { providerRevelation: string, provider: string, sequenceNumber: string, - senderPrivateKey: PrivateKey + senderPrivateKey: PrivateKey, ) { const web3 = this.chain.getWeb3(); const contract = new web3.eth.Contract(EXTENDED_ENTROPY_ABI, this.address); @@ -399,7 +405,7 @@ export class EvmEntropyContract extends Storable { provider, sequenceNumber, userRevelation, - providerRevelation + providerRevelation, ); return this.chain.estiamteAndSendTransaction(transactionObject, { from: address, @@ -410,7 +416,10 @@ export class EvmEntropyContract extends Storable { export class EvmExpressRelayContract extends Storable { static type = "EvmExpressRelayContract"; - constructor(public chain: EvmChain, public address: string) { + constructor( + public chain: EvmChain, + public address: string, + ) { super(); } @@ -433,7 +442,7 @@ export class EvmExpressRelayContract extends Storable { static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): EvmExpressRelayContract { if (parsed.type !== EvmExpressRelayContract.type) throw new Error("Invalid type"); @@ -448,7 +457,7 @@ export class EvmExpressRelayContract extends Storable { return this.chain.generateExecutorPayload( await this.getOwner(), this.address, - data + data, ); } @@ -492,7 +501,10 @@ export class EvmExpressRelayContract extends Storable { } export class EvmExecutorContract { - constructor(public chain: EvmChain, public address: string) {} + constructor( + public chain: EvmChain, + public address: string, + ) {} getId(): string { return `${this.chain.getId()}_${this.address}`; @@ -540,17 +552,17 @@ export class EvmExecutorContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ) { const web3 = this.chain.getWeb3(); const { address } = web3.eth.accounts.wallet.add(senderPrivateKey); const executorContract = new web3.eth.Contract(EXECUTOR_ABI, this.address); const transactionObject = executorContract.methods.execute( - "0x" + vaa.toString("hex") + "0x" + vaa.toString("hex"), ); const result = await this.chain.estiamteAndSendTransaction( transactionObject, - { from: address } + { from: address }, ); return { id: result.transactionHash, info: result }; } @@ -559,13 +571,16 @@ export class EvmExecutorContract { export class EvmPriceFeedContract extends PriceFeedContract { static type = "EvmPriceFeedContract"; - constructor(public chain: EvmChain, public address: string) { + constructor( + public chain: EvmChain, + public address: string, + ) { super(); } static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): EvmPriceFeedContract { if (parsed.type !== EvmPriceFeedContract.type) throw new Error("Invalid type"); @@ -640,7 +655,7 @@ export class EvmPriceFeedContract extends PriceFeedContract { async getLastExecutedGovernanceSequence() { const pythContract = await this.getContract(); return Number( - await pythContract.methods.lastExecutedGovernanceSequence().call() + await pythContract.methods.lastExecutedGovernanceSequence().call(), ); } @@ -704,7 +719,7 @@ export class EvmPriceFeedContract extends PriceFeedContract { emitterChain: Number(chainId), emitterAddress: emitterAddress.replace("0x", ""), }; - } + }, ); } @@ -731,24 +746,24 @@ export class EvmPriceFeedContract extends PriceFeedContract { pythContract.methods.updatePriceFeeds(priceFeedUpdateData); const result = await this.chain.estiamteAndSendTransaction( transactionObject, - { from: address, value: updateFee } + { from: address, value: updateFee }, ); return { id: result.transactionHash, info: result }; } async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ) { const web3 = this.chain.getWeb3(); const { address } = web3.eth.accounts.wallet.add(senderPrivateKey); const pythContract = new web3.eth.Contract(EXTENDED_PYTH_ABI, this.address); const transactionObject = pythContract.methods.executeGovernanceInstruction( - "0x" + vaa.toString("hex") + "0x" + vaa.toString("hex"), ); const result = await this.chain.estiamteAndSendTransaction( transactionObject, - { from: address } + { from: address }, ); return { id: result.transactionHash, info: result }; } @@ -778,7 +793,10 @@ export const PULSE_DEFAULT_KEEPER = { export class EvmPulseContract extends Storable { static type = "EvmPulseContract"; - constructor(public chain: EvmChain, public address: string) { + constructor( + public chain: EvmChain, + public address: string, + ) { super(); } @@ -801,7 +819,7 @@ export class EvmPulseContract extends Storable { static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): EvmPulseContract { if (parsed.type !== EvmPulseContract.type) throw new Error("Invalid type"); if (!(chain instanceof EvmChain)) @@ -889,7 +907,7 @@ export class EvmPulseContract extends Storable { senderPrivateKey: PrivateKey, publishTime: number, priceIds: string[], - callbackGasLimit: number + callbackGasLimit: number, ) { const web3 = this.chain.getWeb3(); const { address } = web3.eth.accounts.wallet.add(senderPrivateKey); @@ -899,12 +917,12 @@ export class EvmPulseContract extends Storable { const transactionObject = contract.methods.requestPriceUpdatesWithCallback( publishTime, priceIds, - callbackGasLimit + callbackGasLimit, ); const result = await this.chain.estiamteAndSendTransaction( transactionObject, - { from: address, value: fee } + { from: address, value: fee }, ); return { id: result.transactionHash, info: result }; } @@ -913,7 +931,7 @@ export class EvmPulseContract extends Storable { senderPrivateKey: PrivateKey, sequenceNumber: number, updateData: string[], - priceIds: string[] + priceIds: string[], ) { const web3 = this.chain.getWeb3(); const { address } = web3.eth.accounts.wallet.add(senderPrivateKey); @@ -922,12 +940,12 @@ export class EvmPulseContract extends Storable { const transactionObject = contract.methods.executeCallback( sequenceNumber, updateData, - priceIds + priceIds, ); const result = await this.chain.estiamteAndSendTransaction( transactionObject, - { from: address } + { from: address }, ); return { id: result.transactionHash, info: result }; } @@ -939,7 +957,7 @@ export class EvmPulseContract extends Storable { return this.chain.generateExecutorPayload( await this.getOwner(), this.address, - data + data, ); } @@ -949,12 +967,12 @@ export class EvmPulseContract extends Storable { return this.chain.generateExecutorPayload( await this.getOwner(), this.address, - data + data, ); } async generateSetExclusivityPeriodPayload( - periodSeconds: number + periodSeconds: number, ): Promise { const contract = this.getContract(); const data = contract.methods @@ -963,7 +981,7 @@ export class EvmPulseContract extends Storable { return this.chain.generateExecutorPayload( await this.getOwner(), this.address, - data + data, ); } } diff --git a/contract_manager/src/contracts/fuel.ts b/contract_manager/src/contracts/fuel.ts index a5eb079501..dd18b5fa85 100644 --- a/contract_manager/src/contracts/fuel.ts +++ b/contract_manager/src/contracts/fuel.ts @@ -44,7 +44,7 @@ export class FuelWormholeContract extends WormholeContract { parsed: { type: string; address: string; - } + }, ): FuelWormholeContract { if (parsed.type !== FuelWormholeContract.type) throw new Error("Invalid type"); @@ -53,7 +53,10 @@ export class FuelWormholeContract extends WormholeContract { return new FuelWormholeContract(chain, parsed.address); } - constructor(public chain: FuelChain, public address: string) { + constructor( + public chain: FuelChain, + public address: string, + ) { super(); } @@ -63,7 +66,7 @@ export class FuelWormholeContract extends WormholeContract { return new Contract( this.address, FuelContractAbi, - wallet ? (wallet as Account) : provider + wallet ? (wallet as Account) : provider, ); } @@ -92,7 +95,7 @@ export class FuelWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const wallet = await this.chain.getWallet(senderPrivateKey); const contract = await this.getContract(wallet); @@ -112,13 +115,16 @@ export class FuelWormholeContract extends WormholeContract { export class FuelPriceFeedContract extends PriceFeedContract { static type = "FuelPriceFeedContract"; - constructor(public chain: FuelChain, public address: string) { + constructor( + public chain: FuelChain, + public address: string, + ) { super(); } static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): FuelPriceFeedContract { if (parsed.type !== FuelPriceFeedContract.type) throw new Error("Invalid type"); @@ -143,7 +149,7 @@ export class FuelPriceFeedContract extends PriceFeedContract { return new Contract( this.address, FuelContractAbi, - wallet ? (wallet as Account) : provider + wallet ? (wallet as Account) : provider, ); } @@ -160,7 +166,7 @@ export class FuelPriceFeedContract extends PriceFeedContract { const pythContract = await this.getContract(); return Number( (await pythContract.functions.last_executed_governance_sequence().get()) - .value + .value, ); } @@ -234,7 +240,7 @@ export class FuelPriceFeedContract extends PriceFeedContract { emitterChain: chain_id, emitterAddress: emitter_address.replace("0x", ""), }; - } + }, ); } @@ -270,7 +276,7 @@ export class FuelPriceFeedContract extends PriceFeedContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ) { const wallet = await this.chain.getWallet(senderPrivateKey); const contract = await this.getContract(wallet); diff --git a/contract_manager/src/contracts/iota.ts b/contract_manager/src/contracts/iota.ts index a6946bcfa0..a803094144 100644 --- a/contract_manager/src/contracts/iota.ts +++ b/contract_manager/src/contracts/iota.ts @@ -25,19 +25,19 @@ export class IotaPriceFeedContract extends PriceFeedContract { constructor( public chain: IotaChain, public stateId: string, - public wormholeStateId: string + public wormholeStateId: string, ) { super(); this.client = new IotaPythClient( this.getProvider(), this.stateId, - this.wormholeStateId + this.wormholeStateId, ); } static fromJson( chain: Chain, - parsed: { type: string; stateId: string; wormholeStateId: string } + parsed: { type: string; stateId: string; wormholeStateId: string }, ): IotaPriceFeedContract { if (parsed.type !== IotaPriceFeedContract.type) throw new Error("Invalid type"); @@ -46,7 +46,7 @@ export class IotaPriceFeedContract extends PriceFeedContract { return new IotaPriceFeedContract( chain, parsed.stateId, - parsed.wormholeStateId + parsed.wormholeStateId, ); } @@ -118,12 +118,12 @@ export class IotaPriceFeedContract extends PriceFeedContract { }); if (!priceInfo.data || !priceInfo.data.content) { throw new Error( - `Price feed ID ${priceInfoObjectId} in price table but object not found!!` + `Price feed ID ${priceInfoObjectId} in price table but object not found!!`, ); } if (priceInfo.data.content.dataType !== "moveObject") { throw new Error( - `Expected ${priceInfoObjectId} to be a moveObject (PriceInfoObject)` + `Expected ${priceInfoObjectId} to be a moveObject (PriceInfoObject)`, ); } return { @@ -131,12 +131,12 @@ export class IotaPriceFeedContract extends PriceFeedContract { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore priceInfo.data.content.fields.price_info.fields.price_feed.fields - .ema_price + .ema_price, ), price: await this.parsePrice( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - priceInfo.data.content.fields.price_info.fields.price_feed.fields.price + priceInfo.data.content.fields.price_info.fields.price_feed.fields.price, ), }; } @@ -153,7 +153,7 @@ export class IotaPriceFeedContract extends PriceFeedContract { const verificationReceipt = await this.getVaaVerificationReceipt( tx, packageId, - vaa + vaa, ); tx.moveCall({ @@ -175,24 +175,24 @@ export class IotaPriceFeedContract extends PriceFeedContract { async executeUpdatePriceFeedWithFeeds( senderPrivateKey: string, vaas: Buffer[], - feedIds: string[] + feedIds: string[], ): Promise { const tx = new Transaction(); await this.client.updatePriceFeeds(tx, vaas, feedIds); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await this.executeTransaction(tx, keypair); return { id: result.digest, info: result }; } async executeCreatePriceFeed( senderPrivateKey: string, - vaas: Buffer[] + vaas: Buffer[], ): Promise { const tx = new Transaction(); await this.client.createPriceFeed(tx, vaas); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await this.executeTransaction(tx, keypair); @@ -201,17 +201,17 @@ export class IotaPriceFeedContract extends PriceFeedContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const tx = new Transaction(); const packageId = await this.getPythPackageId(); const verificationReceipt = await this.getVaaVerificationReceipt( tx, packageId, - vaa + vaa, ); tx.moveCall({ @@ -227,14 +227,14 @@ export class IotaPriceFeedContract extends PriceFeedContract { vaa: Buffer, keypair: Ed25519Keypair, modules: number[][], - dependencies: string[] + dependencies: string[], ) { const tx = new Transaction(); const packageId = await this.getPythPackageId(); const verificationReceipt = await this.getVaaVerificationReceipt( tx, packageId, - vaa + vaa, ); const [upgradeTicket] = tx.moveCall({ @@ -268,7 +268,7 @@ export class IotaPriceFeedContract extends PriceFeedContract { async getVaaVerificationReceipt( tx: Transaction, packageId: string, - vaa: Buffer + vaa: Buffer, ) { const wormholePackageId = await this.getWormholePackageId(); @@ -330,7 +330,7 @@ export class IotaPriceFeedContract extends PriceFeedContract { }); if (!result.data || !result.data.content) { throw new Error( - "Data Sources not found, contract may not be initialized" + "Data Sources not found, contract may not be initialized", ); } if (result.data.content.dataType !== "moveObject") { @@ -350,10 +350,10 @@ export class IotaPriceFeedContract extends PriceFeedContract { return { emitterChain: Number(fields.emitter_chain), emitterAddress: Buffer.from( - fields.emitter_address.fields.value.fields.data + fields.emitter_address.fields.value.fields.data, ).toString("hex"), }; - } + }, ); } @@ -431,7 +431,7 @@ export class IotaWormholeContract extends WormholeContract { type: string; address: string; stateId: string; - } + }, ): IotaWormholeContract { if (parsed.type !== IotaWormholeContract.type) throw new Error("Invalid type"); @@ -440,7 +440,10 @@ export class IotaWormholeContract extends WormholeContract { return new IotaWormholeContract(chain, parsed.stateId); } - constructor(public chain: IotaChain, public stateId: string) { + constructor( + public chain: IotaChain, + public stateId: string, + ) { super(); this.client = new IotaPythClient( this.chain.getProvider(), @@ -449,7 +452,7 @@ export class IotaWormholeContract extends WormholeContract { // so there is no Pyth contract here, passing empty string to type- // check. "", - this.stateId + this.stateId, ); } @@ -480,7 +483,7 @@ export class IotaWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const tx = new Transaction(); const coreObjectId = this.stateId; @@ -517,7 +520,7 @@ export class IotaWormholeContract extends WormholeContract { }); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await this.executeTransaction(tx, keypair); return { id: result.digest, info: result }; diff --git a/contract_manager/src/contracts/near.ts b/contract_manager/src/contracts/near.ts index 966c34291a..a7df32bb96 100644 --- a/contract_manager/src/contracts/near.ts +++ b/contract_manager/src/contracts/near.ts @@ -14,7 +14,10 @@ import { WormholeContract } from "./wormhole"; export class NearWormholeContract extends WormholeContract { static type = "NearWormholeContract"; - constructor(public chain: NearChain, public address: string) { + constructor( + public chain: NearChain, + public address: string, + ) { super(); } @@ -32,7 +35,7 @@ export class NearWormholeContract extends WormholeContract { static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): NearWormholeContract { if (parsed.type !== NearWormholeContract.type) throw new Error("Invalid type"); @@ -51,12 +54,12 @@ export class NearWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const senderAddress = await this.chain.getAccountAddress(senderPrivateKey); const account = await this.chain.getNearAccount( senderAddress, - senderPrivateKey + senderPrivateKey, ); const outcome = await account.functionCall({ contractId: this.address, @@ -70,17 +73,17 @@ export class NearWormholeContract extends WormholeContract { getCurrentGuardianSetIndex(): Promise { throw new Error( - "near wormhole contract doesn't implement getCurrentGuardianSetIndex method" + "near wormhole contract doesn't implement getCurrentGuardianSetIndex method", ); } getChainId(): Promise { throw new Error( - "near wormhole contract doesn't implement getChainId method" + "near wormhole contract doesn't implement getChainId method", ); } getGuardianSet(): Promise { throw new Error( - "near wormhole contract doesn't implement getGuardianSet method" + "near wormhole contract doesn't implement getGuardianSet method", ); } } @@ -92,7 +95,7 @@ export class NearPriceFeedContract extends PriceFeedContract { public chain: NearChain, public address: string, public governanceDataSource: DataSource, - public lastExecutedGovernanceSequence: number + public lastExecutedGovernanceSequence: number, ) { super(); } @@ -128,7 +131,7 @@ export class NearPriceFeedContract extends PriceFeedContract { governanceDataSourceAddress: string; governanceDataSourceChain: number; lastExecutedGovernanceSequence: number; - } + }, ): NearPriceFeedContract { if (parsed.type !== NearPriceFeedContract.type) { throw new Error("Invalid type"); @@ -143,12 +146,12 @@ export class NearPriceFeedContract extends PriceFeedContract { emitterAddress: parsed.governanceDataSourceAddress, emitterChain: parsed.governanceDataSourceChain, }, - parsed.lastExecutedGovernanceSequence + parsed.lastExecutedGovernanceSequence, ); } async getContractNearAccount( - senderPrivateKey?: PrivateKey + senderPrivateKey?: PrivateKey, ): Promise { return await this.chain.getNearAccount(this.address, senderPrivateKey); } @@ -220,7 +223,7 @@ export class NearPriceFeedContract extends PriceFeedContract { async executeUpdatePriceFeed( senderPrivateKey: PrivateKey, - vaas: Buffer[] + vaas: Buffer[], ): Promise { if (vaas.length === 0) { throw new Error("no vaas specified"); @@ -228,7 +231,7 @@ export class NearPriceFeedContract extends PriceFeedContract { const senderAddress = await this.chain.getAccountAddress(senderPrivateKey); const account = await this.chain.getNearAccount( senderAddress, - senderPrivateKey + senderPrivateKey, ); const results = []; for (const vaa of vaas) { @@ -253,12 +256,12 @@ export class NearPriceFeedContract extends PriceFeedContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const senderAddress = await this.chain.getAccountAddress(senderPrivateKey); const account = await this.chain.getNearAccount( senderAddress, - senderPrivateKey + senderPrivateKey, ); const outcome = await account.functionCall({ contractId: this.address, diff --git a/contract_manager/src/contracts/starknet.ts b/contract_manager/src/contracts/starknet.ts index f0fbcb215e..4dc17a9408 100644 --- a/contract_manager/src/contracts/starknet.ts +++ b/contract_manager/src/contracts/starknet.ts @@ -36,7 +36,7 @@ export class StarknetWormholeContract extends WormholeContract { parsed: { type: string; address: string; - } + }, ): StarknetWormholeContract { if (parsed.type !== StarknetWormholeContract.type) throw new Error("Invalid type"); @@ -45,7 +45,10 @@ export class StarknetWormholeContract extends WormholeContract { return new StarknetWormholeContract(chain, parsed.address); } - constructor(public chain: StarknetChain, public address: string) { + constructor( + public chain: StarknetChain, + public address: string, + ) { super(); } @@ -74,7 +77,7 @@ export class StarknetWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const senderAddress = await this.chain.getAccountAddress(senderPrivateKey); const provider = this.chain.getProvider(); @@ -82,7 +85,7 @@ export class StarknetWormholeContract extends WormholeContract { const account = new Account( provider, "0x" + senderAddress, - "0x" + senderPrivateKey + "0x" + senderPrivateKey, ); contract.connect(account); @@ -96,7 +99,10 @@ export class StarknetWormholeContract extends WormholeContract { export class StarknetPriceFeedContract extends PriceFeedContract { static type = "StarknetPriceFeedContract"; - constructor(public chain: StarknetChain, public address: string) { + constructor( + public chain: StarknetChain, + public address: string, + ) { super(); } @@ -105,7 +111,7 @@ export class StarknetPriceFeedContract extends PriceFeedContract { parsed: { type: string; address: string; - } + }, ): StarknetPriceFeedContract { if (parsed.type !== StarknetPriceFeedContract.type) throw new Error("Invalid type"); @@ -172,7 +178,7 @@ export class StarknetPriceFeedContract extends PriceFeedContract { * @param token hex encoded token address without 0x prefix */ async getBaseUpdateFeeInToken( - token: string + token: string, ): Promise<{ amount: string; denom?: string | undefined }> { token = "0x" + token; const provider = this.chain.getProvider(); @@ -205,7 +211,7 @@ export class StarknetPriceFeedContract extends PriceFeedContract { async executeUpdatePriceFeed( senderPrivateKey: PrivateKey, - vaas: Buffer[] + vaas: Buffer[], ): Promise { const senderAddress = await this.chain.getAccountAddress(senderPrivateKey); const provider = this.chain.getProvider(); @@ -213,7 +219,7 @@ export class StarknetPriceFeedContract extends PriceFeedContract { const account = new Account( provider, "0x" + senderAddress, - "0x" + senderPrivateKey + "0x" + senderPrivateKey, ); contract.connect(account); @@ -240,7 +246,7 @@ export class StarknetPriceFeedContract extends PriceFeedContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const senderAddress = await this.chain.getAccountAddress(senderPrivateKey); const provider = this.chain.getProvider(); @@ -248,7 +254,7 @@ export class StarknetPriceFeedContract extends PriceFeedContract { const account = new Account( provider, "0x" + senderAddress, - "0x" + senderPrivateKey + "0x" + senderPrivateKey, ); contract.connect(account); diff --git a/contract_manager/src/contracts/sui.ts b/contract_manager/src/contracts/sui.ts index b565c1448a..ffb684f269 100644 --- a/contract_manager/src/contracts/sui.ts +++ b/contract_manager/src/contracts/sui.ts @@ -25,19 +25,19 @@ export class SuiPriceFeedContract extends PriceFeedContract { constructor( public chain: SuiChain, public stateId: string, - public wormholeStateId: string + public wormholeStateId: string, ) { super(); this.client = new SuiPythClient( this.getProvider(), this.stateId, - this.wormholeStateId + this.wormholeStateId, ); } static fromJson( chain: Chain, - parsed: { type: string; stateId: string; wormholeStateId: string } + parsed: { type: string; stateId: string; wormholeStateId: string }, ): SuiPriceFeedContract { if (parsed.type !== SuiPriceFeedContract.type) throw new Error("Invalid type"); @@ -46,7 +46,7 @@ export class SuiPriceFeedContract extends PriceFeedContract { return new SuiPriceFeedContract( chain, parsed.stateId, - parsed.wormholeStateId + parsed.wormholeStateId, ); } @@ -118,12 +118,12 @@ export class SuiPriceFeedContract extends PriceFeedContract { }); if (!priceInfo.data || !priceInfo.data.content) { throw new Error( - `Price feed ID ${priceInfoObjectId} in price table but object not found!!` + `Price feed ID ${priceInfoObjectId} in price table but object not found!!`, ); } if (priceInfo.data.content.dataType !== "moveObject") { throw new Error( - `Expected ${priceInfoObjectId} to be a moveObject (PriceInfoObject)` + `Expected ${priceInfoObjectId} to be a moveObject (PriceInfoObject)`, ); } return { @@ -131,12 +131,12 @@ export class SuiPriceFeedContract extends PriceFeedContract { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore priceInfo.data.content.fields.price_info.fields.price_feed.fields - .ema_price + .ema_price, ), price: await this.parsePrice( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - priceInfo.data.content.fields.price_info.fields.price_feed.fields.price + priceInfo.data.content.fields.price_info.fields.price_feed.fields.price, ), }; } @@ -153,7 +153,7 @@ export class SuiPriceFeedContract extends PriceFeedContract { const verificationReceipt = await this.getVaaVerificationReceipt( tx, packageId, - vaa + vaa, ); tx.moveCall({ @@ -175,24 +175,24 @@ export class SuiPriceFeedContract extends PriceFeedContract { async executeUpdatePriceFeedWithFeeds( senderPrivateKey: string, vaas: Buffer[], - feedIds: string[] + feedIds: string[], ): Promise { const tx = new Transaction(); await this.client.updatePriceFeeds(tx, vaas, feedIds); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await this.executeTransaction(tx, keypair); return { id: result.digest, info: result }; } async executeCreatePriceFeed( senderPrivateKey: string, - vaas: Buffer[] + vaas: Buffer[], ): Promise { const tx = new Transaction(); await this.client.createPriceFeed(tx, vaas); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await this.executeTransaction(tx, keypair); @@ -201,17 +201,17 @@ export class SuiPriceFeedContract extends PriceFeedContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const tx = new Transaction(); const packageId = await this.getPythPackageId(); const verificationReceipt = await this.getVaaVerificationReceipt( tx, packageId, - vaa + vaa, ); tx.moveCall({ @@ -227,14 +227,14 @@ export class SuiPriceFeedContract extends PriceFeedContract { vaa: Buffer, keypair: Ed25519Keypair, modules: number[][], - dependencies: string[] + dependencies: string[], ) { const tx = new Transaction(); const packageId = await this.getPythPackageId(); const verificationReceipt = await this.getVaaVerificationReceipt( tx, packageId, - vaa + vaa, ); const [upgradeTicket] = tx.moveCall({ @@ -268,7 +268,7 @@ export class SuiPriceFeedContract extends PriceFeedContract { async getVaaVerificationReceipt( tx: Transaction, packageId: string, - vaa: Buffer + vaa: Buffer, ) { const wormholePackageId = await this.getWormholePackageId(); @@ -330,7 +330,7 @@ export class SuiPriceFeedContract extends PriceFeedContract { }); if (!result.data || !result.data.content) { throw new Error( - "Data Sources not found, contract may not be initialized" + "Data Sources not found, contract may not be initialized", ); } if (result.data.content.dataType !== "moveObject") { @@ -350,10 +350,10 @@ export class SuiPriceFeedContract extends PriceFeedContract { return { emitterChain: Number(fields.emitter_chain), emitterAddress: Buffer.from( - fields.emitter_address.fields.value.fields.data + fields.emitter_address.fields.value.fields.data, ).toString("hex"), }; - } + }, ); } @@ -430,7 +430,7 @@ export class SuiWormholeContract extends WormholeContract { parsed: { type: string; stateId: string; - } + }, ): SuiWormholeContract { if (parsed.type !== SuiWormholeContract.type) throw new Error("Invalid type"); @@ -439,7 +439,10 @@ export class SuiWormholeContract extends WormholeContract { return new SuiWormholeContract(chain, parsed.stateId); } - constructor(public chain: SuiChain, public stateId: string) { + constructor( + public chain: SuiChain, + public stateId: string, + ) { super(); this.client = new SuiPythClient( this.chain.getProvider(), @@ -448,7 +451,7 @@ export class SuiWormholeContract extends WormholeContract { // so there is no Pyth contract here, passing empty string to type- // check. "", - this.stateId + this.stateId, ); } @@ -479,7 +482,7 @@ export class SuiWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const tx = new Transaction(); const coreObjectId = this.stateId; @@ -516,7 +519,7 @@ export class SuiWormholeContract extends WormholeContract { }); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(senderPrivateKey, "hex")) + new Uint8Array(Buffer.from(senderPrivateKey, "hex")), ); const result = await this.executeTransaction(tx, keypair); return { id: result.digest, info: result }; diff --git a/contract_manager/src/contracts/ton.ts b/contract_manager/src/contracts/ton.ts index 345f5e102c..cc0d1ebafe 100644 --- a/contract_manager/src/contracts/ton.ts +++ b/contract_manager/src/contracts/ton.ts @@ -37,7 +37,7 @@ export class TonWormholeContract extends WormholeContract { parsed: { type: string; address: string; - } + }, ): TonWormholeContract { if (parsed.type !== TonWormholeContract.type) throw new Error("Invalid type"); @@ -46,14 +46,17 @@ export class TonWormholeContract extends WormholeContract { return new TonWormholeContract(chain, parsed.address); } - constructor(public chain: TonChain, public address: string) { + constructor( + public chain: TonChain, + public address: string, + ) { super(); } async getContract(): Promise> { const provider = await this.chain.getContractProvider(this.address); const contract = provider.open( - PythContract.createFromAddress(Address.parse(this.address)) + PythContract.createFromAddress(Address.parse(this.address)), ); return contract; @@ -80,7 +83,7 @@ export class TonWormholeContract extends WormholeContract { async upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const contract = await this.getContract(); const provider = await this.chain.getContractProvider(this.address); @@ -93,7 +96,7 @@ export class TonWormholeContract extends WormholeContract { wallet.address, BigInt(0), Buffer.alloc(0), - 1 + 1, ); return { @@ -106,13 +109,16 @@ export class TonWormholeContract extends WormholeContract { export class TonPriceFeedContract extends PriceFeedContract { static type = "TonPriceFeedContract"; - constructor(public chain: TonChain, public address: string) { + constructor( + public chain: TonChain, + public address: string, + ) { super(); } static fromJson( chain: Chain, - parsed: { type: string; address: string } + parsed: { type: string; address: string }, ): TonPriceFeedContract { if (parsed.type !== TonPriceFeedContract.type) throw new Error("Invalid type"); @@ -136,7 +142,7 @@ export class TonPriceFeedContract extends PriceFeedContract { async getContract(): Promise> { const provider = await this.chain.getContractProvider(this.address); const contract = provider.open( - PythContract.createFromAddress(Address.parse(this.address)) + PythContract.createFromAddress(Address.parse(this.address)), ); return contract; @@ -225,7 +231,7 @@ export class TonPriceFeedContract extends PriceFeedContract { async executeUpdatePriceFeed( senderPrivateKey: PrivateKey, - vaas: Buffer[] + vaas: Buffer[], ): Promise { const client = await this.chain.getClient(); const contract = await this.getContract(); @@ -237,7 +243,7 @@ export class TonPriceFeedContract extends PriceFeedContract { await contract.sendUpdatePriceFeeds( sender, vaa, - calculateUpdatePriceFeedsFee(BigInt(fee)) + BigInt(fee) + calculateUpdatePriceFeedsFee(BigInt(fee)) + BigInt(fee), ); } @@ -246,7 +252,7 @@ export class TonPriceFeedContract extends PriceFeedContract { }); const txHash = Buffer.from(txDetails[0].hash()).toString("hex"); const txInfo = JSON.stringify(txDetails[0].description, (_, value) => - typeof value === "bigint" ? value.toString() : value + typeof value === "bigint" ? value.toString() : value, ); return { @@ -257,7 +263,7 @@ export class TonPriceFeedContract extends PriceFeedContract { async executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise { const client = await this.chain.getClient(); const contract = await this.getContract(); @@ -270,7 +276,7 @@ export class TonPriceFeedContract extends PriceFeedContract { }); const txHash = Buffer.from(txDetails[0].hash()).toString("hex"); const txInfo = JSON.stringify(txDetails[0].description, (_, value) => - typeof value === "bigint" ? value.toString() : value + typeof value === "bigint" ? value.toString() : value, ); return { @@ -281,7 +287,7 @@ export class TonPriceFeedContract extends PriceFeedContract { async upgradeContract( senderPrivateKey: PrivateKey, - newCode: Cell + newCode: Cell, ): Promise { const client = await this.chain.getClient(); const contract = await this.getContract(); @@ -294,7 +300,7 @@ export class TonPriceFeedContract extends PriceFeedContract { }); const txHash = Buffer.from(txDetails[0].hash()).toString("hex"); const txInfo = JSON.stringify(txDetails[0].description, (_, value) => - typeof value === "bigint" ? value.toString() : value + typeof value === "bigint" ? value.toString() : value, ); return { diff --git a/contract_manager/src/contracts/wormhole.ts b/contract_manager/src/contracts/wormhole.ts index 2874943b91..e323696e7c 100644 --- a/contract_manager/src/contracts/wormhole.ts +++ b/contract_manager/src/contracts/wormhole.ts @@ -21,7 +21,7 @@ export abstract class WormholeContract extends Storable { */ abstract upgradeGuardianSets( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise; /** @@ -40,7 +40,7 @@ export abstract class WormholeContract extends Storable { const vaa = MAINNET_UPGRADE_VAAS[i]; const result = await this.upgradeGuardianSets( senderPrivateKey, - Buffer.from(vaa, "hex") + Buffer.from(vaa, "hex"), ); console.log(`Submitted upgrade VAA ${i} with tx id ${result.id}`); // make sure the upgrade is complete before continuing diff --git a/contract_manager/src/executor.ts b/contract_manager/src/executor.ts index 80bb214253..4a3266c881 100644 --- a/contract_manager/src/executor.ts +++ b/contract_manager/src/executor.ts @@ -17,14 +17,14 @@ interface GovernanceContract { getLastExecutedGovernanceSequence(): Promise; executeGovernanceInstruction( senderPrivateKey: PrivateKey, - vaa: Buffer + vaa: Buffer, ): Promise; } async function executeForGovernanceContract( contract: GovernanceContract, vaa: Buffer, - senderPrivateKey: PrivateKey + senderPrivateKey: PrivateKey, ) { const parsedVaa = parseVaa(vaa); const governanceSource = await contract.getGovernanceDataSource(); @@ -37,13 +37,13 @@ async function executeForGovernanceContract( await contract.getLastExecutedGovernanceSequence(); if (lastExecutedSequence >= parsedVaa.sequence) { console.log( - `Skipping on contract ${contract.getId()} as it was already executed` + `Skipping on contract ${contract.getId()} as it was already executed`, ); return; } const { id } = await contract.executeGovernanceInstruction( senderPrivateKey, - vaa + vaa, ); console.log(`Executed on contract ${contract.getId()} with txHash: ${id}`); } @@ -67,13 +67,13 @@ export async function executeVaa(senderPrivateKey: PrivateKey, vaa: Buffer) { ) { const executorContract = new EvmExecutorContract( chain, - action.executorAddress + action.executorAddress, ); await executeForGovernanceContract( executorContract, vaa, - senderPrivateKey + senderPrivateKey, ); } } diff --git a/contract_manager/src/governance.ts b/contract_manager/src/governance.ts index cececea168..cff5bddf6b 100644 --- a/contract_manager/src/governance.ts +++ b/contract_manager/src/governance.ts @@ -49,7 +49,7 @@ export class SubmittedWormholeMessage { constructor( public emitter: PublicKey, public sequenceNumber: number, - public cluster: PythCluster + public cluster: PythCluster, ) {} /** @@ -63,20 +63,20 @@ export class SubmittedWormholeMessage { static async fromTransactionSignature( signature: string, cluster: PythCluster, - registry: SolanaRpcRegistry = getPythClusterApiUrl + registry: SolanaRpcRegistry = getPythClusterApiUrl, ): Promise { const connection = new Connection(registry(cluster), "confirmed"); const txDetails = await connection.getParsedTransaction(signature); const sequenceLogPrefix = "Sequence: "; const txLog = txDetails?.meta?.logMessages?.find((s) => - s.includes(sequenceLogPrefix) + s.includes(sequenceLogPrefix), ); const sequenceNumber = Number( txLog?.substring( - txLog.indexOf(sequenceLogPrefix) + sequenceLogPrefix.length - ) + txLog.indexOf(sequenceLogPrefix) + sequenceLogPrefix.length, + ), ); const wormholeAddress = WORMHOLE_ADDRESS[cluster]; @@ -97,7 +97,7 @@ export class SubmittedWormholeMessage { }); if (!emitter) throw new InvalidTransactionError( - "Could not find wormhole postMessage instruction" + "Could not find wormhole postMessage instruction", ); return new SubmittedWormholeMessage(emitter, sequenceNumber, cluster); } @@ -115,7 +115,7 @@ export class SubmittedWormholeMessage { const response = await fetch( `${rpcUrl}/v1/signed_vaa/1/${this.emitter.toBuffer().toString("hex")}/${ this.sequenceNumber - }` + }`, ); if (response.status === 404) { await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -160,7 +160,7 @@ export class WormholeEmitter { */ async sendMessage( payload: Buffer, - registry: SolanaRpcRegistry = getPythClusterApiUrl + registry: SolanaRpcRegistry = getPythClusterApiUrl, ) { const provider = new AnchorProvider( new Connection(registry(this.cluster), "confirmed"), @@ -168,7 +168,7 @@ export class WormholeEmitter { { commitment: "confirmed", preflightCommitment: "confirmed", - } + }, ); const wormholeAddress = WORMHOLE_ADDRESS[this.cluster]; if (!wormholeAddress) throw new Error(`Invalid cluster ${this.cluster}`); @@ -188,7 +188,7 @@ export class WormholeEmitter { }; const wormholeProgram = createWormholeProgramInterface( wormholeAddress, - provider + provider, ); const transaction = new Transaction(); transaction.add( @@ -196,18 +196,18 @@ export class WormholeEmitter { fromPubkey: emitter, toPubkey: feeCollector, lamports: 1000, - }) + }), ); transaction.add( await wormholeProgram.methods .postMessage(0, payload, 0) .accounts(accounts) - .instruction() + .instruction(), ); const signature = await provider.sendAndConfirm(transaction, [kp]); return SubmittedWormholeMessage.fromTransactionSignature( signature, - this.cluster + this.cluster, ); } } @@ -216,7 +216,7 @@ export class WormholeMultisigProposal { constructor( public address: PublicKey, public squad: SquadsMesh, - public cluster: PythCluster + public cluster: PythCluster, ) {} /** @@ -240,7 +240,7 @@ export class WormholeMultisigProposal { this.squad, this.cluster, this.squad.connection.commitment, - {} + {}, ); const msgs: SubmittedWormholeMessage[] = []; for (const signature of signatures) { @@ -248,8 +248,8 @@ export class WormholeMultisigProposal { msgs.push( await SubmittedWormholeMessage.fromTransactionSignature( signature, - this.cluster - ) + this.cluster, + ), ); } catch (e) { if (!(e instanceof InvalidTransactionError)) throw e; @@ -309,7 +309,7 @@ export class Vault extends Storable { */ public connect( wallet: Wallet, - registry: SolanaRpcRegistry = getPythClusterApiUrl + registry: SolanaRpcRegistry = getPythClusterApiUrl, ): void { this.squad = SquadsMesh.endpoint(registry(this.cluster), wallet); } @@ -326,7 +326,7 @@ export class Vault extends Storable { public async getEmitter(registry: SolanaRpcRegistry = getPythClusterApiUrl) { const squad = SquadsMesh.endpoint( registry(this.cluster), - new NodeWallet(Keypair.generate()) // dummy wallet + new NodeWallet(Keypair.generate()), // dummy wallet ); return squad.getAuthorityPDA(this.key, 1); } @@ -341,7 +341,7 @@ export class Vault extends Storable { const rpcUrl = WORMHOLE_API_ENDPOINT[this.cluster]; const emitter = await this.getEmitter(); const response = await fetch( - `${rpcUrl}/api/v1/vaas/1/${emitter.toBase58()}` + `${rpcUrl}/api/v1/vaas/1/${emitter.toBase58()}`, ); const { data } = await response.json(); return data[0].sequence; @@ -357,21 +357,21 @@ export class Vault extends Storable { public async proposeWormholeMessage( payloads: Buffer[], proposalAddress?: PublicKey, - priorityFeeConfig: PriorityFeeConfig = {} + priorityFeeConfig: PriorityFeeConfig = {}, ): Promise { const squad = this.getSquadOrThrow(); const multisigVault = new MultisigVault( squad.wallet as Wallet, this.cluster, squad, - this.key + this.key, ); const txAccount = await multisigVault.proposeWormholeMultipleMessagesWithPayer( payloads, squad.wallet.publicKey, proposalAddress, - priorityFeeConfig + priorityFeeConfig, ); return new WormholeMultisigProposal(txAccount, squad, this.cluster); } @@ -385,7 +385,7 @@ export class Vault extends Storable { export async function loadHotWallet(walletPath: string): Promise { return new NodeWallet( Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(readFileSync(walletPath, "ascii"))) - ) + Uint8Array.from(JSON.parse(readFileSync(walletPath, "ascii"))), + ), ); } diff --git a/contract_manager/src/shell.ts b/contract_manager/src/shell.ts index 1667d2d803..5f9e73f590 100644 --- a/contract_manager/src/shell.ts +++ b/contract_manager/src/shell.ts @@ -14,5 +14,5 @@ repl.evalCode( "import { StarknetPriceFeedContract } from './src/contracts/starknet';" + "import { DefaultStore } from './src/store';" + "import { toPrivateKey } from './src/base';" + - "DefaultStore" + "DefaultStore", ); diff --git a/contract_manager/src/store.ts b/contract_manager/src/store.ts index de57d8cd28..c81bcbf324 100644 --- a/contract_manager/src/store.ts +++ b/contract_manager/src/store.ts @@ -102,7 +102,7 @@ export class Store { for (const parsed of parsedArray) { if (allChainClasses[parsed.type] === undefined) { throw new Error( - `No chain class found for chain type: ${parsed.type}` + `No chain class found for chain type: ${parsed.type}`, ); } const chain = allChainClasses[parsed.type].fromJson(parsed); @@ -127,7 +127,7 @@ export class Store { for (const [type, contracts] of Object.entries(contractsByType)) { writeFileSync( `${this.path}/contracts/${type}s.yaml`, - stringify(contracts.map((c) => c.toJson())) + stringify(contracts.map((c) => c.toJson())), ); } } @@ -143,7 +143,7 @@ export class Store { for (const [type, chains] of Object.entries(chainsByType)) { writeFileSync( `${this.path}/chains/${type}s.yaml`, - stringify(chains.map((c) => c.toJson())) + stringify(chains.map((c) => c.toJson())), ); } } @@ -180,7 +180,7 @@ export class Store { const chain = this.chains[parsed.chain]; const chainContract = allContractClasses[parsed.type].fromJson( chain, - parsed + parsed, ); if ( this.contracts[chainContract.getId()] || @@ -188,7 +188,7 @@ export class Store { this.wormhole_contracts[chainContract.getId()] ) throw new Error( - `Multiple contracts with id ${chainContract.getId()} found` + `Multiple contracts with id ${chainContract.getId()} found`, ); if (chainContract instanceof EvmEntropyContract) { this.entropy_contracts[chainContract.getId()] = chainContract; @@ -241,7 +241,7 @@ export class Store { */ getChainOrThrow( chainId: string, - ChainClass?: { new (...args: any[]): T; type: string } // eslint-disable-line @typescript-eslint/no-explicit-any + ChainClass?: { new (...args: any[]): T; type: string }, // eslint-disable-line @typescript-eslint/no-explicit-any ): T { const chain = this.chains[chainId]; if (!chain) { @@ -249,7 +249,7 @@ export class Store { } if (ChainClass && !(chain instanceof ChainClass)) { throw new Error( - `Chain with ID '${chainId}' is not of type ${ChainClass.type}.` + `Chain with ID '${chainId}' is not of type ${ChainClass.type}.`, ); } return chain as T; diff --git a/contract_manager/src/token.ts b/contract_manager/src/token.ts index b3f2c622b2..83725b8fac 100644 --- a/contract_manager/src/token.ts +++ b/contract_manager/src/token.ts @@ -23,7 +23,7 @@ export class Token extends Storable { // The hexadecimal pyth id of the tokens X/USD price feed // (get this from hermes or the Pyth docs page) public pythId: string | undefined, - public decimals: number + public decimals: number, ) { super(); } diff --git a/governance/xc_admin/packages/crank_executor/src/index.ts b/governance/xc_admin/packages/crank_executor/src/index.ts index 7bb3bef8b3..456013fde1 100644 --- a/governance/xc_admin/packages/crank_executor/src/index.ts +++ b/governance/xc_admin/packages/crank_executor/src/index.ts @@ -15,7 +15,7 @@ import { const CLUSTER: PythCluster = envOrErr("CLUSTER") as PythCluster; const VAULT: PublicKey = new PublicKey(envOrErr("VAULT")); const KEYPAIR: Keypair = Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(fs.readFileSync(envOrErr("WALLET"), "ascii"))) + Uint8Array.from(JSON.parse(fs.readFileSync(envOrErr("WALLET"), "ascii"))), ); const SOLANA_RPC = process.env.SOLANA_RPC; const COMMITMENT: Commitment = @@ -29,7 +29,7 @@ async function run() { const squad = new SquadsMesh({ connection: new Connection( SOLANA_RPC ?? getPythClusterApiUrl(CLUSTER), - COMMITMENT + COMMITMENT, ), wallet: new NodeWallet(KEYPAIR), multisigProgramId: DEFAULT_MULTISIG_PROGRAM_ID, diff --git a/governance/xc_admin/packages/crank_pythnet_relayer/src/index.ts b/governance/xc_admin/packages/crank_pythnet_relayer/src/index.ts index 61627d23e8..e2d989154e 100644 --- a/governance/xc_admin/packages/crank_pythnet_relayer/src/index.ts +++ b/governance/xc_admin/packages/crank_pythnet_relayer/src/index.ts @@ -37,7 +37,7 @@ import { const CLUSTER: PythCluster = envOrErr("CLUSTER") as PythCluster; const EMITTER: PublicKey = new PublicKey(envOrErr("EMITTER")); const KEYPAIR: Keypair = Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(fs.readFileSync(envOrErr("WALLET"), "ascii"))) + Uint8Array.from(JSON.parse(fs.readFileSync(envOrErr("WALLET"), "ascii"))), ); const OFFSET: number = Number(process.env.OFFSET ?? "-1"); const SKIP_FAILED_REMOTE_INSTRUCTIONS: boolean = @@ -55,7 +55,7 @@ async function run() { { commitment: COMMITMENT, preflightCommitment: COMMITMENT, - } + }, ); const multisigParser = MultisigParser.fromCluster(CLUSTER); @@ -63,12 +63,11 @@ async function run() { const claimRecordAddress: PublicKey = PublicKey.findProgramAddressSync( [Buffer.from(CLAIM_RECORD_SEED), EMITTER.toBuffer()], - remoteExecutor.programId + remoteExecutor.programId, )[0]; const executorKey: PublicKey = mapKey(EMITTER); - const claimRecord = await remoteExecutor.account.claimRecord.fetchNullable( - claimRecordAddress - ); + const claimRecord = + await remoteExecutor.account.claimRecord.fetchNullable(claimRecordAddress); let lastSequenceNumber: number = claimRecord ? (claimRecord.sequence as BN).toNumber() : -1; @@ -82,8 +81,8 @@ async function run() { const response = await ( await fetch( `${wormholeApi}/v1/signed_vaa/1/${EMITTER.toBuffer().toString( - "hex" - )}/${lastSequenceNumber}` + "hex", + )}/${lastSequenceNumber}`, ) ).json(); @@ -105,7 +104,7 @@ async function run() { WORMHOLE_ADDRESS[CLUSTER]!, provider.wallet.publicKey, Buffer.from(response.vaaBytes, "base64"), - { commitment: COMMITMENT } + { commitment: COMMITMENT }, ); console.log(`VAA ${lastSequenceNumber} relayed. executing ...`); @@ -123,7 +122,7 @@ async function run() { extraAccountMetas.push( ...ix.keys.filter((acc) => { return !acc.pubkey.equals(executorKey); - }) + }), ); const parsedInstruction = multisigParser.parseInstruction(ix); @@ -141,8 +140,8 @@ async function run() { CLUSTER, provider.wallet.publicKey, parsedInstruction.args.symbol, - AccountType.Product - ) + AccountType.Product, + ), ); productAccountToSymbol[ parsedInstruction.accounts.named.productAccount.pubkey.toBase58() @@ -152,7 +151,7 @@ async function run() { parsedInstruction.name == "addPrice" ) { const productAccount = await provider.connection.getAccountInfo( - parsedInstruction.accounts.named.productAccount.pubkey + parsedInstruction.accounts.named.productAccount.pubkey, ); const productSymbol = productAccount ? parseProductData(productAccount.data).product.symbol @@ -166,8 +165,8 @@ async function run() { CLUSTER, provider.wallet.publicKey, productSymbol, - AccountType.Price - ) + AccountType.Price, + ), ); } else { throw Error("Product account not found"); @@ -180,8 +179,8 @@ async function run() { await createDeterministicPublisherBufferAccountInstruction( provider.connection, provider.wallet.publicKey, - parsedInstruction.args.publisherKey - ) + parsedInstruction.args.publisherKey, + ), ); } } @@ -193,7 +192,7 @@ async function run() { claimRecord: claimRecordAddress, postedVaa: derivePostedVaaKey( WORMHOLE_ADDRESS[CLUSTER]!, - vaa.hash + vaa.hash, ), }) .remainingAccounts(extraAccountMetas) @@ -214,8 +213,8 @@ async function run() { console.log(`All VAAs have been relayed`); console.log( `${wormholeApi}/v1/signed_vaa/1/${EMITTER.toBuffer().toString( - "hex" - )}/${lastSequenceNumber}` + "hex", + )}/${lastSequenceNumber}`, ); break; } else { diff --git a/governance/xc_admin/packages/proposer_server/src/index.ts b/governance/xc_admin/packages/proposer_server/src/index.ts index 0ce886567d..b6c88f9027 100644 --- a/governance/xc_admin/packages/proposer_server/src/index.ts +++ b/governance/xc_admin/packages/proposer_server/src/index.ts @@ -20,7 +20,7 @@ import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; const PORT: number = Number(process.env.PORT ?? "4000"); const KEYPAIR: Keypair = Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(fs.readFileSync(envOrErr("WALLET"), "ascii"))) + Uint8Array.from(JSON.parse(fs.readFileSync(envOrErr("WALLET"), "ascii"))), ); const MAINNET_RPC: string = process.env.MAINNET_RPC ?? getPythClusterApiUrl("mainnet-beta"); @@ -63,7 +63,7 @@ app.post("/api/propose", async (req: Request, res: Response) => { pubkey: new PublicKey(key.pubkey), }; }), - }) + }), ); const cluster: PythCluster = req.body.cluster; @@ -78,7 +78,7 @@ app.post("/api/propose", async (req: Request, res: Response) => { wallet, getMultisigCluster(cluster), proposeSquads, - PRICE_FEED_MULTISIG[getMultisigCluster(cluster)] + PRICE_FEED_MULTISIG[getMultisigCluster(cluster)], ); // preserve the existing API by returning only the first pubkey diff --git a/governance/xc_admin/packages/xc_admin_cli/src/index.ts b/governance/xc_admin/packages/xc_admin_cli/src/index.ts index 2b34d2e631..3c24aed492 100644 --- a/governance/xc_admin/packages/xc_admin_cli/src/index.ts +++ b/governance/xc_admin/packages/xc_admin_cli/src/index.ts @@ -70,15 +70,15 @@ import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; export async function loadHotWalletOrLedger( wallet: string, lda: number, - ldc: number + ldc: number, ): Promise { if (wallet === "ledger") { return await LedgerNodeWallet.createWallet(lda, ldc); } else { return new NodeWallet( Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(fs.readFileSync(wallet, "ascii"))) - ) + Uint8Array.from(JSON.parse(fs.readFileSync(wallet, "ascii"))), + ), ); } } @@ -87,7 +87,7 @@ async function loadVaultFromOptions(options: any): Promise { const wallet = await loadHotWalletOrLedger( options.wallet, options.ledgerDerivationAccount, - options.ledgerDerivationChange + options.ledgerDerivationChange, ); // This is the cluster where we want to perform the action const cluster: PythCluster = options.cluster; @@ -97,7 +97,7 @@ async function loadVaultFromOptions(options: any): Promise { const squad = SquadsMesh.endpoint( options.rpcUrlOverride ?? getPythClusterApiUrl(multisigCluster), - wallet + wallet, ); return new MultisigVault(wallet, multisigCluster, squad, vault); @@ -110,23 +110,23 @@ const multisigCommand = (name: string, description: string) => .requiredOption("-c, --cluster ", "solana cluster to use") .requiredOption( "-w, --wallet ", - 'path to the operations key or "ledger"' + 'path to the operations key or "ledger"', ) .requiredOption( "-v, --vault ", - "multisig address, all the addresses can be found in xc_admin_common/src/multisig.ts" + "multisig address, all the addresses can be found in xc_admin_common/src/multisig.ts", ) .option( "-lda, --ledger-derivation-account ", - "ledger derivation account to use" + "ledger derivation account to use", ) .option( "-ldc, --ledger-derivation-change ", - "ledger derivation change to use" + "ledger derivation change to use", ) .option( "-u, --rpc-url-override ", - "RPC URL to override the default for the cluster. Make sure this is an RPC URL of the cluster where the multisig lives. For Pythnet proposals it should be a Solana Mainnet RPC URL." + "RPC URL to override the default for the cluster. Make sure this is an RPC URL of the cluster where the multisig lives. For Pythnet proposals it should be a Solana Mainnet RPC URL.", ); program @@ -136,15 +136,15 @@ program multisigCommand( "escrow-program-accept-authority", - "Accept authority from the program authority escrow" + "Accept authority from the program authority escrow", ) .requiredOption( "-p, --program-id ", - "program whose authority we want to transfer" + "program whose authority we want to transfer", ) .requiredOption( "-a, --current ", - "current authority (before the transfer)" + "current authority (before the transfer)", ) .action(async (options: any) => { @@ -156,17 +156,17 @@ multisigCommand( const programAuthorityEscrowIdl = await Program.fetchIdl( PROGRAM_AUTHORITY_ESCROW, - vault.getAnchorProvider() + vault.getAnchorProvider(), ); const programAuthorityEscrow = new Program( programAuthorityEscrowIdl!, PROGRAM_AUTHORITY_ESCROW, - vault.getAnchorProvider() + vault.getAnchorProvider(), ); const programDataAccount = PublicKey.findProgramAddressSync( [programId.toBuffer()], - BPF_UPGRADABLE_LOADER + BPF_UPGRADABLE_LOADER, )[0]; const proposalInstruction = await programAuthorityEscrow.methods @@ -183,13 +183,13 @@ multisigCommand( await vault.proposeInstructions( [proposalInstruction], targetCluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); multisigCommand( "solana-receiver-program-accept-governance-authority-transfer", - "Accept governance authority transfer for the solana receiver program" + "Accept governance authority transfer for the solana receiver program", ).action(async (options: any) => { const vault = await loadVaultFromOptions(options); const targetCluster: PythCluster = options.cluster; @@ -197,7 +197,7 @@ multisigCommand( const programSolanaReceiver = new Program( pythSolanaReceiverIdl, DEFAULT_RECEIVER_PROGRAM_ID, - vault.getAnchorProvider() + vault.getAnchorProvider(), ); const proposalInstruction = await programSolanaReceiver.methods @@ -211,18 +211,18 @@ multisigCommand( await vault.proposeInstructions( [proposalInstruction], targetCluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); multisigCommand( "solana-receiver-program-request-governance-authority-transfer", - "Request governance authority transfer for the solana receiver program" + "Request governance authority transfer for the solana receiver program", ) .requiredOption( "-t, --target ", "The new governance authority to take over. " + - "If the target is another multisig, it will be the multisig's vault authority PDA." + "If the target is another multisig, it will be the multisig's vault authority PDA.", ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); @@ -232,7 +232,7 @@ multisigCommand( const programSolanaReceiver = new Program( pythSolanaReceiverIdl, DEFAULT_RECEIVER_PROGRAM_ID, - vault.getAnchorProvider() + vault.getAnchorProvider(), ); const proposalInstruction = await programSolanaReceiver.methods @@ -246,14 +246,14 @@ multisigCommand( await vault.proposeInstructions( [proposalInstruction], targetCluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); multisigCommand("upgrade-program", "Upgrade a program from a buffer") .requiredOption( "-p, --program-id ", - "program that you want to upgrade" + "program that you want to upgrade", ) .requiredOption("-b, --buffer ", "buffer account") @@ -265,7 +265,7 @@ multisigCommand("upgrade-program", "Upgrade a program from a buffer") const programDataAccount = PublicKey.findProgramAddressSync( [programId.toBuffer()], - BPF_UPGRADABLE_LOADER + BPF_UPGRADABLE_LOADER, )[0]; // This is intruction is not in @solana/web3.js, source : https://docs.rs/solana-program/latest/src/solana_program/bpf_loader_upgradeable.rs.html#200 @@ -291,14 +291,14 @@ multisigCommand("upgrade-program", "Upgrade a program from a buffer") await vault.proposeInstructions( [proposalInstruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); multisigCommand("upgrade-idl", "Upgrade an Anchor Idl from a bufffer") .requiredOption( "-p, --program-id ", - "program whose idl you want to upgrade" + "program whose idl you want to upgrade", ) .requiredOption("-b, --buffer ", "buffer account") .action(async (options: any) => { @@ -310,13 +310,13 @@ multisigCommand("upgrade-idl", "Upgrade an Anchor Idl from a bufffer") const proposalInstruction: TransactionInstruction = await idlSetBuffer( programId, buffer, - await vault.getVaultAuthorityPDA(cluster) + await vault.getVaultAuthorityPDA(cluster), ); await vault.proposeInstructions( [proposalInstruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); async function closeProgramOrBuffer( @@ -324,7 +324,7 @@ async function closeProgramOrBuffer( cluster: PythCluster, programDataOrBufferAccount: PublicKey, spill: PublicKey, - programId?: PublicKey + programId?: PublicKey, ) { let accounts = [ { pubkey: programDataOrBufferAccount, isSigner: false, isWritable: true }, @@ -349,13 +349,13 @@ async function closeProgramOrBuffer( await vault.proposeInstructions( [proposalInstruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); } multisigCommand( "close-program", - "Close a program, retrieve the funds. WARNING : THIS WILL BRICK THE PROGRAM AND THE ACCOUNTS IT OWNS FOREVER" + "Close a program, retrieve the funds. WARNING : THIS WILL BRICK THE PROGRAM AND THE ACCOUNTS IT OWNS FOREVER", ) .requiredOption("-p, --program-id ", "program that you want to close") .requiredOption("-s, --spill ", "address to receive the funds") @@ -367,7 +367,7 @@ multisigCommand( const programDataAccount = PublicKey.findProgramAddressSync( [programId.toBuffer()], - BPF_UPGRADABLE_LOADER + BPF_UPGRADABLE_LOADER, )[0]; await closeProgramOrBuffer( @@ -375,7 +375,7 @@ multisigCommand( cluster, programDataAccount, spill, - programId + programId, ); }); @@ -393,18 +393,17 @@ multisigCommand("close-buffer", "Close a buffer, retrieve the funds.") multisigCommand( "deactivate-stake", - "Deactivate the delegated stake from the account" + "Deactivate the delegated stake from the account", ) .requiredOption( "-d, --vote-pubkeys ", - "vote account unstake from" + "vote account unstake from", ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); const cluster: PythCluster = options.cluster; - const authorizedPubkey: PublicKey = await vault.getVaultAuthorityPDA( - cluster - ); + const authorizedPubkey: PublicKey = + await vault.getVaultAuthorityPDA(cluster); const voteAccounts: PublicKey[] = options.votePubkeys ? options.votePubkeys.split(",").map((m: string) => new PublicKey(m)) @@ -415,42 +414,41 @@ multisigCommand( voteAccounts.map((voteAccount: PublicKey) => fetchStakeAccounts( new Connection(getPythClusterApiUrl(cluster)), - voteAccount - ) - ) + voteAccount, + ), + ), ) ).flat(); const instructions = stakeAccounts.flatMap( (stakeAccount) => StakeProgram.deactivate({ stakePubkey: stakeAccount, authorizedPubkey }) - .instructions + .instructions, ); const proposalAddresses = await vault.proposeInstructions( instructions, cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); console.log( "Successfully proposed at: https://proposals.pyth.network/?tab=proposals&proposal=" + - proposalAddresses[0].toBase58() + proposalAddresses[0].toBase58(), ); }); multisigCommand( "delegate-stake", - "Delegate a stake account to the given vote account" + "Delegate a stake account to the given vote account", ) .requiredOption("-s, --stake-account ", "stake account to delegate") .requiredOption("-d, --vote-account ", "vote account to delegate to") .action(async (options: any) => { const vault = await loadVaultFromOptions(options); const cluster: PythCluster = options.cluster; - const authorizedPubkey: PublicKey = await vault.getVaultAuthorityPDA( - cluster - ); + const authorizedPubkey: PublicKey = + await vault.getVaultAuthorityPDA(cluster); const stakeAccount: PublicKey = new PublicKey(options.stakeAccount); const voteAccount: PublicKey = new PublicKey(options.voteAccount); @@ -464,13 +462,13 @@ multisigCommand( await vault.proposeInstructions( instructions, cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); async function accountExists( cluster: PythCluster, - accountPubkey: PublicKey + accountPubkey: PublicKey, ): Promise { const connection = new Connection(getPythClusterApiUrl(cluster)); const account = await connection.getAccountInfo(accountPubkey); @@ -479,18 +477,17 @@ async function accountExists( multisigCommand( "initialize-stake-accounts", - "Initialize stake accounts and assign them to the given vote accounts" + "Initialize stake accounts and assign them to the given vote accounts", ) .requiredOption( "-d, --vote-pubkeys ", - "vote account to delegate to" + "vote account to delegate to", ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); const cluster: PythCluster = options.cluster; - const authorizedPubkey: PublicKey = await vault.getVaultAuthorityPDA( - cluster - ); + const authorizedPubkey: PublicKey = + await vault.getVaultAuthorityPDA(cluster); const votePubkeys: PublicKey[] = options.votePubkeys ? options.votePubkeys.split(",").map((m: string) => new PublicKey(m)) @@ -501,14 +498,14 @@ multisigCommand( for (const votePubkey of votePubkeys) { const [stakePubkey, seed] = await findDetermisticStakeAccountAddress( authorizedPubkey, - votePubkey + votePubkey, ); if (await accountExists(cluster, stakePubkey)) { throw new Error( "Stake account for validator " + votePubkey.toBase58() + - " already exists, it may be already permissioned" + " already exists, it may be already permissioned", ); } @@ -521,7 +518,7 @@ multisigCommand( lamports: 100000 * LAMPORTS_PER_SOL, space: StakeProgram.space, programId: StakeProgram.programId, - }) + }), ); instructions.push( StakeProgram.initialize({ @@ -530,33 +527,33 @@ multisigCommand( staker: authorizedPubkey, withdrawer: authorizedPubkey, }, - }) + }), ); instructions.push( StakeProgram.delegate({ stakePubkey, authorizedPubkey, votePubkey, - }).instructions[0] + }).instructions[0], ); } const proposalAddresses = await vault.proposeInstructions( instructions, cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); // This should be a single proposal normally console.log( "Successfully proposed at: https://proposals.pyth.network/?tab=proposals&proposal=" + - proposalAddresses[0].toBase58() + proposalAddresses[0].toBase58(), ); }); multisigCommand( "init-price", - "Init price (useful for changing the exponent), only to be used on unused price feeds" + "Init price (useful for changing the exponent), only to be used on unused price feeds", ) .requiredOption("-p, --price ", "Price account to modify") .requiredOption("-e, --exponent ", "New exponent") @@ -568,7 +565,7 @@ multisigCommand( const proposalInstruction: TransactionInstruction = await pythOracleProgram( getPythProgramKeyForCluster(cluster), - vault.getAnchorProvider() + vault.getAnchorProvider(), ) .methods.setExponent(exponent, 1) .accounts({ @@ -579,13 +576,13 @@ multisigCommand( await vault.proposeInstructions( [proposalInstruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); multisigCommand( "init-price-feed-index", - "Init price feed indexes to migrate old price feed accounts to the new index" + "Init price feed indexes to migrate old price feed accounts to the new index", ).action(async (options: any) => { const vault = await loadVaultFromOptions(options); @@ -613,7 +610,7 @@ multisigCommand( // Create instructions to initialize the price feed indexes const oracleProgram = pythOracleProgram( oracleProgramId, - vault.getAnchorProvider() + vault.getAnchorProvider(), ); const instructions: TransactionInstruction[] = []; @@ -625,14 +622,14 @@ multisigCommand( fundingAccount: await vault.getVaultAuthorityPDA(cluster), priceAccount: pubkey, }) - .instruction() + .instruction(), ); } await vault.proposeInstructions( instructions, cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); @@ -651,9 +648,9 @@ multisigCommand("init-price-store", "Init price store program").action( await vault.proposeInstructions( [instruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); - } + }, ); multisigCommand("init-price-store-buffers", "Init price store buffers").action( @@ -664,9 +661,8 @@ multisigCommand("init-price-store-buffers", "Init price store buffers").action( const connection = new Connection(getPythClusterApiUrl(cluster)); const authorityKey = await vault.getVaultAuthorityPDA(cluster); - const allPythAccounts = await connection.getProgramAccounts( - oracleProgramId - ); + const allPythAccounts = + await connection.getProgramAccounts(oracleProgramId); // Storing them as string to make sure equal comparison works (for the Set) const allPublishers: Set = new Set(); @@ -678,7 +674,7 @@ multisigCommand("init-price-store-buffers", "Init price store buffers").action( const parsed = parsePriceData(data); for (const component of parsed.priceComponents.slice( 0, - parsed.numComponentPrices + parsed.numComponentPrices, )) { allPublishers.add(component.publisher.toBase58()); } @@ -695,16 +691,16 @@ multisigCommand("init-price-store-buffers", "Init price store buffers").action( instructions.push( await createDetermisticPriceStoreInitializePublisherInstruction( authorityKey, - publisherKey - ) + publisherKey, + ), ); } await vault.proposeInstructions( instructions, cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); - } + }, ); program @@ -713,18 +709,18 @@ program .requiredOption("-c, --cluster ", "solana cluster to use") .requiredOption( "-t, --transaction ", - "address of the outstanding transaction" + "address of the outstanding transaction", ) .action(async (options: any) => { const cluster = options.cluster; const transaction: PublicKey = new PublicKey(options.transaction); const squad = SquadsMesh.endpoint( getPythClusterApiUrl(cluster), - new NodeWallet(new Keypair()) + new NodeWallet(new Keypair()), ); const onChainInstructions = await getProposalInstructions( squad, - await squad.getTransaction(new PublicKey(transaction)) + await squad.getTransaction(new PublicKey(transaction)), ); const parser = MultisigParser.fromCluster(cluster); const parsed = onChainInstructions.map((ix) => @@ -732,21 +728,21 @@ program programId: ix.programId, data: ix.data as Buffer, keys: ix.keys as AccountMeta[], - }) + }), ); console.log( JSON.stringify( parsed, (key, value) => (typeof value === "bigint" ? value.toString() : value), // return everything else unchanged - 2 - ) + 2, + ), ); }); multisigCommand("approve", "Approve a transaction sitting in the multisig") .requiredOption( "-t, --transaction ", - "address of the outstanding transaction" + "address of the outstanding transaction", ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); @@ -755,7 +751,7 @@ multisigCommand("approve", "Approve a transaction sitting in the multisig") const txToSend = TransactionBuilder.batchIntoLegacyTransactions( [instruction], - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); await vault.sendAllTransactions(txToSend); @@ -767,7 +763,7 @@ multisigCommand("propose-token-transfer", "Propose token transfer") .option( "-m --mint ", "mint to transfer", - "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" // default value is solana mainnet USDC SPL + "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // default value is solana mainnet USDC SPL ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); @@ -782,16 +778,16 @@ multisigCommand("propose-token-transfer", "Propose token transfer") connection, mint, undefined, - TOKEN_PROGRAM_ID + TOKEN_PROGRAM_ID, ); const sourceTokenAccount = await getAssociatedTokenAddress( mint, await vault.getVaultAuthorityPDA(cluster), - true + true, ); const destinationTokenAccount = await getAssociatedTokenAddress( mint, - destination + destination, ); const proposalInstruction: TransactionInstruction = @@ -799,13 +795,13 @@ multisigCommand("propose-token-transfer", "Propose token transfer") sourceTokenAccount, destinationTokenAccount, await vault.getVaultAuthorityPDA(cluster), - BigInt(amount) * BigInt(10) ** BigInt(mintAccount.decimals) + BigInt(amount) * BigInt(10) ** BigInt(mintAccount.decimals), ); await vault.proposeInstructions( [proposalInstruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); @@ -828,7 +824,7 @@ multisigCommand("propose-sol-transfer", "Propose sol transfer") await vault.proposeInstructions( [proposalInstruction], cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); @@ -851,7 +847,7 @@ multisigCommand("propose-arbitrary-payload", "Propose arbitrary payload") multisigCommand("activate", "Activate a transaction sitting in the multisig") .requiredOption( "-t, --transaction ", - "address of the draft transaction" + "address of the draft transaction", ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); @@ -860,7 +856,7 @@ multisigCommand("activate", "Activate a transaction sitting in the multisig") const txToSend = TransactionBuilder.batchIntoLegacyTransactions( [instruction], - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); await vault.sendAllTransactions(txToSend); @@ -869,15 +865,15 @@ multisigCommand("activate", "Activate a transaction sitting in the multisig") multisigCommand("add-and-delete", "Change the roster of the multisig") .option( "-a, --add ", - "addresses to add to the multisig" + "addresses to add to the multisig", ) .option( "-r, --remove ", - "addresses to remove from the multisig" + "addresses to remove from the multisig", ) .requiredOption( "-t, --target-vaults ", - "the vault whose roster we want to change" + "the vault whose roster we want to change", ) .action(async (options: any) => { const vault: MultisigVault = await loadVaultFromOptions(options); @@ -905,7 +901,7 @@ multisigCommand("add-and-delete", "Change the roster of the multisig") for (const member of membersToRemove) { for (const targetVault of targetVaults) { proposalInstructions.push( - await vault.removeMemberIx(member, targetVault) + await vault.removeMemberIx(member, targetVault), ); } } @@ -913,7 +909,7 @@ multisigCommand("add-and-delete", "Change the roster of the multisig") vault.proposeInstructions( proposalInstructions, options.cluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); @@ -936,15 +932,15 @@ multisigCommand("execute-add-and-delete", "Execute a roster change proposal") multisigCommand( "set-trusted-signer", - "Set a trusted signer for the Lazer program" + "Set a trusted signer for the Lazer program", ) .requiredOption( "-s, --signer ", - "public key of the trusted signer to add/update" + "public key of the trusted signer to add/update", ) .requiredOption( "-e, --expiry-time ", - "expiry time in seconds since Unix epoch. Set to 0 to remove the signer." + "expiry time in seconds since Unix epoch. Set to 0 to remove the signer.", ) .action(async (options: any) => { const vault = await loadVaultFromOptions(options); @@ -957,7 +953,7 @@ multisigCommand( const lazerProgram = new Program( lazerIdl as Idl, SOLANA_LAZER_PROGRAM_ID, - vault.getAnchorProvider() + vault.getAnchorProvider(), ); // Use Anchor to create the instruction @@ -972,7 +968,7 @@ multisigCommand( await vault.proposeInstructions( [updateInstruction], targetCluster, - DEFAULT_PRIORITY_FEE_CONFIG + DEFAULT_PRIORITY_FEE_CONFIG, ); }); diff --git a/governance/xc_admin/packages/xc_admin_cli/src/ledger.ts b/governance/xc_admin/packages/xc_admin_cli/src/ledger.ts index dbb06dff2e..356f96c4f3 100644 --- a/governance/xc_admin/packages/xc_admin_cli/src/ledger.ts +++ b/governance/xc_admin/packages/xc_admin_cli/src/ledger.ts @@ -14,7 +14,7 @@ export class LedgerNodeWallet implements Wallet { constructor( derivationPath: Buffer, transport: Transport, - publicKey: PublicKey + publicKey: PublicKey, ) { this._derivationPath = derivationPath; this._transport = transport; @@ -23,12 +23,12 @@ export class LedgerNodeWallet implements Wallet { static async createWallet( derivationAccount?: number, - derivationChange?: number + derivationChange?: number, ): Promise { const transport = await TransportNodeHid.create(); const derivationPath = getDerivationPath( derivationAccount, - derivationChange + derivationChange, ); const publicKey = await getPublicKey(transport, derivationPath); console.log(`Loaded ledger: ${publicKey.toBase58()}}`); @@ -36,7 +36,7 @@ export class LedgerNodeWallet implements Wallet { } async signTransaction( - tx: T + tx: T, ): Promise { console.log("Please approve the transaction on your ledger device..."); const transport = this._transport; @@ -46,7 +46,7 @@ export class LedgerNodeWallet implements Wallet { const signature = await signTransaction( transport, tx, - this._derivationPath + this._derivationPath, ); tx.addSignature(publicKey, signature); } else { @@ -57,7 +57,7 @@ export class LedgerNodeWallet implements Wallet { } async signAllTransactions( - txs: T[] + txs: T[], ): Promise { return await Promise.all(txs.map((tx) => this.signTransaction(tx))); } @@ -105,13 +105,13 @@ const LEDGER_CLA = 0xe0; /** @internal */ export async function getPublicKey( transport: Transport, - derivationPath: Buffer + derivationPath: Buffer, ): Promise { const bytes = await send( transport, INS_GET_PUBKEY, P1_NON_CONFIRM, - derivationPath + derivationPath, ); return new PublicKey(bytes); } @@ -120,7 +120,7 @@ export async function getPublicKey( export async function signTransaction( transport: Transport, transaction: Transaction, - derivationPath: Buffer + derivationPath: Buffer, ): Promise { const paths = Buffer.alloc(1); paths.writeUInt8(1, 0); @@ -136,7 +136,7 @@ async function send( transport: Transport, instruction: number, p1: number, - data: Buffer + data: Buffer, ): Promise { let p2 = 0; let offset = 0; @@ -149,7 +149,7 @@ async function send( instruction, p1, p2 | P2_MORE, - buffer + buffer, ); if (response.length !== 2) throw new TransportStatusError(StatusCodes.INCORRECT_DATA); @@ -165,7 +165,7 @@ async function send( instruction, p1, p2, - buffer + buffer, ); return response.subarray(0, response.length - 2); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/BpfUpgradableLoaderInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/BpfUpgradableLoaderInstruction.test.ts index d543854b5f..48a29a6c61 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/BpfUpgradableLoaderInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/BpfUpgradableLoaderInstruction.test.ts @@ -46,37 +46,37 @@ test("Bpf Upgradable Loader multisig instruction parse", (done) => { const parsedInstruction = parser.parseInstruction(upgradeInstruction); if (parsedInstruction instanceof BpfUpgradableLoaderInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.BpfUpgradableLoader + MultisigInstructionProgram.BpfUpgradableLoader, ); expect(parsedInstruction.name).toBe("Upgrade"); expect( parsedInstruction.accounts.named.programData.pubkey.equals( - new PublicKey(0) - ) + new PublicKey(0), + ), ).toBeTruthy(); expect( - parsedInstruction.accounts.named.program.pubkey.equals(new PublicKey(1)) + parsedInstruction.accounts.named.program.pubkey.equals(new PublicKey(1)), ).toBeTruthy(); expect( - parsedInstruction.accounts.named.buffer.pubkey.equals(new PublicKey(2)) + parsedInstruction.accounts.named.buffer.pubkey.equals(new PublicKey(2)), ).toBeTruthy(); expect( - parsedInstruction.accounts.named.spill.pubkey.equals(new PublicKey(3)) + parsedInstruction.accounts.named.spill.pubkey.equals(new PublicKey(3)), ).toBeTruthy(); expect( - parsedInstruction.accounts.named.rent.pubkey.equals(SYSVAR_RENT_PUBKEY) + parsedInstruction.accounts.named.rent.pubkey.equals(SYSVAR_RENT_PUBKEY), ).toBeTruthy(); expect( - parsedInstruction.accounts.named.clock.pubkey.equals(SYSVAR_CLOCK_PUBKEY) + parsedInstruction.accounts.named.clock.pubkey.equals(SYSVAR_CLOCK_PUBKEY), ).toBeTruthy(); expect( parsedInstruction.accounts.named.upgradeAuthority.pubkey.equals( - new PublicKey(4) - ) + new PublicKey(4), + ), ).toBeTruthy(); expect(parsedInstruction.accounts.remaining.length).toBe(1); expect( - parsedInstruction.accounts.remaining[0].pubkey.equals(new PublicKey(5)) + parsedInstruction.accounts.remaining[0].pubkey.equals(new PublicKey(5)), ).toBeTruthy(); expect(parsedInstruction.args).toEqual({}); } else { @@ -92,11 +92,11 @@ test("Bpf Upgradable Loader multisig instruction parse", (done) => { const parsedBadInstruction = parser.parseInstruction(badInstruction); if (parsedBadInstruction instanceof BpfUpgradableLoaderInstruction) { expect(parsedBadInstruction.program).toBe( - MultisigInstructionProgram.BpfUpgradableLoader + MultisigInstructionProgram.BpfUpgradableLoader, ); expect(parsedBadInstruction.name).toBe(UNRECOGNIZED_INSTRUCTION); expect( - parsedBadInstruction.args.data.equals(Buffer.from([9])) + parsedBadInstruction.args.data.equals(Buffer.from([9])), ).toBeTruthy(); done(); } else { diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/BufferLayoutExt.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/BufferLayoutExt.test.ts index 361957ee99..bee7e42066 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/BufferLayoutExt.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/BufferLayoutExt.test.ts @@ -13,7 +13,7 @@ test("Buffer layout extension fc tests", (done) => { const decodedBI = u64.decode(buffer); return buffer.equals(encodedUint8Array) && bi === decodedBI; - }) + }), ); done(); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/GovernancePayload.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/GovernancePayload.test.ts index 5aa3da2dee..721a78c468 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/GovernancePayload.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/GovernancePayload.test.ts @@ -39,11 +39,11 @@ test("GovernancePayload ser/de", (done) => { // Valid header 1 let expectedGovernanceHeader = new PythGovernanceHeader( "pythnet", - "ExecutePostedVaa" + "ExecutePostedVaa", ); let buffer = expectedGovernanceHeader.encode(); expect( - buffer.equals(Buffer.from([80, 84, 71, 77, 0, 0, 0, 26])) + buffer.equals(Buffer.from([80, 84, 71, 77, 0, 0, 0, 26])), ).toBeTruthy(); let governanceHeader = PythGovernanceHeader.decode(buffer); expect(governanceHeader?.targetChainId).toBe("pythnet"); @@ -52,7 +52,7 @@ test("GovernancePayload ser/de", (done) => { // Valid header 2 expectedGovernanceHeader = new PythGovernanceHeader( "unset", - "ExecutePostedVaa" + "ExecutePostedVaa", ); buffer = expectedGovernanceHeader.encode(); expect(buffer.equals(Buffer.from([80, 84, 71, 77, 0, 0, 0, 0]))).toBeTruthy(); @@ -79,29 +79,29 @@ test("GovernancePayload ser/de", (done) => { // Wrong magic number expect( PythGovernanceHeader.decode( - Buffer.from([0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0]) - ) + Buffer.from([0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0]), + ), ).toBeUndefined(); // Wrong chain expect( PythGovernanceHeader.decode( - Buffer.from([80, 84, 71, 77, 0, 0, 255, 255, 0, 0, 0, 0]) - ) + Buffer.from([80, 84, 71, 77, 0, 0, 255, 255, 0, 0, 0, 0]), + ), ).toBeUndefined(); // Wrong module/action combination expect( PythGovernanceHeader.decode( - Buffer.from([80, 84, 71, 77, 0, 1, 0, 26, 0, 0, 0, 0]) - ) + Buffer.from([80, 84, 71, 77, 0, 1, 0, 26, 0, 0, 0, 0]), + ), ).toBeUndefined(); // Decode executePostVaa with empty instructions let expectedExecutePostedVaa = new ExecutePostedVaa("pythnet", []); buffer = expectedExecutePostedVaa.encode(); expect( - buffer.equals(Buffer.from([80, 84, 71, 77, 0, 0, 0, 26, 0, 0, 0, 0])) + buffer.equals(Buffer.from([80, 84, 71, 77, 0, 0, 0, 26, 0, 0, 0, 0])), ).toBeTruthy(); let executePostedVaaArgs = ExecutePostedVaa.decode(buffer); expect(executePostedVaaArgs?.targetChainId).toBe("pythnet"); @@ -128,35 +128,35 @@ test("GovernancePayload ser/de", (done) => { 109, 165, 127, 11, 165, 252, 140, 6, 121, 57, 204, 91, 119, 165, 106, 241, 234, 131, 75, 180, 0, 1, 12, 0, 0, 0, 2, 0, 0, 0, 0, 152, 13, 0, 0, 0, 0, 0, - ]) - ) + ]), + ), ).toBeTruthy(); executePostedVaaArgs = ExecutePostedVaa.decode(buffer); expect(executePostedVaaArgs?.targetChainId).toBe("pythnet"); expect(executePostedVaaArgs?.instructions.length).toBe(1); expect( executePostedVaaArgs?.instructions[0].programId.equals( - SystemProgram.programId - ) + SystemProgram.programId, + ), ).toBeTruthy(); expect( executePostedVaaArgs?.instructions[0].keys[0].pubkey.equals( - new PublicKey("AWQ18oKzd187aM2oMB4YirBcdgX1FgWfukmqEX91BRES") - ) + new PublicKey("AWQ18oKzd187aM2oMB4YirBcdgX1FgWfukmqEX91BRES"), + ), ).toBeTruthy(); expect(executePostedVaaArgs?.instructions[0].keys[0].isSigner).toBeTruthy(); expect(executePostedVaaArgs?.instructions[0].keys[0].isWritable).toBeTruthy(); expect( executePostedVaaArgs?.instructions[0].keys[1].pubkey.equals( - new PublicKey("J25GT2knN8V2Wvg9jNrYBuj9SZdsLnU6bK7WCGrL7daj") - ) + new PublicKey("J25GT2knN8V2Wvg9jNrYBuj9SZdsLnU6bK7WCGrL7daj"), + ), ).toBeTruthy(); expect(!executePostedVaaArgs?.instructions[0].keys[1].isSigner).toBeTruthy(); expect(executePostedVaaArgs?.instructions[0].keys[1].isWritable).toBeTruthy(); expect( executePostedVaaArgs?.instructions[0].data.equals( - Buffer.from([2, 0, 0, 0, 0, 152, 13, 0, 0, 0, 0, 0]) - ) + Buffer.from([2, 0, 0, 0, 0, 152, 13, 0, 0, 0, 0, 0]), + ), ); const requestGovernanceDataSourceTransfer = @@ -166,22 +166,22 @@ test("GovernancePayload ser/de", (done) => { console.log(requestGovernanceDataSourceTransferBuffer.toJSON()); expect( requestGovernanceDataSourceTransferBuffer.equals( - Buffer.from([80, 84, 71, 77, 1, 5, 234, 147, 0, 0, 0, 1]) - ) + Buffer.from([80, 84, 71, 77, 1, 5, 234, 147, 0, 0, 0, 1]), + ), ).toBeTruthy(); const authorizeGovernanceDataSourceTransfer = new AuthorizeGovernanceDataSourceTransfer( "starknet", - Buffer.from([1, 2, 3]) + Buffer.from([1, 2, 3]), ); const authorizeGovernanceDataSourceTransferBuffer = authorizeGovernanceDataSourceTransfer.encode(); console.log(authorizeGovernanceDataSourceTransferBuffer.toJSON()); expect( authorizeGovernanceDataSourceTransferBuffer.equals( - Buffer.from([80, 84, 71, 77, 1, 1, 234, 147, 1, 2, 3]) - ) + Buffer.from([80, 84, 71, 77, 1, 1, 234, 147, 1, 2, 3]), + ), ).toBeTruthy(); const setFee = new SetFee("starknet", 42n, 8n); @@ -192,8 +192,8 @@ test("GovernancePayload ser/de", (done) => { Buffer.from([ 80, 84, 71, 77, 1, 3, 234, 147, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 8, - ]) - ) + ]), + ), ).toBeTruthy(); const setFeeInToken = new SetFeeInToken( @@ -202,8 +202,8 @@ test("GovernancePayload ser/de", (done) => { 8n, Buffer.from( "049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", - "hex" - ) + "hex", + ), ); const setFeeInTokenBuffer = setFeeInToken.encode(); console.log(setFeeInTokenBuffer.toJSON()); @@ -214,8 +214,8 @@ test("GovernancePayload ser/de", (done) => { 0, 0, 8, 32, 4, 157, 54, 87, 13, 78, 70, 244, 142, 153, 103, 75, 211, 252, 200, 70, 68, 221, 214, 185, 111, 124, 116, 27, 21, 98, 184, 47, 158, 0, 77, 199, - ]) - ) + ]), + ), ).toBeTruthy(); const setDataSources = new SetDataSources("starknet", [ @@ -240,13 +240,13 @@ test("GovernancePayload ser/de", (done) => { 190, 146, 235, 109, 244, 50, 163, 240, 10, 37, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 45, - ]) - ) + ]), + ), ).toBeTruthy(); const setWormholeAddress = new StarknetSetWormholeAddress( "starknet", - "05033f06d5c47bcce7960ea703b04a0bf64bf33f6f2eb5613496da747522d9c2" + "05033f06d5c47bcce7960ea703b04a0bf64bf33f6f2eb5613496da747522d9c2", ); const setWormholeAddressBuffer = setWormholeAddress.encode(); console.log(setWormholeAddressBuffer.toJSON()); @@ -256,13 +256,13 @@ test("GovernancePayload ser/de", (done) => { 80, 84, 71, 77, 1, 6, 234, 147, 5, 3, 63, 6, 213, 196, 123, 204, 231, 150, 14, 167, 3, 176, 74, 11, 246, 75, 243, 63, 111, 46, 181, 97, 52, 150, 218, 116, 117, 34, 217, 194, - ]) - ) + ]), + ), ).toBeTruthy(); const upgradeContract = new UpgradeContract256Bit( "starknet", - "043d0ed8155263af0862372df3af9403c502358661f317f62fbdc026d03beaee" + "043d0ed8155263af0862372df3af9403c502358661f317f62fbdc026d03beaee", ); const upgradeContractBuffer = upgradeContract.encode(); console.log(upgradeContractBuffer.toJSON()); @@ -272,8 +272,8 @@ test("GovernancePayload ser/de", (done) => { 80, 84, 71, 77, 1, 0, 234, 147, 4, 61, 14, 216, 21, 82, 99, 175, 8, 98, 55, 45, 243, 175, 148, 3, 197, 2, 53, 134, 97, 243, 23, 246, 47, 189, 192, 38, 208, 59, 234, 238, - ]) - ) + ]), + ), ).toBeTruthy(); done(); @@ -288,7 +288,7 @@ function governanceHeaderArb(): Arbitrary { ] as ActionName[]; const actionArb = fc.constantFrom(...actions); const targetChainIdArb = fc.constantFrom( - ...(Object.keys(CHAINS) as ChainName[]) + ...(Object.keys(CHAINS) as ChainName[]), ); return actionArb.chain((action) => { @@ -338,13 +338,13 @@ function governanceActionArb(): Arbitrary { const arb256bit = hexBytesArb({ minLength: 32, maxLength: 32 }).map( (buffer) => { return new UpgradeContract256Bit(header.targetChainId, buffer); - } + }, ); const evmArb = hexBytesArb({ minLength: 20, maxLength: 20 }).map( (address) => { return new EvmUpgradeContract(header.targetChainId, address); - } + }, ); return fc.oneof(cosmosArb, arb256bit, evmArb); @@ -352,7 +352,7 @@ function governanceActionArb(): Arbitrary { return bufferArb().map((claimVaa) => { return new AuthorizeGovernanceDataSourceTransfer( header.targetChainId, - claimVaa + claimVaa, ); }); } else if (header.action === "SetDataSources") { @@ -373,19 +373,19 @@ function governanceActionArb(): Arbitrary { return fc.bigUintN(32).map((index) => { return new RequestGovernanceDataSourceTransfer( header.targetChainId, - parseInt(index.toString()) + parseInt(index.toString()), ); }); } else if (header.action === "SetWormholeAddress") { const evmArb = hexBytesArb({ minLength: 20, maxLength: 20 }).map( (address) => { return new EvmSetWormholeAddress(header.targetChainId, address); - } + }, ); const starknetArb = hexBytesArb({ minLength: 32, maxLength: 32 }).map( (address) => { return new StarknetSetWormholeAddress(header.targetChainId, address); - } + }, ); return fc.oneof(evmArb, starknetArb); } else if (header.action === "Execute") { @@ -403,8 +403,8 @@ function governanceActionArb(): Arbitrary { executerAddress, callAddress, value, - callData - ) + callData, + ), ); } else if (header.action === "SetFeeInToken") { return fc @@ -421,7 +421,7 @@ function governanceActionArb(): Arbitrary { header.targetChainId, value, expo, - Buffer.from(token) + Buffer.from(token), ); }); } else { @@ -442,7 +442,7 @@ test("Header serialization round-trip test", (done) => { decoded.action === original.action && decoded.targetChainId === original.targetChainId ); - }) + }), ); done(); @@ -459,7 +459,7 @@ test("Governance action serialization round-trip test", (done) => { // TODO: not sure if i love this test. return decoded.encode().equals(original.encode()); - }) + }), ); done(); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/LazerMultisigInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/LazerMultisigInstruction.test.ts index 69e7eb5ec3..3aa74276b8 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/LazerMultisigInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/LazerMultisigInstruction.test.ts @@ -11,7 +11,7 @@ import { describe("LazerMultisigInstruction", () => { const mockProgramId = new PublicKey( - "pytd2yyk641x7ak7mkaasSJVXh6YYZnC7wTmtgAyxPt" + "pytd2yyk641x7ak7mkaasSJVXh6YYZnC7wTmtgAyxPt", ); const systemProgram = SystemProgram.programId; diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/MessageBufferMultisigInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/MessageBufferMultisigInstruction.test.ts index 0ab6d95971..c4c1a27517 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/MessageBufferMultisigInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/MessageBufferMultisigInstruction.test.ts @@ -28,8 +28,8 @@ test("Message buffer multisig instruction parse: create buffer", (done) => { new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ) as unknown as Program; const parser = MultisigParser.fromCluster(cluster); @@ -56,77 +56,77 @@ test("Message buffer multisig instruction parse: create buffer", (done) => { if (parsedInstruction instanceof AnchorMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.MessageBuffer + MultisigInstructionProgram.MessageBuffer, ); expect(parsedInstruction.name).toBe("createBuffer"); expect( parsedInstruction.accounts.named["whitelist"].pubkey.equals( - instruction.keys[0].pubkey - ) + instruction.keys[0].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["whitelist"].isSigner).toBe( - instruction.keys[0].isSigner + instruction.keys[0].isSigner, ); expect(parsedInstruction.accounts.named["whitelist"].isWritable).toBe( - instruction.keys[0].isWritable + instruction.keys[0].isWritable, ); expect( parsedInstruction.accounts.named["admin"].pubkey.equals( - instruction.keys[1].pubkey - ) + instruction.keys[1].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["admin"].isSigner).toBe( - instruction.keys[1].isSigner + instruction.keys[1].isSigner, ); expect(parsedInstruction.accounts.named["admin"].isWritable).toBe( - instruction.keys[1].isWritable + instruction.keys[1].isWritable, ); expect( parsedInstruction.accounts.named["payer"].pubkey.equals( - instruction.keys[2].pubkey - ) + instruction.keys[2].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["payer"].isSigner).toBe( - instruction.keys[2].isSigner + instruction.keys[2].isSigner, ); expect(parsedInstruction.accounts.named["payer"].isWritable).toBe( - instruction.keys[2].isWritable + instruction.keys[2].isWritable, ); expect( parsedInstruction.accounts.named["systemProgram"].pubkey.equals( - instruction.keys[3].pubkey - ) + instruction.keys[3].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["systemProgram"].isSigner).toBe( - instruction.keys[3].isSigner + instruction.keys[3].isSigner, ); expect( - parsedInstruction.accounts.named["systemProgram"].isWritable + parsedInstruction.accounts.named["systemProgram"].isWritable, ).toBe(instruction.keys[3].isWritable); expect(parsedInstruction.accounts.remaining.length).toBe(1); expect( parsedInstruction.accounts.remaining[0].pubkey.equals( - instruction.keys[4].pubkey - ) + instruction.keys[4].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.remaining[0].isSigner).toBe( - instruction.keys[4].isSigner + instruction.keys[4].isSigner, ); expect(parsedInstruction.accounts.remaining[0].isWritable).toBe( - instruction.keys[4].isWritable + instruction.keys[4].isWritable, ); expect( - parsedInstruction.args.allowedProgramAuth.equals(allowedProgramAuth) + parsedInstruction.args.allowedProgramAuth.equals(allowedProgramAuth), ).toBeTruthy(); expect( - parsedInstruction.args.baseAccountKey.equals(baseAccountKey) + parsedInstruction.args.baseAccountKey.equals(baseAccountKey), ).toBeTruthy(); expect(parsedInstruction.args.targetSize).toBe(100); @@ -148,8 +148,8 @@ test("Message buffer multisig instruction parse: delete buffer", (done) => { new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ) as unknown as Program; const parser = MultisigParser.fromCluster(cluster); @@ -170,65 +170,65 @@ test("Message buffer multisig instruction parse: delete buffer", (done) => { if (parsedInstruction instanceof AnchorMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.MessageBuffer + MultisigInstructionProgram.MessageBuffer, ); expect(parsedInstruction.name).toBe("deleteBuffer"); expect( parsedInstruction.accounts.named["whitelist"].pubkey.equals( - instruction.keys[0].pubkey - ) + instruction.keys[0].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["whitelist"].isSigner).toBe( - instruction.keys[0].isSigner + instruction.keys[0].isSigner, ); expect(parsedInstruction.accounts.named["whitelist"].isWritable).toBe( - instruction.keys[0].isWritable + instruction.keys[0].isWritable, ); expect( parsedInstruction.accounts.named["admin"].pubkey.equals( - instruction.keys[1].pubkey - ) + instruction.keys[1].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["admin"].isSigner).toBe( - instruction.keys[1].isSigner + instruction.keys[1].isSigner, ); expect(parsedInstruction.accounts.named["admin"].isWritable).toBe( - instruction.keys[1].isWritable + instruction.keys[1].isWritable, ); expect( parsedInstruction.accounts.named["payer"].pubkey.equals( - instruction.keys[2].pubkey - ) + instruction.keys[2].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["payer"].isSigner).toBe( - instruction.keys[2].isSigner + instruction.keys[2].isSigner, ); expect(parsedInstruction.accounts.named["payer"].isWritable).toBe( - instruction.keys[2].isWritable + instruction.keys[2].isWritable, ); expect( parsedInstruction.accounts.named["messageBuffer"].pubkey.equals( - instruction.keys[3].pubkey - ) + instruction.keys[3].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["messageBuffer"].isSigner).toBe( - instruction.keys[3].isSigner + instruction.keys[3].isSigner, ); expect( - parsedInstruction.accounts.named["messageBuffer"].isWritable + parsedInstruction.accounts.named["messageBuffer"].isWritable, ).toBe(instruction.keys[3].isWritable); expect(parsedInstruction.accounts.remaining.length).toBe(0); expect( - parsedInstruction.args.allowedProgramAuth.equals(allowedProgramAuth) + parsedInstruction.args.allowedProgramAuth.equals(allowedProgramAuth), ).toBeTruthy(); expect( - parsedInstruction.args.baseAccountKey.equals(baseAccountKey) + parsedInstruction.args.baseAccountKey.equals(baseAccountKey), ).toBeTruthy(); done(); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/PriceStoreProgramInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/PriceStoreProgramInstruction.test.ts index 5a836414e0..93e633f7cb 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/PriceStoreProgramInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/PriceStoreProgramInstruction.test.ts @@ -12,7 +12,7 @@ test("Price store instruction parse: roundtrip", (done) => { data: { payerKey: new PublicKey("Fe9vtgwRhbMSUsAjwUzupzRoJKofyyk1Rz8ZUrPmGHMr"), authorityKey: new PublicKey( - "D9rnZSLjdYboFGDGHk5Qre2yBS8HYbc6374Zm6AeC1PB" + "D9rnZSLjdYboFGDGHk5Qre2yBS8HYbc6374Zm6AeC1PB", ), }, }, @@ -20,13 +20,13 @@ test("Price store instruction parse: roundtrip", (done) => { type: "InitializePublisher", data: { authorityKey: new PublicKey( - "D9rnZSLjdYboFGDGHk5Qre2yBS8HYbc6374Zm6AeC1PB" + "D9rnZSLjdYboFGDGHk5Qre2yBS8HYbc6374Zm6AeC1PB", ), publisherKey: new PublicKey( - "EXAyN9UVu1x163PQkVzyNm4YunNkMGu5Ry7ntoyyQGTe" + "EXAyN9UVu1x163PQkVzyNm4YunNkMGu5Ry7ntoyyQGTe", ), bufferKey: new PublicKey( - "7q6SS575jGDjE8bWsx4PiLVqS7cHJhjJBhysvRoP53WJ" + "7q6SS575jGDjE8bWsx4PiLVqS7cHJhjJBhysvRoP53WJ", ), }, }, diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/PythMultisigInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/PythMultisigInstruction.test.ts index 9af008d59e..62e7ff59ab 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/PythMultisigInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/PythMultisigInstruction.test.ts @@ -22,8 +22,8 @@ test("Pyth multisig instruction parse: create price account", (done) => { new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ); const parser = MultisigParser.fromCluster(cluster); @@ -40,53 +40,53 @@ test("Pyth multisig instruction parse: create price account", (done) => { if (parsedInstruction instanceof PythMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.PythOracle + MultisigInstructionProgram.PythOracle, ); expect(parsedInstruction.name).toBe("addPrice"); expect( parsedInstruction.accounts.named["fundingAccount"].pubkey.equals( - instruction.keys[0].pubkey - ) + instruction.keys[0].pubkey, + ), ).toBeTruthy(); expect( - parsedInstruction.accounts.named["fundingAccount"].isSigner + parsedInstruction.accounts.named["fundingAccount"].isSigner, ).toBe(instruction.keys[0].isSigner); expect( - parsedInstruction.accounts.named["fundingAccount"].isWritable + parsedInstruction.accounts.named["fundingAccount"].isWritable, ).toBe(instruction.keys[0].isWritable); console.log(parsedInstruction.accounts.named["productAccount"]); expect( parsedInstruction.accounts.named["productAccount"].pubkey.equals( - instruction.keys[1].pubkey - ) + instruction.keys[1].pubkey, + ), ).toBeTruthy(); expect( - parsedInstruction.accounts.named["productAccount"].isSigner + parsedInstruction.accounts.named["productAccount"].isSigner, ).toBe(instruction.keys[1].isSigner); expect( - parsedInstruction.accounts.named["productAccount"].isWritable + parsedInstruction.accounts.named["productAccount"].isWritable, ).toBe(instruction.keys[1].isWritable); expect( parsedInstruction.accounts.named["priceAccount"].pubkey.equals( - instruction.keys[2].pubkey - ) + instruction.keys[2].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["priceAccount"].isSigner).toBe( - instruction.keys[2].isSigner + instruction.keys[2].isSigner, ); expect( - parsedInstruction.accounts.named["priceAccount"].isWritable + parsedInstruction.accounts.named["priceAccount"].isWritable, ).toBe(instruction.keys[2].isWritable); expect( parsedInstruction.accounts.named["permissionsAccount"].pubkey.equals( - instruction.keys[3].pubkey - ) + instruction.keys[3].pubkey, + ), ).toBeTruthy(); expect( - parsedInstruction.accounts.named["permissionsAccount"].isSigner + parsedInstruction.accounts.named["permissionsAccount"].isSigner, ).toBe(instruction.keys[3].isSigner); expect( - parsedInstruction.accounts.named["permissionsAccount"].isWritable + parsedInstruction.accounts.named["permissionsAccount"].isWritable, ).toBe(instruction.keys[3].isWritable); expect(parsedInstruction.accounts.remaining.length).toBe(0); @@ -108,8 +108,8 @@ test("Pyth multisig instruction parse: set minimum publishers", (done) => { new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ); const parser = MultisigParser.fromCluster(cluster); @@ -125,41 +125,41 @@ test("Pyth multisig instruction parse: set minimum publishers", (done) => { if (parsedInstruction instanceof PythMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.PythOracle + MultisigInstructionProgram.PythOracle, ); expect(parsedInstruction.name).toBe("setMinPub"); expect( parsedInstruction.accounts.named["fundingAccount"].pubkey.equals( - instruction.keys[0].pubkey - ) + instruction.keys[0].pubkey, + ), ).toBeTruthy(); expect( - parsedInstruction.accounts.named["fundingAccount"].isSigner + parsedInstruction.accounts.named["fundingAccount"].isSigner, ).toBe(instruction.keys[0].isSigner); expect( - parsedInstruction.accounts.named["fundingAccount"].isWritable + parsedInstruction.accounts.named["fundingAccount"].isWritable, ).toBe(instruction.keys[0].isWritable); expect( parsedInstruction.accounts.named["priceAccount"].pubkey.equals( - instruction.keys[1].pubkey - ) + instruction.keys[1].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["priceAccount"].isSigner).toBe( - instruction.keys[1].isSigner + instruction.keys[1].isSigner, ); expect( - parsedInstruction.accounts.named["priceAccount"].isWritable + parsedInstruction.accounts.named["priceAccount"].isWritable, ).toBe(instruction.keys[1].isWritable); expect( parsedInstruction.accounts.named["permissionsAccount"].pubkey.equals( - instruction.keys[2].pubkey - ) + instruction.keys[2].pubkey, + ), ).toBeTruthy(); expect( - parsedInstruction.accounts.named["permissionsAccount"].isSigner + parsedInstruction.accounts.named["permissionsAccount"].isSigner, ).toBe(instruction.keys[2].isSigner); expect( - parsedInstruction.accounts.named["permissionsAccount"].isWritable + parsedInstruction.accounts.named["permissionsAccount"].isWritable, ).toBe(instruction.keys[2].isWritable); expect(parsedInstruction.accounts.remaining.length).toBe(0); expect(parsedInstruction.args.minPub).toBe(25); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/SystemProgramInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/SystemProgramInstruction.test.ts index 68ee779697..b5690e21f7 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/SystemProgramInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/SystemProgramInstruction.test.ts @@ -27,14 +27,14 @@ test("System multisig instruction parse", (done) => { const parsedInstruction = parser.parseInstruction(transferInstruction); if (parsedInstruction instanceof SystemProgramMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.SystemProgram + MultisigInstructionProgram.SystemProgram, ); expect(parsedInstruction.name).toBe("Transfer"); expect( - parsedInstruction.args.fromPubkey.equals(new PublicKey(1)) + parsedInstruction.args.fromPubkey.equals(new PublicKey(1)), ).toBeTruthy(); expect( - parsedInstruction.args.toPubkey.equals(new PublicKey(2)) + parsedInstruction.args.toPubkey.equals(new PublicKey(2)), ).toBeTruthy(); expect(parsedInstruction.args.lamports.toString()).toBe("100"); } else { @@ -49,11 +49,11 @@ test("System multisig instruction parse", (done) => { const parsedBadInstruction = parser.parseInstruction(badInstruction); if (parsedBadInstruction instanceof SystemProgramMultisigInstruction) { expect(parsedBadInstruction.program).toBe( - MultisigInstructionProgram.SystemProgram + MultisigInstructionProgram.SystemProgram, ); expect(parsedBadInstruction.name).toBe(UNRECOGNIZED_INSTRUCTION); expect( - parsedBadInstruction.args.data.equals(Buffer.from([1, 2, 3, 4])) + parsedBadInstruction.args.data.equals(Buffer.from([1, 2, 3, 4])), ).toBeTruthy(); done(); } else { diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/TransactionSize.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/TransactionSize.test.ts index 95af3950be..b41628aa1f 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/TransactionSize.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/TransactionSize.test.ts @@ -36,8 +36,8 @@ it("Unit test for getSizeOfTransaction", async () => { new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ); const payer = new Keypair(); @@ -60,7 +60,7 @@ it("Unit test for getSizeOfTransaction", async () => { productAccount, tailMappingAccount: PublicKey.unique(), }) - .instruction() + .instruction(), ); ixsToSend.push( @@ -71,7 +71,7 @@ it("Unit test for getSizeOfTransaction", async () => { productAccount, priceAccount: PublicKey.unique(), }) - .instruction() + .instruction(), ); const transaction = new Transaction(); @@ -82,7 +82,7 @@ it("Unit test for getSizeOfTransaction", async () => { transaction.recentBlockhash = "GqdFtdM7zzWw33YyHtBNwPhyBsdYKcfm9gT47bWnbHvs"; // Mock blockhash from devnet transaction.feePayer = payer.publicKey; expect(transaction.serialize({ requireAllSignatures: false }).length).toBe( - getSizeOfTransaction(ixsToSend, false) + getSizeOfTransaction(ixsToSend, false), ); }); @@ -95,8 +95,8 @@ it("Unit test for getSizeOfTransaction", async () => { new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ); const ixsToSend: TransactionInstruction[] = []; const payer = new Keypair(); @@ -109,7 +109,7 @@ it("Unit test for getSizeOfTransaction", async () => { fundingAccount: payer.publicKey, priceAccount: PublicKey.unique(), }) - .instruction() + .instruction(), ); } @@ -118,31 +118,31 @@ it("Unit test for getSizeOfTransaction", async () => { computeUnitPriceMicroLamports: 50000, }); expect( - txToSend.map((tx) => tx.instructions.length).reduce((a, b) => a + b) + txToSend.map((tx) => tx.instructions.length).reduce((a, b) => a + b), ).toBe(ixsToSend.length + txToSend.length); expect( txToSend.every( - (tx) => getSizeOfTransaction(tx.instructions, false) <= PACKET_DATA_SIZE - ) + (tx) => getSizeOfTransaction(tx.instructions, false) <= PACKET_DATA_SIZE, + ), ).toBeTruthy(); for (let tx of txToSend) { tx.recentBlockhash = "GqdFtdM7zzWw33YyHtBNwPhyBsdYKcfm9gT47bWnbHvs"; // Mock blockhash from devnet tx.feePayer = payer.publicKey; expect(tx.serialize({ requireAllSignatures: false }).length).toBe( - getSizeOfTransaction(tx.instructions, false) + getSizeOfTransaction(tx.instructions, false), ); } const batches: TransactionInstruction[][] = batchIntoExecutorPayload(ixsToSend); expect(batches.map((batch) => batch.length).reduce((a, b) => a + b)).toBe( - ixsToSend.length + ixsToSend.length, ); expect( batches.every( (batch) => - getSizeOfExecutorInstructions(batch) <= MAX_EXECUTOR_PAYLOAD_SIZE - ) + getSizeOfExecutorInstructions(batch) <= MAX_EXECUTOR_PAYLOAD_SIZE, + ), ).toBeTruthy(); }); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/UpgradeContract.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/UpgradeContract.test.ts index fd0903d8d7..f8b23ce33d 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/UpgradeContract.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/UpgradeContract.test.ts @@ -9,7 +9,7 @@ test("Upgrade contract ser/de", (done) => { const expectedUpgradeContract = new CosmosUpgradeContract( "injective", - BigInt("18446744073709551614") + BigInt("18446744073709551614"), ); const buffer = expectedUpgradeContract.encode(); @@ -18,8 +18,8 @@ test("Upgrade contract ser/de", (done) => { buffer.equals( Buffer.from([ 80, 84, 71, 77, 1, 0, 0, 19, 255, 255, 255, 255, 255, 255, 255, 254, - ]) - ) + ]), + ), ).toBeTruthy(); const actualHeader = PythGovernanceHeader.decode(buffer); diff --git a/governance/xc_admin/packages/xc_admin_common/src/__tests__/WormholeMultisigInstruction.test.ts b/governance/xc_admin/packages/xc_admin_common/src/__tests__/WormholeMultisigInstruction.test.ts index 699da6d38b..18fd3d238f 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/__tests__/WormholeMultisigInstruction.test.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/__tests__/WormholeMultisigInstruction.test.ts @@ -32,8 +32,8 @@ test("Wormhole multisig instruction parse: send message without governance paylo new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ); const parser = MultisigParser.fromCluster(cluster); @@ -52,107 +52,107 @@ test("Wormhole multisig instruction parse: send message without governance paylo const parsedInstruction = parser.parseInstruction(instruction); if (parsedInstruction instanceof WormholeMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.WormholeBridge + MultisigInstructionProgram.WormholeBridge, ); expect(parsedInstruction.name).toBe("postMessage"); expect( parsedInstruction.accounts.named["bridge"].pubkey.equals( - instruction.keys[0].pubkey - ) + instruction.keys[0].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["bridge"].isSigner).toBe( - instruction.keys[0].isSigner + instruction.keys[0].isSigner, ); expect(parsedInstruction.accounts.named["bridge"].isWritable).toBe( - instruction.keys[0].isWritable + instruction.keys[0].isWritable, ); expect( parsedInstruction.accounts.named["message"].pubkey.equals( - instruction.keys[1].pubkey - ) + instruction.keys[1].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["message"].isSigner).toBe( - instruction.keys[1].isSigner + instruction.keys[1].isSigner, ); expect(parsedInstruction.accounts.named["message"].isWritable).toBe( - instruction.keys[1].isWritable + instruction.keys[1].isWritable, ); expect( parsedInstruction.accounts.named["emitter"].pubkey.equals( - instruction.keys[2].pubkey - ) + instruction.keys[2].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["emitter"].isSigner).toBe( - instruction.keys[2].isSigner + instruction.keys[2].isSigner, ); expect(parsedInstruction.accounts.named["emitter"].isWritable).toBe( - instruction.keys[2].isWritable + instruction.keys[2].isWritable, ); expect( parsedInstruction.accounts.named["sequence"].pubkey.equals( - instruction.keys[3].pubkey - ) + instruction.keys[3].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["sequence"].isSigner).toBe( - instruction.keys[3].isSigner + instruction.keys[3].isSigner, ); expect(parsedInstruction.accounts.named["sequence"].isWritable).toBe( - instruction.keys[3].isWritable + instruction.keys[3].isWritable, ); expect( parsedInstruction.accounts.named["payer"].pubkey.equals( - instruction.keys[4].pubkey - ) + instruction.keys[4].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["payer"].isSigner).toBe( - instruction.keys[4].isSigner + instruction.keys[4].isSigner, ); expect(parsedInstruction.accounts.named["payer"].isWritable).toBe( - instruction.keys[4].isWritable + instruction.keys[4].isWritable, ); expect( parsedInstruction.accounts.named["feeCollector"].pubkey.equals( - instruction.keys[5].pubkey - ) + instruction.keys[5].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["feeCollector"].isSigner).toBe( - instruction.keys[5].isSigner + instruction.keys[5].isSigner, ); expect( - parsedInstruction.accounts.named["feeCollector"].isWritable + parsedInstruction.accounts.named["feeCollector"].isWritable, ).toBe(instruction.keys[5].isWritable); expect( parsedInstruction.accounts.named["clock"].pubkey.equals( - instruction.keys[6].pubkey - ) + instruction.keys[6].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["clock"].isSigner).toBe( - instruction.keys[6].isSigner + instruction.keys[6].isSigner, ); expect(parsedInstruction.accounts.named["clock"].isWritable).toBe( - instruction.keys[6].isWritable + instruction.keys[6].isWritable, ); expect( parsedInstruction.accounts.named["rent"].pubkey.equals( - instruction.keys[7].pubkey - ) + instruction.keys[7].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["rent"].isSigner).toBe( - instruction.keys[7].isSigner + instruction.keys[7].isSigner, ); expect(parsedInstruction.accounts.named["rent"].isWritable).toBe( - instruction.keys[7].isWritable + instruction.keys[7].isWritable, ); expect( parsedInstruction.accounts.named["systemProgram"].pubkey.equals( - instruction.keys[8].pubkey - ) + instruction.keys[8].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["systemProgram"].isSigner).toBe( - instruction.keys[8].isSigner + instruction.keys[8].isSigner, ); expect( - parsedInstruction.accounts.named["systemProgram"].isWritable + parsedInstruction.accounts.named["systemProgram"].isWritable, ).toBe(instruction.keys[8].isWritable); expect(parsedInstruction.accounts.remaining.length).toBe(0); @@ -176,8 +176,8 @@ test("Wormhole multisig instruction parse: send message with governance payload" new AnchorProvider( new Connection(getPythClusterApiUrl(cluster)), new Wallet(new Keypair()), - AnchorProvider.defaultOptions() - ) + AnchorProvider.defaultOptions(), + ), ); const parser = MultisigParser.fromCluster(cluster); @@ -204,119 +204,119 @@ test("Wormhole multisig instruction parse: send message with governance payload" const parsedInstruction = parser.parseInstruction(instruction); if (parsedInstruction instanceof WormholeMultisigInstruction) { expect(parsedInstruction.program).toBe( - MultisigInstructionProgram.WormholeBridge + MultisigInstructionProgram.WormholeBridge, ); expect(parsedInstruction.name).toBe("postMessage"); expect( parsedInstruction.accounts.named["bridge"].pubkey.equals( - instruction.keys[0].pubkey - ) + instruction.keys[0].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["bridge"].isSigner).toBe( - instruction.keys[0].isSigner + instruction.keys[0].isSigner, ); expect(parsedInstruction.accounts.named["bridge"].isWritable).toBe( - instruction.keys[0].isWritable + instruction.keys[0].isWritable, ); expect( parsedInstruction.accounts.named["message"].pubkey.equals( - instruction.keys[1].pubkey - ) + instruction.keys[1].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["message"].isSigner).toBe( - instruction.keys[1].isSigner + instruction.keys[1].isSigner, ); expect(parsedInstruction.accounts.named["message"].isWritable).toBe( - instruction.keys[1].isWritable + instruction.keys[1].isWritable, ); expect( parsedInstruction.accounts.named["emitter"].pubkey.equals( - instruction.keys[2].pubkey - ) + instruction.keys[2].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["emitter"].isSigner).toBe( - instruction.keys[2].isSigner + instruction.keys[2].isSigner, ); expect(parsedInstruction.accounts.named["emitter"].isWritable).toBe( - instruction.keys[2].isWritable + instruction.keys[2].isWritable, ); expect( parsedInstruction.accounts.named["sequence"].pubkey.equals( - instruction.keys[3].pubkey - ) + instruction.keys[3].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["sequence"].isSigner).toBe( - instruction.keys[3].isSigner + instruction.keys[3].isSigner, ); expect(parsedInstruction.accounts.named["sequence"].isWritable).toBe( - instruction.keys[3].isWritable + instruction.keys[3].isWritable, ); expect( parsedInstruction.accounts.named["payer"].pubkey.equals( - instruction.keys[4].pubkey - ) + instruction.keys[4].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["payer"].isSigner).toBe( - instruction.keys[4].isSigner + instruction.keys[4].isSigner, ); expect(parsedInstruction.accounts.named["payer"].isWritable).toBe( - instruction.keys[4].isWritable + instruction.keys[4].isWritable, ); expect( parsedInstruction.accounts.named["feeCollector"].pubkey.equals( - instruction.keys[5].pubkey - ) + instruction.keys[5].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["feeCollector"].isSigner).toBe( - instruction.keys[5].isSigner + instruction.keys[5].isSigner, ); expect( - parsedInstruction.accounts.named["feeCollector"].isWritable + parsedInstruction.accounts.named["feeCollector"].isWritable, ).toBe(instruction.keys[5].isWritable); expect( parsedInstruction.accounts.named["clock"].pubkey.equals( - instruction.keys[6].pubkey - ) + instruction.keys[6].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["clock"].isSigner).toBe( - instruction.keys[6].isSigner + instruction.keys[6].isSigner, ); expect(parsedInstruction.accounts.named["clock"].isWritable).toBe( - instruction.keys[6].isWritable + instruction.keys[6].isWritable, ); expect( parsedInstruction.accounts.named["rent"].pubkey.equals( - instruction.keys[7].pubkey - ) + instruction.keys[7].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["rent"].isSigner).toBe( - instruction.keys[7].isSigner + instruction.keys[7].isSigner, ); expect(parsedInstruction.accounts.named["rent"].isWritable).toBe( - instruction.keys[7].isWritable + instruction.keys[7].isWritable, ); expect( parsedInstruction.accounts.named["systemProgram"].pubkey.equals( - instruction.keys[8].pubkey - ) + instruction.keys[8].pubkey, + ), ).toBeTruthy(); expect(parsedInstruction.accounts.named["systemProgram"].isSigner).toBe( - instruction.keys[8].isSigner + instruction.keys[8].isSigner, ); expect( - parsedInstruction.accounts.named["systemProgram"].isWritable + parsedInstruction.accounts.named["systemProgram"].isWritable, ).toBe(instruction.keys[8].isWritable); expect(parsedInstruction.accounts.remaining.length).toBe(0); expect(parsedInstruction.args.nonce).toBe(0); expect( - parsedInstruction.args.payload.equals(executePostedVaa.encode()) + parsedInstruction.args.payload.equals(executePostedVaa.encode()), ); expect(parsedInstruction.args.consistencyLevel).toBe(0); if (parsedInstruction.governanceAction instanceof ExecutePostedVaa) { expect(parsedInstruction.governanceAction.targetChainId).toBe( - "pythnet" + "pythnet", ); ( @@ -325,23 +325,23 @@ test("Wormhole multisig instruction parse: send message with governance payload" ).forEach((instruction, i) => { expect( instruction.programId.equals( - executePostedVaa.instructions[i].programId - ) + executePostedVaa.instructions[i].programId, + ), ); expect( - instruction.data.equals(executePostedVaa.instructions[i].data) + instruction.data.equals(executePostedVaa.instructions[i].data), ); instruction.keys.forEach((account, j) => { expect( account.pubkey.equals( - executePostedVaa.instructions[i].keys[j].pubkey - ) + executePostedVaa.instructions[i].keys[j].pubkey, + ), ).toBeTruthy(); expect(account.isSigner).toBe( - executePostedVaa.instructions[i].keys[j].isSigner + executePostedVaa.instructions[i].keys[j].isSigner, ); expect(account.isWritable).toBe( - executePostedVaa.instructions[i].keys[j].isWritable + executePostedVaa.instructions[i].keys[j].isWritable, ); }); }); diff --git a/governance/xc_admin/packages/xc_admin_common/src/bpf_upgradable_loader.ts b/governance/xc_admin/packages/xc_admin_common/src/bpf_upgradable_loader.ts index 7acd6d6cab..d40a8eef1e 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/bpf_upgradable_loader.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/bpf_upgradable_loader.ts @@ -1,9 +1,9 @@ import { PublicKey } from "@solana/web3.js"; export const PROGRAM_AUTHORITY_ESCROW = new PublicKey( - "escMHe7kSqPcDHx4HU44rAHhgdTLBZkUrU39aN8kMcL" + "escMHe7kSqPcDHx4HU44rAHhgdTLBZkUrU39aN8kMcL", ); export const BPF_UPGRADABLE_LOADER = new PublicKey( - "BPFLoaderUpgradeab1e11111111111111111111111" + "BPFLoaderUpgradeab1e11111111111111111111111", ); diff --git a/governance/xc_admin/packages/xc_admin_common/src/chains.ts b/governance/xc_admin/packages/xc_admin_common/src/chains.ts index 76ae80c5f9..53908cf396 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/chains.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/chains.ts @@ -239,7 +239,7 @@ export const RECEIVER_CHAINS = { // value and that is an expected behavior. export const CHAINS = { ...WORMHOLE_CHAINS, ...RECEIVER_CHAINS }; export declare type ChainName = keyof typeof CHAINS; -export declare type ChainId = typeof CHAINS[ChainName]; +export declare type ChainId = (typeof CHAINS)[ChainName]; export function toChainId(chainName: ChainName): ChainId { return CHAINS[chainName]; diff --git a/governance/xc_admin/packages/xc_admin_common/src/deterministic_oracle_accounts.ts b/governance/xc_admin/packages/xc_admin_common/src/deterministic_oracle_accounts.ts index 66c794fe5a..014b75d6b8 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/deterministic_oracle_accounts.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/deterministic_oracle_accounts.ts @@ -36,7 +36,7 @@ function getSeed(accountType: AccountType, symbol: string): string { */ function getAccountTypeSize( accountType: AccountType, - cluster: PythCluster + cluster: PythCluster, ): number { switch (accountType) { case AccountType.Price: @@ -62,13 +62,13 @@ function getAccountTypeSize( export async function findDetermisticAccountAddress( type: AccountType, symbol: string, - cluster: PythCluster + cluster: PythCluster, ): Promise<[PublicKey, string]> { const seed: string = getSeed(type, symbol).slice(0, 32); const address: PublicKey = await PublicKey.createWithSeed( PRICE_FEED_OPS_KEY, seed, - getPythProgramKeyForCluster(cluster) + getPythProgramKeyForCluster(cluster), ); return [address, seed]; } @@ -87,7 +87,7 @@ export async function getCreateAccountWithSeedInstruction( cluster: PythCluster, base: PublicKey, symbol: string, - accountType: AccountType + accountType: AccountType, ): Promise { const [address, seed]: [PublicKey, string] = await findDetermisticAccountAddress(accountType, symbol, cluster); @@ -98,7 +98,7 @@ export async function getCreateAccountWithSeedInstruction( seed: seed, space: getAccountTypeSize(accountType, cluster), lamports: await connection.getMinimumBalanceForRentExemption( - getAccountTypeSize(accountType, cluster) + getAccountTypeSize(accountType, cluster), ), programId: getPythProgramKeyForCluster(cluster), }); diff --git a/governance/xc_admin/packages/xc_admin_common/src/deterministic_stake_accounts.ts b/governance/xc_admin/packages/xc_admin_common/src/deterministic_stake_accounts.ts index d917bccc5d..0cd5e32ba4 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/deterministic_stake_accounts.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/deterministic_stake_accounts.ts @@ -2,13 +2,13 @@ import { PublicKey, StakeProgram } from "@solana/web3.js"; export async function findDetermisticStakeAccountAddress( basePubkey: PublicKey, - votePubkey: PublicKey + votePubkey: PublicKey, ): Promise<[PublicKey, string]> { const seed: string = votePubkey.toBuffer().toString("hex").slice(0, 32); const address: PublicKey = await PublicKey.createWithSeed( basePubkey, seed, - StakeProgram.programId + StakeProgram.programId, ); return [address, seed]; } diff --git a/governance/xc_admin/packages/xc_admin_common/src/executor.ts b/governance/xc_admin/packages/xc_admin_common/src/executor.ts index d6077daac4..3340981267 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/executor.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/executor.ts @@ -42,14 +42,14 @@ import { Wallet } from "@coral-xyz/anchor"; */ export async function getPostMessageFeeInstruction( wormholeBridgeAddress: PublicKey, - squad: SquadsMesh + squad: SquadsMesh, ) { const wormholeFee = wormholeBridgeAddress ? ( await getWormholeBridgeData( squad.connection, wormholeBridgeAddress, - "confirmed" + "confirmed", ) ).config.fee : 0; @@ -75,7 +75,7 @@ export async function executeProposal( squad: SquadsMesh, cluster: PythCluster, commitment: Commitment = "confirmed", - priorityFeeConfig: PriorityFeeConfig + priorityFeeConfig: PriorityFeeConfig, ) { const multisigParser = MultisigParser.fromCluster(cluster); const signatures: string[] = []; @@ -87,7 +87,7 @@ export async function executeProposal( const instructionPda = getIxPDA( proposal.publicKey, new BN(i), - squad.multisigProgramId + squad.multisigProgramId, )[0]; const instruction = await squad.getInstruction(instructionPda); const parsedInstruction = multisigParser.parseInstruction({ @@ -104,8 +104,8 @@ export async function executeProposal( transaction.add( await getPostMessageFeeInstruction( multisigParser.wormholeBridgeAddress!, - squad - ) + squad, + ), ); } else if ( parsedInstruction instanceof PythMultisigInstruction && @@ -118,8 +118,8 @@ export async function executeProposal( cluster, squad.wallet.publicKey, parsedInstruction.args.symbol, - AccountType.Product - ) + AccountType.Product, + ), ); } else if ( parsedInstruction instanceof PythMultisigInstruction && @@ -127,7 +127,7 @@ export async function executeProposal( ) { /// Add price, fetch the symbol from the product account const productAccount = await squad.connection.getAccountInfo( - parsedInstruction.accounts.named.productAccount.pubkey + parsedInstruction.accounts.named.productAccount.pubkey, ); if (productAccount) { transaction.add( @@ -136,8 +136,8 @@ export async function executeProposal( cluster, squad.wallet.publicKey, parseProductData(productAccount.data).product.symbol, - AccountType.Price - ) + AccountType.Price, + ), ); } else { throw Error("Product account not found"); @@ -149,16 +149,16 @@ export async function executeProposal( transaction.add( await squad.buildExecuteInstruction( proposal.publicKey, - getIxPDA(proposal.publicKey, new BN(i), squad.multisigProgramId)[0] - ) + getIxPDA(proposal.publicKey, new BN(i), squad.multisigProgramId)[0], + ), ); signatures.push( ...(await sendTransactions( [{ tx: transaction, signers: [] }], squad.connection, - squad.wallet as Wallet - )) + squad.wallet as Wallet, + )), ); } return signatures; diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/BufferLayoutExt.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/BufferLayoutExt.ts index c95ce6b385..55ba504bc1 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/BufferLayoutExt.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/BufferLayoutExt.ts @@ -52,7 +52,7 @@ export function u256be(property?: string | undefined): UIntBE { /** An array of numBytes bytes, returned as a hexadecimal string. */ export function hexBytes( numBytes: number, - property?: string | undefined + property?: string | undefined, ): HexBytes { return new HexBytes(numBytes, property); } diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecuteAction.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecuteAction.ts index f10aef97a9..11e24d665b 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecuteAction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecuteAction.ts @@ -24,7 +24,7 @@ export class EvmExecute extends PythGovernanceActionImpl { readonly executorAddress: string, readonly callAddress: string, readonly value: bigint, - readonly calldata: Buffer + readonly calldata: Buffer, ) { super(targetChainId, "Execute"); } @@ -33,7 +33,7 @@ export class EvmExecute extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "Execute", - this.layout + this.layout, ); if (!decoded) return undefined; @@ -42,7 +42,7 @@ export class EvmExecute extends PythGovernanceActionImpl { decoded[1].executorAddress, decoded[1].callAddress, decoded[1].value, - Buffer.from(decoded[1].calldata) + Buffer.from(decoded[1].calldata), ); } diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecutePostedVaa.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecutePostedVaa.ts index f02250c3af..fa46b74030 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecutePostedVaa.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/ExecutePostedVaa.ts @@ -67,12 +67,12 @@ export class ExecutePostedVaa implements PythGovernanceAction { readonly instructions: TransactionInstruction[]; static layout: Vector = new Vector( instructionDataLayout, - "instructions" + "instructions", ); constructor( targetChainId: ChainName, - instructions: TransactionInstruction[] + instructions: TransactionInstruction[], ) { this.targetChainId = targetChainId; this.instructions = instructions; @@ -85,7 +85,7 @@ export class ExecutePostedVaa implements PythGovernanceAction { const deserialized = safeLayoutDecode( this.layout, - data.subarray(PythGovernanceHeader.span) + data.subarray(PythGovernanceHeader.span), ); if (!deserialized) return undefined; @@ -108,7 +108,7 @@ export class ExecutePostedVaa implements PythGovernanceAction { encode(): Buffer { const headerBuffer = new PythGovernanceHeader( this.targetChainId, - "ExecutePostedVaa" + "ExecutePostedVaa", ).encode(); // The code will crash if the payload is actually bigger than PACKET_DATA_SIZE. But PACKET_DATA_SIZE is the maximum transaction size of Solana, so our serialized payload should never be bigger than this anyway diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/GovernanceDataSourceTransfer.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/GovernanceDataSourceTransfer.ts index 1e63862d5d..1de3d8ccc6 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/GovernanceDataSourceTransfer.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/GovernanceDataSourceTransfer.ts @@ -17,13 +17,16 @@ export class AuthorizeGovernanceDataSourceTransfer readonly actionName: ActionName; readonly claimVaa: Buffer; - constructor(readonly targetChainId: ChainName, vaa: Buffer) { + constructor( + readonly targetChainId: ChainName, + vaa: Buffer, + ) { this.actionName = "AuthorizeGovernanceDataSourceTransfer"; this.claimVaa = new Buffer(vaa); } static decode( - data: Buffer + data: Buffer, ): AuthorizeGovernanceDataSourceTransfer | undefined { const header = PythGovernanceHeader.decode(data); if (!header || header.action !== "AuthorizeGovernanceDataSourceTransfer") { @@ -34,14 +37,14 @@ export class AuthorizeGovernanceDataSourceTransfer return new AuthorizeGovernanceDataSourceTransfer( header.targetChainId, - payload + payload, ); } encode(): Buffer { const headerBuffer = new PythGovernanceHeader( this.targetChainId, - this.actionName + this.actionName, ).encode(); return Buffer.concat([headerBuffer, this.claimVaa]); } @@ -57,7 +60,7 @@ export class RequestGovernanceDataSourceTransfer extends PythGovernanceActionImp constructor( targetChainId: ChainName, - readonly governanceDataSourceIndex: number + readonly governanceDataSourceIndex: number, ) { super(targetChainId, "RequestGovernanceDataSourceTransfer"); } @@ -66,13 +69,13 @@ export class RequestGovernanceDataSourceTransfer extends PythGovernanceActionImp const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "RequestGovernanceDataSourceTransfer", - RequestGovernanceDataSourceTransfer.layout + RequestGovernanceDataSourceTransfer.layout, ); if (!decoded) return undefined; return new RequestGovernanceDataSourceTransfer( decoded[0].targetChainId, - decoded[1].governanceDataSourceIndex + decoded[1].governanceDataSourceIndex, ); } diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/PythGovernanceAction.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/PythGovernanceAction.ts index f83b44fb2c..c6f5d60280 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/PythGovernanceAction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/PythGovernanceAction.ts @@ -24,7 +24,7 @@ export const EvmExecutorAction = { /** Helper to get the ActionName from a (moduleId, actionId) tuple*/ export function toActionName( - deserialized: Readonly<{ moduleId: number; actionId: number }> + deserialized: Readonly<{ moduleId: number; actionId: number }>, ): ActionName | undefined { if (deserialized.moduleId == MODULE_EXECUTOR && deserialized.actionId == 0) { return "ExecutePostedVaa"; @@ -79,7 +79,7 @@ export class PythGovernanceHeader { BufferLayout.u8("action"), BufferLayout.u16be("chain"), ], - "header" + "header", ); /** Span of the serialized governance header */ static span = 8; @@ -106,7 +106,7 @@ export class PythGovernanceHeader { if (actionName) { return new PythGovernanceHeader( toChainName(deserialized.chain), - actionName + actionName, ); } else { return undefined; @@ -138,7 +138,7 @@ export class PythGovernanceHeader { action, chain: toChainId(this.targetChainId), }, - buffer + buffer, ); return buffer.subarray(0, span); } @@ -175,7 +175,7 @@ export abstract class PythGovernanceActionImpl implements PythGovernanceAction { /** Encode this action as a buffer with the given payload (encoded using the given layout). */ protected encodeWithPayload( payloadLayout: BufferLayout.Layout, - payload: T + payload: T, ): Buffer { const headerBuffer = this.header().encode(); @@ -189,14 +189,14 @@ export abstract class PythGovernanceActionImpl implements PythGovernanceAction { protected static decodeWithPayload( buffer: Buffer, requiredAction: ActionName, - payloadLayout: BufferLayout.Layout + payloadLayout: BufferLayout.Layout, ): [PythGovernanceHeader, T] | undefined { const header = PythGovernanceHeader.decode(buffer); if (!header || header.action !== requiredAction) return undefined; const payload = safeLayoutDecode( payloadLayout, - buffer.subarray(PythGovernanceHeader.span, buffer.length) + buffer.subarray(PythGovernanceHeader.span, buffer.length), ); if (!payload) return undefined; @@ -206,7 +206,7 @@ export abstract class PythGovernanceActionImpl implements PythGovernanceAction { export function safeLayoutDecode( layout: BufferLayout.Layout, - data: Buffer + data: Buffer, ): T | undefined { try { return layout.decode(data); diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetDataSources.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetDataSources.ts index b1eb6ec6d8..f2b9db9c15 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetDataSources.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetDataSources.ts @@ -25,7 +25,7 @@ export class SetDataSources implements PythGovernanceAction { constructor( readonly targetChainId: ChainName, - readonly dataSources: DataSource[] + readonly dataSources: DataSource[], ) { this.actionName = "SetDataSources"; } @@ -51,7 +51,7 @@ export class SetDataSources implements PythGovernanceAction { encode(): Buffer { const headerBuffer = new PythGovernanceHeader( this.targetChainId, - "SetDataSources" + "SetDataSources", ).encode(); const numSourcesBuf = Buffer.alloc(1); diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetFee.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetFee.ts index 0018b7ddf4..55b94de00a 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetFee.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetFee.ts @@ -18,7 +18,7 @@ export class SetFee extends PythGovernanceActionImpl { constructor( targetChainId: ChainName, readonly newFeeValue: bigint, - readonly newFeeExpo: bigint + readonly newFeeExpo: bigint, ) { super(targetChainId, "SetFee"); } @@ -27,14 +27,14 @@ export class SetFee extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "SetFee", - SetFee.layout + SetFee.layout, ); if (!decoded) return undefined; return new SetFee( decoded[0].targetChainId, decoded[1].newFeeValue, - decoded[1].newFeeExpo + decoded[1].newFeeExpo, ); } @@ -67,7 +67,7 @@ export class SetFeeInToken extends PythGovernanceActionImpl { targetChainId: ChainName, readonly newFeeValue: bigint, readonly newFeeExpo: bigint, - readonly token: Buffer + readonly token: Buffer, ) { super(targetChainId, "SetFeeInToken"); } @@ -85,14 +85,14 @@ export class SetFeeInToken extends PythGovernanceActionImpl { header.targetChainId, fields.newFeeValue, fields.newFeeExpo, - data.subarray(index) + data.subarray(index), ); } encode(): Buffer { const headerBuffer = new PythGovernanceHeader( this.targetChainId, - "SetFeeInToken" + "SetFeeInToken", ).encode(); const fieldsBuf = Buffer.alloc(SetFeeInToken.layout.span); @@ -102,7 +102,7 @@ export class SetFeeInToken extends PythGovernanceActionImpl { newFeeExpo: this.newFeeExpo, tokenLen: this.token.length, }, - fieldsBuf + fieldsBuf, ); return Buffer.concat([headerBuffer, fieldsBuf, this.token]); diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetValidPeriod.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetValidPeriod.ts index 4dfa042add..c431e3388a 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetValidPeriod.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetValidPeriod.ts @@ -11,7 +11,10 @@ export class SetValidPeriod extends PythGovernanceActionImpl { static layout: BufferLayout.Structure> = BufferLayout.struct([BufferLayoutExt.u64be("newValidPeriod")]); - constructor(targetChainId: ChainName, readonly newValidPeriod: bigint) { + constructor( + targetChainId: ChainName, + readonly newValidPeriod: bigint, + ) { super(targetChainId, "SetValidPeriod"); } @@ -19,13 +22,13 @@ export class SetValidPeriod extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "SetValidPeriod", - SetValidPeriod.layout + SetValidPeriod.layout, ); if (!decoded) return undefined; return new SetValidPeriod( decoded[0].targetChainId, - decoded[1].newValidPeriod + decoded[1].newValidPeriod, ); } diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetWormholeAddress.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetWormholeAddress.ts index 5a04e0414d..c93325c05a 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetWormholeAddress.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/SetWormholeAddress.ts @@ -7,7 +7,10 @@ export class EvmSetWormholeAddress extends PythGovernanceActionImpl { static layout: BufferLayout.Structure> = BufferLayout.struct([BufferLayoutExt.hexBytes(20, "address")]); - constructor(targetChainId: ChainName, readonly address: string) { + constructor( + targetChainId: ChainName, + readonly address: string, + ) { super(targetChainId, "SetWormholeAddress"); } @@ -15,13 +18,13 @@ export class EvmSetWormholeAddress extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "SetWormholeAddress", - this.layout + this.layout, ); if (!decoded) return undefined; return new EvmSetWormholeAddress( decoded[0].targetChainId, - decoded[1].address + decoded[1].address, ); } @@ -36,7 +39,10 @@ export class StarknetSetWormholeAddress extends PythGovernanceActionImpl { static layout: BufferLayout.Structure> = BufferLayout.struct([BufferLayoutExt.hexBytes(32, "address")]); - constructor(targetChainId: ChainName, readonly address: string) { + constructor( + targetChainId: ChainName, + readonly address: string, + ) { super(targetChainId, "SetWormholeAddress"); } @@ -44,13 +50,13 @@ export class StarknetSetWormholeAddress extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "SetWormholeAddress", - this.layout + this.layout, ); if (!decoded) return undefined; return new StarknetSetWormholeAddress( decoded[0].targetChainId, - decoded[1].address + decoded[1].address, ); } diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/UpgradeContract.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/UpgradeContract.ts index 2f42246034..71aeb9877d 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/UpgradeContract.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/UpgradeContract.ts @@ -9,7 +9,10 @@ export class CosmosUpgradeContract extends PythGovernanceActionImpl { static layout: BufferLayout.Structure> = BufferLayout.struct([BufferLayoutExt.u64be("codeId")]); - constructor(targetChainId: ChainName, readonly codeId: bigint) { + constructor( + targetChainId: ChainName, + readonly codeId: bigint, + ) { super(targetChainId, "UpgradeContract"); } @@ -17,13 +20,13 @@ export class CosmosUpgradeContract extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "UpgradeContract", - CosmosUpgradeContract.layout + CosmosUpgradeContract.layout, ); if (!decoded) return undefined; return new CosmosUpgradeContract( decoded[0].targetChainId, - decoded[1].codeId + decoded[1].codeId, ); } @@ -39,7 +42,10 @@ export class UpgradeContract256Bit extends PythGovernanceActionImpl { static layout: BufferLayout.Structure> = BufferLayout.struct([BufferLayoutExt.hexBytes(32, "hash")]); - constructor(targetChainId: ChainName, readonly hash: string) { + constructor( + targetChainId: ChainName, + readonly hash: string, + ) { super(targetChainId, "UpgradeContract"); } @@ -47,7 +53,7 @@ export class UpgradeContract256Bit extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "UpgradeContract", - this.layout + this.layout, ); if (!decoded) return undefined; @@ -65,7 +71,10 @@ export class EvmUpgradeContract extends PythGovernanceActionImpl { static layout: BufferLayout.Structure> = BufferLayout.struct([BufferLayoutExt.hexBytes(20, "address")]); - constructor(targetChainId: ChainName, readonly address: string) { + constructor( + targetChainId: ChainName, + readonly address: string, + ) { super(targetChainId, "UpgradeContract"); } @@ -73,7 +82,7 @@ export class EvmUpgradeContract extends PythGovernanceActionImpl { const decoded = PythGovernanceActionImpl.decodeWithPayload( data, "UpgradeContract", - this.layout + this.layout, ); if (!decoded) return undefined; diff --git a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/index.ts b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/index.ts index 71409e8b2a..9015fe6e1a 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/governance_payload/index.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/governance_payload/index.ts @@ -23,7 +23,7 @@ import { EvmExecute } from "./ExecuteAction"; /** Decode a governance payload */ export function decodeGovernancePayload( - data: Buffer + data: Buffer, ): PythGovernanceAction | undefined { const header = PythGovernanceHeader.decode(data); if (!header) return undefined; diff --git a/governance/xc_admin/packages/xc_admin_common/src/message_buffer.ts b/governance/xc_admin/packages/xc_admin_common/src/message_buffer.ts index 0dc21bed49..01330c3cf0 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/message_buffer.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/message_buffer.ts @@ -5,7 +5,7 @@ import { PublicKey } from "@solana/web3.js"; * Address of the message buffer program. */ export const MESSAGE_BUFFER_PROGRAM_ID: PublicKey = new PublicKey( - "7Vbmv1jt4vyuqBZcpYPpnVhrqVe5e6ZPb6JxDcffRHUM" + "7Vbmv1jt4vyuqBZcpYPpnVhrqVe5e6ZPb6JxDcffRHUM", ); export const MESSAGE_BUFFER_BUFFER_SIZE = 2048; @@ -15,12 +15,12 @@ export function isMessageBufferAvailable(cluster: PythCluster): boolean { } export function getPythOracleMessageBufferCpiAuth( - cluster: PythCluster + cluster: PythCluster, ): PublicKey { const pythOracleProgramId = getPythProgramKeyForCluster(cluster); return PublicKey.findProgramAddressSync( [Buffer.from("upd_price_write"), MESSAGE_BUFFER_PROGRAM_ID.toBuffer()], - pythOracleProgramId + pythOracleProgramId, )[0]; } @@ -28,7 +28,7 @@ export function getPythOracleMessageBufferCpiAuth( // as a named account because Anchor can automatically find the address. export function getMessageBufferAddressForPrice( cluster: PythCluster, - priceAccount: PublicKey + priceAccount: PublicKey, ): PublicKey { return PublicKey.findProgramAddressSync( [ @@ -36,6 +36,6 @@ export function getMessageBufferAddressForPrice( Buffer.from("message"), priceAccount.toBuffer(), ], - MESSAGE_BUFFER_PROGRAM_ID + MESSAGE_BUFFER_PROGRAM_ID, )[0]; } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig.ts index 93b1955d4d..c5abf2c4c2 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig.ts @@ -32,11 +32,11 @@ export const PRICE_FEED_MULTISIG: Record = { * Address of the ops key (same on all networks) */ export const PRICE_FEED_OPS_KEY = new PublicKey( - "ACzP6RC98vcBk9oTeAwcH1o5HJvtBzU59b5nqdwc7Cxy" + "ACzP6RC98vcBk9oTeAwcH1o5HJvtBzU59b5nqdwc7Cxy", ); export const UPGRADE_OPS_KEY = new PublicKey( - "opsLibxVY7Vz5eYMmSfX8cLFCFVYTtH6fr6MiifMpA7" + "opsLibxVY7Vz5eYMmSfX8cLFCFVYTtH6fr6MiifMpA7", ); export function getOpsKey(vault: PublicKey): PublicKey { @@ -67,7 +67,7 @@ export async function getProposals( squad: Squads, vault: PublicKey, offset: number = 1, - state: "active" | "executeReady" | "executed" | "all" = "all" + state: "active" | "executeReady" | "executed" | "all" = "all", ): Promise { const msAccount = await squad.getMultisig(vault); let txKeys = lodash @@ -76,10 +76,10 @@ export async function getProposals( let msTransactions = await squad.getTransactions(txKeys); return msTransactions .filter( - (x: TransactionAccount | null): x is TransactionAccount => x != null + (x: TransactionAccount | null): x is TransactionAccount => x != null, ) .filter((x) => - state === "all" ? true : lodash.isEqual(x.status, { [state]: {} }) + state === "all" ? true : lodash.isEqual(x.status, { [state]: {} }), ); } @@ -91,7 +91,7 @@ export async function getProposals( */ export async function getManyProposalsInstructions( squad: Squads, - txAccounts: TransactionAccount[] + txAccounts: TransactionAccount[], ): Promise { let allIxsKeys = []; let ownerTransaction = []; @@ -103,8 +103,8 @@ export async function getManyProposalsInstructions( getIxPDA( txAccount.publicKey, new BN(i), - DEFAULT_MULTISIG_PROGRAM_ID - )[0] + DEFAULT_MULTISIG_PROGRAM_ID, + )[0], ); for (let ixKey of ixKeys) { allIxsKeys.push(ixKey); @@ -115,7 +115,7 @@ export async function getManyProposalsInstructions( let allTxIxsAccounts = await squad.getInstructions(allIxsKeys); let ixAccountsByTx: InstructionAccount[][] = Array.from( Array(txAccounts.length), - () => [] + () => [], ); for (let i = 0; i < allTxIxsAccounts.length; i++) { @@ -135,16 +135,20 @@ export async function getManyProposalsInstructions( */ export async function getProposalInstructions( squad: Squads, - txAccount: TransactionAccount + txAccount: TransactionAccount, ): Promise { let ixKeys = lodash .range(1, txAccount.instructionIndex + 1) .map( (i) => - getIxPDA(txAccount.publicKey, new BN(i), DEFAULT_MULTISIG_PROGRAM_ID)[0] + getIxPDA( + txAccount.publicKey, + new BN(i), + DEFAULT_MULTISIG_PROGRAM_ID, + )[0], ); let txIxs = await squad.getInstructions(ixKeys); return txIxs.filter( - (x: InstructionAccount | null): x is InstructionAccount => x != null + (x: InstructionAccount | null): x is InstructionAccount => x != null, ); } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/BpfUpgradableLoaderMultisigInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/BpfUpgradableLoaderMultisigInstruction.ts index a49b2b14c2..93d333e234 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/BpfUpgradableLoaderMultisigInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/BpfUpgradableLoaderMultisigInstruction.ts @@ -17,7 +17,7 @@ export class BpfUpgradableLoaderInstruction implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -25,7 +25,7 @@ export class BpfUpgradableLoaderInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): BpfUpgradableLoaderInstruction { try { const instructionTypeLayout = BufferLayout.u32("instruction"); @@ -46,7 +46,7 @@ export class BpfUpgradableLoaderInstruction implements MultisigInstruction { upgradeAuthority: instruction.keys[6], }, remaining: instruction.keys.slice(7), - } + }, ); case 4: return new BpfUpgradableLoaderInstruction( @@ -59,7 +59,7 @@ export class BpfUpgradableLoaderInstruction implements MultisigInstruction { newAuthority: instruction.keys[2], }, remaining: instruction.keys.slice(3), - } + }, ); case 5: let args; @@ -95,7 +95,7 @@ export class BpfUpgradableLoaderInstruction implements MultisigInstruction { return new BpfUpgradableLoaderInstruction( UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/LazerMultisigInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/LazerMultisigInstruction.ts index 7787c3fd4a..a5c323e169 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/LazerMultisigInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/LazerMultisigInstruction.ts @@ -17,7 +17,7 @@ export class LazerMultisigInstruction implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -25,7 +25,7 @@ export class LazerMultisigInstruction implements MultisigInstruction { } static fromInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): LazerMultisigInstruction { // TODO: This is a hack to transform the IDL to be compatible with the anchor version we are using, we can't upgrade anchor to 0.30.1 because then the existing idls will break const idl = lazerIdl as Idl; @@ -38,13 +38,13 @@ export class LazerMultisigInstruction implements MultisigInstruction { return new LazerMultisigInstruction( deserializedData.name, deserializedData.data, - resolveAccountNames(idl, deserializedData.name, instruction) + resolveAccountNames(idl, deserializedData.name, instruction), ); } else { return new LazerMultisigInstruction( UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/MessageBufferMultisigInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/MessageBufferMultisigInstruction.ts index 3141de2a5f..4e5707df13 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/MessageBufferMultisigInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/MessageBufferMultisigInstruction.ts @@ -21,10 +21,10 @@ import { } from "@pythnetwork/pyth-solana-receiver"; export const MESH_PROGRAM_ID = new PublicKey( - "SMPLVC8MxZ5Bf5EfF7PaMiTCxoBAcmkbM2vkrvMK8ho" + "SMPLVC8MxZ5Bf5EfF7PaMiTCxoBAcmkbM2vkrvMK8ho", ); export const STAKING_PROGRAM_ID = new PublicKey( - "pytS9TjG1qyAZypk7n8rw8gfW9sUaqqYyMhJQ4E7JCQ" + "pytS9TjG1qyAZypk7n8rw8gfW9sUaqqYyMhJQ4E7JCQ", ); export class AnchorMultisigInstruction implements MultisigInstruction { @@ -37,7 +37,7 @@ export class AnchorMultisigInstruction implements MultisigInstruction { program: MultisigInstructionProgram, name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.program = program; this.name = name; @@ -46,7 +46,7 @@ export class AnchorMultisigInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): MultisigInstruction { let idl: Idl; let program: MultisigInstructionProgram; @@ -84,7 +84,7 @@ export class AnchorMultisigInstruction implements MultisigInstruction { idlAuthority: instruction.keys[2], }, remaining: instruction.keys.slice(3), - } + }, ); } const instructionCoder = new BorshCoder(idl).instruction; @@ -96,14 +96,14 @@ export class AnchorMultisigInstruction implements MultisigInstruction { program, deserializedData.name, deserializedData.data, - resolveAccountNames(idl, deserializedData.name, instruction) + resolveAccountNames(idl, deserializedData.name, instruction), ); } else { return new AnchorMultisigInstruction( program, UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/PythMultisigInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/PythMultisigInstruction.ts index c69f6935ec..529bf2b19d 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/PythMultisigInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/PythMultisigInstruction.ts @@ -17,7 +17,7 @@ export class PythMultisigInstruction implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -25,7 +25,7 @@ export class PythMultisigInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): PythMultisigInstruction { const pythInstructionCoder = pythOracleCoder().instruction; @@ -35,13 +35,13 @@ export class PythMultisigInstruction implements MultisigInstruction { return new PythMultisigInstruction( deserializedData.name, deserializedData.data, - resolveAccountNames(pythIdl as Idl, deserializedData.name, instruction) + resolveAccountNames(pythIdl as Idl, deserializedData.name, instruction), ); } else { return new PythMultisigInstruction( UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SolanaStakingMultisigInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SolanaStakingMultisigInstruction.ts index 345512f5ad..d165c85fe9 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SolanaStakingMultisigInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SolanaStakingMultisigInstruction.ts @@ -22,7 +22,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -30,7 +30,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): SolanaStakingMultisigInstruction { try { const type = StakeInstruction.decodeInstructionType(instruction); @@ -55,7 +55,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { }, }, remaining: [], - } + }, ); case "Delegate": const decodedDelegate = StakeInstruction.decodeDelegate(instruction); @@ -81,7 +81,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { }, }, remaining: [], - } + }, ); case "Initialize": const decodedInitialize = @@ -101,7 +101,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { }, }, remaining: [], - } + }, ); case "Authorize": case "AuthorizeWithSeed": @@ -116,7 +116,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { return new SolanaStakingMultisigInstruction( UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } @@ -124,7 +124,7 @@ export class SolanaStakingMultisigInstruction implements MultisigInstruction { export async function fetchStakeAccounts( connection: Connection, - voterAccount: PublicKey + voterAccount: PublicKey, ) { const stakeAccounts = await connection.getProgramAccounts( StakeProgram.programId, @@ -144,7 +144,7 @@ export async function fetchStakeAccounts( }, }, ], - } + }, ); return stakeAccounts.map((account) => account.pubkey); diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SystemProgramInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SystemProgramInstruction.ts index ff73580041..be03dd2dd4 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SystemProgramInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/SystemProgramInstruction.ts @@ -15,7 +15,7 @@ export class SystemProgramMultisigInstruction implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -23,7 +23,7 @@ export class SystemProgramMultisigInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): SystemProgramMultisigInstruction { try { const instructionType = @@ -77,7 +77,7 @@ export class SystemProgramMultisigInstruction implements MultisigInstruction { return new SystemProgramMultisigInstruction( UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/WormholeMultisigInstruction.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/WormholeMultisigInstruction.ts index 8a247fafec..77f1bde46d 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/WormholeMultisigInstruction.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/WormholeMultisigInstruction.ts @@ -24,7 +24,7 @@ export class WormholeMultisigInstruction implements MultisigInstruction { name: string, args: { [key: string]: any }, accounts: AnchorAccounts, - governanceAction: PythGovernanceAction | undefined + governanceAction: PythGovernanceAction | undefined, ) { this.name = name; this.args = args; @@ -33,11 +33,11 @@ export class WormholeMultisigInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): WormholeMultisigInstruction { const wormholeProgram = createReadOnlyWormholeProgramInterface( instruction.programId, - new Connection(getPythClusterApiUrl("devnet")) // Hack to get a decoder, this connection won't actually be used + new Connection(getPythClusterApiUrl("devnet")), // Hack to get a decoder, this connection won't actually be used ); const deserializedData = ( @@ -55,9 +55,9 @@ export class WormholeMultisigInstruction implements MultisigInstruction { resolveAccountNames( wormholeProgram.idl, deserializedData.name, - instruction + instruction, ), - decodedGovernanceAction + decodedGovernanceAction, ); } else { return new WormholeMultisigInstruction( @@ -66,9 +66,9 @@ export class WormholeMultisigInstruction implements MultisigInstruction { resolveAccountNames( wormholeProgram.idl, deserializedData.name, - instruction + instruction, ), - undefined + undefined, ); } } else { @@ -76,7 +76,7 @@ export class WormholeMultisigInstruction implements MultisigInstruction { UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, { named: {}, remaining: instruction.keys }, - undefined + undefined, ); } } diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/anchor.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/anchor.ts index b33beb0214..1ef69519ce 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/anchor.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/anchor.ts @@ -15,7 +15,7 @@ export type AnchorAccounts = { export function resolveAccountNames( idl: Idl, name: string, - instruction: TransactionInstruction + instruction: TransactionInstruction, ): { named: NamedAccounts; remaining: RemainingAccounts } { const ix = idl.instructions.find((ix) => ix.name == name); if (!ix) { @@ -35,7 +35,7 @@ export function resolveAccountNames( export const IDL_SET_BUFFER_DISCRIMINATOR = Buffer.from( "40f4bc78a7e9690a03", - "hex" + "hex", ); async function getIdlAddress(programId: PublicKey): Promise { @@ -46,7 +46,7 @@ async function getIdlAddress(programId: PublicKey): Promise { export async function idlSetBuffer( programId: PublicKey, buffer: PublicKey, - idlAuthority: PublicKey + idlAuthority: PublicKey, ): Promise { let idlAddress = await getIdlAddress(programId); return { diff --git a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/index.ts b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/index.ts index 4b7159ea22..445b4575d2 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/index.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/multisig_transaction/index.ts @@ -91,7 +91,7 @@ export class UnrecognizedProgram implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -99,12 +99,12 @@ export class UnrecognizedProgram implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): UnrecognizedProgram { return new UnrecognizedProgram( UNRECOGNIZED_INSTRUCTION, { data: instruction.data }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } } @@ -116,7 +116,7 @@ export class MultisigParser { constructor( pythOracleAddress: PublicKey, wormholeBridgeAddress: PublicKey | undefined, - pythPriceStoreAddress: PublicKey | undefined + pythPriceStoreAddress: PublicKey | undefined, ) { this.pythOracleAddress = pythOracleAddress; this.wormholeBridgeAddress = wormholeBridgeAddress; @@ -126,7 +126,7 @@ export class MultisigParser { return new MultisigParser( getPythProgramKeyForCluster(cluster), WORMHOLE_ADDRESS[cluster], - PRICE_STORE_PROGRAM_ID + PRICE_STORE_PROGRAM_ID, ); } @@ -136,7 +136,7 @@ export class MultisigParser { instruction.programId.equals(this.wormholeBridgeAddress) ) { return WormholeMultisigInstruction.fromTransactionInstruction( - instruction + instruction, ); } else if (instruction.programId.equals(this.pythOracleAddress)) { return PythMultisigInstruction.fromTransactionInstruction(instruction); @@ -145,7 +145,7 @@ export class MultisigParser { instruction.programId.equals(this.pythPriceStoreAddress) ) { return PriceStoreMultisigInstruction.fromTransactionInstruction( - instruction + instruction, ); } else if ( instruction.programId.equals(MESSAGE_BUFFER_PROGRAM_ID) || @@ -156,15 +156,15 @@ export class MultisigParser { return AnchorMultisigInstruction.fromTransactionInstruction(instruction); } else if (instruction.programId.equals(SystemProgram.programId)) { return SystemProgramMultisigInstruction.fromTransactionInstruction( - instruction + instruction, ); } else if (instruction.programId.equals(BPF_UPGRADABLE_LOADER)) { return BpfUpgradableLoaderInstruction.fromTransactionInstruction( - instruction + instruction, ); } else if (instruction.programId.equals(StakeProgram.programId)) { return SolanaStakingMultisigInstruction.fromTransactionInstruction( - instruction + instruction, ); } else if (instruction.programId.equals(SOLANA_LAZER_PROGRAM_ID)) { return LazerMultisigInstruction.fromInstruction(instruction); diff --git a/governance/xc_admin/packages/xc_admin_common/src/price_store.ts b/governance/xc_admin/packages/xc_admin_common/src/price_store.ts index 1cf23e67c9..62edcac33c 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/price_store.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/price_store.ts @@ -15,7 +15,7 @@ import { AnchorAccounts } from "./multisig_transaction/anchor"; import { PRICE_FEED_OPS_KEY } from "./multisig"; export const PRICE_STORE_PROGRAM_ID: PublicKey = new PublicKey( - "3m6sv6HGqEbuyLV84mD7rJn4MAC9LhUa1y1AUNVqcPfr" + "3m6sv6HGqEbuyLV84mD7rJn4MAC9LhUa1y1AUNVqcPfr", ); export type PriceStoreInitializeInstruction = { @@ -52,21 +52,21 @@ export const PRICE_STORE_BUFFER_SPACE = 100048; export function findPriceStoreConfigAddress(): [PublicKey, number] { return PublicKey.findProgramAddressSync( [Buffer.from("CONFIG")], - PRICE_STORE_PROGRAM_ID + PRICE_STORE_PROGRAM_ID, ); } export function findPriceStorePublisherConfigAddress( - publisherKey: PublicKey + publisherKey: PublicKey, ): [PublicKey, number] { return PublicKey.findProgramAddressSync( [Buffer.from("PUBLISHER_CONFIG"), publisherKey.toBuffer()], - PRICE_STORE_PROGRAM_ID + PRICE_STORE_PROGRAM_ID, ); } export function createPriceStoreInstruction( - data: PriceStoreInstruction + data: PriceStoreInstruction, ): TransactionInstruction { switch (data.type) { case "Initialize": { @@ -150,7 +150,7 @@ export function createPriceStoreInstruction( } export function parsePriceStoreInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): PriceStoreInstruction { if (!instruction.programId.equals(PRICE_STORE_PROGRAM_ID)) { throw new Error("program ID mismatch"); @@ -210,7 +210,7 @@ export function parsePriceStoreInstruction( const expectedJson = JSON.stringify(expected.data); const actualJson = JSON.stringify(instruction.data); throw new Error( - `invalid instruction data: expected ${expectedJson}, got ${actualJson}` + `invalid instruction data: expected ${expectedJson}, got ${actualJson}`, ); } @@ -220,13 +220,13 @@ export function parsePriceStoreInstruction( a.pubkey.equals(b.pubkey); const accountMismatch = expected.keys.some( - (ex, index) => !accountEquals(ex, instruction.keys[index]) + (ex, index) => !accountEquals(ex, instruction.keys[index]), ); if (accountMismatch) { const expectedJson = JSON.stringify(expected.keys); const actualJson = JSON.stringify(instruction.keys); throw new Error( - `invalid accounts: expected ${expectedJson}, got ${actualJson}` + `invalid accounts: expected ${expectedJson}, got ${actualJson}`, ); } return data; @@ -241,7 +241,7 @@ export class PriceStoreMultisigInstruction implements MultisigInstruction { constructor( name: string, args: { [key: string]: any }, - accounts: AnchorAccounts + accounts: AnchorAccounts, ) { this.name = name; this.args = args; @@ -249,7 +249,7 @@ export class PriceStoreMultisigInstruction implements MultisigInstruction { } static fromTransactionInstruction( - instruction: TransactionInstruction + instruction: TransactionInstruction, ): PriceStoreMultisigInstruction { let result; try { @@ -258,7 +258,7 @@ export class PriceStoreMultisigInstruction implements MultisigInstruction { return new PriceStoreMultisigInstruction( UNRECOGNIZED_INSTRUCTION, { data: instruction.data, error: (e as Error).toString() }, - { named: {}, remaining: instruction.keys } + { named: {}, remaining: instruction.keys }, ); } @@ -270,7 +270,7 @@ export class PriceStoreMultisigInstruction implements MultisigInstruction { } export async function findDetermisticPublisherBufferAddress( - publisher: PublicKey + publisher: PublicKey, ): Promise<[PublicKey, string]> { const seedPrefix = "Buffer"; const seed = @@ -279,7 +279,7 @@ export async function findDetermisticPublisherBufferAddress( const address: PublicKey = await PublicKey.createWithSeed( PRICE_FEED_OPS_KEY, seed, - PRICE_STORE_PROGRAM_ID + PRICE_STORE_PROGRAM_ID, ); return [address, seed]; } @@ -287,11 +287,10 @@ export async function findDetermisticPublisherBufferAddress( export async function createDeterministicPublisherBufferAccountInstruction( connection: Connection, base: PublicKey, - publisher: PublicKey + publisher: PublicKey, ): Promise { - const [bufferKey, seed] = await findDetermisticPublisherBufferAddress( - publisher - ); + const [bufferKey, seed] = + await findDetermisticPublisherBufferAddress(publisher); return SystemProgram.createAccountWithSeed({ fromPubkey: base, basePubkey: base, @@ -299,7 +298,7 @@ export async function createDeterministicPublisherBufferAccountInstruction( seed, space: PRICE_STORE_BUFFER_SPACE, lamports: await connection.getMinimumBalanceForRentExemption( - PRICE_STORE_BUFFER_SPACE + PRICE_STORE_BUFFER_SPACE, ), programId: PRICE_STORE_PROGRAM_ID, }); @@ -307,7 +306,7 @@ export async function createDeterministicPublisherBufferAccountInstruction( export async function createDetermisticPriceStoreInitializePublisherInstruction( authorityKey: PublicKey, - publisherKey: PublicKey + publisherKey: PublicKey, ): Promise { const bufferKey = ( await findDetermisticPublisherBufferAddress(publisherKey) @@ -324,7 +323,7 @@ export async function createDetermisticPriceStoreInitializePublisherInstruction( export async function isPriceStorePublisherInitialized( connection: Connection, - publisherKey: PublicKey + publisherKey: PublicKey, ): Promise { const publisherConfigKey = findPriceStorePublisherConfigAddress(publisherKey)[0]; @@ -333,7 +332,7 @@ export async function isPriceStorePublisherInitialized( } export async function isPriceStoreInitialized( - connection: Connection + connection: Connection, ): Promise { const configKey = findPriceStoreConfigAddress()[0]; const response = await connection.getAccountInfo(configKey); diff --git a/governance/xc_admin/packages/xc_admin_common/src/propose.ts b/governance/xc_admin/packages/xc_admin_common/src/propose.ts index 388c0d89f4..7da1820040 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/propose.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/propose.ts @@ -66,7 +66,7 @@ export class MultisigVault { wallet: Wallet, cluster: PythCluster, squad: SquadsMesh, - vault: PublicKey + vault: PublicKey, ) { this.wallet = wallet; this.cluster = cluster; @@ -87,7 +87,7 @@ export class MultisigVault { const msAccount = await this.getMultisigAccount(); const localAuthorityPDA = await this.squad.getAuthorityPDA( msAccount.publicKey, - msAccount.authorityIndex + msAccount.authorityIndex, ); if (cluster === undefined || cluster === this.cluster) { @@ -117,69 +117,69 @@ export class MultisigVault { return new AnchorProvider( this.squad.connection, this.squad.wallet as Wallet, - opts + opts, ); } // Convenience wrappers around squads methods public async createProposalIx( - proposalIndex: number + proposalIndex: number, ): Promise<[TransactionInstruction, PublicKey]> { const msAccount = await this.squad.getMultisig(this.vault); const ix = await this.squad.buildCreateTransaction( msAccount.publicKey, msAccount.authorityIndex, - proposalIndex + proposalIndex, ); const newProposalAddress = getTxPDA( this.vault, new BN(proposalIndex), - this.squad.multisigProgramId + this.squad.multisigProgramId, )[0]; return [ix, newProposalAddress]; } public async activateProposalIx( - proposalAddress: PublicKey + proposalAddress: PublicKey, ): Promise { return await this.squad.buildActivateTransaction( this.vault, - proposalAddress + proposalAddress, ); } public async approveProposalIx( - proposalAddress: PublicKey + proposalAddress: PublicKey, ): Promise { return await this.squad.buildApproveTransaction( this.vault, - proposalAddress + proposalAddress, ); } public async addMemberIx( member: PublicKey, - targetVault: PublicKey + targetVault: PublicKey, ): Promise { return await this.squad.buildAddMember( targetVault, await this.getAuthorityPDA(), - member + member, ); } public async removeMemberIx( member: PublicKey, - targetVault: PublicKey + targetVault: PublicKey, ): Promise { return await this.squad.buildRemoveMember( targetVault, await this.getAuthorityPDA(), - member + member, ); } @@ -204,11 +204,11 @@ export class MultisigVault { */ public async proposeWormholeMessageWithPayer( payload: Buffer, - messagePayer: PublicKey + messagePayer: PublicKey, ): Promise { return this.proposeWormholeMultipleMessagesWithPayer( [payload], - messagePayer + messagePayer, ); } @@ -224,7 +224,7 @@ export class MultisigVault { payloads: Buffer[], messagePayer: PublicKey, proposalAddress?: PublicKey, - priorityFeeConfig: PriorityFeeConfig = {} + priorityFeeConfig: PriorityFeeConfig = {}, ): Promise { const msAccount = await this.getMultisigAccount(); @@ -232,7 +232,7 @@ export class MultisigVault { let startingIndex = 0; if (proposalAddress === undefined) { const [proposalIx, newProposalAddress] = await this.createProposalIx( - msAccount.transactionIndex + 1 + msAccount.transactionIndex + 1, ); ixToSend.push(proposalIx); proposalAddress = newProposalAddress; @@ -242,7 +242,7 @@ export class MultisigVault { } if (payloads.length > MAX_INSTRUCTIONS_PER_PROPOSAL) throw new Error( - "Too many messages in proposal, multiple proposal not supported yet" + "Too many messages in proposal, multiple proposal not supported yet", ); for (let i = startingIndex; i < payloads.length; i++) { @@ -253,7 +253,7 @@ export class MultisigVault { 1 + i, this.wormholeAddress()!, payloads[i], - messagePayer + messagePayer, ); ixToSend.push( await this.squad.buildAddInstruction( @@ -263,8 +263,8 @@ export class MultisigVault { 1 + i, instructionToPropose.authorityIndex, instructionToPropose.authorityBump, - instructionToPropose.authorityType - ) + instructionToPropose.authorityType, + ), ); } ixToSend.push(await this.activateProposalIx(proposalAddress)); @@ -272,7 +272,7 @@ export class MultisigVault { const txToSend = TransactionBuilder.batchIntoLegacyTransactions( ixToSend, - priorityFeeConfig + priorityFeeConfig, ); await this.sendAllTransactions(txToSend); return proposalAddress; @@ -288,7 +288,7 @@ export class MultisigVault { public async proposeInstructions( instructions: TransactionInstruction[], targetCluster: PythCluster, - priorityFeeConfig: PriorityFeeConfig = {} + priorityFeeConfig: PriorityFeeConfig = {}, ): Promise { const msAccount = await this.getMultisigAccount(); const newProposals = []; @@ -305,9 +305,8 @@ export class MultisigVault { for (let j = 0; j < batches.length; j += MAX_INSTRUCTIONS_PER_PROPOSAL) { const proposalIndex = msAccount.transactionIndex + 1 + j / MAX_INSTRUCTIONS_PER_PROPOSAL; - const [proposalIx, newProposalAddress] = await this.createProposalIx( - proposalIndex - ); + const [proposalIx, newProposalAddress] = + await this.createProposalIx(proposalIndex); ixToSend.push(proposalIx); newProposals.push(newProposalAddress); @@ -320,7 +319,7 @@ export class MultisigVault { newProposalAddress, batch, i + 1, - this.wormholeAddress()! + this.wormholeAddress()!, ); ixToSend.push( await this.squad.buildAddInstruction( @@ -330,8 +329,8 @@ export class MultisigVault { i + 1, squadIx.authorityIndex, squadIx.authorityBump, - squadIx.authorityType - ) + squadIx.authorityType, + ), ); } ixToSend.push(await this.activateProposalIx(newProposalAddress)); @@ -345,9 +344,8 @@ export class MultisigVault { ) { const proposalIndex = msAccount.transactionIndex + 1 + j / MAX_INSTRUCTIONS_PER_PROPOSAL; - const [proposalIx, newProposalAddress] = await this.createProposalIx( - proposalIndex - ); + const [proposalIx, newProposalAddress] = + await this.createProposalIx(proposalIndex); ixToSend.push(proposalIx); newProposals.push(newProposalAddress); @@ -359,28 +357,28 @@ export class MultisigVault { this.vault, newProposalAddress, instruction, - i + 1 - ) + i + 1, + ), ); } ixToSend.push( await this.squad.buildActivateTransaction( this.vault, - newProposalAddress - ) + newProposalAddress, + ), ); ixToSend.push( await this.squad.buildApproveTransaction( this.vault, - newProposalAddress - ) + newProposalAddress, + ), ); } } const txToSend = TransactionBuilder.batchIntoLegacyTransactions( ixToSend, - priorityFeeConfig + priorityFeeConfig, ); await this.sendAllTransactions(txToSend); @@ -403,7 +401,7 @@ export class MultisigVault { [{ tx, signers: [] }], provider.connection, this.squad.wallet as NodeWallet, - MAX_RETRY_SEND + MAX_RETRY_SEND, ); break; } catch (e) { @@ -422,7 +420,7 @@ export class MultisigVault { * Batch instructions into batches for inclusion in a remote executor payload */ export function batchIntoExecutorPayload( - instructions: TransactionInstruction[] + instructions: TransactionInstruction[], ): TransactionInstruction[][] { let i = 0; const batches: TransactionInstruction[][] = []; @@ -447,7 +445,7 @@ export function batchIntoExecutorPayload( /** Get the size of instructions when serialized as in a remote executor payload */ export function getSizeOfExecutorInstructions( - instructions: TransactionInstruction[] + instructions: TransactionInstruction[], ) { return instructions .map((ix) => { @@ -472,7 +470,7 @@ export async function wrapAsRemoteInstruction( proposalAddress: PublicKey, instructions: TransactionInstruction[], instructionIndex: number, - wormholeAddress: PublicKey + wormholeAddress: PublicKey, ): Promise { const buffer: Buffer = new ExecutePostedVaa("pythnet", instructions).encode(); return await getPostMessageInstruction( @@ -482,7 +480,7 @@ export async function wrapAsRemoteInstruction( instructionIndex, wormholeAddress, buffer, - getOpsKey(vault) + getOpsKey(vault), ); } @@ -503,30 +501,30 @@ async function getPostMessageInstruction( instructionIndex: number, wormholeAddress: PublicKey, payload: Buffer, - messagePayer: PublicKey + messagePayer: PublicKey, ): Promise { const [messagePDA, messagePdaBump] = getIxAuthorityPDA( proposalAddress, new BN(instructionIndex), - squad.multisigProgramId + squad.multisigProgramId, ); const emitter = squad.getAuthorityPDA(vault, 1); const provider = new AnchorProvider( squad.connection, squad.wallet as Wallet, - AnchorProvider.defaultOptions() + AnchorProvider.defaultOptions(), ); const wormholeProgram = createWormholeProgramInterface( wormholeAddress, - provider + provider, ); const accounts = getPostMessageAccounts( wormholeAddress, emitter, messagePayer, - messagePDA + messagePDA, ); return { @@ -544,7 +542,7 @@ function getPostMessageAccounts( wormholeAddress: PublicKey, emitter: PublicKey, payer: PublicKey, - message: PublicKey + message: PublicKey, ) { return { bridge: deriveWormholeBridgeDataKey(wormholeAddress), diff --git a/governance/xc_admin/packages/xc_admin_common/src/remote_executor.ts b/governance/xc_admin/packages/xc_admin_common/src/remote_executor.ts index c9e87cefd9..3326edc581 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/remote_executor.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/remote_executor.ts @@ -14,7 +14,7 @@ const EXECUTOR_KEY_SEED: string = "EXECUTOR_KEY"; * Address of the remote executor (same on all networks) */ export const REMOTE_EXECUTOR_ADDRESS: PublicKey = new PublicKey( - "exe6S3AxPVNmy46L4Nj6HrnnAVQUhwyYzMSNcnRn3qq" + "exe6S3AxPVNmy46L4Nj6HrnnAVQUhwyYzMSNcnRn3qq", ); /** @@ -25,6 +25,6 @@ export const REMOTE_EXECUTOR_ADDRESS: PublicKey = new PublicKey( export function mapKey(key: PublicKey): PublicKey { return PublicKey.findProgramAddressSync( [Buffer.from(EXECUTOR_KEY_SEED), key.toBytes()], - REMOTE_EXECUTOR_ADDRESS + REMOTE_EXECUTOR_ADDRESS, )[0]; } diff --git a/governance/xc_admin/packages/xc_admin_common/src/wormhole.ts b/governance/xc_admin/packages/xc_admin_common/src/wormhole.ts index 87508b6e49..34386ee2b5 100644 --- a/governance/xc_admin/packages/xc_admin_common/src/wormhole.ts +++ b/governance/xc_admin/packages/xc_admin_common/src/wormhole.ts @@ -4,10 +4,10 @@ import { PublicKey } from "@solana/web3.js"; export const WORMHOLE_ADDRESS: Record = { "mainnet-beta": new PublicKey("worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth"), "pythtest-conformance": new PublicKey( - "EUrRARh92Cdc54xrDn6qzaqjA77NRrCcfbr8kPwoTL4z" + "EUrRARh92Cdc54xrDn6qzaqjA77NRrCcfbr8kPwoTL4z", ), "pythtest-crosschain": new PublicKey( - "EUrRARh92Cdc54xrDn6qzaqjA77NRrCcfbr8kPwoTL4z" + "EUrRARh92Cdc54xrDn6qzaqjA77NRrCcfbr8kPwoTL4z", ), devnet: new PublicKey("3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5"), pythnet: new PublicKey("H3fxXJ86ADW2PNuDDmZJg6mzTtPxkYCpNuQUTgmJ7AjU"), diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/InstructionViews/WormholeInstructionView.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/InstructionViews/WormholeInstructionView.tsx index e6f78e9fe4..1d3d3ac8aa 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/InstructionViews/WormholeInstructionView.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/InstructionViews/WormholeInstructionView.tsx @@ -135,14 +135,14 @@ export const WormholeInstructionView = ({ 'string' ? parsedInstruction.args[key] : parsedInstruction.args[key] instanceof - Uint8Array - ? parsedInstruction.args[key].toString() - : typeof parsedInstruction.args[key] === - 'bigint' - ? parsedInstruction.args[key].toString() - : JSON.stringify( - parsedInstruction.args[key] - )} + Uint8Array + ? parsedInstruction.args[key].toString() + : typeof parsedInstruction.args[key] === + 'bigint' + ? parsedInstruction.args[key].toString() + : JSON.stringify( + parsedInstruction.args[key] + )} )} diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx index a5c31b8367..bd7eadd684 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx @@ -862,8 +862,8 @@ const General = ({ proposerServerUrl }: { proposerServerUrl: string }) => { {addPriceFeed ? 'Add New Price Feed' : deletePriceFeed - ? 'Delete Old Price Feed' - : key} + ? 'Delete Old Price Feed' + : key} {addPriceFeed ? ( diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/Proposal.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/Proposal.tsx index 6ce48ed299..d78c1c3a90 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/Proposal.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/Proposal.tsx @@ -378,8 +378,8 @@ export const Proposal = ({ {uniqueTargetCluster ? `Target network: ${targetClusters[0]}` : targetClusters.length == 0 - ? '' - : `Multiple target networks detected ${targetClusters.join(' ')}`} + ? '' + : `Multiple target networks detected ${targetClusters.join(' ')}`}
@@ -550,10 +550,10 @@ export const Proposal = ({ {typeof instruction.args[key] === 'string' ? instruction.args[key] : instruction.args[key] instanceof Uint8Array - ? instruction.args[key].toString() - : typeof instruction.args[key] === 'bigint' - ? instruction.args[key].toString() - : JSON.stringify(instruction.args[key])} + ? instruction.args[key].toString() + : typeof instruction.args[key] === 'bigint' + ? instruction.args[key].toString() + : JSON.stringify(instruction.args[key])}
)} diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/utils.ts b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/utils.ts index 2f88168d4e..20eda01b50 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/utils.ts +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/utils.ts @@ -20,7 +20,7 @@ export const PROPOSAL_STATUSES = [ 'draft', 'unkwown', ] as const -export type ProposalStatus = typeof PROPOSAL_STATUSES[number] +export type ProposalStatus = (typeof PROPOSAL_STATUSES)[number] export const getProposalStatus = ( proposal: TransactionAccount | undefined, diff --git a/lazer/contracts/solana/scripts/check_trusted_signer.ts b/lazer/contracts/solana/scripts/check_trusted_signer.ts index 8dac4ed2c1..4bf1957b8e 100644 --- a/lazer/contracts/solana/scripts/check_trusted_signer.ts +++ b/lazer/contracts/solana/scripts/check_trusted_signer.ts @@ -25,13 +25,13 @@ async function main() { const provider = new anchor.AnchorProvider( connection, new NodeWallet(anchor.web3.Keypair.generate()), // Dummy wallet since we're only reading - { commitment: "confirmed" } + { commitment: "confirmed" }, ); anchor.setProvider(provider); const program: anchor.Program = new anchor.Program( pythLazerSolanaContractIdl as PythLazerSolanaContract, - provider + provider, ); // Fetch and decode storage account @@ -51,13 +51,13 @@ async function main() { console.log(`\nPublic Key: ${signer.pubkey.toBase58()}`); console.log( `Expires At: ${new Date( - signer.expiresAt.toNumber() * 1000 - ).toISOString()}` + signer.expiresAt.toNumber() * 1000, + ).toISOString()}`, ); console.log( `Active: ${ signer.expiresAt.toNumber() > Date.now() / 1000 ? "Yes" : "No" - }` + }`, ); } } diff --git a/lazer/contracts/solana/scripts/setup.ts b/lazer/contracts/solana/scripts/setup.ts index 7272b31d67..ed33ea13bd 100644 --- a/lazer/contracts/solana/scripts/setup.ts +++ b/lazer/contracts/solana/scripts/setup.ts @@ -24,7 +24,7 @@ async function main() { .parse(); const keypair = anchor.web3.Keypair.fromSecretKey( - new Uint8Array(JSON.parse(readFileSync(argv.keypairPath, "ascii"))) + new Uint8Array(JSON.parse(readFileSync(argv.keypairPath, "ascii"))), ); const topAuthority = new anchor.web3.PublicKey(argv.topAuthority); @@ -38,7 +38,7 @@ async function main() { const program: Program = new Program( pythLazerSolanaContractIdl as PythLazerSolanaContract, - provider + provider, ); const storage = await program.account.storage.all(); @@ -61,7 +61,7 @@ async function main() { await program.methods .update( new anchor.web3.PublicKey(argv.trustedSigner), - new anchor.BN(argv.expiryTimeSeconds) + new anchor.BN(argv.expiryTimeSeconds), ) .accounts({}) .rpc(); diff --git a/lazer/sdk/js/examples/index.ts b/lazer/sdk/js/examples/index.ts index 21c9d734ea..7d88f0748e 100644 --- a/lazer/sdk/js/examples/index.ts +++ b/lazer/sdk/js/examples/index.ts @@ -10,7 +10,7 @@ const client = await PythLazerClient.create( ["wss://pyth-lazer.dourolabs.app/v1/stream"], "access_token", 3, // Optionally specify number of parallel redundant connections to reduce the chance of dropped messages. The connections will round-robin across the provided URLs. Default is 3. - console // Optionally log socket operations (to the console in this case.) + console, // Optionally log socket operations (to the console in this case.) ); // Read and process messages from the Lazer stream @@ -23,7 +23,7 @@ client.addMessageListener((message) => { "stream updated for subscription", message.value.subscriptionId, ":", - message.value.parsed?.priceFeeds + message.value.parsed?.priceFeeds, ); } break; diff --git a/lazer/sdk/js/src/client.ts b/lazer/sdk/js/src/client.ts index 3626757aff..84a259ce2d 100644 --- a/lazer/sdk/js/src/client.ts +++ b/lazer/sdk/js/src/client.ts @@ -43,7 +43,7 @@ export class PythLazerClient { urls: string[], token: string, numConnections = 3, - logger: Logger = dummyLogger + logger: Logger = dummyLogger, ): Promise { const wsp = await WebSocketPool.create(urls, token, numConnections, logger); return new PythLazerClient(wsp); @@ -71,7 +71,7 @@ export class PythLazerClient { } // TODO: some uint64 values may not be representable as Number. const subscriptionId = Number( - data.subarray(pos, pos + UINT64_NUM_BYTES).readBigInt64BE() + data.subarray(pos, pos + UINT64_NUM_BYTES).readBigInt64BE(), ); pos += UINT64_NUM_BYTES; @@ -92,7 +92,7 @@ export class PythLazerClient { value.leUnsigned = data.subarray(pos, pos + len); } else if (magic == FORMAT_MAGICS_LE.JSON) { value.parsed = JSON.parse( - data.subarray(pos + UINT32_NUM_BYTES, pos + len).toString() + data.subarray(pos + UINT32_NUM_BYTES, pos + len).toString(), ) as ParsedPayload; } else { throw new Error("unknown magic: " + magic.toString()); diff --git a/lazer/sdk/js/src/constants.ts b/lazer/sdk/js/src/constants.ts index f672d60404..e08689283f 100644 --- a/lazer/sdk/js/src/constants.ts +++ b/lazer/sdk/js/src/constants.ts @@ -1,8 +1,8 @@ import { PublicKey } from "@solana/web3.js"; export const SOLANA_LAZER_PROGRAM_ID = new PublicKey( - "pytd2yyk641x7ak7mkaasSJVXh6YYZnC7wTmtgAyxPt" + "pytd2yyk641x7ak7mkaasSJVXh6YYZnC7wTmtgAyxPt", ); export const SOLANA_STORAGE_ID = new PublicKey( - "3rdJbqfnagQ4yx9HXJViD4zc4xpiSqmFsKpPuSCQVyQL" + "3rdJbqfnagQ4yx9HXJViD4zc4xpiSqmFsKpPuSCQVyQL", ); diff --git a/lazer/sdk/js/src/ed25519.ts b/lazer/sdk/js/src/ed25519.ts index 5731da0afe..4b5feb021f 100644 --- a/lazer/sdk/js/src/ed25519.ts +++ b/lazer/sdk/js/src/ed25519.ts @@ -34,7 +34,7 @@ const ED25519_INSTRUCTION_LAYOUT = BufferLayout.struct< export const createEd25519Instruction = ( message: Buffer, instructionIndex: number, - startingOffset: number + startingOffset: number, ) => { const signatureOffset = startingOffset + MAGIC_LEN; const publicKeyOffset = signatureOffset + SIGNATURE_LEN; @@ -42,7 +42,7 @@ export const createEd25519Instruction = ( const messageDataOffset = messageDataSizeOffset + MESSAGE_SIZE_LEN; const messageDataSize = message.readUInt16LE( - messageDataSizeOffset - startingOffset + messageDataSizeOffset - startingOffset, ); const instructionData = Buffer.alloc(ED25519_INSTRUCTION_LEN); @@ -59,7 +59,7 @@ export const createEd25519Instruction = ( messageDataSize: messageDataSize, messageInstructionIndex: instructionIndex, }, - instructionData + instructionData, ); return new TransactionInstruction({ diff --git a/lazer/sdk/js/src/socket/resilient-websocket.ts b/lazer/sdk/js/src/socket/resilient-websocket.ts index 0c88c83bd9..747e4bfc63 100644 --- a/lazer/sdk/js/src/socket/resilient-websocket.ts +++ b/lazer/sdk/js/src/socket/resilient-websocket.ts @@ -34,7 +34,7 @@ export class ResilientWebSocket { constructor( endpoint: string, wsOptions?: ClientOptions | ClientRequestArgs, - logger?: Logger + logger?: Logger, ) { this.endpoint = endpoint; this.wsOptions = wsOptions; @@ -60,7 +60,7 @@ export class ResilientWebSocket { if (this.wsClient === undefined) { this.logger?.error( - "Couldn't connect to the websocket server. Error callback is called." + "Couldn't connect to the websocket server. Error callback is called.", ); } else { this.wsClient.send(data); @@ -88,7 +88,7 @@ export class ResilientWebSocket { const timeoutId = setTimeout(() => { if (this.rejectConnection) { this.rejectConnection( - new Error(`Connection timeout after ${String(CONNECTION_TIMEOUT)}ms`) + new Error(`Connection timeout after ${String(CONNECTION_TIMEOUT)}ms`), ); } }, CONNECTION_TIMEOUT); @@ -182,7 +182,7 @@ export class ResilientWebSocket { this.logger?.error( "Connection closed unexpectedly or because of timeout. Reconnecting after " + String(waitTime) + - "ms." + "ms.", ); await sleep(waitTime); @@ -200,7 +200,7 @@ export class ResilientWebSocket { if (this.wsClient === undefined) { this.logger?.error( - "Couldn't reconnect to websocket. Error callback is called." + "Couldn't reconnect to websocket. Error callback is called.", ); return; } diff --git a/lazer/sdk/js/src/socket/websocket-pool.ts b/lazer/sdk/js/src/socket/websocket-pool.ts index c756efc093..2bca315cc2 100644 --- a/lazer/sdk/js/src/socket/websocket-pool.ts +++ b/lazer/sdk/js/src/socket/websocket-pool.ts @@ -41,7 +41,7 @@ export class WebSocketPool { urls: string[], token: string, numConnections: number = DEFAULT_NUM_CONNECTIONS, - logger: Logger = dummyLogger + logger: Logger = dummyLogger, ): Promise { if (urls.length === 0) { throw new Error("No URLs provided"); @@ -76,7 +76,7 @@ export class WebSocketPool { } catch (error) { pool.logger.error( "Failed to resend subscription on reconnect:", - error + error, ); } } @@ -100,7 +100,7 @@ export class WebSocketPool { } pool.logger.info( - `Successfully established ${numConnections.toString()} redundant WebSocket connections` + `Successfully established ${numConnections.toString()} redundant WebSocket connections`, ); return pool; @@ -114,8 +114,8 @@ export class WebSocketPool { if (message.type === "subscriptionError") { throw new Error( `Error occurred for subscription ID ${String( - message.subscriptionId - )}: ${message.error}` + message.subscriptionId, + )}: ${message.error}`, ); } else if (message.type === "error") { throw new Error(`Error: ${message.error}`); diff --git a/price_service/client/js/src/PriceServiceConnection.ts b/price_service/client/js/src/PriceServiceConnection.ts index d45058516d..fcc45d8c8f 100644 --- a/price_service/client/js/src/PriceServiceConnection.ts +++ b/price_service/client/js/src/PriceServiceConnection.ts @@ -121,7 +121,7 @@ export class PriceServiceConnection { process.exit(1); } else { this.logger.error( - "Cannot halt process. Please handle the websocket error." + "Cannot halt process. Please handle the websocket error.", ); } }; @@ -137,7 +137,7 @@ export class PriceServiceConnection { * @returns Array of PriceFeeds */ async getLatestPriceFeeds( - priceIds: HexString[] + priceIds: HexString[], ): Promise { if (priceIds.length === 0) { return []; @@ -152,7 +152,7 @@ export class PriceServiceConnection { }); const priceFeedsJson = response.data as any[]; return priceFeedsJson.map((priceFeedJson) => - PriceFeed.fromJson(priceFeedJson) + PriceFeed.fromJson(priceFeedJson), ); } @@ -188,7 +188,7 @@ export class PriceServiceConnection { */ async getVaa( priceId: HexString, - publishTime: EpochTimeStamp + publishTime: EpochTimeStamp, ): Promise<[string, EpochTimeStamp]> { const response = await this.httpClient.get("/api/get_vaa", { params: { @@ -211,7 +211,7 @@ export class PriceServiceConnection { */ async getPriceFeed( priceId: HexString, - publishTime: EpochTimeStamp + publishTime: EpochTimeStamp, ): Promise { const response = await this.httpClient.get("/api/get_price_feed", { params: { @@ -249,7 +249,7 @@ export class PriceServiceConnection { */ async subscribePriceFeedUpdates( priceIds: HexString[], - cb: PriceFeedUpdateCallback + cb: PriceFeedUpdateCallback, ) { if (this.wsClient === undefined) { await this.startWebSocket(); @@ -292,7 +292,7 @@ export class PriceServiceConnection { */ async unsubscribePriceFeedUpdates( priceIds: HexString[], - cb?: PriceFeedUpdateCallback + cb?: PriceFeedUpdateCallback, ) { if (this.wsClient === undefined) { await this.startWebSocket(); @@ -382,7 +382,7 @@ export class PriceServiceConnection { if (message.type === "response") { if (message.status === "error") { this.logger.error( - `Error response from the websocket server ${message.error}.` + `Error response from the websocket server ${message.error}.`, ); this.onWsError(new Error(message.error)); } @@ -392,7 +392,7 @@ export class PriceServiceConnection { priceFeed = PriceFeed.fromJson(message.price_feed); } catch (e: any) { this.logger.error( - `Error parsing price feeds from message ${data.toString()}.` + `Error parsing price feeds from message ${data.toString()}.`, ); this.logger.error(e); this.onWsError(e); @@ -406,7 +406,7 @@ export class PriceServiceConnection { } } else { this.logger.warn( - `Ignoring unsupported server response ${data.toString()}.` + `Ignoring unsupported server response ${data.toString()}.`, ); } }; diff --git a/price_service/client/js/src/ResillientWebSocket.ts b/price_service/client/js/src/ResillientWebSocket.ts index c39c0075a0..e81fd1e0ed 100644 --- a/price_service/client/js/src/ResillientWebSocket.ts +++ b/price_service/client/js/src/ResillientWebSocket.ts @@ -45,7 +45,7 @@ export class ResilientWebSocket { if (this.wsClient === undefined) { this.logger?.error( - "Couldn't connect to the websocket server. Error callback is called." + "Couldn't connect to the websocket server. Error callback is called.", ); } else { this.wsClient?.send(data); @@ -89,7 +89,7 @@ export class ResilientWebSocket { const waitTime = expoBackoff(this.wsFailedAttempts); this.logger?.error( - `Connection closed unexpectedly or because of timeout. Reconnecting after ${waitTime}ms.` + `Connection closed unexpectedly or because of timeout. Reconnecting after ${waitTime}ms.`, ); await sleep(waitTime); @@ -153,7 +153,7 @@ export class ResilientWebSocket { if (this.wsClient === undefined) { this.logger?.error( - "Couldn't reconnect to websocket. Error callback is called." + "Couldn't reconnect to websocket. Error callback is called.", ); return; } diff --git a/price_service/client/js/src/__tests__/connection.e2e.test.ts b/price_service/client/js/src/__tests__/connection.e2e.test.ts index 9550711f5c..580078ec66 100644 --- a/price_service/client/js/src/__tests__/connection.e2e.test.ts +++ b/price_service/client/js/src/__tests__/connection.e2e.test.ts @@ -99,7 +99,7 @@ describe("Test http endpoints", () => { const publishTime10SecAgo = Math.floor(new Date().getTime() / 1000) - 10; const [vaa, vaaPublishTime] = await connection.getVaa( ids[0], - publishTime10SecAgo + publishTime10SecAgo, ); expect(vaa.length).toBeGreaterThan(0); @@ -141,7 +141,7 @@ describe("Test websocket endpoints", () => { // Make sure it receives more than 1 update expect(counter.get(id)).toBeGreaterThan(1); } - } + }, ); test.concurrent("websocket subscription works with verbose", async () => { @@ -227,6 +227,6 @@ describe("Test websocket endpoints", () => { } // expect(seenOutOfOrder).toBe(true); - } + }, ); }); diff --git a/price_service/client/js/src/examples/PriceServiceClient.ts b/price_service/client/js/src/examples/PriceServiceClient.ts index dbf629d767..b4d04ccaa3 100644 --- a/price_service/client/js/src/examples/PriceServiceClient.ts +++ b/price_service/client/js/src/examples/PriceServiceClient.ts @@ -46,8 +46,8 @@ async function run() { await connection.subscribePriceFeedUpdates(priceIds, (priceFeed) => { console.log( `Current price for ${priceFeed.id}: ${JSON.stringify( - priceFeed.getPriceNoOlderThan(60) - )}.` + priceFeed.getPriceNoOlderThan(60), + )}.`, ); console.log(priceFeed.getVAA()); }); diff --git a/price_service/sdk/js/src/AccumulatorUpdateData.ts b/price_service/sdk/js/src/AccumulatorUpdateData.ts index b57132bed4..70c5daec7e 100644 --- a/price_service/sdk/js/src/AccumulatorUpdateData.ts +++ b/price_service/sdk/js/src/AccumulatorUpdateData.ts @@ -117,7 +117,7 @@ export function parseTwapMessage(message: Buffer): TwapMessage { export function sliceAccumulatorUpdateData( data: Buffer, start?: number, - end?: number + end?: number, ): Buffer { if (!isAccumulatorUpdateData(data)) { throw new Error("Invalid accumulator message"); @@ -165,7 +165,7 @@ export function sliceAccumulatorUpdateData( } export function parseAccumulatorUpdateData( - data: Buffer + data: Buffer, ): AccumulatorUpdateData { if (!isAccumulatorUpdateData(data)) { throw new Error("Invalid accumulator message"); @@ -199,7 +199,7 @@ export function parseAccumulatorUpdateData( const proof = []; for (let j = 0; j < numProofs; j++) { proof.push( - Array.from(data.subarray(cursor, cursor + KECCAK160_HASH_SIZE)) + Array.from(data.subarray(cursor, cursor + KECCAK160_HASH_SIZE)), ); cursor += KECCAK160_HASH_SIZE; } diff --git a/price_service/sdk/js/src/__tests__/AccumulatorUpdateData.test.ts b/price_service/sdk/js/src/__tests__/AccumulatorUpdateData.test.ts index 6a2724e69e..096e129cdd 100644 --- a/price_service/sdk/js/src/__tests__/AccumulatorUpdateData.test.ts +++ b/price_service/sdk/js/src/__tests__/AccumulatorUpdateData.test.ts @@ -13,14 +13,14 @@ describe("Test parse accumulator update", () => { test("Happy path", async () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { vaa, updates } = parseAccumulatorUpdateData( - Buffer.from(TEST_ACCUMULATOR_UPDATE_DATA, "base64") + Buffer.from(TEST_ACCUMULATOR_UPDATE_DATA, "base64"), ); const priceMessages = updates.map((update) => { return parsePriceFeedMessage(update.message); }); expect(priceMessages[0].feedId.toString("hex")).toBe( - "c96458d393fe9deb7a7d63a0ac41e2898a67a7750dbd166673279e06c868df0a" + "c96458d393fe9deb7a7d63a0ac41e2898a67a7750dbd166673279e06c868df0a", ); expect(priceMessages[0].price.toString()).toBe("4689500"); expect(priceMessages[0].confidence.toString()).toBe("6174"); @@ -31,7 +31,7 @@ describe("Test parse accumulator update", () => { expect(priceMessages[0].emaConf.toString()).toBe("6257"); expect(priceMessages[1].feedId.toString("hex")).toBe( - "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace" + "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", ); expect(priceMessages[1].price.toString()).toBe("294943041422"); expect(priceMessages[1].confidence.toString()).toBe("184284043"); @@ -42,7 +42,7 @@ describe("Test parse accumulator update", () => { expect(priceMessages[1].emaConf.toString()).toBe("239495968"); expect(priceMessages[2].feedId.toString("hex")).toBe( - "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d" + "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d", ); expect(priceMessages[2].price.toString()).toBe("14802549538"); expect(priceMessages[2].confidence.toString()).toBe("9930888"); @@ -59,9 +59,9 @@ describe("Test parse accumulator update", () => { sliceAccumulatorUpdateData( Buffer.from(TEST_ACCUMULATOR_UPDATE_DATA, "base64"), 2, - 1 - ) - ).updates.length + 1, + ), + ).updates.length, ).toBe(0); expect( @@ -69,9 +69,9 @@ describe("Test parse accumulator update", () => { sliceAccumulatorUpdateData( Buffer.from(TEST_ACCUMULATOR_UPDATE_DATA, "base64"), 0, - 5 - ) - ).updates.length + 5, + ), + ).updates.length, ).toBe(3); // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -79,15 +79,15 @@ describe("Test parse accumulator update", () => { sliceAccumulatorUpdateData( Buffer.from(TEST_ACCUMULATOR_UPDATE_DATA, "base64"), 1, - 3 - ) + 3, + ), ); const priceMessages = updates.map((update) => { return parsePriceFeedMessage(update.message); }); expect(priceMessages[0].feedId.toString("hex")).toBe( - "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace" + "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", ); expect(priceMessages[0].price.toString()).toBe("294943041422"); expect(priceMessages[0].confidence.toString()).toBe("184284043"); @@ -98,7 +98,7 @@ describe("Test parse accumulator update", () => { expect(priceMessages[0].emaConf.toString()).toBe("239495968"); expect(priceMessages[1].feedId.toString("hex")).toBe( - "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d" + "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d", ); expect(priceMessages[1].price.toString()).toBe("14802549538"); expect(priceMessages[1].confidence.toString()).toBe("9930888"); @@ -113,7 +113,7 @@ describe("Test parse accumulator update", () => { const data = Buffer.from(TEST_ACCUMULATOR_UPDATE_DATA, "base64"); data[0] = 0; expect(() => parseAccumulatorUpdateData(data)).toThrow( - "Invalid accumulator message" + "Invalid accumulator message", ); }); @@ -122,13 +122,13 @@ describe("Test parse accumulator update", () => { const testAccumulatorDataTwap = "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"; const { updates } = parseAccumulatorUpdateData( - Buffer.from(testAccumulatorDataTwap, "base64") + Buffer.from(testAccumulatorDataTwap, "base64"), ); // Test that both messages are parsed successfully const twapMessage1 = parseTwapMessage(updates[0].message); expect(twapMessage1.feedId.toString("hex")).toBe( - "49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688" + "49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688", ); expect(twapMessage1.cumulativePrice.toString()).toBe("1760238576144013"); expect(twapMessage1.cumulativeConf.toString()).toBe("5113466755162"); @@ -140,7 +140,7 @@ describe("Test parse accumulator update", () => { const twapMessage2 = parseTwapMessage(updates[1].message); expect(twapMessage2.feedId.toString("hex")).toBe( - "2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445" + "2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445", ); expect(twapMessage2.cumulativePrice.toString()).toBe("949830028892149802"); expect(twapMessage2.cumulativeConf.toString()).toBe("973071467813959"); diff --git a/price_service/sdk/js/src/__tests__/PriceFeed.test.ts b/price_service/sdk/js/src/__tests__/PriceFeed.test.ts index fbb64ee15f..ce81a6f21c 100644 --- a/price_service/sdk/js/src/__tests__/PriceFeed.test.ts +++ b/price_service/sdk/js/src/__tests__/PriceFeed.test.ts @@ -81,7 +81,7 @@ test("getMetadata returns PriceFeedMetadata as expected", () => { emitter_chain: 8, price_service_receive_time: 9, sequence_number: 10, - }) + }), ); }); @@ -106,6 +106,6 @@ test("getVAA returns string as expected", () => { const priceFeed = PriceFeed.fromJson(data); expect(priceFeed.getVAA()).toStrictEqual( - "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef" + "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef", ); }); diff --git a/price_service/sdk/js/src/schemas/PriceFeed.ts b/price_service/sdk/js/src/schemas/PriceFeed.ts index f7d59856fa..64b3099558 100644 --- a/price_service/sdk/js/src/schemas/PriceFeed.ts +++ b/price_service/sdk/js/src/schemas/PriceFeed.ts @@ -123,12 +123,12 @@ function invalidValue(typ: any, val: any, key: any = ""): never { if (key) { throw Error( `Invalid value for key "${key}". Expected type ${JSON.stringify( - typ - )} but got ${JSON.stringify(val)}` + typ, + )} but got ${JSON.stringify(val)}`, ); } throw Error( - `Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}` + `Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}`, ); } @@ -193,7 +193,7 @@ function transform(val: any, typ: any, getProps: any, key: any = ""): any { function transformObject( props: { [k: string]: any }, additional: any, - val: any + val: any, ): any { if (val === null || typeof val !== "object" || Array.isArray(val)) { return invalidValue("object", val); @@ -228,10 +228,10 @@ function transform(val: any, typ: any, getProps: any, key: any = ""): any { return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty("arrayItems") - ? transformArray(typ.arrayItems, val) - : typ.hasOwnProperty("props") - ? transformObject(getProps(typ), typ.additional, val) - : invalidValue(typ, val); + ? transformArray(typ.arrayItems, val) + : typ.hasOwnProperty("props") + ? transformObject(getProps(typ), typ.additional, val) + : invalidValue(typ, val); } // Numbers can be parsed by Date but shouldn't be. if (typ === Date && typeof val !== "number") return transformDate(val); @@ -279,7 +279,7 @@ const typeMap: any = { { json: "price", js: "price", typ: r("Price") }, { json: "vaa", js: "vaa", typ: u(undefined, "") }, ], - "any" + "any", ), Price: o( [ @@ -288,7 +288,7 @@ const typeMap: any = { { json: "price", js: "price", typ: "" }, { json: "publish_time", js: "publish_time", typ: 0 }, ], - "any" + "any", ), PriceFeedMetadata: o( [ @@ -311,6 +311,6 @@ const typeMap: any = { { json: "sequence_number", js: "sequence_number", typ: u(undefined, 0) }, { json: "slot", js: "slot", typ: u(undefined, 0) }, ], - "any" + "any", ), }; diff --git a/pythnet/message_buffer/idl/message_buffer.ts b/pythnet/message_buffer/idl/message_buffer.ts index 10da63347b..79fad0af5d 100644 --- a/pythnet/message_buffer/idl/message_buffer.ts +++ b/pythnet/message_buffer/idl/message_buffer.ts @@ -6,7 +6,7 @@ export type MessageBuffer = { name: "initialize"; docs: [ "Initializes the whitelist and sets it's admin. Once initialized,", - "the admin must sign all further changes to the whitelist." + "the admin must sign all further changes to the whitelist.", ]; accounts: [ { @@ -14,7 +14,7 @@ export type MessageBuffer = { isMut: false; isSigner: true; docs: [ - "Admin that can update the whitelist and create/resize/delete buffers" + "Admin that can update the whitelist and create/resize/delete buffers", ]; }, { @@ -37,7 +37,7 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; }, @@ -45,7 +45,7 @@ export type MessageBuffer = { name: "systemProgram"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -55,7 +55,7 @@ export type MessageBuffer = { "Sets the programs that are allowed to invoke this program through CPI", "", "* `allowed_programs` - Entire list of programs that are allowed to", - "invoke this program through CPI" + "invoke this program through CPI", ]; accounts: [ { @@ -78,11 +78,11 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; relations: ["admin"]; - } + }, ]; args: [ { @@ -90,7 +90,7 @@ export type MessageBuffer = { type: { vec: "publicKey"; }; - } + }, ]; }, { @@ -117,17 +117,17 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; relations: ["admin"]; - } + }, ]; args: [ { name: "newAdmin"; type: "publicKey"; - } + }, ]; }, { @@ -155,7 +155,7 @@ export type MessageBuffer = { "", "TODO:", '- handle updates ("paging/batches of messages")', - "" + "", ]; accounts: [ { @@ -176,7 +176,7 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; }, @@ -185,7 +185,7 @@ export type MessageBuffer = { isMut: false; isSigner: true; docs: ["PDA representing authorized cpi caller"]; - } + }, ]; }, { @@ -211,10 +211,10 @@ export type MessageBuffer = { kind: "arg"; type: "publicKey"; path: "base_account_key"; - } + }, ]; }; - } + }, ]; args: [ { @@ -226,7 +226,7 @@ export type MessageBuffer = { type: { vec: "bytes"; }; - } + }, ]; }, { @@ -242,7 +242,7 @@ export type MessageBuffer = { "(e.g. pyth price account)", "*`target_size` - Initial size to allocate for the", "`MessageBuffer` PDA. `target_size`", - "must be >= HEADER_LEN && <= 10240" + "must be >= HEADER_LEN && <= 10240", ]; accounts: [ { @@ -260,7 +260,7 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; relations: ["admin"]; @@ -280,7 +280,7 @@ export type MessageBuffer = { name: "systemProgram"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -294,7 +294,7 @@ export type MessageBuffer = { { name: "targetSize"; type: "u32"; - } + }, ]; }, { @@ -310,7 +310,7 @@ export type MessageBuffer = { "(e.g. pyth price account)", "*`target_size` - Size to re-allocate for the", "`MessageBuffer` PDA. If increasing the size,", - "max delta of current_size & target_size is 10240" + "max delta of current_size & target_size is 10240", ]; accounts: [ { @@ -328,7 +328,7 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; relations: ["admin"]; @@ -343,7 +343,7 @@ export type MessageBuffer = { isMut: true; isSigner: true; docs: [ - "Pays for any additional rent needed to increase the buffer size" + "Pays for any additional rent needed to increase the buffer size", ]; }, { @@ -360,7 +360,7 @@ export type MessageBuffer = { "if target_size is < MessageBuffer::INIT_SPACE + 8", "and if so,then load() will fail.", "If increasing, Anchor also automatically checks if target_size delta", - "exceeds MAX_PERMITTED_DATA_INCREASE" + "exceeds MAX_PERMITTED_DATA_INCREASE", ]; pda: { seeds: [ @@ -378,10 +378,10 @@ export type MessageBuffer = { kind: "arg"; type: "publicKey"; path: "base_account_key"; - } + }, ]; }; - } + }, ]; args: [ { @@ -395,7 +395,7 @@ export type MessageBuffer = { { name: "targetSize"; type: "u32"; - } + }, ]; }, { @@ -409,7 +409,7 @@ export type MessageBuffer = { "for deriving the `MessageBuffer` PDA.", "* `base_account_key` - Pubkey of the original account the", "`MessageBuffer` is derived from", - "(e.g. pyth price account)" + "(e.g. pyth price account)", ]; accounts: [ { @@ -427,7 +427,7 @@ export type MessageBuffer = { kind: "const"; type: "string"; value: "whitelist"; - } + }, ]; }; relations: ["admin"]; @@ -463,10 +463,10 @@ export type MessageBuffer = { kind: "arg"; type: "publicKey"; path: "base_account_key"; - } + }, ]; }; - } + }, ]; args: [ { @@ -476,9 +476,9 @@ export type MessageBuffer = { { name: "baseAccountKey"; type: "publicKey"; - } + }, ]; - } + }, ]; accounts: [ { @@ -506,7 +506,7 @@ export type MessageBuffer = { "NOTE: The defined fields are read as *Little Endian*. The actual messages", "are read as *Big Endian*. The MessageBuffer fields are only ever read", "by the Pythnet validator & Hermes so don't need to be in Big Endian", - "for cross-platform compatibility." + "for cross-platform compatibility.", ]; type: { kind: "struct"; @@ -529,12 +529,12 @@ export type MessageBuffer = { "endpoints of every message.", "ex: [10, 14]", "=> msg1 = account_info.data[(header_len + 0)..(header_len + 10)]", - "=> msg2 = account_info.data[(header_len + 10)..(header_len + 14)]" + "=> msg2 = account_info.data[(header_len + 10)..(header_len + 14)]", ]; type: { array: ["u16", 255]; }; - } + }, ]; }; }, @@ -556,10 +556,10 @@ export type MessageBuffer = { type: { vec: "publicKey"; }; - } + }, ]; }; - } + }, ]; errors: [ { @@ -596,7 +596,7 @@ export type MessageBuffer = { code: 6006; name: "TargetSizeExceedsMaxLen"; msg: "Target size exceeds MessageBuffer::MAX_LEN"; - } + }, ]; }; diff --git a/pythnet/message_buffer/scripts/setup_message_buffer.ts b/pythnet/message_buffer/scripts/setup_message_buffer.ts index 6b81c265dc..eeecc769d6 100644 --- a/pythnet/message_buffer/scripts/setup_message_buffer.ts +++ b/pythnet/message_buffer/scripts/setup_message_buffer.ts @@ -36,11 +36,11 @@ function getPythClusterEndpoint(cluster: PythClusterOrIntegration): string { } function getPythPidForCluster( - cluster: PythClusterOrIntegration + cluster: PythClusterOrIntegration, ): anchor.web3.PublicKey { if (cluster === "integration") { return new anchor.web3.PublicKey( - "7th6GdMuo4u1zNLzFAyMY6psunHNsGjPjo8hXvcTgKei" + "7th6GdMuo4u1zNLzFAyMY6psunHNsGjPjo8hXvcTgKei", ); } else { return getPythProgramKeyForCluster(cluster); @@ -50,43 +50,43 @@ function getPythPidForCluster( const getKeypairFromFile = (keypairPath: string): anchor.web3.Keypair => { const keypairBuffer = fs.readFileSync(keypairPath); return anchor.web3.Keypair.fromSecretKey( - Uint8Array.from(JSON.parse(keypairBuffer.toString())) + Uint8Array.from(JSON.parse(keypairBuffer.toString())), ); }; function getPythOracleCpiAuth( messageBufferProgramId: anchor.web3.PublicKey, - pythOracleProgramId: anchor.web3.PublicKey + pythOracleProgramId: anchor.web3.PublicKey, ): anchor.web3.PublicKey { return anchor.web3.PublicKey.findProgramAddressSync( [Buffer.from("upd_price_write"), messageBufferProgramId.toBuffer()], - pythOracleProgramId + pythOracleProgramId, )[0]; } function getMessageBufferPubkey( pythOracleCpiAuth: anchor.web3.PublicKey, pythPriceAccountPk: anchor.web3.PublicKey, - messageBufferProgramId: anchor.web3.PublicKey + messageBufferProgramId: anchor.web3.PublicKey, ): anchor.web3.PublicKey { return anchor.web3.PublicKey.findProgramAddressSync( [pythOracleCpiAuth.toBuffer(), MESSAGE, pythPriceAccountPk.toBuffer()], - messageBufferProgramId + messageBufferProgramId, )[0]; } export async function getPriceAccountPubkeys( connection: anchor.web3.Connection, - pythPublicKey: anchor.web3.PublicKey + pythPublicKey: anchor.web3.PublicKey, ): Promise { const accountList = await connection.getProgramAccounts( pythPublicKey, - connection.commitment + connection.commitment, ); console.info( `fetched ${ accountList.length - } programAccounts for pythProgram: ${pythPublicKey.toString()}` + } programAccounts for pythProgram: ${pythPublicKey.toString()}`, ); const priceAccountIds: PublicKey[] = []; accountList.forEach((singleAccount) => { @@ -130,11 +130,11 @@ async function main() { const cluster = process.env.CLUSTER as PythClusterOrIntegration; const messageBufferPid = new anchor.web3.PublicKey( - process.env.MESSAGE_BUFFER_PROGRAM_ID + process.env.MESSAGE_BUFFER_PROGRAM_ID, ); const pythOraclePid = getPythPidForCluster(cluster); const payer = getKeypairFromFile( - path.resolve(process.env.PAYER_KEYPAIR_PATH) + path.resolve(process.env.PAYER_KEYPAIR_PATH), ); const endpoint = getPythClusterEndpoint(cluster); const initialSize = parseInt(process.env.INITIAL_SIZE || "", 10); @@ -160,7 +160,7 @@ async function main() { commitment, preflightCommitment: commitment, skipPreflight: true, - } + }, ); anchor.setProvider(provider); @@ -168,18 +168,18 @@ async function main() { const messageBufferProgram = new Program( messageBuffer as Idl, messageBufferPid, - provider + provider, ) as unknown as Program; const [whitelistPubkey, whitelistBump] = anchor.web3.PublicKey.findProgramAddressSync( [MESSAGE, Buffer.from("whitelist")], - messageBufferProgram.programId + messageBufferProgram.programId, ); const pythOracleCpiAuth = getPythOracleCpiAuth( messageBufferProgram.programId, - pythOraclePid + pythOraclePid, ); if (canAirdrop) { @@ -187,7 +187,7 @@ async function main() { let airdropSig = await provider.connection.requestAirdrop( payer.publicKey, - 1 * anchor.web3.LAMPORTS_PER_SOL + 1 * anchor.web3.LAMPORTS_PER_SOL, ); await provider.connection.confirmTransaction({ signature: airdropSig, @@ -204,13 +204,12 @@ async function main() { console.log("Initializing message buffer whitelist admin..."); - let whitelist = await messageBufferProgram.account.whitelist.fetchNullable( - whitelistPubkey - ); + let whitelist = + await messageBufferProgram.account.whitelist.fetchNullable(whitelistPubkey); if (whitelist === null) { console.group( - "No whitelist detected. Initializing message buffer whitelist & admin" + "No whitelist detected. Initializing message buffer whitelist & admin", ); const initializeTxnSig = await messageBufferProgram.methods .initialize() @@ -224,9 +223,8 @@ async function main() { console.log(`initializeTxnSig: ${initializeTxnSig}`); console.log("fetching & checking whitelist"); - whitelist = await messageBufferProgram.account.whitelist.fetch( - whitelistPubkey - ); + whitelist = + await messageBufferProgram.account.whitelist.fetch(whitelistPubkey); assert.strictEqual(whitelist.bump, whitelistBump); assert.isTrue(whitelist.admin.equals(whitelistAdmin.publicKey)); @@ -247,16 +245,15 @@ async function main() { .rpc(); console.log(`setAllowedProgramSig: ${setAllowedProgramSig}`); console.log("fetching & checking whitelist after add"); - whitelist = await messageBufferProgram.account.whitelist.fetch( - whitelistPubkey - ); + whitelist = + await messageBufferProgram.account.whitelist.fetch(whitelistPubkey); console.info(`whitelist after add: ${JSON.stringify(whitelist)}`); const whitelistAllowedPrograms = whitelist.allowedPrograms.map((pk) => - pk.toString() + pk.toString(), ); assert.deepEqual( whitelistAllowedPrograms, - allowedProgramAuthorities.map((p) => p.toString()) + allowedProgramAuthorities.map((p) => p.toString()), ); console.groupEnd(); } else { @@ -274,14 +271,14 @@ async function main() { messageBuffer: getMessageBufferPubkey( pythOracleCpiAuth, priceId, - messageBufferPid + messageBufferPid, ), priceAccount: priceId, }; }); let accounts = await messageBufferProgram.account.messageBuffer.fetchMultiple( - messageBufferKeys.map((k) => k.messageBuffer) + messageBufferKeys.map((k) => k.messageBuffer), ); const msgBufferKeysAndData = messageBufferKeys.map((k, i) => { @@ -346,7 +343,7 @@ async function main() { } catch (e) { console.error( "Error creating message buffer for price account: ", - priceId.toString() + priceId.toString(), ); console.error(e); errorAccounts.push({ @@ -354,12 +351,12 @@ async function main() { messageBuffer: messageBufferPda.toString(), }); } - } - ) + }, + ), ); if (errorAccounts.length !== 0) { console.error( - `Ran into errors when initializing ${errorAccounts.length} accounts` + `Ran into errors when initializing ${errorAccounts.length} accounts`, ); console.info(`Accounts with errors: ${JSON.stringify(errorAccounts)}`); } @@ -369,15 +366,16 @@ async function main() { // Update whitelist admin at the end otherwise all the message buffer PDAs // will have to be initialized by the whitelist admin (which could be the multisig) if (process.env.WHITELIST_ADMIN) { - whitelist = await messageBufferProgram.account.whitelist.fetchNullable( - whitelistPubkey - ); + whitelist = + await messageBufferProgram.account.whitelist.fetchNullable( + whitelistPubkey, + ); let newWhitelistAdmin = new anchor.web3.PublicKey( - process.env.WHITELIST_ADMIN + process.env.WHITELIST_ADMIN, ); if (!whitelist.admin.equals(newWhitelistAdmin)) { console.info( - `updating whitelist admin from ${whitelist.admin.toString()} to ${newWhitelistAdmin.toString()}` + `updating whitelist admin from ${whitelist.admin.toString()} to ${newWhitelistAdmin.toString()}`, ); try { await messageBufferProgram.methods @@ -392,7 +390,7 @@ async function main() { } } else { console.info( - `whitelist admin is already ${newWhitelistAdmin.toString()}` + `whitelist admin is already ${newWhitelistAdmin.toString()}`, ); } } diff --git a/pythnet/message_buffer/tests/message_buffer.ts b/pythnet/message_buffer/tests/message_buffer.ts index 0d297a8c1d..2da38fe054 100644 --- a/pythnet/message_buffer/tests/message_buffer.ts +++ b/pythnet/message_buffer/tests/message_buffer.ts @@ -23,7 +23,7 @@ const mockCpiProg = anchor.workspace.MockCpiCaller as Program; const [mockCpiCallerAuth] = anchor.web3.PublicKey.findProgramAddressSync( [Buffer.from("upd_price_write"), messageBufferProgram.programId.toBuffer()], - mockCpiProg.programId + mockCpiProg.programId, ); const pythPriceAccountId = new anchor.BN(1); @@ -40,13 +40,13 @@ const [pythPriceAccountPk] = anchor.web3.PublicKey.findProgramAddressSync( Buffer.from("price"), pythPriceAccountId.toArrayLike(Buffer, "le", 8), ], - mockCpiProg.programId + mockCpiProg.programId, ); const MESSAGE = Buffer.from("message"); const [messageBufferPda, messageBufferBump] = anchor.web3.PublicKey.findProgramAddressSync( [mockCpiCallerAuth.toBuffer(), MESSAGE, pythPriceAccountPk.toBuffer()], - messageBufferProgram.programId + messageBufferProgram.programId, ); const pythPriceAccountId2 = new anchor.BN(2); @@ -56,13 +56,13 @@ const [pythPriceAccountPk2] = anchor.web3.PublicKey.findProgramAddressSync( Buffer.from("price"), pythPriceAccountId2.toArrayLike(Buffer, "le", 8), ], - mockCpiProg.programId + mockCpiProg.programId, ); const [messageBufferPda2, messageBufferBump2] = anchor.web3.PublicKey.findProgramAddressSync( [mockCpiCallerAuth.toBuffer(), MESSAGE, pythPriceAccountPk2.toBuffer()], - messageBufferProgram.programId + messageBufferProgram.programId, ); const messageBufferPdaMeta2 = { @@ -83,7 +83,7 @@ let whitelistAdmin = anchor.web3.Keypair.generate(); const [whitelistPubkey, whitelistBump] = anchor.web3.PublicKey.findProgramAddressSync( [MESSAGE, Buffer.from("whitelist")], - messageBufferProgram.programId + messageBufferProgram.programId, ); describe("message_buffer", () => { @@ -99,9 +99,8 @@ describe("message_buffer", () => { .rpc(); console.log("Your transaction signature", tx); - const whitelist = await messageBufferProgram.account.whitelist.fetch( - whitelistPubkey - ); + const whitelist = + await messageBufferProgram.account.whitelist.fetch(whitelistPubkey); assert.strictEqual(whitelist.bump, whitelistBump); assert.isTrue(whitelist.admin.equals(whitelistAdmin.publicKey)); console.info(`whitelist: ${JSON.stringify(whitelist)}`); @@ -116,16 +115,15 @@ describe("message_buffer", () => { }) .signers([whitelistAdmin]) .rpc(); - const whitelist = await messageBufferProgram.account.whitelist.fetch( - whitelistPubkey - ); + const whitelist = + await messageBufferProgram.account.whitelist.fetch(whitelistPubkey); console.info(`whitelist after add: ${JSON.stringify(whitelist)}`); const whitelistAllowedPrograms = whitelist.allowedPrograms.map((pk) => - pk.toString() + pk.toString(), ); assert.deepEqual( whitelistAllowedPrograms, - allowedProgramAuthorities.map((p) => p.toString()) + allowedProgramAuthorities.map((p) => p.toString()), ); }); @@ -152,11 +150,11 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda + messageBufferPda, ); const messageBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, - messageBufferAccountData + messageBufferAccountData, ); assert.equal(messageBufferHeader.version, 1); assert.equal(messageBufferHeader.bump, messageBufferBump); @@ -173,15 +171,14 @@ describe("message_buffer", () => { fromPubkey: provider.wallet.publicKey, toPubkey: messageBufferPda2, lamports: minimumEmptyRent, - }) + }), ); return tx; - })() + })(), ); - const accumulatorPdaBalance = await provider.connection.getBalance( - messageBufferPda2 - ); + const accumulatorPdaBalance = + await provider.connection.getBalance(messageBufferPda2); console.log(`accumulatorPdaBalance: ${accumulatorPdaBalance}`); assert.isTrue(accumulatorPdaBalance === minimumEmptyRent); @@ -199,20 +196,19 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda2 + messageBufferPda2, ); const minimumMessageBufferRent = await provider.connection.getMinimumBalanceForRentExemption( - messageBufferAccountData.length + messageBufferAccountData.length, ); - const accumulatorPdaBalanceAfter = await provider.connection.getBalance( - messageBufferPda2 - ); + const accumulatorPdaBalanceAfter = + await provider.connection.getBalance(messageBufferPda2); assert.isTrue(accumulatorPdaBalanceAfter === minimumMessageBufferRent); const messageBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, - messageBufferAccountData + messageBufferAccountData, ); console.log(`header: ${JSON.stringify(messageBufferHeader)}`); @@ -232,9 +228,8 @@ describe("message_buffer", () => { .signers([whitelistAdmin]) .rpc(); - let whitelist = await messageBufferProgram.account.whitelist.fetch( - whitelistPubkey - ); + let whitelist = + await messageBufferProgram.account.whitelist.fetch(whitelistPubkey); assert.isTrue(whitelist.admin.equals(newWhitelistAdmin.publicKey)); // swap back to original authority @@ -246,9 +241,8 @@ describe("message_buffer", () => { .signers([newWhitelistAdmin]) .rpc(); - whitelist = await messageBufferProgram.account.whitelist.fetch( - whitelistPubkey - ); + whitelist = + await messageBufferProgram.account.whitelist.fetch(whitelistPubkey); assert.isTrue(whitelist.admin.equals(whitelistAdmin.publicKey)); }); @@ -289,12 +283,12 @@ describe("message_buffer", () => { return v; } }, - 2 - )}` + 2, + )}`, ); for (const prop in mockCpiCallerAddPriceTxPrep.pubkeys) { console.log( - `${prop}: ${mockCpiCallerAddPriceTxPrep.pubkeys[prop].toString()}` + `${prop}: ${mockCpiCallerAddPriceTxPrep.pubkeys[prop].toString()}`, ); } @@ -313,24 +307,23 @@ describe("message_buffer", () => { console.log(`addPriceTx: ${addPriceTx}`); const pythPriceAccount = await provider.connection.getAccountInfo( - mockCpiCallerAddPriceTxPubkeys.pythPriceAccount + mockCpiCallerAddPriceTxPubkeys.pythPriceAccount, ); - const messageBufferAccount = await provider.connection.getAccountInfo( - messageBufferPda - ); + const messageBufferAccount = + await provider.connection.getAccountInfo(messageBufferPda); const accumulatorPriceMessages = parseMessageBuffer( messageBufferProgram, - messageBufferAccount.data + messageBufferAccount.data, ); console.log( `accumulatorPriceMessages: ${JSON.stringify( accumulatorPriceMessages, null, - 2 - )}` + 2, + )}`, ); accumulatorPriceMessages.forEach((pm) => { assert.isTrue(pm.id.eq(addPriceParams.id)); @@ -341,13 +334,13 @@ describe("message_buffer", () => { it("Fetches MessageBuffer using getProgramAccounts with discriminator", async () => { const messageBufferAccounts = await getProgramAccountsForMessageBuffers( - provider.connection + provider.connection, ); const msgBufferAcctKeys = messageBufferAccounts.map((ai) => - ai.pubkey.toString() + ai.pubkey.toString(), ); console.log( - `messageBufferAccounts: ${JSON.stringify(msgBufferAcctKeys, null, 2)}` + `messageBufferAccounts: ${JSON.stringify(msgBufferAcctKeys, null, 2)}`, ); assert.isTrue(messageBufferAccounts.length === 2); @@ -364,7 +357,7 @@ describe("message_buffer", () => { let accumulatorPdaMeta = getAccumulatorPdaMeta( mockCpiCallerAuth, - pythPriceAccountPk + pythPriceAccountPk, ); await mockCpiProg.methods .updatePrice(updatePriceParams) @@ -382,9 +375,8 @@ describe("message_buffer", () => { skipPreflight: true, }); - const pythPriceAccount = await mockCpiProg.account.priceAccount.fetch( - pythPriceAccountPk - ); + const pythPriceAccount = + await mockCpiProg.account.priceAccount.fetch(pythPriceAccountPk); assert.isTrue(pythPriceAccount.price.eq(updatePriceParams.price)); assert.isTrue(pythPriceAccount.priceExpo.eq(updatePriceParams.priceExpo)); assert.isTrue(pythPriceAccount.ema.eq(updatePriceParams.ema)); @@ -392,20 +384,20 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda + messageBufferPda, ); const updatedAccumulatorPriceMessages = parseMessageBuffer( messageBufferProgram, - messageBufferAccountData + messageBufferAccountData, ); console.log( `updatedAccumulatorPriceMessages: ${JSON.stringify( updatedAccumulatorPriceMessages, null, - 2 - )}` + 2, + )}`, ); updatedAccumulatorPriceMessages.forEach((pm) => { assert.isTrue(pm.id.eq(addPriceParams.id)); @@ -431,7 +423,7 @@ describe("message_buffer", () => { let accumulatorPdaMeta = getAccumulatorPdaMeta( mockCpiCallerAuth, - pythPriceAccountPk + pythPriceAccountPk, ); await mockCpiProg.methods .cpiMaxTest(updatePriceParams, testCase) @@ -449,9 +441,8 @@ describe("message_buffer", () => { skipPreflight: true, }); - const pythPriceAccount = await mockCpiProg.account.priceAccount.fetch( - pythPriceAccountPk - ); + const pythPriceAccount = + await mockCpiProg.account.priceAccount.fetch(pythPriceAccountPk); assert.isTrue(pythPriceAccount.price.eq(updatePriceParams.price)); assert.isTrue(pythPriceAccount.priceExpo.eq(updatePriceParams.priceExpo)); assert.isTrue(pythPriceAccount.ema.eq(updatePriceParams.ema)); @@ -459,12 +450,12 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda + messageBufferPda, ); const messageBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, - messageBufferAccountData + messageBufferAccountData, ); console.log(`header: ${JSON.stringify(messageBufferHeader)}`); @@ -479,7 +470,7 @@ describe("message_buffer", () => { currentExpectedOffset: ${currentExpectedOffset} `); assert.isTrue( - messageBufferHeader.endOffsets[j] === currentExpectedOffset + messageBufferHeader.endOffsets[j] === currentExpectedOffset, ); } } @@ -501,7 +492,7 @@ describe("message_buffer", () => { let accumulatorPdaMeta = getAccumulatorPdaMeta( mockCpiCallerAuth, - pythPriceAccountPk + pythPriceAccountPk, ); let errorThrown = false; try { @@ -530,7 +521,7 @@ describe("message_buffer", () => { it("Resizes a buffer to a valid larger size", async () => { const messageBufferAccountDataBefore = await getMessageBuffer( provider.connection, - messageBufferPda2 + messageBufferPda2, ); const messageBufferAccountDataLenBefore = messageBufferAccountDataBefore.length; @@ -538,11 +529,11 @@ describe("message_buffer", () => { // check that header is still the same as before const messageBufferHeaderBefore = deserializeMessageBufferHeader( messageBufferProgram, - messageBufferAccountDataBefore + messageBufferAccountDataBefore, ); const payerBalanceBefore = await provider.connection.getBalance( - payer.publicKey + payer.publicKey, ); console.log(`payerBalanceBefore: ${payerBalanceBefore}`); const targetSize = 10 * 1024; @@ -558,28 +549,28 @@ describe("message_buffer", () => { .rpc({ skipPreflight: true }); const payerBalanceAftger = await provider.connection.getBalance( - payer.publicKey + payer.publicKey, ); assert.isTrue(payerBalanceAftger < payerBalanceBefore); const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda2 + messageBufferPda2, ); assert.equal(messageBufferAccountData.length, targetSize); // check that header is still the same as before const messageBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, - messageBufferAccountData + messageBufferAccountData, ); assert.deepEqual( messageBufferHeader.endOffsets, - messageBufferHeaderBefore.endOffsets + messageBufferHeaderBefore.endOffsets, ); assert.deepEqual( messageBufferAccountData.subarray(0, messageBufferAccountDataLenBefore), - messageBufferAccountDataBefore + messageBufferAccountDataBefore, ); }); @@ -599,7 +590,7 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda2 + messageBufferPda2, ); assert.equal(messageBufferAccountData.length, targetSize); }); @@ -643,7 +634,7 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda2 + messageBufferPda2, ); if (messageBufferAccountData != null) { @@ -651,14 +642,14 @@ describe("message_buffer", () => { } const messageBufferAccounts = await getProgramAccountsForMessageBuffers( - provider.connection + provider.connection, ); assert.equal(messageBufferAccounts.length, 1); assert.isFalse( messageBufferAccounts .map((a) => a.pubkey.toString()) - .includes(messageBufferPda2.toString()) + .includes(messageBufferPda2.toString()), ); }); @@ -677,20 +668,19 @@ describe("message_buffer", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - messageBufferPda2 + messageBufferPda2, ); const minimumMessageBufferRent = await provider.connection.getMinimumBalanceForRentExemption( - messageBufferAccountData.length + messageBufferAccountData.length, ); - const accumulatorPdaBalanceAfter = await provider.connection.getBalance( - messageBufferPda2 - ); + const accumulatorPdaBalanceAfter = + await provider.connection.getBalance(messageBufferPda2); assert.isTrue(accumulatorPdaBalanceAfter === minimumMessageBufferRent); const messageBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, - messageBufferAccountData + messageBufferAccountData, ); console.log(`header: ${JSON.stringify(messageBufferHeader)}`); @@ -703,11 +693,11 @@ describe("message_buffer", () => { export const getAccumulatorPdaMeta = ( cpiCallerAuth: anchor.web3.PublicKey, - pythAccount: anchor.web3.PublicKey + pythAccount: anchor.web3.PublicKey, ): AccountMeta => { const accumulatorPdaKey = anchor.web3.PublicKey.findProgramAddressSync( [cpiCallerAuth.toBuffer(), MESSAGE, pythAccount.toBuffer()], - messageBufferProgram.programId + messageBufferProgram.programId, )[0]; return { pubkey: accumulatorPdaKey, @@ -718,7 +708,7 @@ export const getAccumulatorPdaMeta = ( async function getMessageBuffer( connection: anchor.web3.Connection, - accountKey: anchor.web3.PublicKey + accountKey: anchor.web3.PublicKey, ): Promise { let accountInfo = await connection.getAccountInfo(accountKey); return accountInfo ? accountInfo.data : null; @@ -728,11 +718,11 @@ async function getMessageBuffer( // accountType and accountSchema. function parseMessageBuffer( messageBufferProgram: Program, - accountData: Buffer + accountData: Buffer, ): AccumulatorPriceMessage[] { const msgBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, - accountData + accountData, ); const accumulatorMessages = []; @@ -740,7 +730,7 @@ function parseMessageBuffer( let dataBuffer = accountData.subarray( msgBufferHeader.headerLen, - accountData.length + accountData.length, ); let start = 0; for (let i = 0; i < msgBufferHeader.endOffsets.length; i++) { @@ -781,11 +771,11 @@ type MessageBufferType = { function deserializeMessageBufferHeader( messageBufferProgram: Program, - accountData: Buffer + accountData: Buffer, ): IdlAccounts["messageBuffer"] { return messageBufferProgram.coder.accounts.decode( "MessageBuffer", - accountData + accountData, ); } @@ -848,7 +838,7 @@ function parseCompactPriceMessage(data: Uint8Array): CompactPriceMessage { // fetch MessageBuffer accounts using `getProgramAccounts` and memcmp filter async function getProgramAccountsForMessageBuffers( - connection: anchor.web3.Connection + connection: anchor.web3.Connection, ) { return await connection.getProgramAccounts(messageBufferProgram.programId, { filters: [ diff --git a/target_chains/aptos/cli/README.md b/target_chains/aptos/cli/README.md index 4373d05999..b3ad40eeb4 100644 --- a/target_chains/aptos/cli/README.md +++ b/target_chains/aptos/cli/README.md @@ -70,7 +70,7 @@ let vault = await vault.connect(wallet); let payload = DefaultStore.chains.aptos_testnet.generateGovernanceUpgradePayload( - "CONTRACT_HASH_TO_USE" + "CONTRACT_HASH_TO_USE", ); await vault.proposeWormholeMessage([payload]); ``` @@ -83,7 +83,7 @@ After the approval process, you can fetch the VAA for the transaction and execut import { SubmittedWormholeMessage } from "./src/governance"; let msg = await SubmittedWormholeMessage.fromTransactionSignature( "tx_signature", - "devnet or mainnet-beta" + "devnet or mainnet-beta", ); let vaa = await msg.fetchVaa(); let contract = @@ -91,7 +91,7 @@ let contract = .aptos_testnet_0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387; await contract.executeGovernanceInstruction( "private-key-of-account-inaptos", - vaa + vaa, ); ``` diff --git a/target_chains/aptos/cli/src/commands/aptos.ts b/target_chains/aptos/cli/src/commands/aptos.ts index 9ba6c983f3..f06fcf523d 100644 --- a/target_chains/aptos/cli/src/commands/aptos.ts +++ b/target_chains/aptos/cli/src/commands/aptos.ts @@ -69,19 +69,19 @@ export const builder: (args: Argv) => Argv = (yargs) => }, async (argv) => { const artefact = serializePackage( - buildPackage(argv["package-dir"]!, argv["named-addresses"]) + buildPackage(argv["package-dir"]!, argv["named-addresses"]), ); const txPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction( TxnBuilderTypes.EntryFunction.natural( "0x1::code", "publish_package_txn", [], - [artefact.meta, artefact.bytecodes] - ) + [artefact.meta, artefact.bytecodes], + ), ); await executeTransaction(argv.network, txPayload); - } + }, ) .command( "deploy-wormhole ", @@ -97,7 +97,7 @@ export const builder: (args: Argv) => Argv = (yargs) => const sender = getSender(); const derivedAddress = generateDerivedAddress( sender.address().toString(), - argv.seed! + argv.seed!, ); const namedAddresses = `deployer=${argv.deployer},wormhole=0x${derivedAddress}`; @@ -108,11 +108,11 @@ export const builder: (args: Argv) => Argv = (yargs) => argv["package-dir"], argv.deployer, argv.seed, - namedAddresses + namedAddresses, ); await executeTransaction(argv.network, txPayload); - } + }, ) .command( "deploy-pyth ", @@ -129,7 +129,7 @@ export const builder: (args: Argv) => Argv = (yargs) => const sender = getSender(); const derivedAddress = generateDerivedAddress( sender.address().toString(), - argv.seed! + argv.seed!, ); const namedAddresses = `wormhole=${argv.wormhole},deployer=${argv.deployer},pyth=0x${derivedAddress}`; @@ -141,11 +141,11 @@ export const builder: (args: Argv) => Argv = (yargs) => argv["package-dir"], argv.deployer, argv.seed, - namedAddresses + namedAddresses, ); await executeTransaction(argv.network, txPayload); - } + }, ) .command( "derived-address ", @@ -159,10 +159,10 @@ export const builder: (args: Argv) => Argv = (yargs) => console.log( generateDerivedAddress( argv.signer || getSender().address().toString(), - argv.seed - ) + argv.seed, + ), ); - } + }, ) .command( "init-wormhole", @@ -183,7 +183,7 @@ export const builder: (args: Argv) => Argv = (yargs) => const guardian_addresses_serializer = new BCS.Serializer(); guardian_addresses_serializer.serializeU32AsUleb128(1); guardian_addresses_serializer.serializeBytes( - Buffer.from(guardian_address, "hex") + Buffer.from(guardian_address, "hex"), ); const args = [ @@ -195,19 +195,19 @@ export const builder: (args: Argv) => Argv = (yargs) => const sender = getSender(); const wormholeAddress = generateDerivedAddress( sender.address().hex(), - "wormhole" + "wormhole", ); const txPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction( TxnBuilderTypes.EntryFunction.natural( `${wormholeAddress}::wormhole`, "init", [], - args - ) + args, + ), ); await executeTransaction(argv.network, txPayload); - } + }, ) .command( "init-pyth ", @@ -240,16 +240,16 @@ export const builder: (args: Argv) => Argv = (yargs) => const dataSourceChainIdsSerializer = new BCS.Serializer(); dataSourceChainIdsSerializer.serializeU32AsUleb128( - config.dataSources.length + config.dataSources.length, ); const dataSourceEmitterAddressesSerializer = new BCS.Serializer(); dataSourceEmitterAddressesSerializer.serializeU32AsUleb128( - config.dataSources.length + config.dataSources.length, ); config.dataSources.forEach((ds) => { dataSourceChainIdsSerializer.serializeU64(ds.emitterChain); dataSourceEmitterAddressesSerializer.serializeBytes( - Buffer.from(ds.emitterAddress, "hex") + Buffer.from(ds.emitterAddress, "hex"), ); }); @@ -264,19 +264,19 @@ export const builder: (args: Argv) => Argv = (yargs) => const sender = getSender(); const pythAddress = generateDerivedAddress( sender.address().hex(), - argv.seed + argv.seed, ); const txPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction( TxnBuilderTypes.EntryFunction.natural( `${pythAddress}::pyth`, "init", [], - args - ) + args, + ), ); await executeTransaction(argv.network, txPayload); - } + }, ) .command( "hash-contracts ", @@ -296,7 +296,7 @@ export const builder: (args: Argv) => Argv = (yargs) => const p = buildPackage(argv["package-dir"]!, namedAddresses); const b = serializePackage(p); console.log(Buffer.from(b.codeHash).toString("hex")); - } + }, ) .command( "upgrade ", @@ -315,7 +315,7 @@ export const builder: (args: Argv) => Argv = (yargs) => async (argv) => { const namedAddresses = `wormhole=${argv.wormhole},deployer=${argv.deployer},pyth=${argv.pyth}`; const artefact = serializePackage( - buildPackage(argv["package-dir"]!, namedAddresses) + buildPackage(argv["package-dir"]!, namedAddresses), ); let pythAddress = argv.pyth; @@ -324,12 +324,12 @@ export const builder: (args: Argv) => Argv = (yargs) => `${pythAddress}::contract_upgrade`, "do_contract_upgrade", [], - [artefact.meta, artefact.bytecodes] - ) + [artefact.meta, artefact.bytecodes], + ), ); await executeTransaction(argv.network, txPayload); - } + }, ) .command( "diff-abi ", @@ -362,11 +362,11 @@ export const builder: (args: Argv) => Argv = (yargs) => // Replace the addresses with 0x0 so that we can compare the ABIs skipping the irrelevant address differences const module1Stripped = module1Response.replace( new RegExp(addr1, "g"), - "0x0" + "0x0", ); const module2Stripped = module2Response.replace( new RegExp(addr2, "g"), - "0x0" + "0x0", ); if ( JSON.stringify(JSON.parse(module1Stripped).abi) !== @@ -377,7 +377,7 @@ export const builder: (args: Argv) => Argv = (yargs) => console.log(`Module ${moduleName} ABI not changed`); } } - } + }, ) .demandCommand(); @@ -385,7 +385,7 @@ function getSender() { const key = process.env["APTOS_PRIVATE_KEY"]; if (key === undefined) { throw new Error( - `Please set the APTOS_PRIVATE_KEY environment variable to the private key of the sender in hex format` + `Please set the APTOS_PRIVATE_KEY environment variable to the private key of the sender in hex format`, ); } return new AptosAccount(new Uint8Array(Buffer.from(key, "hex"))); @@ -393,7 +393,7 @@ function getSender() { async function executeTransaction( network: string, - txPayload: TxnBuilderTypes.TransactionPayloadEntryFunction + txPayload: TxnBuilderTypes.TransactionPayloadEntryFunction, ) { const endpoint = (DefaultStore.chains[network] as AptosChain).rpcUrl; const client = new AptosClient(endpoint); @@ -401,7 +401,7 @@ async function executeTransaction( console.log( await client.generateSignSubmitWaitForTransaction(sender, txPayload, { maxGasAmount: BigInt(30000), - }) + }), ); } @@ -428,7 +428,7 @@ function generateDerivedAddress(signer_address: string, seed: string): string { hexStringToByteArray(signer_address), Buffer.from(seed, "ascii"), derive_resource_account_scheme, - ]) + ]), ); } @@ -457,7 +457,7 @@ function buildPackage(dir: string, addrs?: string): Package { .map((dirent) => dirent.name); if (buildDirs.length !== 1) { console.error( - `Unexpected directory structure in ${dir}/build: expected a single directory` + `Unexpected directory structure in ${dir}/build: expected a single directory`, ); process.exit(1); } @@ -465,7 +465,7 @@ function buildPackage(dir: string, addrs?: string): Package { return { meta_file: `${buildDir}/package-metadata.bcs`, mv_files: result["Result"].map( - (mod: string) => `${buildDir}/bytecode_modules/${mod.split("::")[1]}.mv` + (mod: string) => `${buildDir}/bytecode_modules/${mod.split("::")[1]}.mv`, ), }; } @@ -498,7 +498,7 @@ function createDeployDerivedTransaction( packageDir: string, deployer: string, seed: string, - namedAddresses: string + namedAddresses: string, ) { const artifact = serializePackage(buildPackage(packageDir, namedAddresses)); @@ -511,8 +511,8 @@ function createDeployDerivedTransaction( artifact.meta, artifact.bytecodes, BCS.bcsSerializeBytes(Buffer.from(seed, "ascii")), - ] - ) + ], + ), ); } diff --git a/target_chains/aptos/sdk/js/src/examples/AptosRelay.ts b/target_chains/aptos/sdk/js/src/examples/AptosRelay.ts index ec452cc84d..e43c6aa6c1 100644 --- a/target_chains/aptos/sdk/js/src/examples/AptosRelay.ts +++ b/target_chains/aptos/sdk/js/src/examples/AptosRelay.ts @@ -39,7 +39,7 @@ async function run() { // Fetch the latest price feed update data from the Price Service const connection = new AptosPriceServiceConnection(argv.priceService); const priceFeedUpdateData = await connection.getPriceFeedsUpdateData( - argv.priceIds as string[] + argv.priceIds as string[], ); // Update the Pyth Contract using this update data @@ -56,9 +56,9 @@ async function run() { argv.pythContract + "::pyth", "update_price_feeds_with_funder", [], - [AptosPriceServiceConnection.serializeUpdateData(priceFeedUpdateData)] - ) - ) + [AptosPriceServiceConnection.serializeUpdateData(priceFeedUpdateData)], + ), + ), ); console.dir(result, { depth: null }); diff --git a/target_chains/cosmwasm/deploy-scripts/src/build-contract.ts b/target_chains/cosmwasm/deploy-scripts/src/build-contract.ts index cc04c20781..b9664e55c1 100644 --- a/target_chains/cosmwasm/deploy-scripts/src/build-contract.ts +++ b/target_chains/cosmwasm/deploy-scripts/src/build-contract.ts @@ -60,12 +60,12 @@ function build() { argv.osmosis === true ? "osmosis" : argv.injective === true - ? "injective" - : undefined; + ? "injective" + : undefined; if (feature === undefined) { console.log( - "Please provide one of the options: ['cosmwasm', 'injective', 'osmosis']" + "Please provide one of the options: ['cosmwasm', 'injective', 'osmosis']", ); return; } diff --git a/target_chains/cosmwasm/deploy-scripts/src/configs.ts b/target_chains/cosmwasm/deploy-scripts/src/configs.ts index fc81a8a22b..7f74d2c478 100644 --- a/target_chains/cosmwasm/deploy-scripts/src/configs.ts +++ b/target_chains/cosmwasm/deploy-scripts/src/configs.ts @@ -13,7 +13,7 @@ function getPythSources(deploymentType: DeploymentType) { governance_source: { emitter: Buffer.from( config.governanceDataSource.emitterAddress, - "hex" + "hex", ).toString("base64"), chain_id: config.governanceDataSource.emitterChain, }, @@ -62,7 +62,7 @@ export function getWormholeConfig({ fee_denom: feeDenom, gov_chain: config.governanceChainId, gov_address: Buffer.from(config.governanceContract, "hex").toString( - "base64" + "base64", ), guardian_set_expirity: 86400, initial_guardian_set: { diff --git a/target_chains/cosmwasm/deploy-scripts/src/helper.ts b/target_chains/cosmwasm/deploy-scripts/src/helper.ts index d5cd5cd8cc..8346247d34 100644 --- a/target_chains/cosmwasm/deploy-scripts/src/helper.ts +++ b/target_chains/cosmwasm/deploy-scripts/src/helper.ts @@ -15,7 +15,7 @@ export type DeploymentType = "stable" | "beta"; // this method will return an object with key = zipFileName and value = compiledCode export async function getContractBytesDict( artifactZipFileNames: string[], - version: string + version: string, ) { const githubArtifactsLink = `https://github.com/pyth-network/pyth-crosschain/releases/download/pyth-cosmwasm-contract-v${version}/`; const tmpCodeStorageDir = "./tmp"; @@ -34,7 +34,7 @@ export async function getContractBytesDict( return new Promise((resolve, reject) => { const dl = new DownloaderHelper( githubArtifactsLink + artifactZipName + ".zip", - tmpCodeStorageDir + tmpCodeStorageDir, ); dl.on("end", () => { @@ -50,13 +50,13 @@ export async function getContractBytesDict( reject(err); }); }); - }) + }), ); // extract zip files uniqueArtifactsZipName.map(async (artifactZipName) => { const zip = new AdmZip( - path.resolve(tmpCodeStorageDir + "/" + artifactZipName + ".zip") + path.resolve(tmpCodeStorageDir + "/" + artifactZipName + ".zip"), ); zip.extractAllTo(path.resolve(tmpCodeStorageDir)); }); @@ -64,7 +64,7 @@ export async function getContractBytesDict( let contractBytesDict: { [fileName: string]: Buffer } = {}; for (let uniqueArtifactZipName of uniqueArtifactsZipName) { const contractBytes = readFileSync( - tmpCodeStorageDir + "/" + uniqueArtifactZipName + "/pyth_cosmwasm.wasm" + tmpCodeStorageDir + "/" + uniqueArtifactZipName + "/pyth_cosmwasm.wasm", ); contractBytesDict[uniqueArtifactZipName] = contractBytes; } diff --git a/target_chains/cosmwasm/deploy-scripts/src/instantiate-pyth.ts b/target_chains/cosmwasm/deploy-scripts/src/instantiate-pyth.ts index 1237d905f6..46c96fef7f 100644 --- a/target_chains/cosmwasm/deploy-scripts/src/instantiate-pyth.ts +++ b/target_chains/cosmwasm/deploy-scripts/src/instantiate-pyth.ts @@ -61,11 +61,11 @@ async function run() { // get the wasm code from github let contractBytesDict = await getContractBytesDict( [pythArtifactZipName], - argv.contractVersion + argv.contractVersion, ); const checksum = Buffer.from( - sha256(contractBytesDict[pythArtifactZipName]) + sha256(contractBytesDict[pythArtifactZipName]), ).toString("hex"); console.log(`Downloaded wasm checksum ${checksum}`); @@ -75,7 +75,7 @@ async function run() { }); console.log( - `Code stored on chain ${chain.getId()} at ${storeCodeRes.codeId}` + `Code stored on chain ${chain.getId()} at ${storeCodeRes.codeId}`, ); const instantiateContractRes = await chainExecutor.instantiateContract({ diff --git a/target_chains/cosmwasm/deploy-scripts/src/instantiate-wormhole.ts b/target_chains/cosmwasm/deploy-scripts/src/instantiate-wormhole.ts index b6ca722575..1c12776287 100644 --- a/target_chains/cosmwasm/deploy-scripts/src/instantiate-wormhole.ts +++ b/target_chains/cosmwasm/deploy-scripts/src/instantiate-wormhole.ts @@ -50,10 +50,10 @@ async function run() { const storeCodeRes = await CosmWasmPriceFeedContract.storeCode( chain, privateKey, - wasmFilePath + wasmFilePath, ); console.log( - `Code stored on chain ${chain.getId()} at ${storeCodeRes.codeId}` + `Code stored on chain ${chain.getId()} at ${storeCodeRes.codeId}`, ); const chainExecutor = await chain.getExecutor(privateKey); const instantiateContractRes = await chainExecutor.instantiateContract({ @@ -66,7 +66,7 @@ async function run() { label: "wormhole", }); console.log( - `Contract instantiated at ${instantiateContractRes.contractAddr}` + `Contract instantiated at ${instantiateContractRes.contractAddr}`, ); await chainExecutor.updateContractAdmin({ @@ -77,7 +77,7 @@ async function run() { const contract = new CosmWasmWormholeContract( chain, - instantiateContractRes.contractAddr + instantiateContractRes.contractAddr, ); if (argv.deploy === "stable") { console.log("Syncing guardian sets for mainnet contract"); @@ -85,7 +85,7 @@ async function run() { console.log("Sync complete"); } console.log( - `Contract deployed on chain ${chain.getId()} at ${contract.address}` + `Contract deployed on chain ${chain.getId()} at ${contract.address}`, ); } diff --git a/target_chains/cosmwasm/tools/src/chains-manager/chain-executor.ts b/target_chains/cosmwasm/tools/src/chains-manager/chain-executor.ts index 7d93170d3b..1276a9b22a 100644 --- a/target_chains/cosmwasm/tools/src/chains-manager/chain-executor.ts +++ b/target_chains/cosmwasm/tools/src/chains-manager/chain-executor.ts @@ -44,7 +44,7 @@ export interface ChainExecutor { * @throws an error if it fails */ instantiateContract( - req: InstantiateContractRequest + req: InstantiateContractRequest, ): Promise; /** @@ -59,7 +59,7 @@ export interface ChainExecutor { * @throws an error if it fails */ executeContract( - req: ExecuteContractRequest + req: ExecuteContractRequest, ): Promise; /** @@ -77,7 +77,7 @@ export interface ChainExecutor { * @throws an error if it fails. */ migrateContract( - req: MigrateContractRequest + req: MigrateContractRequest, ): Promise; /** @@ -94,7 +94,7 @@ export interface ChainExecutor { * @throws an error if it fails */ updateContractAdmin( - req: UpdateContractAdminRequest + req: UpdateContractAdminRequest, ): Promise; } diff --git a/target_chains/cosmwasm/tools/src/chains-manager/chain-querier.ts b/target_chains/cosmwasm/tools/src/chains-manager/chain-querier.ts index aedb65be66..d5b0a4b2b7 100644 --- a/target_chains/cosmwasm/tools/src/chains-manager/chain-querier.ts +++ b/target_chains/cosmwasm/tools/src/chains-manager/chain-querier.ts @@ -99,20 +99,19 @@ export class CosmwasmQuerier implements ChainQuerier { private constructor(readonly tendermintClient: Tendermint34Client) { this.wasmQueryClient = setupWasmExtension( - new QueryClient(tendermintClient) + new QueryClient(tendermintClient), ); } async getContractInfo( - req: ContractInfoRequest + req: ContractInfoRequest, ): Promise { const { contractAddr } = req; const { wasm: wasmQueryClient } = this.wasmQueryClient; - const { contractInfo } = await wasmQueryClient.getContractInfo( - contractAddr - ); + const { contractInfo } = + await wasmQueryClient.getContractInfo(contractAddr); if (contractInfo === undefined) throw new Error("error fetching contract info"); diff --git a/target_chains/cosmwasm/tools/src/chains-manager/cosmwasm.ts b/target_chains/cosmwasm/tools/src/chains-manager/cosmwasm.ts index 81d3df2cf6..5b6fbe70d1 100644 --- a/target_chains/cosmwasm/tools/src/chains-manager/cosmwasm.ts +++ b/target_chains/cosmwasm/tools/src/chains-manager/cosmwasm.ts @@ -36,7 +36,7 @@ export class CosmwasmExecutor implements ChainExecutor { private readonly endpoint: string, private readonly signer: OfflineSigner, // example - 0.025uosmo - private readonly gasPrice: string + private readonly gasPrice: string, ) {} /** @@ -47,7 +47,7 @@ export class CosmwasmExecutor implements ChainExecutor { static async getSignerFromMnemonic(mnemonic: string, prefix: string) { const directSecp256k1HdWallet = await DirectSecp256k1HdWallet.fromMnemonic( mnemonic, - { prefix } + { prefix }, ); return directSecp256k1HdWallet; } @@ -60,7 +60,7 @@ export class CosmwasmExecutor implements ChainExecutor { static async getSignerFromPrivateKey(privateKey: string, prefix: string) { return await DirectSecp256k1Wallet.fromKey( Buffer.from(privateKey, "hex"), - prefix + prefix, ); } @@ -82,7 +82,7 @@ export class CosmwasmExecutor implements ChainExecutor { } private async signAndBroadcastMsg( - encodedMsgObject: EncodeObject + encodedMsgObject: EncodeObject, ): Promise { const address = (await this.signer.getAccounts())[0].address; @@ -91,14 +91,14 @@ export class CosmwasmExecutor implements ChainExecutor { this.signer, { gasPrice: GasPrice.fromString(this.gasPrice), - } + }, ); try { const txResponse = await cosmwasmClient.signAndBroadcast( address, [encodedMsgObject], - 2 + 2, ); if (txResponse.code !== 0) { @@ -106,8 +106,8 @@ export class CosmwasmExecutor implements ChainExecutor { } else { console.log( `Broadcasted transaction hash: ${JSON.stringify( - txResponse.transactionHash - )}` + txResponse.transactionHash, + )}`, ); } @@ -142,7 +142,7 @@ export class CosmwasmExecutor implements ChainExecutor { } async instantiateContract( - req: InstantiateContractRequest + req: InstantiateContractRequest, ): Promise { const { codeId, instMsg, label } = req; @@ -162,7 +162,7 @@ export class CosmwasmExecutor implements ChainExecutor { }; const txResponse = await this.signAndBroadcastMsg( - msgInstantiateContractEncodeObject + msgInstantiateContractEncodeObject, ); if (txResponse.rawLog === undefined) @@ -170,7 +170,7 @@ export class CosmwasmExecutor implements ChainExecutor { const contractAddr: string = extractFromRawLog( txResponse.rawLog, - "_contract_address" + "_contract_address", ); return { @@ -180,7 +180,7 @@ export class CosmwasmExecutor implements ChainExecutor { } async executeContract( - req: ExecuteContractRequest + req: ExecuteContractRequest, ): Promise { const { contractAddr, funds, msg } = req; const msgExecuteContact = { @@ -196,7 +196,7 @@ export class CosmwasmExecutor implements ChainExecutor { }; const txResponse = await this.signAndBroadcastMsg( - msgExecuteContractEncodeObject + msgExecuteContractEncodeObject, ); return { @@ -205,7 +205,7 @@ export class CosmwasmExecutor implements ChainExecutor { } async migrateContract( - req: MigrateContractRequest + req: MigrateContractRequest, ): Promise { const { newCodeId, contractAddr, migrateMsg } = req; const msgMigrateContractEncodeObject: MsgMigrateContractEncodeObject = { @@ -219,14 +219,14 @@ export class CosmwasmExecutor implements ChainExecutor { }; const txResponse = await this.signAndBroadcastMsg( - msgMigrateContractEncodeObject + msgMigrateContractEncodeObject, ); if (txResponse.rawLog === undefined) throw new Error("error parsing raw logs: rawLog undefined"); let resultCodeId = parseInt( - extractFromRawLog(txResponse.rawLog, "code_id") + extractFromRawLog(txResponse.rawLog, "code_id"), ); assert.strictEqual(newCodeId, resultCodeId); @@ -237,7 +237,7 @@ export class CosmwasmExecutor implements ChainExecutor { } async updateContractAdmin( - req: UpdateContractAdminRequest + req: UpdateContractAdminRequest, ): Promise { const { newAdminAddr, contractAddr } = req; const currAdminAddr = await this.getAddress(); @@ -252,7 +252,7 @@ export class CosmwasmExecutor implements ChainExecutor { }; const txResponse = await this.signAndBroadcastMsg( - msgUpdateAdminEncodeObject + msgUpdateAdminEncodeObject, ); return { @@ -268,7 +268,7 @@ function extractFromRawLog(rawLog: string, key: string): string { return rx.exec(rawLog)![1]; } catch (e) { console.error( - "Encountered an error in parsing instantiation result. Printing raw log" + "Encountered an error in parsing instantiation result. Printing raw log", ); console.error(rawLog); throw e; diff --git a/target_chains/cosmwasm/tools/src/chains-manager/injective.ts b/target_chains/cosmwasm/tools/src/chains-manager/injective.ts index 841b83b99f..bacf950055 100644 --- a/target_chains/cosmwasm/tools/src/chains-manager/injective.ts +++ b/target_chains/cosmwasm/tools/src/chains-manager/injective.ts @@ -42,7 +42,7 @@ export class InjectiveExecutor implements ChainExecutor { constructor( private readonly network: Network, - private readonly wallet: PrivateKey + private readonly wallet: PrivateKey, ) {} static fromMnemonic(network: Network, mnemonic: string) { @@ -127,7 +127,7 @@ export class InjectiveExecutor implements ChainExecutor { throw new Error(`Transaction failed: ${txResponse.rawLog}`); } else { console.log( - `Broadcasted transaction hash: ${JSON.stringify(txResponse.txHash)}` + `Broadcasted transaction hash: ${JSON.stringify(txResponse.txHash)}`, ); } @@ -144,7 +144,7 @@ export class InjectiveExecutor implements ChainExecutor { const txResponse = await this.signAndBroadcastMsg(store_code); const codeId: number = parseInt( - extractFromRawLog(txResponse.rawLog, "code_id") + extractFromRawLog(txResponse.rawLog, "code_id"), ); return { @@ -154,7 +154,7 @@ export class InjectiveExecutor implements ChainExecutor { } async instantiateContract( - req: InstantiateContractRequest + req: InstantiateContractRequest, ): Promise { const { codeId, instMsg, label } = req; const instantiateMsg = MsgInstantiateContract.fromJSON({ @@ -170,7 +170,7 @@ export class InjectiveExecutor implements ChainExecutor { const contractAddr: string = extractFromRawLog( txResponse.rawLog, - "contract_address" + "contract_address", ); return { @@ -180,7 +180,7 @@ export class InjectiveExecutor implements ChainExecutor { } async executeContract( - req: ExecuteContractRequest + req: ExecuteContractRequest, ): Promise { const { contractAddr, msg, funds } = req; @@ -199,7 +199,7 @@ export class InjectiveExecutor implements ChainExecutor { } async migrateContract( - req: MigrateContractRequest + req: MigrateContractRequest, ): Promise { const { newCodeId, contractAddr, migrateMsg } = req; const migrate_msg = MsgMigrateContract.fromJSON({ @@ -214,7 +214,7 @@ export class InjectiveExecutor implements ChainExecutor { const txResponse = await this.signAndBroadcastMsg(migrate_msg); let resultCodeId: number = parseInt( - extractFromRawLog(txResponse.rawLog, "code_id") + extractFromRawLog(txResponse.rawLog, "code_id"), ); try { assert.strictEqual(newCodeId, resultCodeId); @@ -230,7 +230,7 @@ export class InjectiveExecutor implements ChainExecutor { } async updateContractAdmin( - req: UpdateContractAdminRequest + req: UpdateContractAdminRequest, ): Promise { const { newAdminAddr, contractAddr } = req; const currAdminAddr = this.getAddress(); @@ -256,7 +256,7 @@ function extractFromRawLog(rawLog: string, key: string): string { return rx.exec(rawLog)![1]; } catch (e) { console.error( - "Encountered an error in parsing instantiation result. Printing raw log" + "Encountered an error in parsing instantiation result. Printing raw log", ); console.error(rawLog); throw e; diff --git a/target_chains/cosmwasm/tools/src/ci/deploy.ts b/target_chains/cosmwasm/tools/src/ci/deploy.ts index 0bd475fc67..73eba91e39 100644 --- a/target_chains/cosmwasm/tools/src/ci/deploy.ts +++ b/target_chains/cosmwasm/tools/src/ci/deploy.ts @@ -21,32 +21,32 @@ async function deploy() { /* Check that the artifact folder contains all the wasm files we expect and nothing else */ const actual_artifacts = readdirSync("../artifacts/").filter((a) => - a.endsWith(".wasm") + a.endsWith(".wasm"), ); const missing_artifacts = artifacts.filter( - (a) => !actual_artifacts.includes(a) + (a) => !actual_artifacts.includes(a), ); if (missing_artifacts.length) { console.log( - "Error during terra deployment. The following files are expected to be in the artifacts folder:" + "Error during terra deployment. The following files are expected to be in the artifacts folder:", ); missing_artifacts.forEach((file) => console.log(` - ${file}`)); console.log( - "Hint: the deploy script needs to run after the contracts have been built." + "Hint: the deploy script needs to run after the contracts have been built.", ); console.log( - "External binary blobs need to be manually added in tools/Dockerfile." + "External binary blobs need to be manually added in tools/Dockerfile.", ); process.exit(1); } const unexpected_artifacts = actual_artifacts.filter( - (a) => !artifacts.includes(a) + (a) => !artifacts.includes(a), ); if (unexpected_artifacts.length) { console.log( - "Error during terra deployment. The following files are not expected to be in the artifacts folder:" + "Error during terra deployment. The following files are not expected to be in the artifacts folder:", ); unexpected_artifacts.forEach((file) => console.log(` - ${file}`)); console.log("Hint: you might need to modify tools/deploy.js"); @@ -56,7 +56,7 @@ async function deploy() { /* Set up terra deployer */ const deployer = DeployerFactory.create( NetworkConfig[NETWORKS.TERRA_LOCAL], - "notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius" + "notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius", ); /* Deploy artifacts */ @@ -95,7 +95,7 @@ async function deploy() { { bytes: Buffer.from( "beFA429d57cD18b7F8A4d91A2da9AB4AF05d0FBe", - "hex" + "hex", ).toString("base64"), }, ], @@ -108,7 +108,7 @@ async function deploy() { addresses[contract] = await deployer.instantiate( codeIds[contract], inst_msg, - "wormhole" + "wormhole", ); contract = "pyth_cosmwasm.wasm"; @@ -129,7 +129,7 @@ async function deploy() { ], governance_source: { emitter: Buffer.from(pythGovernanceEmitterAddress, "hex").toString( - "base64" + "base64", ), chain_id: pythChain, }, @@ -147,7 +147,7 @@ async function deploy() { addresses[contract] = await deployer.instantiate( codeIds[contract], inst_msg, - "pyth" + "pyth", ); } diff --git a/target_chains/cosmwasm/tools/src/ci/deployer/index.ts b/target_chains/cosmwasm/tools/src/ci/deployer/index.ts index 46b8f0438f..837bed6b52 100644 --- a/target_chains/cosmwasm/tools/src/ci/deployer/index.ts +++ b/target_chains/cosmwasm/tools/src/ci/deployer/index.ts @@ -16,7 +16,7 @@ export interface Deployer { instantiate( codeId: number, inst_msg: string | object, - label: string + label: string, ): Promise; migrate(contract: string, codeId: number): Promise; updateAdmin(newAdmin: string, contract: string): Promise; diff --git a/target_chains/cosmwasm/tools/src/ci/deployer/injective.ts b/target_chains/cosmwasm/tools/src/ci/deployer/injective.ts index 19f5814ab2..247920cfab 100644 --- a/target_chains/cosmwasm/tools/src/ci/deployer/injective.ts +++ b/target_chains/cosmwasm/tools/src/ci/deployer/injective.ts @@ -43,7 +43,7 @@ export class InjectiveDeployer implements Deployer { denom: string; }[]; gas: string; - } = DEFAULT_STD_FEE + } = DEFAULT_STD_FEE, ): Promise { const networkInfo = getNetworkInfo(this.network); @@ -68,7 +68,7 @@ export class InjectiveDeployer implements Deployer { console.error(`Transaction failed: ${txResponse.rawLog}`); } else { console.log( - `Broadcasted transaction hash: ${JSON.stringify(txResponse.txHash)}` + `Broadcasted transaction hash: ${JSON.stringify(txResponse.txHash)}`, ); } @@ -107,7 +107,7 @@ export class InjectiveDeployer implements Deployer { codeId = parseInt(ci); } catch (e) { console.error( - "Encountered an error in parsing deploy code result. Printing raw log" + "Encountered an error in parsing deploy code result. Printing raw log", ); console.error(txResponse.rawLog); throw e; @@ -119,7 +119,7 @@ export class InjectiveDeployer implements Deployer { async instantiate( codeId: number, inst_msg: object, - label: string + label: string, ): Promise { const instantiate_msg = MsgInstantiateContract.fromJSON({ sender: this.injectiveAddress(), @@ -136,7 +136,7 @@ export class InjectiveDeployer implements Deployer { address = extractFromRawLog(txResponse.rawLog, "contract_address"); } catch (e) { console.error( - "Encountered an error in parsing instantiation result. Printing raw log" + "Encountered an error in parsing instantiation result. Printing raw log", ); console.error(txResponse.rawLog); throw e; @@ -144,8 +144,8 @@ export class InjectiveDeployer implements Deployer { console.log( `Instantiated Pyth at ${address} (${convert_injective_address_to_hex( - address - )})` + address, + )})`, ); return address; @@ -169,7 +169,7 @@ export class InjectiveDeployer implements Deployer { assert.strictEqual(codeId, resultCodeId); } catch (e) { console.error( - "Encountered an error in parsing migration result. Printing raw log" + "Encountered an error in parsing migration result. Printing raw log", ); console.error(txResponse.rawLog); throw e; diff --git a/target_chains/cosmwasm/tools/src/ci/deployer/osmosis.ts b/target_chains/cosmwasm/tools/src/ci/deployer/osmosis.ts index b0b540e380..20b929b798 100644 --- a/target_chains/cosmwasm/tools/src/ci/deployer/osmosis.ts +++ b/target_chains/cosmwasm/tools/src/ci/deployer/osmosis.ts @@ -17,7 +17,10 @@ export type OsmosisHost = { export class OsmosisDeployer implements Deployer { private chain: Chain; - constructor(private endpoint: string, private mnemonic: string) { + constructor( + private endpoint: string, + private mnemonic: string, + ) { const c = chains.find(({ chain_name }) => chain_name === "osmosis"); if (c === undefined) throw new Error("Could not find Osmosis in chain registry"); @@ -31,7 +34,7 @@ export class OsmosisDeployer implements Deployer { } private async signAndBroadcast( - msg: EncodeObject + msg: EncodeObject, ): Promise { const signer = await DirectSecp256k1HdWallet.fromMnemonic(this.mnemonic); @@ -46,7 +49,7 @@ export class OsmosisDeployer implements Deployer { client, address, [msg], - "estimate fee" + "estimate fee", ); // libraries output more gas than simulated by multiplying with a constant @@ -55,7 +58,7 @@ export class OsmosisDeployer implements Deployer { // hence again multiplying by 1.3 const fee = calculateFee( parseInt((parseInt(gas) * 1.3).toFixed()), - "0.025uosmo" + "0.025uosmo", ); const rs = await client.signAndBroadcast(address, [msg], fee); @@ -64,7 +67,7 @@ export class OsmosisDeployer implements Deployer { console.error(`Transaction failed: ${rs.events}`); } else { console.log( - `Broadcasted transaction hash: ${JSON.stringify(rs.transactionHash)}` + `Broadcasted transaction hash: ${JSON.stringify(rs.transactionHash)}`, ); } @@ -93,7 +96,7 @@ export class OsmosisDeployer implements Deployer { codeId = parseInt(ci); } catch (e) { console.error( - "Encountered an error in parsing deploy code result. Printing raw log" + "Encountered an error in parsing deploy code result. Printing raw log", ); console.error(rs.rawLog); throw e; @@ -105,7 +108,7 @@ export class OsmosisDeployer implements Deployer { async instantiate( codeId: number, inst_msg: string | object, - label: string + label: string, ): Promise { const accAddress = await this.getAccountAddress(); const instMsg = @@ -131,7 +134,7 @@ export class OsmosisDeployer implements Deployer { address = extractFromRawLog(rs.rawLog, "_contract_address"); } catch (e) { console.error( - "Encountered an error in parsing instantiation result. Printing raw log" + "Encountered an error in parsing instantiation result. Printing raw log", ); console.error(rs.rawLog); throw e; @@ -139,8 +142,8 @@ export class OsmosisDeployer implements Deployer { console.log( `Instantiated ${label} at ${address} (${convert_terra_address_to_hex( - address - )})` + address, + )})`, ); return address; } @@ -155,7 +158,7 @@ export class OsmosisDeployer implements Deployer { msg: Buffer.from( JSON.stringify({ action: "", - }) + }), ), }); @@ -169,7 +172,7 @@ export class OsmosisDeployer implements Deployer { assert.strictEqual(codeId, resultCodeId); } catch (e) { console.error( - "Encountered an error in parsing migration result. Printing raw log" + "Encountered an error in parsing migration result. Printing raw log", ); console.error(rs.rawLog); throw e; diff --git a/target_chains/cosmwasm/tools/src/ci/deployer/terra.ts b/target_chains/cosmwasm/tools/src/ci/deployer/terra.ts index 8b27ea4d88..cea954fdef 100644 --- a/target_chains/cosmwasm/tools/src/ci/deployer/terra.ts +++ b/target_chains/cosmwasm/tools/src/ci/deployer/terra.ts @@ -42,7 +42,7 @@ export class TerraDeployer implements Deployer { console.error(`Transaction failed: ${res.raw_log}`); } else { console.log( - `Broadcasted transaction hash: ${JSON.stringify(res.txhash)}` + `Broadcasted transaction hash: ${JSON.stringify(res.txhash)}`, ); } @@ -55,7 +55,7 @@ export class TerraDeployer implements Deployer { const store_code = new MsgStoreCode( this.wallet.key.accAddress, - contract_bytes.toString("base64") + contract_bytes.toString("base64"), ); const rs = await this.signAndBroadcastMsg(store_code); @@ -67,7 +67,7 @@ export class TerraDeployer implements Deployer { codeId = parseInt(ci); } catch (e) { console.error( - "Encountered an error in parsing deploy code result. Printing raw log" + "Encountered an error in parsing deploy code result. Printing raw log", ); console.error(rs.raw_log); throw e; @@ -79,7 +79,7 @@ export class TerraDeployer implements Deployer { async instantiate( codeId: number, inst_msg: string | object, - label: string + label: string, ): Promise { const instMsg = new MsgInstantiateContract( this.wallet.key.accAddress, @@ -87,7 +87,7 @@ export class TerraDeployer implements Deployer { codeId, inst_msg, undefined, - label + label, ); const rs = await this.signAndBroadcastMsg(instMsg); @@ -98,7 +98,7 @@ export class TerraDeployer implements Deployer { address = extractFromRawLog(rs.raw_log, "_contract_address"); } catch (e) { console.error( - "Encountered an error in parsing instantiation result. Printing raw log" + "Encountered an error in parsing instantiation result. Printing raw log", ); console.error(rs.raw_log); throw e; @@ -106,8 +106,8 @@ export class TerraDeployer implements Deployer { console.log( `Instantiated ${label} at ${address} (${convert_terra_address_to_hex( - address - )})` + address, + )})`, ); return address; } @@ -119,7 +119,7 @@ export class TerraDeployer implements Deployer { codeId, { action: "", - } + }, ); const rs = await this.signAndBroadcastMsg(migrateMsg); @@ -129,7 +129,7 @@ export class TerraDeployer implements Deployer { assert.strictEqual(codeId, resultCodeId); } catch (e) { console.error( - "Encountered an error in parsing migration result. Printing raw log" + "Encountered an error in parsing migration result. Printing raw log", ); console.error(rs.raw_log); throw e; @@ -145,7 +145,7 @@ export class TerraDeployer implements Deployer { const updateAdminMsg = new MsgUpdateContractAdmin( currAdmin, newAdmin, - contract + contract, ); await this.signAndBroadcastMsg(updateAdminMsg); @@ -169,7 +169,7 @@ export class TerraDeployer implements Deployer { const wallet = lcd.wallet( new MnemonicKey({ mnemonic, - }) + }), ); return new TerraDeployer(wallet); diff --git a/target_chains/cosmwasm/tools/src/pyth-wrapper.ts b/target_chains/cosmwasm/tools/src/pyth-wrapper.ts index 4e6ee1eff3..d88c2a0e91 100644 --- a/target_chains/cosmwasm/tools/src/pyth-wrapper.ts +++ b/target_chains/cosmwasm/tools/src/pyth-wrapper.ts @@ -63,7 +63,7 @@ export class PythWrapperQuerier { */ async getPriceFeed( contractAddr: string, - id: string + id: string, ): Promise { try { const priceFeedResponse = await this.chainQuerier.getSmartContractState({ @@ -116,7 +116,7 @@ export class PythWrapperExecutor { * @throws an error if it fails */ async executeUpdatePriceFeeds( - req: ExecuteUpdatePriceFeedsRequest + req: ExecuteUpdatePriceFeedsRequest, ): Promise { const { contractAddr, vaas, fund } = req; @@ -143,7 +143,7 @@ export class PythWrapperExecutor { * @throws an error if it fails */ async executeGovernanceInstruction( - req: ExecuteGovernanceInstructionRequest + req: ExecuteGovernanceInstructionRequest, ): Promise { const { contractAddr, vaa } = req; diff --git a/target_chains/ethereum/abi_generator/src/index.js b/target_chains/ethereum/abi_generator/src/index.js index ac92065c9c..524e715ebc 100644 --- a/target_chains/ethereum/abi_generator/src/index.js +++ b/target_chains/ethereum/abi_generator/src/index.js @@ -35,7 +35,7 @@ function generateAbi(contracts) { } const output = JSON.parse( - solc.compile(JSON.stringify(input), { import: findImports }) + solc.compile(JSON.stringify(input), { import: findImports }), ); if (!fs.existsSync("abis")) { @@ -48,7 +48,7 @@ function generateAbi(contracts) { const abi = output.contracts[contractFile][contract].abi; fs.writeFileSync( `abis/${contract}.json`, - JSON.stringify(abi, null, 2) + "\n" + JSON.stringify(abi, null, 2) + "\n", ); } } diff --git a/target_chains/ethereum/contracts/contracts/libraries/external/BytesLib.sol b/target_chains/ethereum/contracts/contracts/libraries/external/BytesLib.sol index 71277b6ddb..6fbedb5fad 100644 --- a/target_chains/ethereum/contracts/contracts/libraries/external/BytesLib.sol +++ b/target_chains/ethereum/contracts/contracts/libraries/external/BytesLib.sol @@ -527,9 +527,7 @@ library BytesLib { // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) - for { - - } eq(add(lt(mc, end), cb), 2) { + for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { diff --git a/target_chains/ethereum/contracts/contracts/libraries/external/UnsafeBytesLib.sol b/target_chains/ethereum/contracts/contracts/libraries/external/UnsafeBytesLib.sol index 2c6fdad6bb..c59e421ee9 100644 --- a/target_chains/ethereum/contracts/contracts/libraries/external/UnsafeBytesLib.sol +++ b/target_chains/ethereum/contracts/contracts/libraries/external/UnsafeBytesLib.sol @@ -518,9 +518,7 @@ library UnsafeBytesLib { // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) - for { - - } eq(add(lt(mc, end), cb), 2) { + for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { diff --git a/target_chains/ethereum/contracts/deploy/zkSyncDeployEntropy.ts b/target_chains/ethereum/contracts/deploy/zkSyncDeployEntropy.ts index f0eb9d8924..e2f26180d8 100644 --- a/target_chains/ethereum/contracts/deploy/zkSyncDeployEntropy.ts +++ b/target_chains/ethereum/contracts/deploy/zkSyncDeployEntropy.ts @@ -59,13 +59,13 @@ export default async function (hre: HardhatRuntimeEnvironment) { wormholeGovernanceChainId, wormholeGovernanceContract, wormholeInitialSigners, - wormholeReceiverChainId + wormholeReceiverChainId, ); } console.log( "WormholeReceiver contract address:", - wormholeReceiverContractAddress + wormholeReceiverContractAddress, ); // // TODO: Top up accounts if necessary @@ -75,7 +75,7 @@ export default async function (hre: HardhatRuntimeEnvironment) { wormholeReceiverContractAddress, wormholeReceiverChainId, governanceChainId, - governanceEmitter + governanceEmitter, ); console.log("Executor contract address:", executorContractAddress); @@ -84,7 +84,7 @@ export default async function (hre: HardhatRuntimeEnvironment) { deployer, executorContractAddress, wormholeReceiverChainId, - isMainnet + isMainnet, ); console.log("Entropy contract address:", entropyContractAddress); @@ -101,15 +101,14 @@ async function deployExecutorContract( wormholeReceiverContractAddress: string, wormholeReceiverChainId: number, governanceChainId: string, - governanceEmitter: string + governanceEmitter: string, ) { - const executorImplArtifact = await deployer.loadArtifact( - "ExecutorUpgradable" - ); + const executorImplArtifact = + await deployer.loadArtifact("ExecutorUpgradable"); const executorImplContract = await deployer.deploy(executorImplArtifact); console.log( "Deployed ExecutorImpl contract on", - executorImplContract.address + executorImplContract.address, ); const executorInitData = executorImplContract.interface.encodeFunctionData( @@ -120,7 +119,7 @@ async function deployExecutorContract( wormholeReceiverChainId, governanceChainId, governanceEmitter, - ] + ], ); const executorProxyArtifact = await deployer.loadArtifact("ERC1967Proxy"); @@ -139,7 +138,7 @@ async function deployEntropyContract( deployer: Deployer, executorContractAddress: string, chainId: number, - isMainnet: boolean + isMainnet: boolean, ) { const entropyImplArtifact = await deployer.loadArtifact("EntropyUpgradable"); const entropyImplContract = await deployer.deploy(entropyImplArtifact); @@ -154,7 +153,7 @@ async function deployEntropyContract( ? ENTROPY_DEFAULT_PROVIDER.mainnet : ENTROPY_DEFAULT_PROVIDER.testnet, true, - ] + ], ); const entropyProxyArtifact = await deployer.loadArtifact("ERC1967Proxy"); diff --git a/target_chains/ethereum/contracts/deploy/zkSyncDeployNewPythImpl.ts b/target_chains/ethereum/contracts/deploy/zkSyncDeployNewPythImpl.ts index 6b407dee6b..c8e8cf3d57 100644 --- a/target_chains/ethereum/contracts/deploy/zkSyncDeployNewPythImpl.ts +++ b/target_chains/ethereum/contracts/deploy/zkSyncDeployNewPythImpl.ts @@ -37,9 +37,9 @@ export default async function (hre: HardhatRuntimeEnvironment) { const pythImplContract = await deployer.deploy(pythImplArtifact); console.log( - `Deployed Pyth implementation contract on ${pythImplContract.address}` + `Deployed Pyth implementation contract on ${pythImplContract.address}`, ); console.log( - "Please use this address as the candidate new implementation in the deployment script." + "Please use this address as the candidate new implementation in the deployment script.", ); } diff --git a/target_chains/ethereum/contracts/deploy/zkSyncDeployPriceFeed.ts b/target_chains/ethereum/contracts/deploy/zkSyncDeployPriceFeed.ts index 52afcb1cb8..3860c077cf 100644 --- a/target_chains/ethereum/contracts/deploy/zkSyncDeployPriceFeed.ts +++ b/target_chains/ethereum/contracts/deploy/zkSyncDeployPriceFeed.ts @@ -67,7 +67,7 @@ export default async function (hre: HardhatRuntimeEnvironment) { wormholeGovernanceChainId, wormholeGovernanceContract, wormholeInitialSigners, - wormholeReceiverChainId + wormholeReceiverChainId, ); } @@ -95,7 +95,7 @@ export default async function (hre: HardhatRuntimeEnvironment) { governanceInitialSequence, validTimePeriodSeconds, singleUpdateFeeInWei, - ] + ], ); const pythProxyContract = await deployer.deploy(pythProxyArtifact, [ diff --git a/target_chains/ethereum/contracts/deploy/zkSyncDeployWormhole.ts b/target_chains/ethereum/contracts/deploy/zkSyncDeployWormhole.ts index bd0941ca50..91dd4ee705 100644 --- a/target_chains/ethereum/contracts/deploy/zkSyncDeployWormhole.ts +++ b/target_chains/ethereum/contracts/deploy/zkSyncDeployWormhole.ts @@ -24,15 +24,14 @@ export async function deployWormholeContract( wormholeGovernanceChainId: string, wormholeGovernanceContract: string, wormholeInitialSigners: string[], - wormholeReceiverChainId: number + wormholeReceiverChainId: number, ): Promise { const receiverSetupArtifact = await deployer.loadArtifact("ReceiverSetup"); const receiverImplArtifact = await deployer.loadArtifact( - "ReceiverImplementation" - ); - const wormholeReceiverArtifact = await deployer.loadArtifact( - "WormholeReceiver" + "ReceiverImplementation", ); + const wormholeReceiverArtifact = + await deployer.loadArtifact("WormholeReceiver"); console.log("Deploying WormholeReceiver contract..."); const receiverSetupContract = await deployer.deploy(receiverSetupArtifact); @@ -43,7 +42,7 @@ export async function deployWormholeContract( const receiverImplContract = await deployer.deploy(receiverImplArtifact); console.log( "Deployed ReceiverImplementation on", - receiverImplContract.address + receiverImplContract.address, ); // encode initialisation data @@ -55,17 +54,17 @@ export async function deployWormholeContract( wormholeReceiverChainId, wormholeGovernanceChainId, wormholeGovernanceContract, - ] + ], ); // deploy proxy const wormholeReceiverContract = await deployer.deploy( wormholeReceiverArtifact, - [receiverSetupContract.address, whInitData] + [receiverSetupContract.address, whInitData], ); console.log( - `Deployed WormholeReceiver on ${wormholeReceiverContract.address}` + `Deployed WormholeReceiver on ${wormholeReceiverContract.address}`, ); return wormholeReceiverContract.address; diff --git a/target_chains/ethereum/contracts/forge-test/Pyth.t.sol b/target_chains/ethereum/contracts/forge-test/Pyth.t.sol index 2ad80b8f07..bd072df0a2 100644 --- a/target_chains/ethereum/contracts/forge-test/Pyth.t.sol +++ b/target_chains/ethereum/contracts/forge-test/Pyth.t.sol @@ -287,16 +287,19 @@ contract PythTest is Test, WormholeTestUtils, PythTestUtils { PriceFeedMessage[] memory messages ) = generateRandomPriceMessages(numMessages); - (bytes[] memory updateData, uint updateFee) = createBatchedUpdateDataFromMessagesWithConfig( - messages, - MerkleUpdateConfig( - MERKLE_TREE_DEPTH, - NUM_GUARDIAN_SIGNERS, - SOURCE_EMITTER_CHAIN_ID, - 0x00000000000000000000000000000000000000000000000000000000000000aa, // Random wrong source address - false - ) - ); + ( + bytes[] memory updateData, + uint updateFee + ) = createBatchedUpdateDataFromMessagesWithConfig( + messages, + MerkleUpdateConfig( + MERKLE_TREE_DEPTH, + NUM_GUARDIAN_SIGNERS, + SOURCE_EMITTER_CHAIN_ID, + 0x00000000000000000000000000000000000000000000000000000000000000aa, // Random wrong source address + false + ) + ); vm.expectRevert(PythErrors.InvalidUpdateDataSource.selector); pyth.parsePriceFeedUpdates{value: updateFee}( diff --git a/target_chains/ethereum/contracts/migrations/test/2_deploy_wormhole.js b/target_chains/ethereum/contracts/migrations/test/2_deploy_wormhole.js index dd5c472ecc..045bccb5db 100644 --- a/target_chains/ethereum/contracts/migrations/test/2_deploy_wormhole.js +++ b/target_chains/ethereum/contracts/migrations/test/2_deploy_wormhole.js @@ -25,7 +25,7 @@ module.exports = async function (deployer) { initialSigners, chainId, governanceChainId, - governanceContract + governanceContract, ) .encodeABI(); diff --git a/target_chains/ethereum/contracts/migrations/test/3_deploy_pyth.js b/target_chains/ethereum/contracts/migrations/test/3_deploy_pyth.js index b190172860..3da31cee1d 100644 --- a/target_chains/ethereum/contracts/migrations/test/3_deploy_pyth.js +++ b/target_chains/ethereum/contracts/migrations/test/3_deploy_pyth.js @@ -12,7 +12,7 @@ const governanceChainId = process.env.GOVERNANCE_CHAIN_ID; const governanceEmitter = process.env.GOVERNANCE_EMITTER; // Default value for this field is 0 const governanceInitialSequence = Number( - process.env.GOVERNANCE_INITIAL_SEQUENCE ?? "0" + process.env.GOVERNANCE_INITIAL_SEQUENCE ?? "0", ); const validTimePeriodSeconds = Number(process.env.VALID_TIME_PERIOD_SECONDS); @@ -42,6 +42,6 @@ module.exports = async function (deployer) { validTimePeriodSeconds, singleUpdateFeeInWei, ], - { deployer } + { deployer }, ); }; diff --git a/target_chains/ethereum/contracts/mine.js b/target_chains/ethereum/contracts/mine.js index 88a2154406..cd6d9c89c2 100644 --- a/target_chains/ethereum/contracts/mine.js +++ b/target_chains/ethereum/contracts/mine.js @@ -18,7 +18,7 @@ advanceBlock = () => { const newBlockHash = web3.eth.getBlock("latest").hash; return resolve(newBlockHash); - } + }, ); }); }; diff --git a/target_chains/ethereum/contracts/scripts/assertVaaPayloadEquals.js b/target_chains/ethereum/contracts/scripts/assertVaaPayloadEquals.js index cc1ab6f7ce..f503824f73 100644 --- a/target_chains/ethereum/contracts/scripts/assertVaaPayloadEquals.js +++ b/target_chains/ethereum/contracts/scripts/assertVaaPayloadEquals.js @@ -8,7 +8,7 @@ const { assert } = require("chai"); */ module.exports = async function assertVaaPayloadEquals( vaaHex, - expectedPayload + expectedPayload, ) { if (vaaHex.startsWith("0x")) { vaaHex = vaaHex.substring(2); @@ -18,6 +18,6 @@ module.exports = async function assertVaaPayloadEquals( assert( expectedPayload.equals(vaaPayload), - "The VAA payload is not equal to the expected payload" + "The VAA payload is not equal to the expected payload", ); }; diff --git a/target_chains/ethereum/contracts/scripts/batchDeployReceivers.ts b/target_chains/ethereum/contracts/scripts/batchDeployReceivers.ts index a9e3f5396e..463232dc7c 100644 --- a/target_chains/ethereum/contracts/scripts/batchDeployReceivers.ts +++ b/target_chains/ethereum/contracts/scripts/batchDeployReceivers.ts @@ -19,7 +19,7 @@ const { getDefaultConfig } = require("./contractManagerConfig"); const parser = yargs(hideBin(process.argv)) .usage( - "Usage: $0 --contracts --network --private-key --ops-wallet " + "Usage: $0 --contracts --network --private-key --ops-wallet ", ) .options({ contract: { @@ -60,8 +60,9 @@ async function main() { const privateKey = argv["private-key"]; const network = argv["network"]; const setupInfo = require(argv["contract"] + "/ReceiverSetup.json"); - const implementationInfo = require(argv["contract"] + - "/ReceiverImplementation.json"); + const implementationInfo = require( + argv["contract"] + "/ReceiverImplementation.json", + ); const receiverInfo = require(argv["contract"] + "/WormholeReceiver.json"); const payloads: Buffer[] = []; @@ -82,14 +83,14 @@ async function main() { privateKey, setupInfo.abi, setupInfo.bytecode, - [] + [], ); console.log("setupAddress", setupAddress); const implementationAddress = await chain.deploy( privateKey, implementationInfo.abi, implementationInfo.bytecode, - [] + [], ); console.log("implementationAddress", implementationAddress); const web3 = new Web3(); @@ -100,7 +101,7 @@ async function main() { wormholeInitialSigners, CHAINS[chain.wormholeChainName], wormholeGovernanceChainId, - wormholeGovernanceContract + wormholeGovernanceContract, ) .encodeABI(); @@ -109,7 +110,7 @@ async function main() { privateKey, receiverInfo.abi, receiverInfo.bytecode, - [setupAddress, initData] + [setupAddress, initData], ); const contract = new EvmWormholeContract(chain, receiverAddress); console.log("receiverAddress", receiverAddress); @@ -118,7 +119,7 @@ async function main() { return contract.address; }); const payload = chain.generateGovernanceSetWormholeAddressPayload( - address.replace("0x", "") + address.replace("0x", ""), ); payloads.push(payload); } diff --git a/target_chains/ethereum/contracts/scripts/contractManagerConfig.js b/target_chains/ethereum/contracts/scripts/contractManagerConfig.js index 8b3fff3873..50c3fd193c 100644 --- a/target_chains/ethereum/contracts/scripts/contractManagerConfig.js +++ b/target_chains/ethereum/contracts/scripts/contractManagerConfig.js @@ -20,10 +20,10 @@ function getDefaultConfig(chainName) { getDefaultDeploymentConfig("stable"); const emitterChainIds = dataSources.map((dataSource) => - convertChainId(dataSource.emitterChain) + convertChainId(dataSource.emitterChain), ); const emitterAddresses = dataSources.map((dataSource) => - convertAddress(dataSource.emitterAddress) + convertAddress(dataSource.emitterAddress), ); const governanceChainId = convertChainId(governanceDataSource.emitterChain); const governanceEmitter = convertAddress(governanceDataSource.emitterAddress); @@ -31,10 +31,10 @@ function getDefaultConfig(chainName) { const wormholeInitialSigners = wormholeConfig.initialGuardianSet.map(convertAddress); const wormholeGovernanceChainId = convertChainId( - wormholeConfig.governanceChainId + wormholeConfig.governanceChainId, ); const wormholeGovernanceContract = convertAddress( - wormholeConfig.governanceContract + wormholeConfig.governanceContract, ); return { diff --git a/target_chains/ethereum/contracts/scripts/createLocalnetGovernanceVaa.js b/target_chains/ethereum/contracts/scripts/createLocalnetGovernanceVaa.js index 525ac81efb..cd38761f33 100644 --- a/target_chains/ethereum/contracts/scripts/createLocalnetGovernanceVaa.js +++ b/target_chains/ethereum/contracts/scripts/createLocalnetGovernanceVaa.js @@ -25,7 +25,7 @@ const signAndEncodeVM = function ( data, signers, guardianSetIndex, - consistencyLevel + consistencyLevel, ) { const body = [ abi.encodeParameter("uint32", timestamp).substring(2 + (64 - 8)), @@ -74,7 +74,7 @@ function createVAAFromUint8Array( dataBuffer, emitterChainId, emitterAddress, - sequence + sequence, ) { const dataHex = "0x" + dataBuffer.toString("hex"); return ( @@ -88,7 +88,7 @@ function createVAAFromUint8Array( dataHex, [testSigner1PK], 0, - 0 + 0, ) ); } @@ -98,6 +98,6 @@ module.exports = function createLocalnetGovernanceVAA(dataBuffer, sequence) { dataBuffer, testGovernanceChain, testGovernanceEmitter, - sequence + sequence, ); }; diff --git a/target_chains/ethereum/contracts/test/pyth.js b/target_chains/ethereum/contracts/test/pyth.js index 29728ffcce..953e88366b 100644 --- a/target_chains/ethereum/contracts/test/pyth.js +++ b/target_chains/ethereum/contracts/test/pyth.js @@ -59,7 +59,7 @@ contract("Pyth", function () { it("should be initialized with the correct signers and values", async function () { await this.pythProxy.isValidDataSource( testPyth2WormholeChainId, - testPyth2WormholeEmitter + testPyth2WormholeEmitter, ); }); @@ -73,7 +73,7 @@ contract("Pyth", function () { // upgrade proxy should fail await expectRevert( upgradeProxy(this.pythProxy.address, MockPythUpgrade), - "Ownable: caller is not the owner." + "Ownable: caller is not the owner.", ); }); @@ -82,7 +82,7 @@ contract("Pyth", function () { batches, valueInWei, chainId, - emitter + emitter, ) { let updateData = []; for (let data of batches) { @@ -95,7 +95,7 @@ contract("Pyth", function () { data, [testSigner1PK], 0, - 0 + 0, ); updateData.push("0x" + vm); } @@ -112,15 +112,15 @@ contract("Pyth", function () { async function createAndThenSubmitGovernanceInstructionVaa( contract, governanceInstruction, - sequence + sequence, ) { await contract.executeGovernanceInstruction( await createVAAFromUint8Array( governanceInstruction.encode(), testGovernanceChainId, testGovernanceEmitter, - sequence - ) + sequence, + ), ); } @@ -139,16 +139,16 @@ contract("Pyth", function () { await createAndThenSubmitGovernanceInstructionVaa( contract, new governance.SetFee("ethereum", BigInt(newFee), BigInt(0)), - governanceSequence ?? 1 + governanceSequence ?? 1, ); } it("should fail transaction if a price is not found", async function () { await expectRevertCustomError( this.pythProxy.queryPriceFeed( - "0xdeadfeeddeadfeeddeadfeeddeadfeeddeadfeeddeadfeeddeadfeeddeadfeed" + "0xdeadfeeddeadfeeddeadfeeddeadfeeddeadfeeddeadfeeddeadfeeddeadfeed", ), - "PriceFeedNotFound" + "PriceFeedNotFound", ); }); @@ -162,12 +162,12 @@ contract("Pyth", function () { async function setValidPeriodTo( contract, newValidPeriod, - governanceSequence + governanceSequence, ) { await createAndThenSubmitGovernanceInstructionVaa( contract, new governance.SetValidPeriod("ethereum", BigInt(newValidPeriod)), - governanceSequence ?? 1 + governanceSequence ?? 1, ); } @@ -185,12 +185,12 @@ contract("Pyth", function () { wrongMagic, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaWrongMagic), - "InvalidGovernanceMessage" + "InvalidGovernanceMessage", ); const wrongModule = Buffer.from(data); @@ -200,12 +200,12 @@ contract("Pyth", function () { wrongModule, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaWrongModule), - "InvalidGovernanceTarget" + "InvalidGovernanceTarget", ); const outOfBoundModule = Buffer.from(data); @@ -215,12 +215,12 @@ contract("Pyth", function () { outOfBoundModule, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await expectRevert( this.pythProxy.executeGovernanceInstruction(vaaOutOfBoundModule), - "Panic: Enum value out of bounds." + "Panic: Enum value out of bounds.", ); }); @@ -231,69 +231,69 @@ contract("Pyth", function () { data, testGovernanceChainId, "0x0000000000000000000000000000000000000000000000000000000000001111", - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaWrongEmitter), - "InvalidGovernanceDataSource" + "InvalidGovernanceDataSource", ); const vaaWrongChain = await createVAAFromUint8Array( data, governance.CHAINS.karura, testGovernanceEmitter, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaWrongChain), - "InvalidGovernanceDataSource" + "InvalidGovernanceDataSource", ); }); it("Make sure governance with only target chain id and 0 work", async function () { const wrongChainData = new governance.SetValidPeriod( "solana", - BigInt(10) + BigInt(10), ).encode(); const wrongChainVaa = await createVAAFromUint8Array( wrongChainData, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(wrongChainVaa), - "InvalidGovernanceTarget" + "InvalidGovernanceTarget", ); const dataForAllChains = new governance.SetValidPeriod( "unset", - BigInt(10) + BigInt(10), ).encode(); const vaaForAllChains = await createVAAFromUint8Array( dataForAllChains, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await this.pythProxy.executeGovernanceInstruction(vaaForAllChains); const dataForEth = new governance.SetValidPeriod( "ethereum", - BigInt(10) + BigInt(10), ).encode(); const vaaForEth = await createVAAFromUint8Array( dataForEth, testGovernanceChainId, testGovernanceEmitter, - 2 + 2, ); await this.pythProxy.executeGovernanceInstruction(vaaForEth); @@ -306,32 +306,32 @@ contract("Pyth", function () { data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await this.pythProxy.executeGovernanceInstruction(vaaSeq1), // Replaying shouldn't work await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaSeq1), - "OldGovernanceMessage" + "OldGovernanceMessage", ); const vaaSeq2 = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 2 + 2, ); await this.pythProxy.executeGovernanceInstruction(vaaSeq2), // Replaying shouldn't work await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaSeq1), - "OldGovernanceMessage" + "OldGovernanceMessage", ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaaSeq2), - "OldGovernanceMessage" + "OldGovernanceMessage", ); }); @@ -341,19 +341,19 @@ contract("Pyth", function () { const data = new governance.EvmUpgradeContract( "unset", // 0 - newImplementation.address.replace("0x", "") + newImplementation.address.replace("0x", ""), ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaa), - "InvalidGovernanceTarget" + "InvalidGovernanceTarget", ); }); @@ -362,14 +362,14 @@ contract("Pyth", function () { const data = new governance.EvmUpgradeContract( "ethereum", - newImplementation.address.replace("0x", "") + newImplementation.address.replace("0x", ""), ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); const receipt = await this.pythProxy.executeGovernanceInstruction(vaa); @@ -388,20 +388,20 @@ contract("Pyth", function () { const data = new governance.EvmUpgradeContract( "ethereum", - newImplementation.address.replace("0x", "") + newImplementation.address.replace("0x", ""), ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); // Calling a non-existing method will cause a revert with no explanation. await expectRevert( this.pythProxy.executeGovernanceInstruction(vaa), - "revert" + "revert", ); }); @@ -417,26 +417,26 @@ contract("Pyth", function () { claimInstructionData, newEmitterChain, newEmitterAddress, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(claimVaaHexString), - "InvalidGovernanceDataSource" + "InvalidGovernanceDataSource", ); const claimVaa = Buffer.from(claimVaaHexString.substring(2), "hex"); const data = new governance.AuthorizeGovernanceDataSourceTransfer( "unset", - claimVaa + claimVaa, ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); const oldGovernanceDataSource = await this.pythProxy.governanceDataSource(); @@ -456,26 +456,26 @@ contract("Pyth", function () { // Verifies the data source has changed. await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(vaa), - "InvalidGovernanceDataSource" + "InvalidGovernanceDataSource", ); // Make sure a claim vaa does not get executed const claimLonely = new governance.RequestGovernanceDataSourceTransfer( "unset", - 2 + 2, ).encode(); const claimLonelyVaa = await createVAAFromUint8Array( claimLonely, newEmitterChain, newEmitterAddress, - 2 + 2, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(claimLonelyVaa), - "InvalidGovernanceMessage" + "InvalidGovernanceMessage", ); // Transfer back the ownership to the old governance data source without increasing @@ -485,37 +485,37 @@ contract("Pyth", function () { const transferBackClaimInstructionDataWrong = new governance.RequestGovernanceDataSourceTransfer( "unset", - 1 // The same governance data source index => Should fail + 1, // The same governance data source index => Should fail ).encode(); const transferBackClaimVaaHexStringWrong = await createVAAFromUint8Array( transferBackClaimInstructionDataWrong, testGovernanceChainId, testGovernanceEmitter, - 2 + 2, ); const transferBackClaimVaaWrong = Buffer.from( transferBackClaimVaaHexStringWrong.substring(2), - "hex" + "hex", ); const transferBackDataWrong = new governance.AuthorizeGovernanceDataSourceTransfer( "unset", - transferBackClaimVaaWrong + transferBackClaimVaaWrong, ).encode(); const transferBackVaaWrong = await createVAAFromUint8Array( transferBackDataWrong, newEmitterChain, newEmitterAddress, - 2 + 2, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(transferBackVaaWrong), - "OldGovernanceMessage" + "OldGovernanceMessage", ); }); @@ -532,7 +532,7 @@ contract("Pyth", function () { data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); const oldDataSources = await this.pythProxy.validDataSources(); @@ -546,14 +546,14 @@ contract("Pyth", function () { assert.isTrue( await this.pythProxy.isValidDataSource( governance.CHAINS.acala, - "0x0000000000000000000000000000000000000000000000000000000000001111" - ) + "0x0000000000000000000000000000000000000000000000000000000000001111", + ), ); assert.isFalse( await this.pythProxy.isValidDataSource( testPyth2WormholeChainId, - testPyth2WormholeEmitter - ) + testPyth2WormholeEmitter, + ), ); // TODO: try to publish prices @@ -563,14 +563,14 @@ contract("Pyth", function () { const data = new governance.SetFee( "ethereum", BigInt(5), - BigInt(3) // 5*10**3 = 5000 + BigInt(3), // 5*10**3 = 5000 ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); const oldFee = await this.pythProxy.singleUpdateFeeInWei(); @@ -593,7 +593,7 @@ contract("Pyth", function () { data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); const oldValidPeriod = await this.pythProxy.validTimePeriodSeconds(); @@ -622,7 +622,7 @@ contract("Pyth", function () { [testSigner1.address], governance.CHAINS.polygon, // changing the chain id to polygon wormholeGovernanceChainId, - wormholeGovernanceContract + wormholeGovernanceContract, ) .encodeABI(); @@ -631,14 +631,14 @@ contract("Pyth", function () { // Creating the vaa to set the new wormhole address const data = new governance.EvmSetWormholeAddress( "ethereum", - newWormhole.address.replace("0x", "") + newWormhole.address.replace("0x", ""), ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); assert.equal(await this.pythProxy.chainId(), governance.CHAINS.ethereum); @@ -667,26 +667,26 @@ contract("Pyth", function () { [testSigner1.address], governance.CHAINS.polygon, // changing the chain id to polygon wormholeGovernanceChainId, - wormholeGovernanceContract + wormholeGovernanceContract, ) .encodeABI(); const newWormholeReceiver = await WormholeReceiver.new( newReceiverSetup.address, - initData + initData, ); // Creating the vaa to set the new wormhole address const data = new governance.EvmSetWormholeAddress( "ethereum", - newWormholeReceiver.address.replace("0x", "") + newWormholeReceiver.address.replace("0x", ""), ).encode(); const vaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); assert.equal(await this.pythProxy.chainId(), governance.CHAINS.ethereum); @@ -715,7 +715,7 @@ contract("Pyth", function () { [testSigner2.address], // A wrong signer governance.CHAINS.ethereum, wormholeGovernanceChainId, - wormholeGovernanceContract + wormholeGovernanceContract, ) .encodeABI(); @@ -724,19 +724,19 @@ contract("Pyth", function () { // Creating the vaa to set the new wormhole address const data = new governance.EvmSetWormholeAddress( "ethereum", - newWormhole.address.replace("0x", "") + newWormhole.address.replace("0x", ""), ).encode(); const wrongVaa = await createVAAFromUint8Array( data, testGovernanceChainId, testGovernanceEmitter, - 1 + 1, ); await expectRevertCustomError( this.pythProxy.executeGovernanceInstruction(wrongVaa), - "InvalidGovernanceMessage" + "InvalidGovernanceMessage", ); }); @@ -759,7 +759,7 @@ const signAndEncodeVM = async function ( data, signers, guardianSetIndex, - consistencyLevel + consistencyLevel, ) { const body = [ web3.eth.abi.encodeParameter("uint32", timestamp).substring(2 + (64 - 8)), @@ -776,7 +776,7 @@ const signAndEncodeVM = async function ( ]; const hash = web3.utils.soliditySha3( - web3.utils.soliditySha3("0x" + body.join("")) + web3.utils.soliditySha3("0x" + body.join("")), ); let signatures = ""; @@ -825,7 +825,7 @@ async function createVAAFromUint8Array( dataBuffer, emitterChainId, emitterAddress, - sequence + sequence, ) { const dataHex = "0x" + dataBuffer.toString("hex"); return ( @@ -839,7 +839,7 @@ async function createVAAFromUint8Array( dataHex, [testSigner1PK], 0, - 0 + 0, )) ); } @@ -870,7 +870,7 @@ function expectEventNotEmittedWithArgs(receipt, eventName, args) { const matches = getNumMatchingEvents(receipt, eventName, args); assert( matches === 0, - `Expected no matching emitted event. But found ${matches}.` + `Expected no matching emitted event. But found ${matches}.`, ); } @@ -888,7 +888,7 @@ async function expectRevertCustomError(promise, reason) { const reasonId = web3.utils.keccak256(reason + "()").substr(0, 10); expect( JSON.stringify(revert), - `Expected custom error ${reason} (${reasonId})` + `Expected custom error ${reason} (${reasonId})`, ).to.include(reasonId); } } diff --git a/target_chains/ethereum/entropy_sdk/solidity/README.md b/target_chains/ethereum/entropy_sdk/solidity/README.md index 722fc1344d..55cbe6927d 100644 --- a/target_chains/ethereum/entropy_sdk/solidity/README.md +++ b/target_chains/ethereum/entropy_sdk/solidity/README.md @@ -76,7 +76,7 @@ For the provider `0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344` you can query the ```typescript await axios.get( - `https://fortuna-staging.dourolabs.app/v1/chains/${chainName}/revelations/${sequenceNumber}` + `https://fortuna-staging.dourolabs.app/v1/chains/${chainName}/revelations/${sequenceNumber}`, ); ``` @@ -133,7 +133,6 @@ contract MyContract is PRNG { PRNG(_seed); } } - ``` 2. Use the contract functions to generate random numbers: diff --git a/target_chains/ethereum/sdk/js/src/EvmPriceServiceConnection.ts b/target_chains/ethereum/sdk/js/src/EvmPriceServiceConnection.ts index 3272c86a67..b985c9a3b9 100644 --- a/target_chains/ethereum/sdk/js/src/EvmPriceServiceConnection.ts +++ b/target_chains/ethereum/sdk/js/src/EvmPriceServiceConnection.ts @@ -15,7 +15,7 @@ export class EvmPriceServiceConnection extends PriceServiceConnection { async getPriceFeedsUpdateData(priceIds: HexString[]): Promise { const latestVaas = await this.getLatestVaas(priceIds); return latestVaas.map( - (vaa) => "0x" + Buffer.from(vaa, "base64").toString("hex") + (vaa) => "0x" + Buffer.from(vaa, "base64").toString("hex"), ); } } diff --git a/target_chains/ethereum/sdk/js/src/examples/EvmBenchmark.ts b/target_chains/ethereum/sdk/js/src/examples/EvmBenchmark.ts index 6fcde0434b..b8ddf95861 100644 --- a/target_chains/ethereum/sdk/js/src/examples/EvmBenchmark.ts +++ b/target_chains/ethereum/sdk/js/src/examples/EvmBenchmark.ts @@ -69,7 +69,7 @@ async function run() { const [priceFeedUpdateVaa, updateTimestamp] = await connection.getVaa( priceId, - unixTimestamp + unixTimestamp, ); console.log(`Next pyth update was at: ${updateTimestamp}`); console.log(priceFeedUpdateVaa); @@ -82,7 +82,7 @@ async function run() { pythContractAddr, { from: provider.getAddress(0), - } + }, ); const updateFee = await pythContract.methods @@ -100,7 +100,7 @@ async function run() { // parsePriceFeedUpdates will reject any price update outside of the time window provided in the following // two arguments. Integrators can use this to specify the timestamp of the update they are expecting. unixTimestamp, - unixTimestamp + 5 + unixTimestamp + 5, ) .send({ value: updateFee }) .on("transactionHash", (hash: string) => { diff --git a/target_chains/ethereum/sdk/js/src/examples/EvmPriceServiceClient.ts b/target_chains/ethereum/sdk/js/src/examples/EvmPriceServiceClient.ts index 9e7d2be05a..3c24285ff2 100644 --- a/target_chains/ethereum/sdk/js/src/examples/EvmPriceServiceClient.ts +++ b/target_chains/ethereum/sdk/js/src/examples/EvmPriceServiceClient.ts @@ -47,8 +47,8 @@ async function run() { await connection.subscribePriceFeedUpdates(priceIds, (priceFeed) => { console.log( `Current price for ${priceFeed.id}: ${JSON.stringify( - priceFeed.getPriceNoOlderThan(60) - )}.` + priceFeed.getPriceNoOlderThan(60), + )}.`, ); }); diff --git a/target_chains/ethereum/sdk/js/src/examples/EvmRelay.ts b/target_chains/ethereum/sdk/js/src/examples/EvmRelay.ts index 1d51cd7f88..19582c9d38 100644 --- a/target_chains/ethereum/sdk/js/src/examples/EvmRelay.ts +++ b/target_chains/ethereum/sdk/js/src/examples/EvmRelay.ts @@ -62,9 +62,8 @@ async function run() { const priceFeeds = await connection.getLatestPriceFeeds(priceIds); console.log(priceFeeds); - const priceFeedUpdateData = await connection.getPriceFeedsUpdateData( - priceIds - ); + const priceFeedUpdateData = + await connection.getPriceFeedsUpdateData(priceIds); console.log(priceFeedUpdateData); const pythContract = new web3.eth.Contract( @@ -72,7 +71,7 @@ async function run() { pythContractAddr, { from: provider.getAddress(0), - } + }, ); const updateFee = await pythContract.methods @@ -110,7 +109,7 @@ async function run() { .getPriceNoOlderThan(priceId, 60) // 60 seconds staleness tolerance .call(); console.log( - `Updated ${priceId} to (${price} +- ${conf}) * 10^${expo} at unix timestamp ${publishTime}` + `Updated ${priceId} to (${price} +- ${conf}) * 10^${expo} at unix timestamp ${publishTime}`, ); } } diff --git a/target_chains/ethereum/sdk/solidity/README.md b/target_chains/ethereum/sdk/solidity/README.md index 1e489261e0..02992ba62e 100644 --- a/target_chains/ethereum/sdk/solidity/README.md +++ b/target_chains/ethereum/sdk/solidity/README.md @@ -68,7 +68,6 @@ contract ExampleContract { return pyth.getPriceNoOlderThan(priceID, 10); } } - ``` ## How Pyth Works on EVM Chains diff --git a/target_chains/fuel/sdk/js/src/examples/usage.ts b/target_chains/fuel/sdk/js/src/examples/usage.ts index 0bfa96c76a..88d63900ba 100644 --- a/target_chains/fuel/sdk/js/src/examples/usage.ts +++ b/target_chains/fuel/sdk/js/src/examples/usage.ts @@ -9,7 +9,7 @@ import { Provider, Wallet, Contract, hexlify, arrayify } from "fuels"; async function main() { // Create a provider for interacting with Fuel RPC const provider = await Provider.create( - "https://testnet.fuel.network/v1/graphql" + "https://testnet.fuel.network/v1/graphql", ); const privateKey = process.env.ACCOUNT_PRIVATE_KEY; if (privateKey === undefined) { @@ -21,7 +21,7 @@ async function main() { const contract = new Contract( PYTH_CONTRACT_ADDRESS_SEPOLIA, PYTH_CONTRACT_ABI, - wallet + wallet, ); const priceFeedSymbol = "Crypto.ETH/USD"; @@ -33,7 +33,7 @@ async function main() { console.log( `Previous price: ${ previousPrice.price.toNumber() * 10 ** -previousPrice.exponent - }` + }`, ); // Create a client for pulling price updates from Hermes. @@ -48,11 +48,11 @@ async function main() { `Current price from Hermes: ${ Number(priceUpdates.parsed?.[0].price.price) * 10 ** Number(priceUpdates.parsed?.[0].price.expo) - }` + }`, ); const priceFeedUpdateData = arrayify( - Buffer.from(priceUpdates.binary.data[0], "hex") + Buffer.from(priceUpdates.binary.data[0], "hex"), ); // Query the amount of update fee required @@ -74,7 +74,7 @@ async function main() { await contract.functions.price_no_older_than(60, priceFeedId).get() ).value; console.log( - `New price: ${newPrice.price.toNumber() * 10 ** -newPrice.exponent}` + `New price: ${newPrice.price.toNumber() * 10 ** -newPrice.exponent}`, ); } diff --git a/target_chains/fuel/sdk/js/src/types/PythContract.ts b/target_chains/fuel/sdk/js/src/types/PythContract.ts index a3fb24427c..5a0de83596 100644 --- a/target_chains/fuel/sdk/js/src/types/PythContract.ts +++ b/target_chains/fuel/sdk/js/src/types/PythContract.ts @@ -2226,7 +2226,7 @@ export class PythContract extends Contract { max_publish_time: BigNumberish, min_publish_time: BigNumberish, target_price_feed_ids: Vec, - update_data: Vec + update_data: Vec, ], Vec >; @@ -2242,7 +2242,7 @@ export class PythContract extends Contract { [ price_feed_ids: Vec, publish_times: Vec, - update_data: Vec + update_data: Vec, ], void >; @@ -2256,7 +2256,7 @@ export class PythContract extends Contract { valid_time_period_seconds: BigNumberish, wormhole_guardian_set_addresses: Vec, wormhole_guardian_set_index: BigNumberish, - chain_id: BigNumberish + chain_id: BigNumberish, ], void >; @@ -2285,7 +2285,7 @@ export class PythContract extends Contract { constructor( id: string | AbstractAddress, - accountOrProvider: Account | Provider + accountOrProvider: Account | Provider, ) { super(id, abi, accountOrProvider); } diff --git a/target_chains/fuel/sdk/js/src/types/PythContractFactory.ts b/target_chains/fuel/sdk/js/src/types/PythContractFactory.ts index 251ff10936..495d0028b7 100644 --- a/target_chains/fuel/sdk/js/src/types/PythContractFactory.ts +++ b/target_chains/fuel/sdk/js/src/types/PythContractFactory.ts @@ -19,7 +19,7 @@ import type { import { PythContract } from "./PythContract"; const bytecode = decompressBytecode( - "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", ); export class PythContractFactory extends ContractFactory { @@ -30,7 +30,7 @@ export class PythContractFactory extends ContractFactory { } override deploy( - deployOptions?: DeployContractOptions + deployOptions?: DeployContractOptions, ): Promise> { return super.deploy({ storageSlots: PythContract.storageSlots, @@ -40,7 +40,7 @@ export class PythContractFactory extends ContractFactory { static async deploy( wallet: Account, - options: DeployContractOptions = {} + options: DeployContractOptions = {}, ): Promise> { const factory = new PythContractFactory(wallet); return factory.deploy(options); diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/src/PythSolanaReceiver.ts b/target_chains/solana/sdk/js/pyth_solana_receiver/src/PythSolanaReceiver.ts index 3762b022e0..77caa75d78 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/src/PythSolanaReceiver.ts +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/src/PythSolanaReceiver.ts @@ -112,12 +112,12 @@ export class PythTransactionBuilder extends TransactionBuilder { constructor( pythSolanaReceiver: PythSolanaReceiver, config: PythTransactionBuilderConfig, - addressLookupTable?: AddressLookupTableAccount + addressLookupTable?: AddressLookupTableAccount, ) { super( pythSolanaReceiver.wallet.publicKey, pythSolanaReceiver.connection, - addressLookupTable + addressLookupTable, ); this.pythSolanaReceiver = pythSolanaReceiver; this.closeInstructions = []; @@ -151,13 +151,14 @@ export class PythTransactionBuilder extends TransactionBuilder { postInstructions, priceFeedIdToPriceUpdateAccount, closeInstructions, - } = await this.pythSolanaReceiver.buildPostPriceUpdateInstructions( - priceUpdateDataArray - ); + } = + await this.pythSolanaReceiver.buildPostPriceUpdateInstructions( + priceUpdateDataArray, + ); this.closeInstructions.push(...closeInstructions); Object.assign( this.priceFeedIdToPriceUpdateAccount, - priceFeedIdToPriceUpdateAccount + priceFeedIdToPriceUpdateAccount, ); this.addInstructions(postInstructions); } @@ -191,13 +192,14 @@ export class PythTransactionBuilder extends TransactionBuilder { postInstructions, priceFeedIdToPriceUpdateAccount, closeInstructions, - } = await this.pythSolanaReceiver.buildPostPriceUpdateAtomicInstructions( - priceUpdateDataArray - ); + } = + await this.pythSolanaReceiver.buildPostPriceUpdateAtomicInstructions( + priceUpdateDataArray, + ); this.closeInstructions.push(...closeInstructions); Object.assign( this.priceFeedIdToPriceUpdateAccount, - priceFeedIdToPriceUpdateAccount + priceFeedIdToPriceUpdateAccount, ); this.addInstructions(postInstructions); } @@ -227,13 +229,14 @@ export class PythTransactionBuilder extends TransactionBuilder { postInstructions, priceFeedIdToTwapUpdateAccount, closeInstructions, - } = await this.pythSolanaReceiver.buildPostTwapUpdateInstructions( - twapUpdateDataArray - ); + } = + await this.pythSolanaReceiver.buildPostTwapUpdateInstructions( + twapUpdateDataArray, + ); this.closeInstructions.push(...closeInstructions); Object.assign( this.priceFeedIdToTwapUpdateAccount, - priceFeedIdToTwapUpdateAccount + priceFeedIdToTwapUpdateAccount, ); this.addInstructions(postInstructions); } @@ -266,12 +269,12 @@ export class PythTransactionBuilder extends TransactionBuilder { closeInstructions, } = await this.pythSolanaReceiver.buildUpdatePriceFeedInstructions( priceUpdateDataArray, - shardId + shardId, ); this.closeInstructions.push(...closeInstructions); Object.assign( this.priceFeedIdToPriceUpdateAccount, - priceFeedIdToPriceUpdateAccount + priceFeedIdToPriceUpdateAccount, ); this.addInstructions(postInstructions); } @@ -308,11 +311,11 @@ export class PythTransactionBuilder extends TransactionBuilder { */ async addPriceConsumerInstructions( getInstructions: ( - getPriceUpdateAccount: (priceFeedId: string) => PublicKey - ) => Promise + getPriceUpdateAccount: (priceFeedId: string) => PublicKey, + ) => Promise, ) { this.addInstructions( - await getInstructions(this.getPriceUpdateAccount.bind(this)) + await getInstructions(this.getPriceUpdateAccount.bind(this)), ); } @@ -348,11 +351,11 @@ export class PythTransactionBuilder extends TransactionBuilder { */ async addTwapConsumerInstructions( getInstructions: ( - getTwapUpdateAccount: (priceFeedId: string) => PublicKey - ) => Promise + getTwapUpdateAccount: (priceFeedId: string) => PublicKey, + ) => Promise, ) { this.addInstructions( - await getInstructions(this.getTwapUpdateAccount.bind(this)) + await getInstructions(this.getTwapUpdateAccount.bind(this)), ); } @@ -363,8 +366,8 @@ export class PythTransactionBuilder extends TransactionBuilder { async addClosePreviousEncodedVaasInstructions(maxInstructions = 40) { this.addInstructions( await this.pythSolanaReceiver.buildClosePreviousEncodedVaasInstructions( - maxInstructions - ) + maxInstructions, + ), ); } @@ -372,7 +375,7 @@ export class PythTransactionBuilder extends TransactionBuilder { * Returns all the added instructions batched into versioned transactions, plus for each transaction the ephemeral signers that need to sign it */ async buildVersionedTransactions( - args: PriorityFeeConfig + args: PriorityFeeConfig, ): Promise<{ tx: VersionedTransaction; signers: Signer[] }[]> { if (this.closeUpdateAccounts) { this.addInstructions(this.closeInstructions); @@ -384,7 +387,7 @@ export class PythTransactionBuilder extends TransactionBuilder { * Returns all the added instructions batched into transactions, plus for each transaction the ephemeral signers that need to sign it */ buildLegacyTransactions( - args: PriorityFeeConfig + args: PriorityFeeConfig, ): { tx: Transaction; signers: Signer[] }[] { if (this.closeUpdateAccounts) { this.addInstructions(this.closeInstructions); @@ -401,7 +404,7 @@ export class PythTransactionBuilder extends TransactionBuilder { this.priceFeedIdToPriceUpdateAccount[priceFeedId]; if (!priceUpdateAccount) { throw new Error( - `No price update account found for the price feed ID ${priceFeedId}. Make sure to call addPostPriceUpdates or addPostPartiallyVerifiedPriceUpdates before calling this function.` + `No price update account found for the price feed ID ${priceFeedId}. Make sure to call addPostPriceUpdates or addPostPartiallyVerifiedPriceUpdates before calling this function.`, ); } return priceUpdateAccount; @@ -415,7 +418,7 @@ export class PythTransactionBuilder extends TransactionBuilder { const twapUpdateAccount = this.priceFeedIdToTwapUpdateAccount[priceFeedId]; if (!twapUpdateAccount) { throw new Error( - `No TWAP update account found for the price feed ID ${priceFeedId}. Make sure to call addPostTwapUpdates before calling this function.` + `No TWAP update account found for the price feed ID ${priceFeedId}. Make sure to call addPostTwapUpdates before calling this function.`, ); } return twapUpdateAccount; @@ -467,17 +470,17 @@ export class PythSolanaReceiver { this.receiver = new Program( Idl as PythSolanaReceiverProgram, receiverProgramId, - this.provider + this.provider, ); this.wormhole = new Program( WormholeCoreBridgeSolanaIdl as WormholeCoreBridgeSolana, wormholeProgramId, - this.provider + this.provider, ); this.pushOracle = new Program( PythPushOracleIdl as PythPushOracle, pushOracleProgramId, - this.provider + this.provider, ); this.treasuryId = treasuryId; } @@ -487,7 +490,7 @@ export class PythSolanaReceiver { */ newTransactionBuilder( config: PythTransactionBuilderConfig, - addressLookupAccount?: AddressLookupTableAccount + addressLookupAccount?: AddressLookupTableAccount, ): PythTransactionBuilder { return new PythTransactionBuilder(this, config, addressLookupAccount); } @@ -504,7 +507,7 @@ export class PythSolanaReceiver { * @returns `closeInstructions`: the instructions to close the price update accounts, these should be called after consuming the price updates */ async buildPostPriceUpdateAtomicInstructions( - priceUpdateDataArray: string[] + priceUpdateDataArray: string[], ): Promise<{ postInstructions: InstructionWithEphemeralSigners[]; priceFeedIdToPriceUpdateAccount: Record; @@ -518,7 +521,7 @@ export class PythSolanaReceiver { for (const priceUpdateData of priceUpdateDataArray) { const accumulatorUpdateData = parseAccumulatorUpdateData( - Buffer.from(priceUpdateData, "base64") + Buffer.from(priceUpdateData, "base64"), ); const guardianSetIndex = getGuardianSetIndex(accumulatorUpdateData.vaa); const trimmedVaa = trimSignatures(accumulatorUpdateData.vaa); @@ -538,7 +541,7 @@ export class PythSolanaReceiver { config: getConfigPda(this.receiver.programId), guardianSet: getGuardianSetPda( guardianSetIndex, - this.wormhole.programId + this.wormhole.programId, ), }) .instruction(), @@ -551,8 +554,8 @@ export class PythSolanaReceiver { closeInstructions.push( await this.buildClosePriceUpdateInstruction( - priceUpdateKeypair.publicKey - ) + priceUpdateKeypair.publicKey, + ), ); } } @@ -572,7 +575,7 @@ export class PythSolanaReceiver { * @returns `closeInstructions`: the instructions to close the price update accounts, these should be called after consuming the price updates */ async buildPostPriceUpdateInstructions( - priceUpdateDataArray: string[] + priceUpdateDataArray: string[], ): Promise<{ postInstructions: InstructionWithEphemeralSigners[]; priceFeedIdToPriceUpdateAccount: Record; @@ -586,7 +589,7 @@ export class PythSolanaReceiver { for (const priceUpdateData of priceUpdateDataArray) { const accumulatorUpdateData = parseAccumulatorUpdateData( - Buffer.from(priceUpdateData, "base64") + Buffer.from(priceUpdateData, "base64"), ); const { @@ -621,8 +624,8 @@ export class PythSolanaReceiver { ] = priceUpdateKeypair.publicKey; closeInstructions.push( await this.buildClosePriceUpdateInstruction( - priceUpdateKeypair.publicKey - ) + priceUpdateKeypair.publicKey, + ), ); } } @@ -643,7 +646,7 @@ export class PythSolanaReceiver { * @returns `closeInstructions`: the instructions to close the TWAP update accounts, these should be called after consuming the TWAP updates */ async buildPostTwapUpdateInstructions( - twapUpdateDataArray: string[] + twapUpdateDataArray: string[], ): Promise<{ postInstructions: InstructionWithEphemeralSigners[]; priceFeedIdToTwapUpdateAccount: Record; @@ -657,18 +660,18 @@ export class PythSolanaReceiver { if (twapUpdateDataArray.length !== 2) { throw new Error( - "twapUpdateDataArray must contain exactly two updates (start and end)" + "twapUpdateDataArray must contain exactly two updates (start and end)", ); } const [startUpdateData, endUpdateData] = twapUpdateDataArray.map((data) => - parseAccumulatorUpdateData(Buffer.from(data, "base64")) + parseAccumulatorUpdateData(Buffer.from(data, "base64")), ); // Validate that the start and end updates contain the same number of price feeds if (startUpdateData.updates.length !== endUpdateData.updates.length) { throw new Error( - "Start and end updates must contain the same number of price feeds" + "Start and end updates must contain the same number of price feeds", ); } @@ -681,7 +684,7 @@ export class PythSolanaReceiver { } = await buildPostEncodedVaasForTwapInstructions( this.wormhole, startUpdateData, - endUpdateData + endUpdateData, ); postInstructions.push(...buildVaasInstructions); closeInstructions.push(...closeVaasInstructions); @@ -715,7 +718,7 @@ export class PythSolanaReceiver { "0x" + parseTwapMessage(startUpdate.message).feedId.toString("hex") ] = twapUpdateKeypair.publicKey; closeInstructions.push( - await this.buildCloseTwapUpdateInstruction(twapUpdateKeypair.publicKey) + await this.buildCloseTwapUpdateInstruction(twapUpdateKeypair.publicKey), ); } @@ -737,7 +740,7 @@ export class PythSolanaReceiver { */ async buildUpdatePriceFeedInstructions( priceUpdateDataArray: string[], - shardId: number + shardId: number, ): Promise<{ postInstructions: InstructionWithEphemeralSigners[]; priceFeedIdToPriceUpdateAccount: Record; @@ -751,7 +754,7 @@ export class PythSolanaReceiver { for (const priceUpdateData of priceUpdateDataArray) { const accumulatorUpdateData = parseAccumulatorUpdateData( - Buffer.from(priceUpdateData, "base64") + Buffer.from(priceUpdateData, "base64"), ); const { @@ -772,14 +775,14 @@ export class PythSolanaReceiver { treasuryId, }, shardId, - Array.from(feedId) + Array.from(feedId), ) .accounts({ pythSolanaReceiver: this.receiver.programId, encodedVaa, priceFeedAccount: this.getPriceFeedAccountAddress( shardId, - feedId + feedId, ), treasury: getTreasuryPda(treasuryId, this.receiver.programId), config: getConfigPda(this.receiver.programId), @@ -821,7 +824,7 @@ export class PythSolanaReceiver { * Build an instruction to close an encoded VAA account, recovering the rent. */ async buildCloseEncodedVaaInstruction( - encodedVaa: PublicKey + encodedVaa: PublicKey, ): Promise { return buildCloseEncodedVaaInstruction(this.wormhole, encodedVaa); } @@ -830,7 +833,7 @@ export class PythSolanaReceiver { * Build aset of instructions to close all the existing encoded VAA accounts owned by this PythSolanaReceiver's wallet */ async buildClosePreviousEncodedVaasInstructions( - maxInstructions: number + maxInstructions: number, ): Promise { const encodedVaas = await this.findOwnedEncodedVaaAccounts(); const instructions = []; @@ -844,7 +847,7 @@ export class PythSolanaReceiver { * Build an instruction to close a price update account, recovering the rent. */ async buildClosePriceUpdateInstruction( - priceUpdateAccount: PublicKey + priceUpdateAccount: PublicKey, ): Promise { const instruction = await this.receiver.methods .reclaimRent() @@ -857,7 +860,7 @@ export class PythSolanaReceiver { * Build an instruction to close a TWAP update account, recovering the rent. */ async buildCloseTwapUpdateInstruction( - twapUpdateAccount: PublicKey + twapUpdateAccount: PublicKey, ): Promise { const instruction = await this.receiver.methods .reclaimTwapRent() @@ -872,14 +875,14 @@ export class PythSolanaReceiver { async batchIntoVersionedTransactions( instructions: InstructionWithEphemeralSigners[], priorityFeeConfig: PriorityFeeConfig, - addressLookupTable?: AddressLookupTableAccount + addressLookupTable?: AddressLookupTableAccount, ): Promise<{ tx: VersionedTransaction; signers: Signer[] }[]> { return TransactionBuilder.batchIntoVersionedTransactions( this.wallet.publicKey, this.connection, instructions, priorityFeeConfig, - addressLookupTable + addressLookupTable, ); } @@ -889,10 +892,10 @@ export class PythSolanaReceiver { * @returns The contents of the deserialized price update account or `null` if the account doesn't exist */ async fetchPriceUpdateAccount( - priceUpdateAccount: PublicKey + priceUpdateAccount: PublicKey, ): Promise { return this.receiver.account.priceUpdateV2.fetchNullable( - priceUpdateAccount + priceUpdateAccount, ); } @@ -904,10 +907,10 @@ export class PythSolanaReceiver { */ async fetchPriceFeedAccount( shardId: number, - priceFeedId: Buffer | string + priceFeedId: Buffer | string, ): Promise { return this.receiver.account.priceUpdateV2.fetchNullable( - this.getPriceFeedAccountAddress(shardId, priceFeedId) + this.getPriceFeedAccountAddress(shardId, priceFeedId), ); } @@ -919,12 +922,12 @@ export class PythSolanaReceiver { */ getPriceFeedAccountAddress( shardId: number, - priceFeedId: Buffer | string + priceFeedId: Buffer | string, ): PublicKey { return getPriceFeedAccountForProgram( shardId, priceFeedId, - this.pushOracle.programId + this.pushOracle.programId, ); } @@ -936,7 +939,7 @@ export class PythSolanaReceiver { return await findEncodedVaaAccountsByWriteAuthority( this.receiver.provider.connection, this.wallet.publicKey, - this.wormhole.programId + this.wormhole.programId, ); } } @@ -951,7 +954,7 @@ export class PythSolanaReceiver { export function getPriceFeedAccountForProgram( shardId: number, priceFeedId: Buffer | string, - pushOracleProgramId?: PublicKey + pushOracleProgramId?: PublicKey, ): PublicKey { if (typeof priceFeedId == "string") { if (priceFeedId.startsWith("0x")) { @@ -969,6 +972,6 @@ export function getPriceFeedAccountForProgram( return PublicKey.findProgramAddressSync( [shardBuffer, priceFeedId], - pushOracleProgramId ?? DEFAULT_PUSH_ORACLE_PROGRAM_ID + pushOracleProgramId ?? DEFAULT_PUSH_ORACLE_PROGRAM_ID, )[0]; } diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/src/address.ts b/target_chains/solana/sdk/js/pyth_solana_receiver/src/address.ts index 79580e95e2..4ce970c0f6 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/src/address.ts +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/src/address.ts @@ -5,18 +5,18 @@ import { PublicKey } from "@solana/web3.js"; * The program is deployed at this address on all SVM networks. */ export const DEFAULT_RECEIVER_PROGRAM_ID = new PublicKey( - "rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ" + "rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ", ); /** * The default Wormhole program ID. * The program is deployed at this address on all SVM networks. */ export const DEFAULT_WORMHOLE_PROGRAM_ID = new PublicKey( - "HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ" + "HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ", ); export const DEFAULT_PUSH_ORACLE_PROGRAM_ID = new PublicKey( - "pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT" + "pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT", ); /** @@ -24,13 +24,13 @@ export const DEFAULT_PUSH_ORACLE_PROGRAM_ID = new PublicKey( */ export const getGuardianSetPda = ( guardianSetIndex: number, - wormholeProgramId: PublicKey + wormholeProgramId: PublicKey, ) => { const guardianSetIndexBuf = Buffer.alloc(4); guardianSetIndexBuf.writeUInt32BE(guardianSetIndex, 0); return PublicKey.findProgramAddressSync( [Buffer.from("GuardianSet"), guardianSetIndexBuf], - wormholeProgramId + wormholeProgramId, )[0]; }; @@ -47,11 +47,11 @@ export function getRandomTreasuryId() { */ export const getTreasuryPda = ( treasuryId: number, - receiverProgramId: PublicKey + receiverProgramId: PublicKey, ) => { return PublicKey.findProgramAddressSync( [Buffer.from("treasury"), Buffer.from([treasuryId])], - receiverProgramId + receiverProgramId, )[0]; }; @@ -61,6 +61,6 @@ export const getTreasuryPda = ( export const getConfigPda = (receiverProgramId: PublicKey) => { return PublicKey.findProgramAddressSync( [Buffer.from("config")], - receiverProgramId + receiverProgramId, )[0]; }; diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_push_oracle.ts b/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_push_oracle.ts index 3ebe124d4a..b3f58dd1a2 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_push_oracle.ts +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_push_oracle.ts @@ -39,7 +39,7 @@ export type PythPushOracle = { name: "systemProgram"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -57,9 +57,9 @@ export type PythPushOracle = { type: { array: ["u8", 32]; }; - } + }, ]; - } + }, ]; types: [ { @@ -76,7 +76,7 @@ export type PythPushOracle = { { name: "treasuryId"; type: "u8"; - } + }, ]; }; }, @@ -96,10 +96,10 @@ export type PythPushOracle = { array: ["u8", 20]; }; }; - } + }, ]; }; - } + }, ]; errors: [ { @@ -111,7 +111,7 @@ export type PythPushOracle = { code: 6001; name: "PriceFeedMessageMismatch"; msg: "Trying to update price feed with the wrong feed id"; - } + }, ]; }; diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_solana_receiver.ts b/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_solana_receiver.ts index 5d8e0de72a..9be798c6c6 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_solana_receiver.ts +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/pyth_solana_receiver.ts @@ -19,7 +19,7 @@ export type PythSolanaReceiver = { name: "systemProgram"; isMut: false; isSigner: false; - } + }, ]; args: [ { @@ -27,7 +27,7 @@ export type PythSolanaReceiver = { type: { defined: "Config"; }; - } + }, ]; }, { @@ -42,13 +42,13 @@ export type PythSolanaReceiver = { name: "config"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "targetGovernanceAuthority"; type: "publicKey"; - } + }, ]; }, { @@ -63,7 +63,7 @@ export type PythSolanaReceiver = { name: "config"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -79,7 +79,7 @@ export type PythSolanaReceiver = { name: "config"; isMut: true; isSigner: false; - } + }, ]; args: [ { @@ -89,7 +89,7 @@ export type PythSolanaReceiver = { defined: "DataSource"; }; }; - } + }, ]; }, { @@ -104,13 +104,13 @@ export type PythSolanaReceiver = { name: "config"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "singleUpdateFeeInLamports"; type: "u64"; - } + }, ]; }, { @@ -125,13 +125,13 @@ export type PythSolanaReceiver = { name: "config"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "wormhole"; type: "publicKey"; - } + }, ]; }, { @@ -146,13 +146,13 @@ export type PythSolanaReceiver = { name: "config"; isMut: true; isSigner: false; - } + }, ]; args: [ { name: "minimumSignatures"; type: "u8"; - } + }, ]; }, { @@ -161,7 +161,7 @@ export type PythSolanaReceiver = { "Post a price update using a VAA and a MerklePriceUpdate.", "This function allows you to post a price update in a single transaction.", "Compared to post_update, it is less secure since you won't be able to verify all guardian signatures if you use this function because of transaction size limitations.", - "Typically, you can fit 5 guardian signatures in a transaction that uses this." + "Typically, you can fit 5 guardian signatures in a transaction that uses this.", ]; accounts: [ { @@ -174,7 +174,7 @@ export type PythSolanaReceiver = { isMut: false; isSigner: false; docs: [ - "Instead we do the same steps in deserialize_guardian_set_checked." + "Instead we do the same steps in deserialize_guardian_set_checked.", ]; }, { @@ -193,7 +193,7 @@ export type PythSolanaReceiver = { isSigner: true; docs: [ "The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.", - "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized" + "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized", ]; }, { @@ -205,7 +205,7 @@ export type PythSolanaReceiver = { name: "writeAuthority"; isMut: false; isSigner: true; - } + }, ]; args: [ { @@ -213,7 +213,7 @@ export type PythSolanaReceiver = { type: { defined: "PostUpdateAtomicParams"; }; - } + }, ]; }, { @@ -221,7 +221,7 @@ export type PythSolanaReceiver = { docs: [ "Post a price update using an encoded_vaa account and a MerklePriceUpdate calldata.", "This should be called after the client has already verified the Vaa via the Wormhole contract.", - "Check out target_chains/solana/cli/src/main.rs for an example of how to do this." + "Check out target_chains/solana/cli/src/main.rs for an example of how to do this.", ]; accounts: [ { @@ -250,7 +250,7 @@ export type PythSolanaReceiver = { isSigner: true; docs: [ "The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.", - "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized" + "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized", ]; }, { @@ -262,7 +262,7 @@ export type PythSolanaReceiver = { name: "writeAuthority"; isMut: false; isSigner: true; - } + }, ]; args: [ { @@ -270,7 +270,7 @@ export type PythSolanaReceiver = { type: { defined: "PostUpdateParams"; }; - } + }, ]; }, { @@ -278,7 +278,7 @@ export type PythSolanaReceiver = { docs: [ "Post a TWAP (time weighted average price) update for a given time window.", "This should be called after the client has already verified the VAAs via the Wormhole contract.", - "Check out target_chains/solana/cli/src/main.rs for an example of how to do this." + "Check out target_chains/solana/cli/src/main.rs for an example of how to do this.", ]; accounts: [ { @@ -312,7 +312,7 @@ export type PythSolanaReceiver = { isSigner: true; docs: [ "The contraint is such that either the twap_update_account is uninitialized or the write_authority is the write_authority.", - "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that twap_update_account.write_authority == Pubkey::default() once the account is initialized" + "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that twap_update_account.write_authority == Pubkey::default() once the account is initialized", ]; }, { @@ -324,7 +324,7 @@ export type PythSolanaReceiver = { name: "writeAuthority"; isMut: false; isSigner: true; - } + }, ]; args: [ { @@ -332,7 +332,7 @@ export type PythSolanaReceiver = { type: { defined: "PostTwapUpdateParams"; }; - } + }, ]; }, { @@ -347,7 +347,7 @@ export type PythSolanaReceiver = { name: "priceUpdateAccount"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -363,10 +363,10 @@ export type PythSolanaReceiver = { name: "twapUpdateAccount"; isMut: true; isSigner: false; - } + }, ]; args: []; - } + }, ]; accounts: [ { @@ -403,7 +403,7 @@ export type PythSolanaReceiver = { { name: "minimumSignatures"; type: "u8"; - } + }, ]; }; }, @@ -431,7 +431,7 @@ export type PythSolanaReceiver = { { name: "postedSlot"; type: "u64"; - } + }, ]; }; }, @@ -449,10 +449,10 @@ export type PythSolanaReceiver = { type: { defined: "TwapPrice"; }; - } + }, ]; }; - } + }, ]; types: [ { @@ -493,7 +493,7 @@ export type PythSolanaReceiver = { { name: "emaConf"; type: "u64"; - } + }, ]; }; }, @@ -501,7 +501,7 @@ export type PythSolanaReceiver = { name: "TwapPrice"; docs: [ "The time weighted average price & conf for a feed over the window [start_time, end_time].", - "This type is used to persist the calculated TWAP in TwapUpdate accounts on Solana." + "This type is used to persist the calculated TWAP in TwapUpdate accounts on Solana.", ]; type: { kind: "struct"; @@ -536,10 +536,10 @@ export type PythSolanaReceiver = { name: "downSlotsRatio"; docs: [ "Ratio out of 1_000_000, where a value of 1_000_000 represents", - "all slots were missed and 0 represents no slots were missed." + "all slots were missed and 0 represents no slots were missed.", ]; type: "u32"; - } + }, ]; }; }, @@ -559,7 +559,7 @@ export type PythSolanaReceiver = { array: ["u8", 20]; }; }; - } + }, ]; }; }, @@ -575,7 +575,7 @@ export type PythSolanaReceiver = { { name: "emitter"; type: "publicKey"; - } + }, ]; }; }, @@ -597,7 +597,7 @@ export type PythSolanaReceiver = { { name: "treasuryId"; type: "u8"; - } + }, ]; }; }, @@ -615,7 +615,7 @@ export type PythSolanaReceiver = { { name: "treasuryId"; type: "u8"; - } + }, ]; }; }, @@ -639,14 +639,14 @@ export type PythSolanaReceiver = { { name: "treasuryId"; type: "u8"; - } + }, ]; }; }, { name: "VerificationLevel"; docs: [ - "* This enum represents how many guardian signatures were checked for a Pythnet price update\n * If full, guardian quorum has been attained\n * If partial, at least config.minimum signatures have been verified, but in the case config.minimum_signatures changes in the future we also include the number of signatures that were checked" + "* This enum represents how many guardian signatures were checked for a Pythnet price update\n * If full, guardian quorum has been attained\n * If partial, at least config.minimum signatures have been verified, but in the case config.minimum_signatures changes in the future we also include the number of signatures that were checked", ]; type: { kind: "enum"; @@ -657,15 +657,15 @@ export type PythSolanaReceiver = { { name: "numSignatures"; type: "u8"; - } + }, ]; }, { name: "Full"; - } + }, ]; }; - } + }, ]; errors: [ { @@ -777,7 +777,7 @@ export type PythSolanaReceiver = { code: 6021; name: "NonexistentGovernanceAuthorityTransferRequest"; msg: "The governance authority needs to request a transfer first"; - } + }, ]; }; diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/wormhole_core_bridge_solana.ts b/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/wormhole_core_bridge_solana.ts index 55c5edeb06..7b2413d14d 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/wormhole_core_bridge_solana.ts +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/src/idl/wormhole_core_bridge_solana.ts @@ -28,7 +28,7 @@ export type WormholeCoreBridgeSolana = { defined: "usize"; }; value: "30 * 1_024"; - } + }, ]; instructions: [ { @@ -49,7 +49,7 @@ export type WormholeCoreBridgeSolana = { "", "NOTE: If you wish to publish a small message (one where the data does not overflow the", "Solana transaction size), it is recommended that you use an [sdk](crate::sdk::cpi) method to", - "either prepare your message or post a message as a program ID emitter." + "either prepare your message or post a message as a program ID emitter.", ]; accounts: [ { @@ -57,7 +57,7 @@ export type WormholeCoreBridgeSolana = { isMut: false; isSigner: true; docs: [ - "This authority is the only one who can write to the draft message account." + "This authority is the only one who can write to the draft message account.", ]; }, { @@ -65,7 +65,7 @@ export type WormholeCoreBridgeSolana = { isMut: true; isSigner: false; docs: ["Bridge."]; - } + }, ]; args: [ { @@ -73,7 +73,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "InitMessageV1Args"; }; - } + }, ]; }, { @@ -81,7 +81,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Processor used to write to a draft [PostedMessageV1](crate::state::PostedMessageV1) account.", "This instruction requires an authority (the emitter authority) to interact with the message", - "account." + "account.", ]; accounts: [ { @@ -94,7 +94,7 @@ export type WormholeCoreBridgeSolana = { isMut: true; isSigner: false; docs: ["only be published when the message is finalized."]; - } + }, ]; args: [ { @@ -102,7 +102,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "WriteMessageV1Args"; }; - } + }, ]; }, { @@ -112,7 +112,7 @@ export type WormholeCoreBridgeSolana = { "Once finalized, this message account cannot be written to again. A finalized message is the", "only state the legacy post message instruction can accept before publishing. This", "instruction requires an authority (the emitter authority) to interact with the message", - "account." + "account.", ]; accounts: [ { @@ -125,7 +125,7 @@ export type WormholeCoreBridgeSolana = { isMut: true; isSigner: false; docs: ["only be published when the message is finalized."]; - } + }, ]; args: []; }, @@ -134,7 +134,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Processor used to process a draft [PostedMessageV1](crate::state::PostedMessageV1) account.", "This instruction requires an authority (the emitter authority) to interact with the message", - "account." + "account.", ]; accounts: [ { @@ -152,7 +152,7 @@ export type WormholeCoreBridgeSolana = { name: "closeAccountDestination"; isMut: true; isSigner: false; - } + }, ]; args: []; }, @@ -160,7 +160,7 @@ export type WormholeCoreBridgeSolana = { name: "initEncodedVaa"; docs: [ "Processor used to intialize a created account as [EncodedVaa](crate::state::EncodedVaa). An", - "authority (the write authority) is established with this instruction." + "authority (the write authority) is established with this instruction.", ]; accounts: [ { @@ -168,7 +168,7 @@ export type WormholeCoreBridgeSolana = { isMut: false; isSigner: true; docs: [ - "The authority who can write to the VAA account when it is being processed." + "The authority who can write to the VAA account when it is being processed.", ]; }, { @@ -176,7 +176,7 @@ export type WormholeCoreBridgeSolana = { isMut: true; isSigner: false; docs: ["Bridge."]; - } + }, ]; args: []; }, @@ -184,7 +184,7 @@ export type WormholeCoreBridgeSolana = { name: "closeEncodedVaa"; docs: [ "Processor used to close an [EncodedVaa](crate::state::EncodedVaa). This instruction requires", - "an authority (the write authority) to interact witht he encoded VAA account." + "an authority (the write authority) to interact witht he encoded VAA account.", ]; accounts: [ { @@ -194,7 +194,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "This account is only required to be mutable for the `CloseVaaAccount` directive. This", "authority is the same signer that originally created the VAA accounts, so he is the one that", - "will receive the lamports back for the closed accounts." + "will receive the lamports back for the closed accounts.", ]; }, { @@ -202,7 +202,7 @@ export type WormholeCoreBridgeSolana = { isMut: true; isSigner: false; docs: ["written to and then verified."]; - } + }, ]; args: []; }, @@ -211,7 +211,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Processor used to write to an [EncodedVaa](crate::state::EncodedVaa) account. This", "instruction requires an authority (the write authority) to interact with the encoded VAA", - "account." + "account.", ]; accounts: [ { @@ -219,7 +219,7 @@ export type WormholeCoreBridgeSolana = { isMut: false; isSigner: true; docs: [ - "The only authority that can write to the encoded VAA account." + "The only authority that can write to the encoded VAA account.", ]; }, { @@ -227,7 +227,7 @@ export type WormholeCoreBridgeSolana = { isMut: true; isSigner: false; docs: ["written to and then verified."]; - } + }, ]; args: [ { @@ -235,7 +235,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "WriteEncodedVaaArgs"; }; - } + }, ]; }, { @@ -243,7 +243,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Processor used to verify an [EncodedVaa](crate::state::EncodedVaa) account as a version 1", "VAA (guardian signatures attesting to this observation). This instruction requires an", - "authority (the write authority) to interact with the encoded VAA account." + "authority (the write authority) to interact with the encoded VAA account.", ]; accounts: [ { @@ -263,9 +263,9 @@ export type WormholeCoreBridgeSolana = { isSigner: false; docs: [ "Guardian set account, which should be the same one that was used to attest for the VAA. The", - "signatures in the encoded VAA are verified against this guardian set." + "signatures in the encoded VAA are verified against this guardian set.", ]; - } + }, ]; args: []; }, @@ -277,7 +277,7 @@ export type WormholeCoreBridgeSolana = { "", "NOTE: Because the legacy verify signatures instruction was not required for the Posted VAA", "account to exist, the encoded [SignatureSet](crate::state::SignatureSet) is the default", - "[Pubkey]." + "[Pubkey].", ]; accounts: [ { @@ -286,7 +286,7 @@ export type WormholeCoreBridgeSolana = { isSigner: true; docs: [ "Payer to create the posted VAA account. This instruction allows anyone with an encoded VAA", - "to create a posted VAA account." + "to create a posted VAA account.", ]; }, { @@ -301,7 +301,7 @@ export type WormholeCoreBridgeSolana = { "allow a pathway to convert the encoded VAA into a posted VAA. However, the payload is", "restricted to 9.5KB, which is much larger than what was possible with the old implementation", "using the legacy post vaa instruction. The Core Bridge program will not support posting VAAs", - "larger than this payload size." + "larger than this payload size.", ]; }, { @@ -313,7 +313,7 @@ export type WormholeCoreBridgeSolana = { name: "systemProgram"; isMut: false; isSigner: false; - } + }, ]; args: []; }, @@ -321,7 +321,7 @@ export type WormholeCoreBridgeSolana = { name: "closeSignatureSet"; docs: [ "Processor used to close a [SignatureSet](crate::state::SignatureSet), which was used to", - "verify the VAA using the legacy parse and verify procedure." + "verify the VAA using the legacy parse and verify procedure.", ]; accounts: [ { @@ -342,12 +342,12 @@ export type WormholeCoreBridgeSolana = { docs: [ "Signature set that may have been used to create the posted VAA account. If the `post_vaa_v1`", "instruction were used to create the posted VAA account, then the encoded signature set", - "pubkey would be all zeroes." + "pubkey would be all zeroes.", ]; - } + }, ]; args: []; - } + }, ]; accounts: [ { @@ -361,7 +361,7 @@ export type WormholeCoreBridgeSolana = { "NOTE: The account schema is the same as legacy guardian sets, but this account now has a", "discriminator generated by Anchor's [account] macro. When the Core Bridge program performs a", "guardian set update with this implementation, guardian sets will now have this Anchor-generated", - "discriminator." + "discriminator.", ]; type: { kind: "struct"; @@ -369,7 +369,7 @@ export type WormholeCoreBridgeSolana = { { name: "index"; docs: [ - "Index representing an incrementing version number for this guardian set." + "Index representing an incrementing version number for this guardian set.", ]; type: "u32"; }, @@ -385,7 +385,7 @@ export type WormholeCoreBridgeSolana = { { name: "creationTime"; docs: [ - "Timestamp representing the time this guardian became active." + "Timestamp representing the time this guardian became active.", ]; type: { defined: "Timestamp"; @@ -394,12 +394,12 @@ export type WormholeCoreBridgeSolana = { { name: "expirationTime"; docs: [ - "Expiration time when VAAs issued by this set are no longer valid." + "Expiration time when VAAs issued by this set are no longer valid.", ]; type: { defined: "Timestamp"; }; - } + }, ]; }; }, @@ -414,7 +414,7 @@ export type WormholeCoreBridgeSolana = { "NOTE: The account schema is the same as legacy signature sets, but this account now has a", "discriminator generated by Anchor's [account] macro. When the Core Bridge program upgrades to", "this implementation from the old one, integrators in the middle of verifying signatures will", - "have to use a new keypair for this account and try again." + "have to use a new keypair for this account and try again.", ]; type: { kind: "struct"; @@ -437,7 +437,7 @@ export type WormholeCoreBridgeSolana = { name: "guardianSetIndex"; docs: ["Index of the guardian set"]; type: "u32"; - } + }, ]; }; }, @@ -447,7 +447,7 @@ export type WormholeCoreBridgeSolana = { "Account used to warehouse VAA buffer.", "", "NOTE: This account should not be used by an external application unless the header's status is", - "`Verified`. It is encouraged to use the `EncodedVaa` zero-copy account struct instead." + "`Verified`. It is encouraged to use the `EncodedVaa` zero-copy account struct instead.", ]; type: { kind: "struct"; @@ -463,10 +463,10 @@ export type WormholeCoreBridgeSolana = { name: "buf"; docs: ["VAA buffer."]; type: "bytes"; - } + }, ]; }; - } + }, ]; types: [ { @@ -490,7 +490,7 @@ export type WormholeCoreBridgeSolana = { array: ["u8", 20]; }; }; - } + }, ]; }; }, @@ -499,7 +499,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Arguments used to post a new Wormhole (Core Bridge) message either using", "[post_message](crate::legacy::instruction::post_message) or", - "[post_message_unreliable](crate::legacy::instruction::post_message_unreliable)." + "[post_message_unreliable](crate::legacy::instruction::post_message_unreliable).", ]; type: { kind: "struct"; @@ -520,7 +520,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "Commitment"; }; - } + }, ]; }; }, @@ -531,7 +531,7 @@ export type WormholeCoreBridgeSolana = { "", "NOTE: It is preferred to use the new process of verifying a VAA using the new Core Bridge Anchor", "instructions. See [init_encoded_vaa](crate::wormhole_core_bridge_solana::init_encoded_vaa) and", - "[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info." + "[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info.", ]; type: { kind: "struct"; @@ -556,7 +556,7 @@ export type WormholeCoreBridgeSolana = { { name: "emitterChain"; docs: [ - "The Wormhole chain ID denoting the origin of this message." + "The Wormhole chain ID denoting the origin of this message.", ]; type: "u16"; }, @@ -581,7 +581,7 @@ export type WormholeCoreBridgeSolana = { name: "payload"; docs: ["Message payload."]; type: "bytes"; - } + }, ]; }; }, @@ -592,7 +592,7 @@ export type WormholeCoreBridgeSolana = { "", "NOTE: It is preferred to use the new process of verifying a VAA using the new Core Bridge Anchor", "instructions. See [init_encoded_vaa](crate::wormhole_core_bridge_solana::init_encoded_vaa) and", - "[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info." + "[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info.", ]; type: { kind: "struct"; @@ -606,12 +606,12 @@ export type WormholeCoreBridgeSolana = { "", "NOTE: In the legacy implementation, this argument being a fixed-sized array of 19 only", "allows the first 19 guardians of any size guardian set to be verified. Because of this, it", - "is absolutely important to use the new process of verifying a VAA." + "is absolutely important to use the new process of verifying a VAA.", ]; type: { array: ["i8", 19]; }; - } + }, ]; }; }, @@ -628,7 +628,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Account used to store the current configuration of the bridge, including tracking Wormhole fee", "payments. For governance decrees, the guardian set index is used to determine whether a decree", - "was attested for using the latest guardian set." + "was attested for using the latest guardian set.", ]; type: { kind: "struct"; @@ -636,7 +636,7 @@ export type WormholeCoreBridgeSolana = { { name: "guardianSetIndex"; docs: [ - "The current guardian set index, used to decide which signature sets to accept." + "The current guardian set index, used to decide which signature sets to accept.", ]; type: "u32"; }, @@ -644,7 +644,7 @@ export type WormholeCoreBridgeSolana = { name: "gap0"; docs: [ "Gap. In the old implementation, this was an amount that kept track of message fees that", - "were paid to the program's fee collector." + "were paid to the program's fee collector.", ]; type: { array: ["u8", 8]; @@ -655,7 +655,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "Period for how long a guardian set is valid after it has been replaced by a new one. This", "guarantees that VAAs issued by that set can still be submitted for a certain period. In", - "this period we still trust the old guardian set." + "this period we still trust the old guardian set.", ]; type: { defined: "Duration"; @@ -664,17 +664,17 @@ export type WormholeCoreBridgeSolana = { { name: "feeLamports"; docs: [ - "Amount of lamports that needs to be paid to the protocol to post a message" + "Amount of lamports that needs to be paid to the protocol to post a message", ]; type: "u64"; - } + }, ]; }; }, { name: "LegacyEmitterSequence"; docs: [ - "Account used to store the current sequence number for a given emitter." + "Account used to store the current sequence number for a given emitter.", ]; type: { kind: "struct"; @@ -682,10 +682,10 @@ export type WormholeCoreBridgeSolana = { { name: "value"; docs: [ - "Current sequence number, which will be used the next time this emitter publishes a message." + "Current sequence number, which will be used the next time this emitter publishes a message.", ]; type: "u64"; - } + }, ]; }; }, @@ -709,7 +709,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "EmitterType"; }; - } + }, ]; }; }, @@ -724,14 +724,14 @@ export type WormholeCoreBridgeSolana = { type: { defined: "PostedMessageV1Data"; }; - } + }, ]; }; }, { name: "PostedMessageV1Info"; docs: [ - "Message metadata defining information about a published Wormhole message." + "Message metadata defining information about a published Wormhole message.", ]; type: { kind: "struct"; @@ -745,7 +745,7 @@ export type WormholeCoreBridgeSolana = { name: "emitterAuthority"; docs: [ "Authority used to write the message. This field is set to default when the message is", - "posted." + "posted.", ]; type: "publicKey"; }, @@ -755,7 +755,7 @@ export type WormholeCoreBridgeSolana = { "If a message is being written to, this status is used to determine which state this", "account is in (e.g. [MessageStatus::Writing] indicates that the emitter authority is still", "writing its message to this account). When this message is posted, this value will be", - "set to [MessageStatus::Published]." + "set to [MessageStatus::Published].", ]; type: { defined: "MessageStatus"; @@ -791,7 +791,7 @@ export type WormholeCoreBridgeSolana = { "Always `1`.", "", "NOTE: Saving this value is silly, but we are keeping it to be consistent with how the posted", - "message account is written." + "message account is written.", ]; type: { defined: "ChainIdSolanaOnly"; @@ -800,10 +800,10 @@ export type WormholeCoreBridgeSolana = { { name: "emitter"; docs: [ - "Emitter of the message. This may either be the emitter authority or a program ID." + "Emitter of the message. This may either be the emitter authority or a program ID.", ]; type: "publicKey"; - } + }, ]; }; }, @@ -811,7 +811,7 @@ export type WormholeCoreBridgeSolana = { name: "PostedMessageV1Data"; docs: [ "Underlying data for either [PostedMessageV1](crate::legacy::state::PostedMessageV1) or", - "[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable)." + "[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable).", ]; type: { kind: "struct"; @@ -827,7 +827,7 @@ export type WormholeCoreBridgeSolana = { name: "payload"; docs: ["Encoded message."]; type: "bytes"; - } + }, ]; }; }, @@ -837,7 +837,7 @@ export type WormholeCoreBridgeSolana = { "Account used to store a published Wormhole message.", "", "NOTE: If your integration requires reusable message accounts, please see", - "[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable)." + "[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable).", ]; type: { kind: "struct"; @@ -848,7 +848,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "PostedMessageV1Data"; }; - } + }, ]; }; }, @@ -856,7 +856,7 @@ export type WormholeCoreBridgeSolana = { name: "PostedVaaV1Info"; docs: [ "VAA metadata defining information about a Wormhole message attested for by an active guardian", - "set." + "set.", ]; type: { kind: "struct"; @@ -877,7 +877,7 @@ export type WormholeCoreBridgeSolana = { name: "signatureSet"; docs: [ "Pubkey of [SignatureSet](crate::state::SignatureSet) account that represents this VAA's", - "signature verification." + "signature verification.", ]; type: "publicKey"; }, @@ -890,7 +890,7 @@ export type WormholeCoreBridgeSolana = { "which is zero for VAA data (posted messages and VAAs resemble the same account schema). By", "changing this to the guardian set index, we patch a bug with verifying governance VAAs for", "the Core Bridge (other Core Bridge implementations require that the guardian set that", - "attested for the governance VAA is the current one)." + "attested for the governance VAA is the current one).", ]; type: "u32"; }, @@ -907,7 +907,7 @@ export type WormholeCoreBridgeSolana = { { name: "emitterChain"; docs: [ - "The Wormhole chain ID denoting the origin of this message." + "The Wormhole chain ID denoting the origin of this message.", ]; type: "u16"; }, @@ -917,7 +917,7 @@ export type WormholeCoreBridgeSolana = { type: { array: ["u8", 32]; }; - } + }, ]; }; }, @@ -938,7 +938,7 @@ export type WormholeCoreBridgeSolana = { name: "payload"; docs: ["Message payload."]; type: "bytes"; - } + }, ]; }; }, @@ -946,7 +946,7 @@ export type WormholeCoreBridgeSolana = { name: "WriteEncodedVaaArgs"; docs: [ "Arguments for the [write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa)", - "instruction." + "instruction.", ]; type: { kind: "struct"; @@ -959,10 +959,10 @@ export type WormholeCoreBridgeSolana = { { name: "data"; docs: [ - "Data representing subset of VAA buffer starting at specified index." + "Data representing subset of VAA buffer starting at specified index.", ]; type: "bytes"; - } + }, ]; }; }, @@ -970,7 +970,7 @@ export type WormholeCoreBridgeSolana = { name: "InitMessageV1Args"; docs: [ "Arguments for the [init_message_v1](crate::wormhole_core_bridge_solana::init_message_v1)", - "instruction." + "instruction.", ]; type: { kind: "struct"; @@ -992,12 +992,12 @@ export type WormholeCoreBridgeSolana = { docs: [ "Optional program ID if the emitter address will be your program ID.", "", - 'NOTE: If `Some(program_id)`, your emitter authority seeds to be \\[b"emitter\\].' + 'NOTE: If `Some(program_id)`, your emitter authority seeds to be \\[b"emitter\\].', ]; type: { option: "publicKey"; }; - } + }, ]; }; }, @@ -1005,7 +1005,7 @@ export type WormholeCoreBridgeSolana = { name: "WriteMessageV1Args"; docs: [ "Arguments for the [write_message_v1](crate::wormhole_core_bridge_solana::write_message_v1)", - "instruction." + "instruction.", ]; type: { kind: "struct"; @@ -1018,10 +1018,10 @@ export type WormholeCoreBridgeSolana = { { name: "data"; docs: [ - "Data representing subset of message buffer starting at specified index." + "Data representing subset of message buffer starting at specified index.", ]; type: "bytes"; - } + }, ]; }; }, @@ -1035,7 +1035,7 @@ export type WormholeCoreBridgeSolana = { name: "status"; docs: [ "Processing status. **This encoded VAA is only considered usable when this status is set", - "to [Verified](ProcessingStatus::Verified).**" + "to [Verified](ProcessingStatus::Verified).**", ]; type: { defined: "ProcessingStatus"; @@ -1049,10 +1049,10 @@ export type WormholeCoreBridgeSolana = { { name: "version"; docs: [ - "VAA version. Only when the VAA is verified is this version set to a value." + "VAA version. Only when the VAA is verified is this version set to a value.", ]; type: "u8"; - } + }, ]; }; }, @@ -1061,7 +1061,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "This struct defines unix timestamp as u32 (as opposed to more modern systems that have adopted", "i64). Methods for this struct are meant to convert Solana's clock type to this type assuming we", - "are far from year 2038." + "are far from year 2038.", ]; type: { kind: "struct"; @@ -1069,14 +1069,14 @@ export type WormholeCoreBridgeSolana = { { name: "value"; type: "u32"; - } + }, ]; }; }, { name: "Duration"; docs: [ - "To be used with the [Timestamp] type, this struct defines a duration in seconds." + "To be used with the [Timestamp] type, this struct defines a duration in seconds.", ]; type: { kind: "struct"; @@ -1084,7 +1084,7 @@ export type WormholeCoreBridgeSolana = { { name: "seconds"; type: "u32"; - } + }, ]; }; }, @@ -1099,7 +1099,7 @@ export type WormholeCoreBridgeSolana = { type: { array: ["u8", 32]; }; - } + }, ]; }; }, @@ -1108,7 +1108,7 @@ export type WormholeCoreBridgeSolana = { docs: [ "This type is kind of silly. But because [PostedMessageV1](crate::state::PostedMessageV1) has the", "emitter chain ID as a field, which is unnecessary since it is always Solana's chain ID, we use", - "this type to guarantee that the encoded chain ID is always `1`." + "this type to guarantee that the encoded chain ID is always `1`.", ]; type: { kind: "struct"; @@ -1116,7 +1116,7 @@ export type WormholeCoreBridgeSolana = { { name: "chainId"; type: "u16"; - } + }, ]; }; }, @@ -1138,7 +1138,7 @@ export type WormholeCoreBridgeSolana = { { name: "sequence"; type: "u64"; - } + }, ]; }; }, @@ -1149,7 +1149,7 @@ export type WormholeCoreBridgeSolana = { "", "NOTE: No more instructions should be added to this enum. Instead, add them as Anchor instruction", "handlers, which will inevitably live in", - "[wormhole_core_bridge_solana](crate::wormhole_core_bridge_solana)." + "[wormhole_core_bridge_solana](crate::wormhole_core_bridge_solana).", ]; type: { kind: "enum"; @@ -1180,7 +1180,7 @@ export type WormholeCoreBridgeSolana = { }, { name: "PostMessageUnreliable"; - } + }, ]; }; }, @@ -1197,7 +1197,7 @@ export type WormholeCoreBridgeSolana = { }, { name: "Executable"; - } + }, ]; }; }, @@ -1205,7 +1205,7 @@ export type WormholeCoreBridgeSolana = { name: "MessageStatus"; docs: [ "Status of a message. When a message is posted, its status is", - "[Published](MessageStatus::Published)." + "[Published](MessageStatus::Published).", ]; type: { kind: "enum"; @@ -1218,7 +1218,7 @@ export type WormholeCoreBridgeSolana = { }, { name: "ReadyForPublishing"; - } + }, ]; }; }, @@ -1244,7 +1244,7 @@ export type WormholeCoreBridgeSolana = { type: { defined: "Commitment"; }; - } + }, ]; }, { @@ -1267,12 +1267,12 @@ export type WormholeCoreBridgeSolana = { type: { defined: "Commitment"; }; - } + }, ]; }, { name: "PreparedMessage"; - } + }, ]; }; }, @@ -1290,7 +1290,7 @@ export type WormholeCoreBridgeSolana = { }, { name: "Verified"; - } + }, ]; }; }, @@ -1300,7 +1300,7 @@ export type WormholeCoreBridgeSolana = { "Representation of Solana's commitment levels. This enum is not exhaustive because Wormhole only", "considers these two commitment levels in its Guardian observation.", "", - "See for more info." + "See for more info.", ]; type: { kind: "enum"; @@ -1310,10 +1310,10 @@ export type WormholeCoreBridgeSolana = { }, { name: "Finalized"; - } + }, ]; }; - } + }, ]; errors: [ { @@ -1600,7 +1600,7 @@ export type WormholeCoreBridgeSolana = { code: 10286; name: "ExecutableDisallowed"; msg: "ExecutableDisallowed"; - } + }, ]; }; diff --git a/target_chains/solana/sdk/js/pyth_solana_receiver/src/vaa.ts b/target_chains/solana/sdk/js/pyth_solana_receiver/src/vaa.ts index 47b508c3bb..da4eb7ccce 100644 --- a/target_chains/solana/sdk/js/pyth_solana_receiver/src/vaa.ts +++ b/target_chains/solana/sdk/js/pyth_solana_receiver/src/vaa.ts @@ -58,12 +58,12 @@ export const VAA_SPLIT_INDEX = 721; */ export function trimSignatures( vaa: Buffer, - n = DEFAULT_REDUCED_GUARDIAN_SET_SIZE + n = DEFAULT_REDUCED_GUARDIAN_SET_SIZE, ): Buffer { const currentNumSignatures = vaa[5]; if (n > currentNumSignatures) { throw new Error( - "Resulting VAA can't have more signatures than the original VAA" + "Resulting VAA can't have more signatures than the original VAA", ); } @@ -95,7 +95,7 @@ interface VaaInstructionGroups { // Core function to generate VAA instruction groups async function generateVaaInstructionGroups( wormhole: Program, - vaa: Buffer + vaa: Buffer, ): Promise { const encodedVaaKeypair = new Keypair(); @@ -153,7 +153,7 @@ async function generateVaaInstructionGroups( .accounts({ guardianSet: getGuardianSetPda( getGuardianSetIndex(vaa), - wormhole.programId + wormhole.programId, ), draftVaa: encodedVaaKeypair.publicKey, }) @@ -199,7 +199,7 @@ async function generateVaaInstructionGroups( */ export async function buildPostEncodedVaaInstructions( wormhole: Program, - vaa: Buffer + vaa: Buffer, ): Promise<{ encodedVaaAddress: PublicKey; postInstructions: InstructionWithEphemeralSigners[]; @@ -242,7 +242,7 @@ export async function buildPostEncodedVaaInstructions( export async function buildPostEncodedVaasForTwapInstructions( wormhole: Program, startUpdateData: AccumulatorUpdateData, - endUpdateData: AccumulatorUpdateData + endUpdateData: AccumulatorUpdateData, ): Promise<{ startEncodedVaaAddress: PublicKey; endEncodedVaaAddress: PublicKey; @@ -251,11 +251,11 @@ export async function buildPostEncodedVaasForTwapInstructions( }> { const startGroups = await generateVaaInstructionGroups( wormhole, - startUpdateData.vaa + startUpdateData.vaa, ); const endGroups = await generateVaaInstructionGroups( wormhole, - endUpdateData.vaa + endUpdateData.vaa, ); // Pack instructions for optimal 3-transaction pattern: @@ -290,7 +290,7 @@ export async function buildPostEncodedVaasForTwapInstructions( */ export async function buildCloseEncodedVaaInstruction( wormhole: Program, - encodedVaa: PublicKey + encodedVaa: PublicKey, ): Promise { const instruction = await wormhole.methods .closeEncodedVaa() @@ -311,13 +311,13 @@ export async function buildCloseEncodedVaaInstruction( export async function buildEncodedVaaCreateInstruction( wormhole: Program, vaa: Buffer, - encodedVaaKeypair: Keypair + encodedVaaKeypair: Keypair, ): Promise { const encodedVaaSize = vaa.length + VAA_START; return { instruction: await wormhole.account.encodedVaa.createInstruction( encodedVaaKeypair, - encodedVaaSize + encodedVaaSize, ), signers: [encodedVaaKeypair], }; @@ -330,7 +330,7 @@ export async function buildEncodedVaaCreateInstruction( export async function findEncodedVaaAccountsByWriteAuthority( connection: Connection, writeAuthority: PublicKey, - wormholeProgramId: PublicKey + wormholeProgramId: PublicKey, ): Promise { const result = await connection.getProgramAccounts(wormholeProgramId, { filters: [ @@ -338,7 +338,7 @@ export async function findEncodedVaaAccountsByWriteAuthority( memcmp: { offset: 0, bytes: bs58.encode( - Buffer.from(sha256("account:EncodedVaa").slice(0, 8)) + Buffer.from(sha256("account:EncodedVaa").slice(0, 8)), ), }, }, diff --git a/target_chains/solana/sdk/js/solana_utils/src/__tests__/TransactionSize.test.ts b/target_chains/solana/sdk/js/solana_utils/src/__tests__/TransactionSize.test.ts index e4cf3b0bb9..8ce36923b7 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/__tests__/TransactionSize.test.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/__tests__/TransactionSize.test.ts @@ -36,7 +36,7 @@ it("Unit test for getSizeOfTransaction", async () => { space: 100, lamports: 1000000000, programId: SystemProgram.programId, - }) + }), ); ixsToSend.push( @@ -48,7 +48,7 @@ it("Unit test for getSizeOfTransaction", async () => { space: 100, lamports: 1000000000, programId: SystemProgram.programId, - }) + }), ); ixsToSend.push( @@ -56,13 +56,13 @@ it("Unit test for getSizeOfTransaction", async () => { keys: [{ pubkey: PublicKey.unique(), isSigner: true, isWritable: true }], programId: PublicKey.unique(), data: Buffer.from([1, 2, 3]), - }) + }), ); ixsToSend.push(ComputeBudgetProgram.setComputeUnitLimit({ units: 69 })); ixsToSend.push( - ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1000000 }) + ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1000000 }), ); const transaction = new Transaction(); @@ -73,7 +73,7 @@ it("Unit test for getSizeOfTransaction", async () => { transaction.recentBlockhash = "GqdFtdM7zzWw33YyHtBNwPhyBsdYKcfm9gT47bWnbHvs"; // Mock blockhash from devnet transaction.feePayer = payer.publicKey; expect(transaction.serialize({ requireAllSignatures: false }).length).toBe( - getSizeOfTransaction(ixsToSend, false) + getSizeOfTransaction(ixsToSend, false), ); const versionedTransaction = new VersionedTransaction( @@ -81,10 +81,10 @@ it("Unit test for getSizeOfTransaction", async () => { recentBlockhash: transaction.recentBlockhash, payerKey: payer.publicKey, instructions: ixsToSend, - }).compileToV0Message() + }).compileToV0Message(), ); expect(versionedTransaction.serialize().length).toBe( - getSizeOfTransaction(ixsToSend) + getSizeOfTransaction(ixsToSend), ); const addressLookupTable: AddressLookupTableAccount = @@ -109,10 +109,10 @@ it("Unit test for getSizeOfTransaction", async () => { recentBlockhash: transaction.recentBlockhash, payerKey: payer.publicKey, instructions: ixsToSend, - }).compileToV0Message([addressLookupTable]) + }).compileToV0Message([addressLookupTable]), ); expect(versionedTransactionWithAlt.serialize().length).toBe( - getSizeOfTransaction(ixsToSend, true, addressLookupTable) + getSizeOfTransaction(ixsToSend, true, addressLookupTable), ); }); diff --git a/target_chains/solana/sdk/js/solana_utils/src/jito.ts b/target_chains/solana/sdk/js/solana_utils/src/jito.ts index fa7b1844ad..2a6a5c290e 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/jito.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/jito.ts @@ -28,7 +28,7 @@ export function getRandomTipAccount(): PublicKey { export function buildJitoTipInstruction( payer: PublicKey, - lamports: number + lamports: number, ): TransactionInstruction { return SystemProgram.transfer({ fromPubkey: payer, @@ -43,7 +43,7 @@ export async function sendTransactionsJito( signers?: Signer[] | undefined; }[], searcherClient: SearcherClient, - wallet: Wallet + wallet: Wallet, ): Promise { const signedTransactions = []; @@ -60,7 +60,7 @@ export async function sendTransactionsJito( } const firstTransactionSignature = bs58.encode( - signedTransactions[0].signatures[0] + signedTransactions[0].signatures[0], ); const bundle = new Bundle(signedTransactions, 2); diff --git a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts index 3caac0d28c..b50c36f963 100644 --- a/target_chains/solana/sdk/js/solana_utils/src/transaction.ts +++ b/target_chains/solana/sdk/js/solana_utils/src/transaction.ts @@ -79,7 +79,7 @@ export const DEFAULT_PRIORITY_FEE_CONFIG: PriorityFeeConfig = { export function getSizeOfTransaction( instructions: TransactionInstruction[], versionedTransaction = true, - addressLookupTable?: AddressLookupTableAccount + addressLookupTable?: AddressLookupTableAccount, ): number { const programs = new Set(); const signers = new Set(); @@ -103,18 +103,20 @@ export function getSizeOfTransaction( getSizeOfCompressedU16(ix.keys.length) + ix.keys.length + getSizeOfCompressedU16(ix.data.length) + - ix.data.length + ix.data.length, ) .reduce((a, b) => a + b, 0); let numberOfAddressLookups = 0; if (addressLookupTable) { const lookupTableAddresses = addressLookupTable.state.addresses.map( - (address) => address.toBase58() + (address) => address.toBase58(), ); const totalNumberOfAccounts = accounts.size; accounts = new Set( - [...accounts].filter((account) => !lookupTableAddresses.includes(account)) + [...accounts].filter( + (account) => !lookupTableAddresses.includes(account), + ), ); accounts = new Set([...accounts, ...programs, ...signers]); numberOfAddressLookups = totalNumberOfAccounts - accounts.size; // This number is equal to the number of accounts that are in the lookup table and are neither signers nor programs @@ -161,7 +163,7 @@ export class TransactionBuilder { constructor( payer: PublicKey, connection: Connection, - addressLookupTable?: AddressLookupTableAccount + addressLookupTable?: AddressLookupTableAccount, ) { this.payer = payer; this.connection = connection; @@ -190,7 +192,7 @@ export class TransactionBuilder { ComputeBudgetProgram.setComputeUnitLimit({ units: 1 }), ], true, - this.addressLookupTable + this.addressLookupTable, ); if (sizeWithComputeUnits <= PACKET_DATA_SIZE) { this.transactionInstructions[ @@ -224,7 +226,7 @@ export class TransactionBuilder { * Returns all the added instructions batched into versioned transactions, plus for each transaction the ephemeral signers that need to sign it */ async buildVersionedTransactions( - args: PriorityFeeConfig + args: PriorityFeeConfig, ): Promise<{ tx: VersionedTransaction; signers: Signer[] }[]> { const blockhash = ( await this.connection.getLatestBlockhash({ commitment: "confirmed" }) @@ -243,19 +245,19 @@ export class TransactionBuilder { args.tightComputeBudget ) { instructionsWithComputeBudget.push( - ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits }) + ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits }), ); } if (args.computeUnitPriceMicroLamports) { instructionsWithComputeBudget.push( ComputeBudgetProgram.setComputeUnitPrice({ microLamports: args.computeUnitPriceMicroLamports, - }) + }), ); } if (args.jitoTipLamports && index % jitoBundleSize === 0) { instructionsWithComputeBudget.push( - buildJitoTipInstruction(this.payer, args.jitoTipLamports) + buildJitoTipInstruction(this.payer, args.jitoTipLamports), ); } @@ -265,7 +267,7 @@ export class TransactionBuilder { const sizeWithInstruction = getSizeOfTransaction( [...instructionsToSend, instruction], true, - this.addressLookupTable + this.addressLookupTable, ); if (sizeWithInstruction > PACKET_DATA_SIZE) { break; @@ -280,12 +282,12 @@ export class TransactionBuilder { instructions: instructionsToSend, payerKey: this.payer, }).compileToV0Message( - this.addressLookupTable ? [this.addressLookupTable] : [] - ) + this.addressLookupTable ? [this.addressLookupTable] : [], + ), ), signers: signers, }; - } + }, ); } @@ -293,7 +295,7 @@ export class TransactionBuilder { * Returns all the added instructions batched into transactions, plus for each transaction the ephemeral signers that need to sign it */ buildLegacyTransactions( - args: PriorityFeeConfig + args: PriorityFeeConfig, ): { tx: Transaction; signers: Signer[] }[] { const jitoBundleSize = args.jitoBundleSize || this.transactionInstructions.length; @@ -308,19 +310,19 @@ export class TransactionBuilder { args.tightComputeBudget ) { instructionsWithComputeBudget.push( - ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits }) + ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits }), ); } if (args.computeUnitPriceMicroLamports) { instructionsWithComputeBudget.push( ComputeBudgetProgram.setComputeUnitPrice({ microLamports: args.computeUnitPriceMicroLamports, - }) + }), ); } if (args.jitoTipLamports && index % jitoBundleSize === 0) { instructionsWithComputeBudget.push( - buildJitoTipInstruction(this.payer, args.jitoTipLamports) + buildJitoTipInstruction(this.payer, args.jitoTipLamports), ); } @@ -329,12 +331,12 @@ export class TransactionBuilder { for (const instruction of instructionsWithComputeBudget) { const sizeWithInstruction = getSizeOfTransaction( [...instructionsToSend, instruction], - false + false, ); if (sizeWithInstruction > PACKET_DATA_SIZE) { if (instructionsToSend.length == 0) { throw new Error( - `An instruction is too big to be sent in a transaction (${sizeWithInstruction} > ${PACKET_DATA_SIZE} bytes)` + `An instruction is too big to be sent in a transaction (${sizeWithInstruction} > ${PACKET_DATA_SIZE} bytes)`, ); } break; @@ -346,7 +348,7 @@ export class TransactionBuilder { tx: new Transaction().add(...instructionsToSend), signers: signers, }; - } + }, ); } @@ -355,11 +357,11 @@ export class TransactionBuilder { */ static batchIntoLegacyTransactions( instructions: TransactionInstruction[], - priorityFeeConfig: PriorityFeeConfig + priorityFeeConfig: PriorityFeeConfig, ): Transaction[] { const transactionBuilder = new TransactionBuilder( PublicKey.unique(), - new Connection("http://placeholder.placeholder") + new Connection("http://placeholder.placeholder"), ); // We only need wallet and connection for `VersionedTransaction` so we can put placeholders here for (const instruction of instructions) { transactionBuilder.addInstruction({ instruction, signers: [] }); @@ -379,12 +381,12 @@ export class TransactionBuilder { connection: Connection, instructions: InstructionWithEphemeralSigners[], priorityFeeConfig: PriorityFeeConfig, - addressLookupTable?: AddressLookupTableAccount + addressLookupTable?: AddressLookupTableAccount, ): Promise<{ tx: VersionedTransaction; signers: Signer[] }[]> { const transactionBuilder = new TransactionBuilder( payer, connection, - addressLookupTable + addressLookupTable, ); transactionBuilder.addInstructions(instructions); return transactionBuilder.buildVersionedTransactions(priorityFeeConfig); @@ -395,20 +397,20 @@ export class TransactionBuilder { */ static addPriorityFee( transaction: Transaction, - priorityFeeConfig: PriorityFeeConfig + priorityFeeConfig: PriorityFeeConfig, ) { if (priorityFeeConfig.computeUnitPriceMicroLamports) { transaction.add( ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFeeConfig.computeUnitPriceMicroLamports, - }) + }), ); } } } export const isVersionedTransaction = ( - tx: Transaction | VersionedTransaction + tx: Transaction | VersionedTransaction, ): tx is VersionedTransaction => { return "version" in tx; }; @@ -425,7 +427,7 @@ export async function sendTransactions( }[], connection: Connection, wallet: AnchorWallet, - maxRetries?: number + maxRetries?: number, ): Promise { const blockhashResult = await connection.getLatestBlockhashAndContext({ commitment: "confirmed", @@ -465,7 +467,7 @@ export async function sendTransactions( const txSignature = bs58.encode( isVersionedTransaction(tx) ? tx.signatures?.[0] || new Uint8Array() - : tx.signature ?? new Uint8Array() + : (tx.signature ?? new Uint8Array()), ); const confirmTransactionPromise = connection.confirmTransaction( @@ -474,7 +476,7 @@ export async function sendTransactions( blockhash: blockhashResult.value.blockhash, lastValidBlockHeight: blockhashResult.value.lastValidBlockHeight, }, - "confirmed" + "confirmed", ); confirmedTx = null; @@ -488,7 +490,7 @@ export async function sendTransactions( new Promise((resolve) => setTimeout(() => { resolve(null); - }, TX_RETRY_INTERVAL) + }, TX_RETRY_INTERVAL), ), ]); if (confirmedTx) { @@ -505,7 +507,7 @@ export async function sendTransactions( " with signature: ", txSignature, " Retry count: ", - retryCount + retryCount, ); retryCount++; @@ -522,8 +524,8 @@ export async function sendTransactions( if (confirmedTx?.err) { throw new Error( `Transaction ${txSignature} has failed with error: ${JSON.stringify( - confirmedTx.err - )}` + confirmedTx.err, + )}`, ); } diff --git a/target_chains/sui/cli/src/cli.ts b/target_chains/sui/cli/src/cli.ts index 0d35ebf7b8..31439b651f 100644 --- a/target_chains/sui/cli/src/cli.ts +++ b/target_chains/sui/cli/src/cli.ts @@ -66,7 +66,7 @@ yargs(hideBin(process.argv)) endpoint: OPTIONS.endpoint, }) .usage( - "$0 create --contract --feed-id --private-key " + "$0 create --contract --feed-id --private-key ", ); }, async (argv) => { @@ -76,10 +76,10 @@ yargs(hideBin(process.argv)) const vaas = await priceService.getLatestVaas(feedIds); const digest = await contract.executeCreatePriceFeed( argv["private-key"], - vaas.map((vaa) => Buffer.from(vaa, "base64")) + vaas.map((vaa) => Buffer.from(vaa, "base64")), ); console.log("Transaction successful. Digest:", digest); - } + }, ) .command( "create-all", @@ -92,7 +92,7 @@ yargs(hideBin(process.argv)) endpoint: OPTIONS.endpoint, }) .usage( - "$0 create-all --contract --private-key " + "$0 create-all --contract --private-key ", ); }, async (argv) => { @@ -105,12 +105,12 @@ yargs(hideBin(process.argv)) const vaas = await priceService.getLatestVaas(batch); const digest = await contract.executeCreatePriceFeed( argv["private-key"], - vaas.map((vaa) => Buffer.from(vaa, "base64")) + vaas.map((vaa) => Buffer.from(vaa, "base64")), ); console.log("Transaction successful. Digest:", digest); console.log(`Progress: ${i + BATCH_SIZE}/${feedIds.length}`); } - } + }, ) .command( "generate-digest", @@ -132,12 +132,12 @@ yargs(hideBin(process.argv)) `sui move build --dump-bytecode-as-base64 --path ${__dirname}/${argv.path} 2> /dev/null`, { encoding: "utf-8", - } - ) + }, + ), ); console.log("Contract digest:"); console.log(Buffer.from(buildOutput.digest).toString("hex")); - } + }, ) .command( "deploy", @@ -154,19 +154,19 @@ yargs(hideBin(process.argv)) path: OPTIONS.path, }) .usage( - "$0 deploy --private-key --chain [sui_mainnet|sui_testnet] --path " + "$0 deploy --private-key --chain [sui_mainnet|sui_testnet] --path ", ); }, async (argv) => { const walletPrivateKey = argv["private-key"]; const chain = DefaultStore.chains[argv.chain] as SuiChain; const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(walletPrivateKey, "hex")) + new Uint8Array(Buffer.from(walletPrivateKey, "hex")), ); const result = await publishPackage( keypair, chain.getProvider(), - argv.path + argv.path, ); const deploymentType = chain.isMainnet() ? "stable" : "beta"; const config = getDefaultDeploymentConfig(deploymentType); @@ -176,9 +176,9 @@ yargs(hideBin(process.argv)) result.packageId, result.deployerCapId, result.upgradeCapId, - config + config, ); - } + }, ) .command( "update-feeds", @@ -192,7 +192,7 @@ yargs(hideBin(process.argv)) endpoint: OPTIONS.endpoint, }) .usage( - "$0 update-feeds --contract --feed-id --private-key " + "$0 update-feeds --contract --feed-id --private-key ", ); }, async (argv) => { @@ -203,10 +203,10 @@ yargs(hideBin(process.argv)) const digest = await contract.executeUpdatePriceFeedWithFeeds( argv["private-key"], vaas.map((vaa) => Buffer.from(vaa, "base64")), - feedIds + feedIds, ); console.log("Transaction successful. Digest:", digest); - } + }, ) .command( "upgrade", @@ -224,13 +224,13 @@ yargs(hideBin(process.argv)) path: OPTIONS.path, }) .usage( - "$0 upgrade --private-key --contract --vaa " + "$0 upgrade --private-key --contract --vaa ", ); }, async (argv) => { const contract = getContract(argv.contract); const keypair = Ed25519Keypair.fromSecretKey( - new Uint8Array(Buffer.from(argv["private-key"], "hex")) + new Uint8Array(Buffer.from(argv["private-key"], "hex")), ); const pythContractsPath = resolve(`${__dirname}/${argv.path}`); @@ -249,7 +249,7 @@ yargs(hideBin(process.argv)) modules, dependencies, signedVaa, - contract + contract, ); console.log("Tx digest", upgradeResults.digest); if ( @@ -260,7 +260,7 @@ yargs(hideBin(process.argv)) } console.log( - "Upgrade successful, Executing the migrate function in a separate transaction..." + "Upgrade successful, Executing the migrate function in a separate transaction...", ); // We can not do the migration in the same transaction since the newly published package is not found @@ -271,7 +271,7 @@ yargs(hideBin(process.argv)) contract.chain.getProvider(), signedVaa, contract, - pythPackageOld + pythPackageOld, ); console.log("Tx digest", migrateResults.digest); if ( @@ -279,10 +279,10 @@ yargs(hideBin(process.argv)) migrateResults.effects.status.status !== "success" ) { throw new Error( - `Migrate failed. Old package id is ${pythPackageOld}. Please do the migration manually` + `Migrate failed. Old package id is ${pythPackageOld}. Please do the migration manually`, ); } console.log("Migrate successful"); - } + }, ) .demandCommand().argv; diff --git a/target_chains/sui/cli/src/pyth_deploy.ts b/target_chains/sui/cli/src/pyth_deploy.ts index 80d585482c..1a5face045 100644 --- a/target_chains/sui/cli/src/pyth_deploy.ts +++ b/target_chains/sui/cli/src/pyth_deploy.ts @@ -11,7 +11,7 @@ import { bcs } from "@mysten/sui/bcs"; export async function publishPackage( keypair: Ed25519Keypair, provider: SuiClient, - packagePath: string + packagePath: string, ): Promise<{ packageId: string; upgradeCapId: string; deployerCapId: string }> { // Build contracts const buildOutput: { @@ -22,8 +22,8 @@ export async function publishPackage( `sui move build --dump-bytecode-as-base64 --path ${__dirname}/${packagePath} 2> /dev/null`, { encoding: "utf-8", - } - ) + }, + ), ); console.log("buildOutput: ", buildOutput); @@ -36,7 +36,7 @@ export async function publishPackage( const [upgradeCap] = txb.publish({ modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))), dependencies: buildOutput.dependencies.map((d: string) => - normalizeSuiObjectId(d) + normalizeSuiObjectId(d), ), }); @@ -54,7 +54,7 @@ export async function publishPackage( }); const publishedChanges = result.objectChanges?.filter( - (change) => change.type === "published" + (change) => change.type === "published", ); if ( @@ -63,7 +63,7 @@ export async function publishPackage( ) { throw new Error( "No publish event found in transaction:" + - JSON.stringify(result.objectChanges, null, 2) + JSON.stringify(result.objectChanges, null, 2), ); } @@ -104,7 +104,7 @@ export async function initPyth( config: { dataSources: DataSource[]; governanceDataSource: DataSource; - } + }, ) { const tx = new Transaction(); @@ -115,25 +115,25 @@ export async function initPyth( .serialize( config.dataSources.map((dataSource) => [ ...Buffer.from(dataSource.emitterAddress, "hex"), - ]) - ) + ]), + ), ); const dataSourceEmitterChainIds = tx.pure( bcs .vector(bcs.u64()) .serialize( - config.dataSources.map((dataSource) => dataSource.emitterChain) - ) + config.dataSources.map((dataSource) => dataSource.emitterChain), + ), ); const governanceEmitterAddress = tx.pure( bcs .vector(bcs.u8()) .serialize([ ...Buffer.from(config.governanceDataSource.emitterAddress, "hex"), - ]) + ]), ); const governanceEmitterChainId = tx.pure( - bcs.u64().serialize(config.governanceDataSource.emitterChain) + bcs.u64().serialize(config.governanceDataSource.emitterChain), ); const stalePriceThreshold = tx.pure.u64(60); tx.moveCall({ diff --git a/target_chains/sui/cli/src/upgrade_pyth.ts b/target_chains/sui/cli/src/upgrade_pyth.ts index ee2b83cf92..661e2646f3 100644 --- a/target_chains/sui/cli/src/upgrade_pyth.ts +++ b/target_chains/sui/cli/src/upgrade_pyth.ts @@ -14,13 +14,13 @@ export function buildForBytecodeAndDigest(packagePath: string) { } = JSON.parse( execSync( `sui move build --dump-bytecode-as-base64 -p ${packagePath} 2> /dev/null`, - { encoding: "utf-8" } - ) + { encoding: "utf-8" }, + ), ); return { modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))), dependencies: buildOutput.dependencies.map((d: string) => - normalizeSuiObjectId(d) + normalizeSuiObjectId(d), ), digest: Buffer.from(buildOutput.digest), }; @@ -32,7 +32,7 @@ export async function upgradePyth( modules: number[][], dependencies: string[], signedVaa: Buffer, - contract: SuiPriceFeedContract + contract: SuiPriceFeedContract, ) { const pythPackage = await contract.getPackageId(contract.stateId); @@ -41,7 +41,7 @@ export async function upgradePyth( const verificationReceipt = await contract.getVaaVerificationReceipt( tx as any, pythPackage, - signedVaa + signedVaa, ); // Authorize upgrade. @@ -81,7 +81,7 @@ export async function migratePyth( provider: SuiClient, signedUpgradeVaa: Buffer, contract: SuiPriceFeedContract, - pythPackageOld: string + pythPackageOld: string, ) { const pythPackage = await contract.getPackageId(contract.stateId); const tx = new Transaction(); @@ -91,7 +91,7 @@ export async function migratePyth( const verificationReceipt = await contract.getVaaVerificationReceipt( tx, pythPackageOld, - signedUpgradeVaa + signedUpgradeVaa, ); tx.moveCall({ target: `${pythPackage}::migrate::migrate`, diff --git a/target_chains/sui/sdk/js-iota/src/client.ts b/target_chains/sui/sdk/js-iota/src/client.ts index 86797d695c..6a2e1b8a8e 100644 --- a/target_chains/sui/sdk/js-iota/src/client.ts +++ b/target_chains/sui/sdk/js-iota/src/client.ts @@ -17,7 +17,7 @@ export class IotaPythClient { constructor( public provider: IotaClient, public pythStateId: ObjectId, - public wormholeStateId: ObjectId + public wormholeStateId: ObjectId, ) { this.pythPackageId = undefined; this.wormholePackageId = undefined; @@ -94,7 +94,7 @@ export class IotaPythClient { .serialize(Array.from(vaa), { maxSize: MAX_ARGUMENT_SIZE, }) - .toBytes() + .toBytes(), ), tx.object(IOTA_CLOCK_OBJECT_ID), ], @@ -113,14 +113,14 @@ export class IotaPythClient { async updatePriceFeeds( tx: Transaction, updates: Buffer[], - feedIds: HexString[] + feedIds: HexString[], ): Promise { const packageId = await this.getPythPackageId(); let priceUpdatesHotPotato; if (updates.length > 1) { throw new Error( - "SDK does not support sending multiple accumulator messages in a single transaction" + "SDK does not support sending multiple accumulator messages in a single transaction", ); } const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]); @@ -135,7 +135,7 @@ export class IotaPythClient { .serialize(Array.from(updates[0]), { maxSize: MAX_ARGUMENT_SIZE, }) - .toBytes() + .toBytes(), ), verifiedVaas[0], tx.object(IOTA_CLOCK_OBJECT_ID), @@ -146,14 +146,14 @@ export class IotaPythClient { const baseUpdateFee = await this.getBaseUpdateFee(); const coins = tx.splitCoins( tx.gas, - feedIds.map(() => tx.pure.u64(baseUpdateFee)) + feedIds.map(() => tx.pure.u64(baseUpdateFee)), ); let coinId = 0; for (const feedId of feedIds) { const priceInfoObjectId = await this.getPriceFeedObjectId(feedId); if (!priceInfoObjectId) { throw new Error( - `Price feed ${feedId} not found, please create it first` + `Price feed ${feedId} not found, please create it first`, ); } priceInfoObjects.push(priceInfoObjectId); @@ -180,7 +180,7 @@ export class IotaPythClient { const packageId = await this.getPythPackageId(); if (updates.length > 1) { throw new Error( - "SDK does not support sending multiple accumulator messages in a single transaction" + "SDK does not support sending multiple accumulator messages in a single transaction", ); } const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]); @@ -195,7 +195,7 @@ export class IotaPythClient { .serialize(Array.from(updates[0]), { maxSize: MAX_ARGUMENT_SIZE, }) - .toBytes() + .toBytes(), ), verifiedVaas[0], tx.object(IOTA_CLOCK_OBJECT_ID), @@ -250,7 +250,7 @@ export class IotaPythClient { normalizedFeedId, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - result.data.content.fields.value + result.data.content.fields.value, ); } return this.priceFeedObjectIdCache.get(normalizedFeedId); @@ -271,13 +271,13 @@ export class IotaPythClient { }); if (!result.data || !result.data.type) { throw new Error( - "Price Table not found, contract may not be initialized" + "Price Table not found, contract may not be initialized", ); } let type = result.data.type.replace("0x2::table::Table<", ""); type = type.replace( "::price_identifier::PriceIdentifier, 0x2::object::ID>", - "" + "", ); this.priceTableInfo = { id: result.data.objectId, fieldType: type }; } diff --git a/target_chains/sui/sdk/js-iota/src/examples/IotaRelay.ts b/target_chains/sui/sdk/js-iota/src/examples/IotaRelay.ts index c0c9ed13ab..acdec72fd3 100644 --- a/target_chains/sui/sdk/js-iota/src/examples/IotaRelay.ts +++ b/target_chains/sui/sdk/js-iota/src/examples/IotaRelay.ts @@ -80,7 +80,7 @@ async function run() { } const wallet = Ed25519Keypair.fromSecretKey( - Buffer.from(process.env.IOTA_KEY, "hex") + Buffer.from(process.env.IOTA_KEY, "hex"), ); const result = await provider.signAndExecuteTransaction({ diff --git a/target_chains/sui/sdk/js/src/client.ts b/target_chains/sui/sdk/js/src/client.ts index f65e2e21aa..1d49fa6ae9 100644 --- a/target_chains/sui/sdk/js/src/client.ts +++ b/target_chains/sui/sdk/js/src/client.ts @@ -17,7 +17,7 @@ export class SuiPythClient { constructor( public provider: SuiClient, public pythStateId: ObjectId, - public wormholeStateId: ObjectId + public wormholeStateId: ObjectId, ) { this.pythPackageId = undefined; this.wormholePackageId = undefined; @@ -94,7 +94,7 @@ export class SuiPythClient { .serialize(Array.from(vaa), { maxSize: MAX_ARGUMENT_SIZE, }) - .toBytes() + .toBytes(), ), tx.object(SUI_CLOCK_OBJECT_ID), ], @@ -113,14 +113,14 @@ export class SuiPythClient { async updatePriceFeeds( tx: Transaction, updates: Buffer[], - feedIds: HexString[] + feedIds: HexString[], ): Promise { const packageId = await this.getPythPackageId(); let priceUpdatesHotPotato; if (updates.length > 1) { throw new Error( - "SDK does not support sending multiple accumulator messages in a single transaction" + "SDK does not support sending multiple accumulator messages in a single transaction", ); } const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]); @@ -135,7 +135,7 @@ export class SuiPythClient { .serialize(Array.from(updates[0]), { maxSize: MAX_ARGUMENT_SIZE, }) - .toBytes() + .toBytes(), ), verifiedVaas[0], tx.object(SUI_CLOCK_OBJECT_ID), @@ -146,14 +146,14 @@ export class SuiPythClient { const baseUpdateFee = await this.getBaseUpdateFee(); const coins = tx.splitCoins( tx.gas, - feedIds.map(() => tx.pure.u64(baseUpdateFee)) + feedIds.map(() => tx.pure.u64(baseUpdateFee)), ); let coinId = 0; for (const feedId of feedIds) { const priceInfoObjectId = await this.getPriceFeedObjectId(feedId); if (!priceInfoObjectId) { throw new Error( - `Price feed ${feedId} not found, please create it first` + `Price feed ${feedId} not found, please create it first`, ); } priceInfoObjects.push(priceInfoObjectId); @@ -180,7 +180,7 @@ export class SuiPythClient { const packageId = await this.getPythPackageId(); if (updates.length > 1) { throw new Error( - "SDK does not support sending multiple accumulator messages in a single transaction" + "SDK does not support sending multiple accumulator messages in a single transaction", ); } const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]); @@ -195,7 +195,7 @@ export class SuiPythClient { .serialize(Array.from(updates[0]), { maxSize: MAX_ARGUMENT_SIZE, }) - .toBytes() + .toBytes(), ), verifiedVaas[0], tx.object(SUI_CLOCK_OBJECT_ID), @@ -250,7 +250,7 @@ export class SuiPythClient { normalizedFeedId, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - result.data.content.fields.value + result.data.content.fields.value, ); } return this.priceFeedObjectIdCache.get(normalizedFeedId); @@ -271,13 +271,13 @@ export class SuiPythClient { }); if (!result.data || !result.data.type) { throw new Error( - "Price Table not found, contract may not be initialized" + "Price Table not found, contract may not be initialized", ); } let type = result.data.type.replace("0x2::table::Table<", ""); type = type.replace( "::price_identifier::PriceIdentifier, 0x2::object::ID>", - "" + "", ); this.priceTableInfo = { id: result.data.objectId, fieldType: type }; } diff --git a/target_chains/sui/sdk/js/src/examples/SuiRelay.ts b/target_chains/sui/sdk/js/src/examples/SuiRelay.ts index 0275ed9f24..164d09c832 100644 --- a/target_chains/sui/sdk/js/src/examples/SuiRelay.ts +++ b/target_chains/sui/sdk/js/src/examples/SuiRelay.ts @@ -87,7 +87,7 @@ async function run() { } const wallet = Ed25519Keypair.fromSecretKey( - Buffer.from(process.env.SUI_KEY, "hex") + Buffer.from(process.env.SUI_KEY, "hex"), ); const result = await provider.signAndExecuteTransaction({ diff --git a/target_chains/ton/contracts/scripts/deployPyth.ts b/target_chains/ton/contracts/scripts/deployPyth.ts index c14ec522fe..b80b8e0669 100644 --- a/target_chains/ton/contracts/scripts/deployPyth.ts +++ b/target_chains/ton/contracts/scripts/deployPyth.ts @@ -25,7 +25,7 @@ export async function run(provider: NetworkProvider) { // Require CHAIN_ID environment variable if (!process.env.CHAIN_ID) { throw new Error( - "CHAIN_ID environment variable is required. Example usage: CHAIN_ID=2 npx blueprint run ..." + "CHAIN_ID environment variable is required. Example usage: CHAIN_ID=2 npx blueprint run ...", ); } @@ -51,7 +51,7 @@ export async function run(provider: NetworkProvider) { }; const main = provider.open( - Main.createFromConfig(config, await compile("Main")) + Main.createFromConfig(config, await compile("Main")), ); await main.sendDeploy(provider.sender(), toNano("0.005")); @@ -71,8 +71,8 @@ export async function run(provider: NetworkProvider) { console.log( `Successfully updated guardian set ${i + 1} with VAA: ${vaa.slice( 0, - 20 - )}...` + 20, + )}...`, ); // Wait for 30 seconds before checking the guardian set index @@ -85,7 +85,7 @@ export async function run(provider: NetworkProvider) { console.error( `Failed to update guardian set. Expected index ${ i + 1 - }, got ${newIndex}` + }, got ${newIndex}`, ); break; } @@ -101,7 +101,7 @@ export async function run(provider: NetworkProvider) { const priceIds = [BTC_PRICE_FEED_ID, ETH_PRICE_FEED_ID]; const latestPriceUpdates = await hermesClient.getLatestPriceUpdates( priceIds, - { encoding: "hex" } + { encoding: "hex" }, ); console.log("Hermes BTC price:", latestPriceUpdates.parsed?.[0].price); console.log("Hermes ETH price:", latestPriceUpdates.parsed?.[1].price); @@ -121,7 +121,7 @@ export async function run(provider: NetworkProvider) { const result = await main.sendUpdatePriceFeeds( provider.sender(), updateData, - totalFee + totalFee, ); console.log("Price feeds updated successfully."); @@ -131,11 +131,11 @@ export async function run(provider: NetworkProvider) { // Query updated price feeds const btcPrice = await main.getPriceUnsafe(BTC_PRICE_FEED_ID); console.log( - `Updated BTC price: ${btcPrice.price}, publish time: ${btcPrice.publishTime}` + `Updated BTC price: ${btcPrice.price}, publish time: ${btcPrice.publishTime}`, ); const ethPrice = await main.getPriceUnsafe(ETH_PRICE_FEED_ID); console.log( - `Updated ETH price: ${ethPrice.price}, publish time: ${ethPrice.publishTime}` + `Updated ETH price: ${ethPrice.price}, publish time: ${ethPrice.publishTime}`, ); } diff --git a/target_chains/ton/contracts/tests/Main.spec.ts b/target_chains/ton/contracts/tests/Main.spec.ts index 74438ceb92..39f360c198 100644 --- a/target_chains/ton/contracts/tests/Main.spec.ts +++ b/target_chains/ton/contracts/tests/Main.spec.ts @@ -39,7 +39,7 @@ describe("Main", () => { const deployResult = await main.sendDeploy( deployer.getSender(), - toNano("0.05") + toNano("0.05"), ); expect(deployResult.transactions).toHaveTransaction({ diff --git a/target_chains/ton/contracts/tests/PythTest.spec.ts b/target_chains/ton/contracts/tests/PythTest.spec.ts index 3a3ae4216b..660de7d9ff 100644 --- a/target_chains/ton/contracts/tests/PythTest.spec.ts +++ b/target_chains/ton/contracts/tests/PythTest.spec.ts @@ -126,7 +126,7 @@ describe("PythTest", () => { chainId: number = 1, governanceChainId: number = 1, governanceContract: string = "0000000000000000000000000000000000000000000000000000000000000004", - governanceDataSource?: DataSource + governanceDataSource?: DataSource, ) { const config: PythTestConfig = { priceFeedId, @@ -146,7 +146,7 @@ describe("PythTest", () => { const deployResult = await pythTest.sendDeploy( deployer.getSender(), - toNano("0.05") + toNano("0.05"), ); expect(deployResult.transactions).toHaveTransaction({ @@ -159,12 +159,12 @@ describe("PythTest", () => { async function updateGuardianSets( pythTest: SandboxContract, - deployer: SandboxContract + deployer: SandboxContract, ) { for (const vaa of MAINNET_UPGRADE_VAAS) { const result = await pythTest.sendUpdateGuardianSet( deployer.getSender(), - Buffer.from(vaa, "hex") + Buffer.from(vaa, "hex"), ); expect(result.transactions).toHaveTransaction({ from: deployer.address, @@ -196,7 +196,7 @@ describe("PythTest", () => { const result = await pythTest.getPriceNoOlderThan( TIME_PERIOD, - BTC_PRICE_FEED_ID + BTC_PRICE_FEED_ID, ); expect(result.price).toBe(1); @@ -209,7 +209,7 @@ describe("PythTest", () => { await deployContract(); await expect( - pythTest.getPriceNoOlderThan(TIME_PERIOD, BTC_PRICE_FEED_ID) + pythTest.getPriceNoOlderThan(TIME_PERIOD, BTC_PRICE_FEED_ID), ).rejects.toThrow("Unable to execute get method. Got exit_code: 2001"); // ERROR_OUTDATED_PRICE = 2001 }); @@ -225,7 +225,7 @@ describe("PythTest", () => { const result = await pythTest.getEmaPriceNoOlderThan( TIME_PERIOD, - BTC_PRICE_FEED_ID + BTC_PRICE_FEED_ID, ); expect(result.price).toBe(5); @@ -238,7 +238,7 @@ describe("PythTest", () => { await deployContract(); await expect( - pythTest.getEmaPriceNoOlderThan(TIME_PERIOD, BTC_PRICE_FEED_ID) + pythTest.getEmaPriceNoOlderThan(TIME_PERIOD, BTC_PRICE_FEED_ID), ).rejects.toThrow("Unable to execute get method. Got exit_code: 2001"); // ERROR_OUTDATED_PRICE = 2001 }); @@ -257,7 +257,7 @@ describe("PythTest", () => { await deployContract(); const result = await pythTest.getUpdateFee( - Buffer.from(HERMES_BTC_ETH_UPDATE, "hex") + Buffer.from(HERMES_BTC_ETH_UPDATE, "hex"), ); expect(result).toBe(2); @@ -274,7 +274,7 @@ describe("PythTest", () => { expect(initialBtcPrice.price).not.toBe(HERMES_BTC_PRICE); // Expect an error for ETH price feed as it doesn't exist initially await expect(pythTest.getPriceUnsafe(ETH_PRICE_FEED_ID)).rejects.toThrow( - "Unable to execute get method. Got exit_code: 2000" + "Unable to execute get method. Got exit_code: 2000", ); // ERROR_PRICE_FEED_NOT_FOUND = 2000 const updateData = Buffer.from(HERMES_BTC_ETH_UPDATE, "hex"); @@ -283,7 +283,7 @@ describe("PythTest", () => { result = await pythTest.sendUpdatePriceFeeds( deployer.getSender(), updateData, - toNano(updateFee) + toNano(updateFee), ); expect(result.transactions).toHaveTransaction({ @@ -309,7 +309,7 @@ describe("PythTest", () => { const invalidUpdateData = Buffer.from("invalid data"); await expect(pythTest.getUpdateFee(invalidUpdateData)).rejects.toThrow( - "Unable to execute get method. Got exit_code: 2002" + "Unable to execute get method. Got exit_code: 2002", ); // ERROR_INVALID_MAGIC = 2002 }); @@ -325,7 +325,7 @@ describe("PythTest", () => { const result = await pythTest.sendUpdatePriceFeeds( deployer.getSender(), invalidUpdateData, - updateFee + updateFee, ); expect(result.transactions).toHaveTransaction({ @@ -346,7 +346,7 @@ describe("PythTest", () => { const result = await pythTest.sendUpdatePriceFeeds( deployer.getSender(), updateData, - toNano(updateFee) + toNano(updateFee), ); expect(result.transactions).toHaveTransaction({ @@ -363,7 +363,7 @@ describe("PythTest", () => { PRICE, EMA_PRICE, SINGLE_UPDATE_FEE, - [] // Empty data sources + [], // Empty data sources ); await updateGuardianSets(pythTest, deployer); @@ -373,7 +373,7 @@ describe("PythTest", () => { const result = await pythTest.sendUpdatePriceFeeds( deployer.getSender(), updateData, - toNano(updateFee) + toNano(updateFee), ); expect(result.transactions).toHaveTransaction({ @@ -395,7 +395,7 @@ describe("PythTest", () => { await deployContract(BTC_PRICE_FEED_ID, stalePrice, EMA_PRICE); await expect( - pythTest.getPriceNoOlderThan(TIME_PERIOD, BTC_PRICE_FEED_ID) + pythTest.getPriceNoOlderThan(TIME_PERIOD, BTC_PRICE_FEED_ID), ).rejects.toThrow("Unable to execute get method. Got exit_code: 2001"); // ERROR_OUTDATED_PRICE = 2001 }); @@ -408,7 +408,7 @@ describe("PythTest", () => { let result = await pythTest.sendUpdatePriceFeeds( deployer.getSender(), updateData, - calculateUpdatePriceFeedsFee(1n) // Send enough gas for 1 update instead of 2 + calculateUpdatePriceFeedsFee(1n), // Send enough gas for 1 update instead of 2 ); expect(result.transactions).toHaveTransaction({ @@ -433,7 +433,7 @@ describe("PythTest", () => { const result = await pythTest.sendUpdatePriceFeeds( deployer.getSender(), updateData, - calculateUpdatePriceFeedsFee(2n) + BigInt(insufficientFee) + calculateUpdatePriceFeedsFee(2n) + BigInt(insufficientFee), ); // Check that the transaction did not succeed @@ -452,15 +452,15 @@ describe("PythTest", () => { "0000000000000000000000000000000000000000000000000000000000000000"; await expect( - pythTest.getPriceUnsafe(nonExistentPriceFeedId) + pythTest.getPriceUnsafe(nonExistentPriceFeedId), ).rejects.toThrow("Unable to execute get method. Got exit_code: 2000"); // ERROR_PRICE_FEED_NOT_FOUND = 2000 await expect( - pythTest.getPriceNoOlderThan(TIME_PERIOD, nonExistentPriceFeedId) + pythTest.getPriceNoOlderThan(TIME_PERIOD, nonExistentPriceFeedId), ).rejects.toThrow("Unable to execute get method. Got exit_code: 2000"); // ERROR_PRICE_FEED_NOT_FOUND await expect( - pythTest.getEmaPriceUnsafe(nonExistentPriceFeedId) + pythTest.getEmaPriceUnsafe(nonExistentPriceFeedId), ).rejects.toThrow("Unable to execute get method. Got exit_code: 2000"); // ERROR_PRICE_FEED_NOT_FOUND }); @@ -483,7 +483,7 @@ describe("PythTest", () => { 60051, 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Check initial value @@ -493,7 +493,7 @@ describe("PythTest", () => { // Execute a governance action (e.g., set fee) await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_FEE, "hex") + Buffer.from(PYTH_SET_FEE, "hex"), ); // Check that the sequence has increased @@ -514,7 +514,7 @@ describe("PythTest", () => { 60051, 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Check initial value @@ -524,7 +524,7 @@ describe("PythTest", () => { // Execute governance action to change data source await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_AUTHORIZE_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex") + Buffer.from(PYTH_AUTHORIZE_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex"), ); // Check that the index has increased @@ -552,7 +552,7 @@ describe("PythTest", () => { 60051, 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Check that the governance data source is set @@ -562,7 +562,7 @@ describe("PythTest", () => { // Execute governance action to change data source await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_AUTHORIZE_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex") + Buffer.from(PYTH_AUTHORIZE_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex"), ); // Check that the data source has changed @@ -591,13 +591,13 @@ describe("PythTest", () => { 60051, // CHAIN_ID of starknet since we are using the test payload for starknet 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Execute the governance action const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_DATA_SOURCES, "hex") + Buffer.from(PYTH_SET_DATA_SOURCES, "hex"), ); expect(result.transactions).toHaveTransaction({ from: deployer.address, @@ -626,9 +626,8 @@ describe("PythTest", () => { // Verify that the old data source is no longer valid const oldDataSource = DATA_SOURCES[0]; - const oldDataSourceIsValid = await pythTest.getIsValidDataSource( - oldDataSource - ); + const oldDataSourceIsValid = + await pythTest.getIsValidDataSource(oldDataSource); expect(oldDataSourceIsValid).toBe(false); }); @@ -644,7 +643,7 @@ describe("PythTest", () => { 60051, // CHAIN_ID of starknet since we are using the test payload for starknet 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Get the initial fee @@ -654,7 +653,7 @@ describe("PythTest", () => { // Execute the governance action const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_FEE, "hex") + Buffer.from(PYTH_SET_FEE, "hex"), ); expect(result.transactions).toHaveTransaction({ from: deployer.address, @@ -684,7 +683,7 @@ describe("PythTest", () => { 60051, // CHAIN_ID of starknet since we are using the test payload for starknet 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Get the initial governance data source index @@ -702,7 +701,7 @@ describe("PythTest", () => { // Execute the governance action const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_AUTHORIZE_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex") + Buffer.from(PYTH_AUTHORIZE_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex"), ); expect(result.transactions).toHaveTransaction({ from: deployer.address, @@ -737,12 +736,12 @@ describe("PythTest", () => { 60051, // CHAIN_ID of starknet since we are using the test payload for starknet 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[1] + TEST_GOVERNANCE_DATA_SOURCES[1], ); const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_REQUEST_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex") + Buffer.from(PYTH_REQUEST_GOVERNANCE_DATA_SOURCE_TRANSFER, "hex"), ); // Check that the transaction did not succeed @@ -774,12 +773,12 @@ describe("PythTest", () => { 60051, 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[1] + TEST_GOVERNANCE_DATA_SOURCES[1], ); const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_FEE, "hex") + Buffer.from(PYTH_SET_FEE, "hex"), ); expect(result.transactions).toHaveTransaction({ @@ -802,19 +801,19 @@ describe("PythTest", () => { 60051, 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); // Execute a governance action to increase the sequence number await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_FEE, "hex") + Buffer.from(PYTH_SET_FEE, "hex"), ); // Try to execute the same governance action again const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_FEE, "hex") + Buffer.from(PYTH_SET_FEE, "hex"), ); expect(result.transactions).toHaveTransaction({ @@ -838,12 +837,12 @@ describe("PythTest", () => { invalidChainId, 1, "0000000000000000000000000000000000000000000000000000000000000004", - TEST_GOVERNANCE_DATA_SOURCES[0] + TEST_GOVERNANCE_DATA_SOURCES[0], ); const result = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(PYTH_SET_FEE, "hex") + Buffer.from(PYTH_SET_FEE, "hex"), ); expect(result.transactions).toHaveTransaction({ @@ -889,14 +888,14 @@ describe("PythTest", () => { 1, 1, "0000000000000000000000000000000000000000000000000000000000000000", - TEST_GOVERNANCE_DATA_SOURCES[2] + TEST_GOVERNANCE_DATA_SOURCES[2], ); // Execute the upgrade const sendExecuteGovernanceActionResult = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(serialize(authorizeUpgradeVaa)) + Buffer.from(serialize(authorizeUpgradeVaa)), ); expect(sendExecuteGovernanceActionResult.transactions).toHaveTransaction({ @@ -908,7 +907,7 @@ describe("PythTest", () => { // Execute the upgrade const sendUpgradeContractResult = await pythTest.sendUpgradeContract( deployer.getSender(), - upgradedCode + upgradedCode, ); expect(sendUpgradeContractResult.transactions).toHaveTransaction({ @@ -957,14 +956,14 @@ describe("PythTest", () => { 1, 1, "0000000000000000000000000000000000000000000000000000000000000000", - TEST_GOVERNANCE_DATA_SOURCES[2] + TEST_GOVERNANCE_DATA_SOURCES[2], ); // Execute the upgrade authorization const sendExecuteGovernanceActionResult = await pythTest.sendExecuteGovernanceAction( deployer.getSender(), - Buffer.from(serialize(authorizeUpgradeVaa)) + Buffer.from(serialize(authorizeUpgradeVaa)), ); expect(sendExecuteGovernanceActionResult.transactions).toHaveTransaction({ @@ -977,7 +976,7 @@ describe("PythTest", () => { const wormholeTestCode = await compile("WormholeTest"); const sendUpgradeContractResult = await pythTest.sendUpgradeContract( deployer.getSender(), - wormholeTestCode + wormholeTestCode, ); // Expect the transaction to fail @@ -1005,7 +1004,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, HERMES_BTC_PUBLISH_TIME, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success and message count @@ -1021,7 +1020,7 @@ describe("PythTest", () => { // Verify excess value is returned expect( - (outMessage.info as CommonMessageInfoInternal).value.coins + (outMessage.info as CommonMessageInfoInternal).value.coins, ).toBeGreaterThan(0); const cs = outMessage.body.beginParse(); @@ -1097,17 +1096,17 @@ describe("PythTest", () => { // Verify sender address const senderAddress = cs.loadAddress(); expect(senderAddress?.toString()).toBe( - deployer.getSender().address.toString() + deployer.getSender().address.toString(), ); // Verify custom payload const customPayloadCell = cs.loadRef(); const customPayloadSlice = customPayloadCell.beginParse(); const receivedPayload = Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), ); expect(receivedPayload.toString("hex")).toBe( - CUSTOM_PAYLOAD.toString("hex") + CUSTOM_PAYLOAD.toString("hex"), ); }); @@ -1124,7 +1123,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, 60, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success and message count @@ -1140,7 +1139,7 @@ describe("PythTest", () => { // Verify excess value is returned expect( - (outMessage.info as CommonMessageInfoInternal).value.coins + (outMessage.info as CommonMessageInfoInternal).value.coins, ).toBeGreaterThan(0); const cs = outMessage.body.beginParse(); @@ -1216,17 +1215,17 @@ describe("PythTest", () => { // Verify sender address const senderAddress = cs.loadAddress(); expect(senderAddress?.toString()).toBe( - deployer.getSender().address.toString() + deployer.getSender().address.toString(), ); // Verify custom payload const customPayloadCell = cs.loadRef(); const customPayloadSlice = customPayloadCell.beginParse(); const receivedPayload = Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), ); expect(receivedPayload.toString("hex")).toBe( - CUSTOM_PAYLOAD.toString("hex") + CUSTOM_PAYLOAD.toString("hex"), ); }); @@ -1244,7 +1243,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, HERMES_BTC_PUBLISH_TIME, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success but error response sent @@ -1278,8 +1277,8 @@ describe("PythTest", () => { const customPayloadSlice = customPayloadCell.beginParse(); expect( Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) - ).toString("hex") + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), + ).toString("hex"), ).toBe(CUSTOM_PAYLOAD.toString("hex")); }); @@ -1296,7 +1295,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME + 1, HERMES_BTC_PUBLISH_TIME + 1, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success but error response sent @@ -1330,8 +1329,8 @@ describe("PythTest", () => { const customPayloadSlice = customPayloadCell.beginParse(); expect( Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) - ).toString("hex") + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), + ).toString("hex"), ).toBe(CUSTOM_PAYLOAD.toString("hex")); }); @@ -1348,7 +1347,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, 60, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success but error response sent @@ -1382,8 +1381,8 @@ describe("PythTest", () => { const customPayloadSlice = customPayloadCell.beginParse(); expect( Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) - ).toString("hex") + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), + ).toString("hex"), ).toBe(CUSTOM_PAYLOAD.toString("hex")); }); @@ -1400,7 +1399,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, HERMES_BTC_PUBLISH_TIME, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success and message count @@ -1416,11 +1415,11 @@ describe("PythTest", () => { // Verify excess value is returned expect( - (outMessage.info as CommonMessageInfoInternal).value.coins + (outMessage.info as CommonMessageInfoInternal).value.coins, ).toBeGreaterThan(0); expect((outMessage.info as CommonMessageInfoInternal).dest.toString()).toBe( - deployer.address.toString() + deployer.address.toString(), ); const cs = outMessage.body.beginParse(); @@ -1507,7 +1506,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, 60, deployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success and message count @@ -1523,7 +1522,7 @@ describe("PythTest", () => { // Verify excess value is returned expect( - (outMessage.info as CommonMessageInfoInternal).value.coins + (outMessage.info as CommonMessageInfoInternal).value.coins, ).toBeGreaterThan(0); const cs = outMessage.body.beginParse(); @@ -1609,7 +1608,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, HERMES_BTC_PUBLISH_TIME, mockDeployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success and message count @@ -1632,7 +1631,7 @@ describe("PythTest", () => { // Verify excess value is returned expect( - (outMessage.info as CommonMessageInfoInternal).value.coins + (outMessage.info as CommonMessageInfoInternal).value.coins, ).toBeGreaterThan(0); const cs = outMessage.body.beginParse(); @@ -1650,17 +1649,17 @@ describe("PythTest", () => { // Verify sender address const senderAddress = cs.loadAddress(); expect(senderAddress?.toString()).toBe( - deployer.getSender().address.toString() + deployer.getSender().address.toString(), ); // Verify custom payload const customPayloadCell = cs.loadRef(); const customPayloadSlice = customPayloadCell.beginParse(); const receivedPayload = Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), ); expect(receivedPayload.toString("hex")).toBe( - CUSTOM_PAYLOAD.toString("hex") + CUSTOM_PAYLOAD.toString("hex"), ); }); @@ -1677,7 +1676,7 @@ describe("PythTest", () => { HERMES_BTC_PUBLISH_TIME, 60, mockDeployer.address, - CUSTOM_PAYLOAD + CUSTOM_PAYLOAD, ); // Verify transaction success and message count @@ -1700,7 +1699,7 @@ describe("PythTest", () => { // Verify excess value is returned expect( - (outMessage.info as CommonMessageInfoInternal).value.coins + (outMessage.info as CommonMessageInfoInternal).value.coins, ).toBeGreaterThan(0); const cs = outMessage.body.beginParse(); @@ -1718,17 +1717,17 @@ describe("PythTest", () => { // Verify sender address const senderAddress = cs.loadAddress(); expect(senderAddress?.toString()).toBe( - deployer.getSender().address.toString() + deployer.getSender().address.toString(), ); // Verify custom payload const customPayloadCell = cs.loadRef(); const customPayloadSlice = customPayloadCell.beginParse(); const receivedPayload = Buffer.from( - customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length) + customPayloadSlice.loadBuffer(CUSTOM_PAYLOAD.length), ); expect(receivedPayload.toString("hex")).toBe( - CUSTOM_PAYLOAD.toString("hex") + CUSTOM_PAYLOAD.toString("hex"), ); }); }); diff --git a/target_chains/ton/contracts/tests/WormholeTest.spec.ts b/target_chains/ton/contracts/tests/WormholeTest.spec.ts index 547f34f133..10aad3a8be 100644 --- a/target_chains/ton/contracts/tests/WormholeTest.spec.ts +++ b/target_chains/ton/contracts/tests/WormholeTest.spec.ts @@ -36,7 +36,7 @@ describe("WormholeTest", () => { guardianSet: string[] = GUARDIAN_SET_0, chainId: number = CHAIN_ID, governanceChainId: number = GOVERNANCE_CHAIN_ID, - governanceContract: string = GOVERNANCE_CONTRACT + governanceContract: string = GOVERNANCE_CONTRACT, ) { const config: WormholeTestConfig = { guardianSetIndex, @@ -47,12 +47,12 @@ describe("WormholeTest", () => { }; wormholeTest = blockchain.openContract( - WormholeTest.createFromConfig(config, code) + WormholeTest.createFromConfig(config, code), ); const deployResult = await wormholeTest.sendDeploy( deployer.getSender(), - toNano("0.05") + toNano("0.05"), ); expect(deployResult.transactions).toHaveTransaction({ @@ -75,12 +75,12 @@ describe("WormholeTest", () => { const encodedUpgrade = createGuardianSetUpgradeBytes( chainId, newGuardianSetIndex, - GUARDIAN_SET_4 + GUARDIAN_SET_4, ); const result = await wormholeTest.getParseEncodedUpgrade( currentGuardianSetIndex, - encodedUpgrade + encodedUpgrade, ); expect(result.action).toBe(2); @@ -100,7 +100,7 @@ describe("WormholeTest", () => { const encodedUpgrade = createGuardianSetUpgradeBytes( chainId, newGuardianSetIndex, - GUARDIAN_SET_4 + GUARDIAN_SET_4, ); // Replace the first 32 bytes with zeros @@ -110,8 +110,8 @@ describe("WormholeTest", () => { await expect( wormholeTest.getParseEncodedUpgrade( currentGuardianSetIndex, - encodedUpgrade - ) + encodedUpgrade, + ), ).rejects.toThrow("Unable to execute get method. Got exit_code: 1011"); // ERROR_INVALID_MODULE = 1011 }); @@ -121,7 +121,7 @@ describe("WormholeTest", () => { const mainnet_upgrade_vaa_1 = MAINNET_UPGRADE_VAAS[0]; const result = await wormholeTest.getParseAndVerifyWormholeVm( - Buffer.from(mainnet_upgrade_vaa_1, "hex") + Buffer.from(mainnet_upgrade_vaa_1, "hex"), ); expect(result.version).toBe(1); expect(result.vm_guardian_set_index).toBe(0); @@ -129,13 +129,13 @@ describe("WormholeTest", () => { expect(result.nonce).toBe(3); expect(result.emitter_chain_id).toBe(1); expect(result.emitter_address.toString()).toBe( - "0000000000000000000000000000000000000000000000000000000000000004" + "0000000000000000000000000000000000000000000000000000000000000004", ); expect(result.sequence).toBe(1337); expect(result.consistency_level).toBe(0); expect(result.payload).toBe(mainnet_upgrade_vaa_1.slice(246)); expect(result.hash).toBe( - "ed3a5600d44b9dcc889daf0178dd69ab1e9356308194ba3628a7b720ae48a8d5" + "ed3a5600d44b9dcc889daf0178dd69ab1e9356308194ba3628a7b720ae48a8d5", ); }); @@ -146,7 +146,7 @@ describe("WormholeTest", () => { const getUpdateGuardianSetResult = await wormholeTest.sendUpdateGuardianSet( deployer.getSender(), - Buffer.from(mainnet_upgrade_vaa_1, "hex") + Buffer.from(mainnet_upgrade_vaa_1, "hex"), ); expect(getUpdateGuardianSetResult.transactions).toHaveTransaction({ from: deployer.address, @@ -164,7 +164,7 @@ describe("WormholeTest", () => { const invalid_mainnet_upgrade_vaa = "00" + MAINNET_UPGRADE_VAAS[0].slice(2); const result = await wormholeTest.sendUpdateGuardianSet( deployer.getSender(), - Buffer.from(invalid_mainnet_upgrade_vaa, "hex") + Buffer.from(invalid_mainnet_upgrade_vaa, "hex"), ); expect(result.transactions).toHaveTransaction({ from: deployer.address, @@ -214,16 +214,16 @@ describe("WormholeTest", () => { const getParseAndVerifyWormholeVmResult = await wormholeTest.getParseAndVerifyWormholeVm( - Buffer.from(mainnet_upgrade_vaa_1, "hex") + Buffer.from(mainnet_upgrade_vaa_1, "hex"), ); expect(getParseAndVerifyWormholeVmResult.hash).toBe( - "ed3a5600d44b9dcc889daf0178dd69ab1e9356308194ba3628a7b720ae48a8d5" + "ed3a5600d44b9dcc889daf0178dd69ab1e9356308194ba3628a7b720ae48a8d5", ); const sendUpdateGuardianSetResult = await wormholeTest.sendUpdateGuardianSet( deployer.getSender(), - Buffer.from(mainnet_upgrade_vaa_1, "hex") + Buffer.from(mainnet_upgrade_vaa_1, "hex"), ); expect(sendUpdateGuardianSetResult.transactions).toHaveTransaction({ from: deployer.address, @@ -233,7 +233,7 @@ describe("WormholeTest", () => { getGovernanceActionIsConsumedResult = await wormholeTest.getGovernanceActionIsConsumed( - BigInt("0x" + getParseAndVerifyWormholeVmResult.hash) + BigInt("0x" + getParseAndVerifyWormholeVmResult.hash), ); expect(getGovernanceActionIsConsumedResult).toEqual(true); }); diff --git a/target_chains/ton/contracts/tests/utils/wormhole.ts b/target_chains/ton/contracts/tests/utils/wormhole.ts index 707b8bb2c4..66c3aafed5 100644 --- a/target_chains/ton/contracts/tests/utils/wormhole.ts +++ b/target_chains/ton/contracts/tests/utils/wormhole.ts @@ -94,7 +94,7 @@ export const GUARDIAN_SET_4 = [ export function createGuardianSetUpgradeBytes( chainId: number, newGuardianSetIndex: number, - guardians: string[] + guardians: string[], ): Buffer { const payload = Buffer.alloc(1024); let offset = 0; @@ -140,11 +140,11 @@ export function createGuardianSetUpgradeBytes( export function createGuardianSetsDict( guardianSet: string[], - guardianSetIndex: number + guardianSetIndex: number, ): Dictionary { const guardianSetDict = Dictionary.empty( Dictionary.Keys.Uint(8), - Dictionary.Values.Buffer(20) + Dictionary.Values.Buffer(20), ); guardianSet.forEach((key, index) => { guardianSetDict.set(index, Buffer.from(key.slice(2), "hex")); @@ -152,7 +152,7 @@ export function createGuardianSetsDict( const guardianSets = Dictionary.empty( Dictionary.Keys.Uint(32), - Dictionary.Values.Cell() + Dictionary.Values.Cell(), ); const guardianSetCell = beginCell() .storeUint(0, 64) // expiration_time, set to 0 for testing diff --git a/target_chains/ton/contracts/wrappers/BaseWrapper.ts b/target_chains/ton/contracts/wrappers/BaseWrapper.ts index e21ff376f7..eb34ee97a6 100644 --- a/target_chains/ton/contracts/wrappers/BaseWrapper.ts +++ b/target_chains/ton/contracts/wrappers/BaseWrapper.ts @@ -17,7 +17,7 @@ import { DataSource } from "@pythnetwork/xc-admin-common"; export class BaseWrapper implements Contract { constructor( readonly address: Address, - readonly init?: { code: Cell; data: Cell } + readonly init?: { code: Cell; data: Cell }, ) {} static createFromAddress(address: Address) { @@ -39,18 +39,18 @@ export class BaseWrapper implements Contract { }): Cell { const priceDict = Dictionary.empty( Dictionary.Keys.BigUint(256), - Dictionary.Values.Cell() + Dictionary.Values.Cell(), ); if (config.priceFeedId && config.price && config.emaPrice) { const priceCell = beginCell() .storeInt( config.price.getPriceAsNumberUnchecked() * 10 ** -config.price.expo, - 64 + 64, ) .storeUint( config.price.getConfAsNumberUnchecked() * 10 ** -config.price.expo, - 64 + 64, ) .storeInt(config.price.expo, 32) .storeUint(config.price.publishTime, 64) @@ -60,12 +60,12 @@ export class BaseWrapper implements Contract { .storeInt( config.emaPrice.getPriceAsNumberUnchecked() * 10 ** -config.emaPrice.expo, - 64 + 64, ) .storeUint( config.emaPrice.getConfAsNumberUnchecked() * 10 ** -config.emaPrice.expo, - 64 + 64, ) .storeInt(config.emaPrice.expo, 32) .storeUint(config.emaPrice.publishTime, 64) @@ -82,7 +82,7 @@ export class BaseWrapper implements Contract { // Create a dictionary for valid data sources const isValidDataSourceDict = Dictionary.empty( Dictionary.Keys.BigUint(256), - Dictionary.Values.Bool() + Dictionary.Values.Bool(), ); if (config.dataSources) { @@ -111,7 +111,7 @@ export class BaseWrapper implements Contract { const guardianSetCell = beginCell() .storeUint(config.guardianSetIndex, 32) .storeDict( - createGuardianSetsDict(config.guardianSet, config.guardianSetIndex) + createGuardianSetsDict(config.guardianSet, config.guardianSetIndex), ) .endCell(); @@ -126,10 +126,10 @@ export class BaseWrapper implements Contract { ? beginCell() .storeUint(config.governanceDataSource.emitterChain, 16) .storeBuffer( - Buffer.from(config.governanceDataSource.emitterAddress, "hex") + Buffer.from(config.governanceDataSource.emitterAddress, "hex"), ) .endCell() - : beginCell().endCell() + : beginCell().endCell(), ) // governance_data_source .storeUint(0, 64) // last_executed_governance_sequence, set to 0 for initial state .storeUint(0, 32) // governance_data_source_index, set to 0 for initial state @@ -155,7 +155,7 @@ export class BaseWrapper implements Contract { async getCurrentGuardianSetIndex( provider: ContractProvider, - methodName: string + methodName: string, ) { const result = await provider.get(methodName, []); return result.stack.readNumber(); @@ -164,7 +164,7 @@ export class BaseWrapper implements Contract { async sendUpdateGuardianSet( provider: ContractProvider, via: Sender, - vm: Buffer + vm: Buffer, ) { const messageBody = beginCell() .storeUint(1, 32) // OP_UPDATE_GUARDIAN_SET @@ -182,7 +182,7 @@ export class BaseWrapper implements Contract { provider: ContractProvider, via: Sender, updateData: Buffer, - updateFee: bigint + updateFee: bigint, ) { const messageBody = beginCell() .storeUint(2, 32) // OP_UPDATE_PRICE_FEEDS @@ -204,7 +204,7 @@ export class BaseWrapper implements Contract { async getPriceUnsafe( provider: ContractProvider, priceFeedId: HexString, - methodName: string + methodName: string, ) { const result = await provider.get(methodName, [ { type: "int", value: BigInt(priceFeedId) }, @@ -227,7 +227,7 @@ export class BaseWrapper implements Contract { provider: ContractProvider, timePeriod: number, priceFeedId: HexString, - methodName: string + methodName: string, ) { const result = await provider.get(methodName, [ { type: "int", value: BigInt(timePeriod) }, @@ -250,7 +250,7 @@ export class BaseWrapper implements Contract { async getEmaPriceUnsafe( provider: ContractProvider, priceFeedId: HexString, - methodName: string + methodName: string, ) { const result = await provider.get(methodName, [ { type: "int", value: BigInt(priceFeedId) }, @@ -273,7 +273,7 @@ export class BaseWrapper implements Contract { provider: ContractProvider, timePeriod: number, priceFeedId: HexString, - methodName: string + methodName: string, ) { const result = await provider.get(methodName, [ { type: "int", value: BigInt(timePeriod) }, @@ -296,7 +296,7 @@ export class BaseWrapper implements Contract { async getUpdateFee( provider: ContractProvider, vm: Buffer, - methodName: string + methodName: string, ) { const result = await provider.get(methodName, [ { type: "slice", cell: createCellChain(vm) }, diff --git a/target_chains/ton/contracts/wrappers/Main.ts b/target_chains/ton/contracts/wrappers/Main.ts index 0c04af1351..6281088d30 100644 --- a/target_chains/ton/contracts/wrappers/Main.ts +++ b/target_chains/ton/contracts/wrappers/Main.ts @@ -33,14 +33,14 @@ export class Main extends BaseWrapper { async getCurrentGuardianSetIndex(provider: ContractProvider) { return await super.getCurrentGuardianSetIndex( provider, - "get_current_guardian_set_index" + "get_current_guardian_set_index", ); } async sendUpdateGuardianSet( provider: ContractProvider, via: Sender, - vm: Buffer + vm: Buffer, ) { await super.sendUpdateGuardianSet(provider, via, vm); } @@ -49,7 +49,7 @@ export class Main extends BaseWrapper { provider: ContractProvider, via: Sender, updateData: Buffer, - updateFee: bigint + updateFee: bigint, ) { await super.sendUpdatePriceFeeds(provider, via, updateData, updateFee); } @@ -58,20 +58,20 @@ export class Main extends BaseWrapper { return await super.getPriceUnsafe( provider, priceFeedId, - "get_price_unsafe" + "get_price_unsafe", ); } async getPriceNoOlderThan( provider: ContractProvider, timePeriod: number, - priceFeedId: HexString + priceFeedId: HexString, ) { return await super.getPriceNoOlderThan( provider, timePeriod, priceFeedId, - "get_price_no_older_than" + "get_price_no_older_than", ); } @@ -79,20 +79,20 @@ export class Main extends BaseWrapper { return await super.getEmaPriceUnsafe( provider, priceFeedId, - "get_ema_price_unsafe" + "get_ema_price_unsafe", ); } async getEmaPriceNoOlderThan( provider: ContractProvider, timePeriod: number, - priceFeedId: HexString + priceFeedId: HexString, ) { return await super.getEmaPriceNoOlderThan( provider, timePeriod, priceFeedId, - "get_ema_price_no_older_than" + "get_ema_price_no_older_than", ); } diff --git a/target_chains/ton/contracts/wrappers/PythTest.ts b/target_chains/ton/contracts/wrappers/PythTest.ts index b1551b0f15..7cbd1112de 100644 --- a/target_chains/ton/contracts/wrappers/PythTest.ts +++ b/target_chains/ton/contracts/wrappers/PythTest.ts @@ -50,20 +50,20 @@ export class PythTest extends BaseWrapper { return await super.getPriceUnsafe( provider, priceFeedId, - "test_get_price_unsafe" + "test_get_price_unsafe", ); } async getPriceNoOlderThan( provider: ContractProvider, timePeriod: number, - priceFeedId: HexString + priceFeedId: HexString, ) { return await super.getPriceNoOlderThan( provider, timePeriod, priceFeedId, - "test_get_price_no_older_than" + "test_get_price_no_older_than", ); } @@ -71,20 +71,20 @@ export class PythTest extends BaseWrapper { return await super.getEmaPriceUnsafe( provider, priceFeedId, - "test_get_ema_price_unsafe" + "test_get_ema_price_unsafe", ); } async getEmaPriceNoOlderThan( provider: ContractProvider, timePeriod: number, - priceFeedId: HexString + priceFeedId: HexString, ) { return await super.getEmaPriceNoOlderThan( provider, timePeriod, priceFeedId, - "test_get_ema_price_no_older_than" + "test_get_ema_price_no_older_than", ); } @@ -95,7 +95,7 @@ export class PythTest extends BaseWrapper { async getSingleUpdateFee(provider: ContractProvider) { return await super.getSingleUpdateFee( provider, - "test_get_single_update_fee" + "test_get_single_update_fee", ); } @@ -103,7 +103,7 @@ export class PythTest extends BaseWrapper { provider: ContractProvider, via: Sender, updateData: Buffer, - updateFee: bigint + updateFee: bigint, ) { await super.sendUpdatePriceFeeds(provider, via, updateData, updateFee); } @@ -111,7 +111,7 @@ export class PythTest extends BaseWrapper { async sendUpdateGuardianSet( provider: ContractProvider, via: Sender, - vm: Buffer + vm: Buffer, ) { await super.sendUpdateGuardianSet(provider, via, vm); } @@ -124,7 +124,7 @@ export class PythTest extends BaseWrapper { async getLastExecutedGovernanceSequence(provider: ContractProvider) { const result = await provider.get( "test_get_last_executed_governance_sequence", - [] + [], ); return result.stack.readNumber(); } @@ -132,7 +132,7 @@ export class PythTest extends BaseWrapper { async getGovernanceDataSourceIndex(provider: ContractProvider) { const result = await provider.get( "test_get_governance_data_source_index", - [] + [], ); return result.stack.readNumber(); } @@ -145,7 +145,7 @@ export class PythTest extends BaseWrapper { async sendExecuteGovernanceAction( provider: ContractProvider, via: Sender, - governanceAction: Buffer + governanceAction: Buffer, ) { const messageBody = beginCell() .storeUint(3, 32) // OP_EXECUTE_GOVERNANCE_ACTION @@ -162,7 +162,7 @@ export class PythTest extends BaseWrapper { async sendUpgradeContract( provider: ContractProvider, via: Sender, - newCode: Cell + newCode: Cell, ) { const messageBody = beginCell() .storeUint(4, 32) // OP_UPGRADE_CONTRACT @@ -178,7 +178,7 @@ export class PythTest extends BaseWrapper { async getIsValidDataSource( provider: ContractProvider, - dataSource: DataSource + dataSource: DataSource, ) { const result = await provider.get("test_get_is_valid_data_source", [ { @@ -204,7 +204,7 @@ export class PythTest extends BaseWrapper { time1: number, time2: number, targetAddress: Address, - customPayload: Buffer + customPayload: Buffer, ): Cell { // Create a buffer for price IDs: 1 byte length + (32 bytes per ID) const priceIdsBuffer = Buffer.alloc(1 + priceIds.length * 32); @@ -237,7 +237,7 @@ export class PythTest extends BaseWrapper { minPublishTime: number, maxPublishTime: number, targetAddress: Address, - customPayload: Buffer + customPayload: Buffer, ) { const messageCell = this.createPriceFeedMessage( 5, // OP_PARSE_PRICE_FEED_UPDATES @@ -246,7 +246,7 @@ export class PythTest extends BaseWrapper { minPublishTime, maxPublishTime, targetAddress, - customPayload + customPayload, ); await provider.internal(via, { @@ -265,7 +265,7 @@ export class PythTest extends BaseWrapper { publishTime: number, maxStaleness: number, targetAddress: Address, - customPayload: Buffer + customPayload: Buffer, ) { const messageCell = this.createPriceFeedMessage( 6, // OP_PARSE_UNIQUE_PRICE_FEED_UPDATES @@ -274,7 +274,7 @@ export class PythTest extends BaseWrapper { publishTime, maxStaleness, targetAddress, - customPayload + customPayload, ); await provider.internal(via, { diff --git a/target_chains/ton/contracts/wrappers/WormholeTest.ts b/target_chains/ton/contracts/wrappers/WormholeTest.ts index d7bd522897..a5600e5152 100644 --- a/target_chains/ton/contracts/wrappers/WormholeTest.ts +++ b/target_chains/ton/contracts/wrappers/WormholeTest.ts @@ -17,7 +17,7 @@ export class WormholeTest extends BaseWrapper { static createFromConfig( config: WormholeTestConfig, code: Cell, - workchain = 0 + workchain = 0, ) { const data = WormholeTest.getWormholeInitData(config); const init = { code, data }; @@ -41,7 +41,7 @@ export class WormholeTest extends BaseWrapper { async getParseEncodedUpgrade( provider: ContractProvider, currentGuardianSetIndex: number, - encodedUpgrade: Buffer + encodedUpgrade: Buffer, ) { const result = await provider.get("test_parse_encoded_upgrade", [ { type: "int", value: BigInt(currentGuardianSetIndex) }, @@ -106,7 +106,7 @@ export class WormholeTest extends BaseWrapper { async getCurrentGuardianSetIndex(provider: ContractProvider) { return await super.getCurrentGuardianSetIndex( provider, - "test_get_current_guardian_set_index" + "test_get_current_guardian_set_index", ); } @@ -143,7 +143,7 @@ export class WormholeTest extends BaseWrapper { async getGovernanceActionIsConsumed( provider: ContractProvider, - hash: bigint + hash: bigint, ) { const result = await provider.get("test_governance_action_is_consumed", [ { type: "int", value: hash }, @@ -154,7 +154,7 @@ export class WormholeTest extends BaseWrapper { async sendUpdateGuardianSet( provider: ContractProvider, via: Sender, - vm: Buffer + vm: Buffer, ) { await super.sendUpdateGuardianSet(provider, via, vm); } diff --git a/target_chains/ton/sdk/js/src/index.ts b/target_chains/ton/sdk/js/src/index.ts index b42b42cbc1..dfe56a63da 100644 --- a/target_chains/ton/sdk/js/src/index.ts +++ b/target_chains/ton/sdk/js/src/index.ts @@ -28,7 +28,7 @@ export interface DataSource { export class PythContract implements Contract { constructor( readonly address: Address, - readonly init?: { code: Cell; data: Cell } + readonly init?: { code: Cell; data: Cell }, ) {} static createFromAddress(address: Address) { @@ -44,7 +44,7 @@ export class PythContract implements Contract { async sendUpdateGuardianSet( provider: ContractProvider, via: Sender, - vm: Buffer + vm: Buffer, ) { const messageBody = beginCell() .storeUint(1, 32) // OP_UPDATE_GUARDIAN_SET @@ -62,7 +62,7 @@ export class PythContract implements Contract { provider: ContractProvider, via: Sender, updateData: Buffer, - updateFee: bigint + updateFee: bigint, ) { const messageBody = beginCell() .storeUint(2, 32) // OP_UPDATE_PRICE_FEEDS @@ -79,7 +79,7 @@ export class PythContract implements Contract { async sendExecuteGovernanceAction( provider: ContractProvider, via: Sender, - governanceAction: Buffer + governanceAction: Buffer, ) { const messageBody = beginCell() .storeUint(3, 32) // OP_EXECUTE_GOVERNANCE_ACTION @@ -96,7 +96,7 @@ export class PythContract implements Contract { async sendUpgradeContract( provider: ContractProvider, via: Sender, - newCode: Cell + newCode: Cell, ) { const messageBody = beginCell() .storeUint(4, 32) // OP_UPGRADE_CONTRACT @@ -131,7 +131,7 @@ export class PythContract implements Contract { async getPriceNoOlderThan( provider: ContractProvider, timePeriod: number, - priceFeedId: string + priceFeedId: string, ) { const result = await provider.get("get_price_no_older_than", [ { type: "int", value: BigInt(timePeriod) }, @@ -172,7 +172,7 @@ export class PythContract implements Contract { async getEmaPriceNoOlderThan( provider: ContractProvider, timePeriod: number, - priceFeedId: string + priceFeedId: string, ) { const result = await provider.get("get_ema_price_no_older_than", [ { type: "int", value: BigInt(timePeriod) }, @@ -209,7 +209,7 @@ export class PythContract implements Contract { async getLastExecutedGovernanceSequence(provider: ContractProvider) { const result = await provider.get( "get_last_executed_governance_sequence", - [] + [], ); return result.stack.readNumber(); @@ -277,7 +277,7 @@ function bufferToChunks(buff: Buffer, chunkSizeBytes = 127): Uint8Array[] { const uint8Array = new Uint8Array( buff.buffer, buff.byteOffset, - buff.byteLength + buff.byteLength, ); for (let offset = 0; offset < uint8Array.length; offset += chunkSizeBytes) { @@ -294,7 +294,7 @@ export function parseDataSources(cell: Cell): DataSource[] { const slice = cell.beginParse(); const dict = slice.loadDictDirect( Dictionary.Keys.Uint(8), - Dictionary.Values.Cell() + Dictionary.Values.Cell(), ); for (const [, value] of dict) { const dataSource = parseDataSource(value); From 8a057579292fa2e92748354ac1275cbba9ca5537 Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 14:05:24 -0700 Subject: [PATCH 3/7] chore: update turbo config This commit cleans up and updates the turbo config so that: 1. Tests and fixes can run on the [root package](https://turbo.build/repo/docs/crafting-your-repository/configuring-tasks#registering-root-tasks), e.g. to format or lint any files that don't exist inside a workspace package 2. More config is shared and we don't have as much config scoped to individual packages 3. `pnpm install` automatically runs at the right times (i.e. you don't have to manually run an install ever) --- .github/workflows/ci-turbo-test.yml | 2 +- apps/api-reference/turbo.json | 16 --- apps/entropy-debugger/turbo.json | 19 --- apps/hermes/client/js/README.md | 7 +- apps/hermes/client/js/turbo.json | 7 +- apps/insights/turbo.json | 32 ++--- apps/staking/turbo.json | 16 +-- flake.nix | 6 +- .../packages/xc_admin_frontend/turbo.json | 15 +-- lazer/contracts/solana/turbo.json | 3 - package.json | 10 +- packages/component-library/turbo.json | 20 ++-- .../ethereum/sdk/solidity/turbo.json | 2 + turbo.json | 109 ++++++++++++++++-- 14 files changed, 143 insertions(+), 121 deletions(-) delete mode 100644 apps/entropy-debugger/turbo.json diff --git a/.github/workflows/ci-turbo-test.yml b/.github/workflows/ci-turbo-test.yml index f4df602cde..37eb12ed5a 100644 --- a/.github/workflows/ci-turbo-test.yml +++ b/.github/workflows/ci-turbo-test.yml @@ -33,4 +33,4 @@ jobs: - name: Cache for Turbo uses: rharkor/caching-for-turbo@v1.5 - name: Test - run: pnpm test:ci + run: pnpm turbo test diff --git a/apps/api-reference/turbo.json b/apps/api-reference/turbo.json index 8faef52b0a..02dce5c7d2 100644 --- a/apps/api-reference/turbo.json +++ b/apps/api-reference/turbo.json @@ -3,27 +3,11 @@ "extends": ["//"], "tasks": { "build": { - "dependsOn": ["pull:env", "^build"], - "outputs": [".next/**", "!.next/cache/**"], "env": [ "WALLETCONNECT_PROJECT_ID", "AMPLITUDE_API_KEY", "GOOGLE_ANALYTICS_ID" ] - }, - "pull:env": { - "outputs": [".env.local"], - "cache": false - }, - "start:dev": { - "dependsOn": ["pull:env"], - "persistent": true, - "cache": false - }, - "start:prod": { - "dependsOn": ["build"], - "persistent": true, - "cache": false } } } diff --git a/apps/entropy-debugger/turbo.json b/apps/entropy-debugger/turbo.json deleted file mode 100644 index 8e880d4aeb..0000000000 --- a/apps/entropy-debugger/turbo.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "tasks": { - "build": { - "dependsOn": ["^build"], - "outputs": [".next/**", "!.next/cache/**"] - }, - "start:dev": { - "persistent": true, - "cache": false - }, - "start:prod": { - "dependsOn": ["build"], - "persistent": true, - "cache": false - } - } -} diff --git a/apps/hermes/client/js/README.md b/apps/hermes/client/js/README.md index c66aa0f68e..9718ede2cb 100644 --- a/apps/hermes/client/js/README.md +++ b/apps/hermes/client/js/README.md @@ -76,11 +76,12 @@ The [HermesClient](./src/examples/HermesClient.ts) example demonstrates both the examples above. To run the example: 1. Clone [the Pyth monorepo](https://github.com/pyth-network/pyth-crosschain) -2. In the root of the monorepo, run `pnpm example:hermes-client -- `. For - example, to print BTC and ETH price feeds in the testnet network, run: +2. In the root of the monorepo, run `pnpm turbo --filter + @pythnetwork/hermes-client example -- `. For example, to print BTC and + ETH price feeds in the testnet network, run: ```bash -pnpm example:hermes-client -- \ +pnpm turbo --filter @pythnetwork/hermes-client example -- \ --endpoint https://hermes.pyth.network \ --price-ids \ 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43 \ diff --git a/apps/hermes/client/js/turbo.json b/apps/hermes/client/js/turbo.json index 098d3b7133..9b20596bbf 100644 --- a/apps/hermes/client/js/turbo.json +++ b/apps/hermes/client/js/turbo.json @@ -3,22 +3,23 @@ "extends": ["//"], "tasks": { "build:schemas": { - "dependsOn": ["pull:schema"], + "dependsOn": ["//#install:modules", "pull:schema"], "inputs": ["schema.json"], "outputs": ["src/zodSchemas.ts"] }, "build:typescript": { - "dependsOn": ["build:schemas", "^build"], + "dependsOn": ["//#install:modules", "build:schemas", "^build"], "outputs": ["lib/**"] }, "build": { "dependsOn": ["build:typescript", "build:schemas"] }, "example": { - "dependsOn": ["build"], + "dependsOn": ["//#install:modules", "build"], "cache": false }, "pull:schema": { + "dependsOn": ["//#install:modules"], "outputs": ["schema.json"], "cache": false } diff --git a/apps/insights/turbo.json b/apps/insights/turbo.json index b37e1ddc68..c6a8e5ea6a 100644 --- a/apps/insights/turbo.json +++ b/apps/insights/turbo.json @@ -3,8 +3,6 @@ "extends": ["//"], "tasks": { "build": { - "dependsOn": ["pull:env", "^build"], - "outputs": [".next/**", "!.next/cache/**"], "env": [ "VERCEL_ENV", "GOOGLE_ANALYTICS_ID", @@ -17,36 +15,28 @@ ] }, "fix:lint": { - "dependsOn": ["fix:lint:eslint", "fix:lint:stylelint"], - "cache": false + "dependsOn": [ + "//#install:modules", + "fix:lint:eslint", + "fix:lint:stylelint" + ] }, "fix:lint:eslint": { - "dependsOn": ["^build"], + "dependsOn": ["//#install:modules", "^build"], "cache": false }, "fix:lint:stylelint": { - "cache": false - }, - "pull:env": { - "outputs": [".env.local"], - "cache": false - }, - "start:dev": { - "dependsOn": ["pull:env"], - "persistent": true, - "cache": false - }, - "start:prod": { - "dependsOn": ["build"], - "persistent": true, + "dependsOn": ["//#install:modules"], "cache": false }, "test:lint": { "dependsOn": ["test:lint:eslint", "test:lint:stylelint"] }, "test:lint:eslint": { - "dependsOn": ["^build"] + "dependsOn": ["//#install:modules", "^build"] }, - "test:lint:stylelint": {} + "test:lint:stylelint": { + "dependsOn": ["//#install:modules"] + } } } diff --git a/apps/staking/turbo.json b/apps/staking/turbo.json index 175e724c1f..1982bac221 100644 --- a/apps/staking/turbo.json +++ b/apps/staking/turbo.json @@ -3,8 +3,6 @@ "extends": ["//"], "tasks": { "build": { - "dependsOn": ["pull:env", "^build"], - "outputs": [".next/**", "!.next/cache/**"], "env": [ "IP_ALLOWLIST", "GOVERNANCE_ONLY_REGIONS", @@ -17,23 +15,13 @@ "GOOGLE_ANALYTICS_ID" ] }, - "pull:env": { - "outputs": [".env.local"], - "cache": false - }, "start:dev": { "dependsOn": [ + "//#install:modules", "pull:env", "@pythnetwork/hermes-client#build", "@pythnetwork/solana-utils#build" - ], - "persistent": true, - "cache": false - }, - "start:prod": { - "dependsOn": ["build"], - "persistent": true, - "cache": false + ] } } } diff --git a/flake.nix b/flake.nix index faf84b8a35..5bea18b610 100644 --- a/flake.nix +++ b/flake.nix @@ -18,7 +18,7 @@ cli = prev.lib.mkCli "cli" { _noAll = true; - start = "${prev.lib.getExe prev.pnpm} start:dev"; + start = "${prev.lib.getExe prev.pnpm} turbo start:dev"; test = { nix = { @@ -26,7 +26,7 @@ dead-code = "${prev.deadnix}/bin/deadnix --exclude ./node_modules ."; format = "${prev.alejandra}/bin/alejandra --exclude ./node_modules --check ."; }; - turbo = "${prev.lib.getExe prev.pnpm} test -- --ui stream"; + turbo = "${prev.lib.getExe prev.pnpm} turbo test -- --ui stream"; }; fix = { @@ -35,7 +35,7 @@ dead-code = "${prev.deadnix}/bin/deadnix --exclude ./node_modules -e ."; format = "${prev.alejandra}/bin/alejandra --exclude ./node_modules ."; }; - turbo = "${prev.lib.getExe prev.pnpm} fix -- --ui stream"; + turbo = "${prev.lib.getExe prev.pnpm} turbo fix -- --ui stream"; }; }; }; diff --git a/governance/xc_admin/packages/xc_admin_frontend/turbo.json b/governance/xc_admin/packages/xc_admin_frontend/turbo.json index 86d283c491..b2a3d39221 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/turbo.json +++ b/governance/xc_admin/packages/xc_admin_frontend/turbo.json @@ -3,27 +3,14 @@ "extends": ["//"], "tasks": { "build": { - "dependsOn": ["pull:env", "^build"], - "outputs": [".next/**", "!.next/cache/**"], "env": [ "BUILD_STANDALONE", "NEXT_PUBLIC_MAINNET_RPC", "NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID" ] }, - "pull:env": { - "outputs": [".env.local"], - "cache": false - }, "start:dev": { - "dependsOn": ["pull:env", "^build"], - "persistent": true, - "cache": false - }, - "start:prod": { - "dependsOn": ["build"], - "persistent": true, - "cache": false + "dependsOn": ["//#install:modules", "pull:env", "^build"] } } } diff --git a/lazer/contracts/solana/turbo.json b/lazer/contracts/solana/turbo.json index 58f94ab9d6..c1a10084ca 100644 --- a/lazer/contracts/solana/turbo.json +++ b/lazer/contracts/solana/turbo.json @@ -2,9 +2,6 @@ "$schema": "https://turbo.build/schema.json", "extends": ["//"], "tasks": { - "test": { - "dependsOn": ["test:format"] - }, "test:anchor": {} } } diff --git a/package.json b/package.json index f2dde8de99..08a8e2a61e 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,11 @@ }, "scripts": { "build:ci": "turbo build --filter=!./apps/api-reference --filter=!./apps/insights --filter=!./apps/staking", - "example:hermes-client": "pnpm i && turbo example --filter @pythnetwork/hermes-client --ui stream", - "fix": "pnpm i && turbo fix", + "fix:format": "prettier --write .", + "install:modules": "[ $CI ] && true || pnpm install", "publish": "lerna publish from-package --no-private --no-git-tag-version --yes", - "start:dev": "pnpm i && turbo start:dev", - "start:prod": "pnpm i && turbo start:prod", - "test": "pnpm i && turbo test", - "test:ci": "turbo test" + "test:format": "prettier --check .", + "turbo": "[ ! -d node_modules ] && pnpm install; turbo" }, "devDependencies": { "@cprussin/prettier-config": "^2.2.1", diff --git a/packages/component-library/turbo.json b/packages/component-library/turbo.json index bb0b75c7d5..697e50f219 100644 --- a/packages/component-library/turbo.json +++ b/packages/component-library/turbo.json @@ -6,26 +6,28 @@ "outputs": ["storybook-static/**"] }, "fix:lint": { - "dependsOn": ["fix:lint:eslint", "fix:lint:stylelint"], - "cache": false + "dependsOn": [ + "//#install:modules", + "fix:lint:eslint", + "fix:lint:stylelint" + ] }, "fix:lint:eslint": { - "dependsOn": ["^build"], + "dependsOn": ["//#install:modules", "^build"], "cache": false }, "fix:lint:stylelint": { - "cache": false - }, - "start:dev": { - "persistent": true, + "dependsOn": ["//#install:modules"], "cache": false }, "test:lint": { "dependsOn": ["test:lint:eslint", "test:lint:stylelint"] }, "test:lint:eslint": { - "dependsOn": ["^build"] + "dependsOn": ["//#install:modules", "^build"] }, - "test:lint:stylelint": {} + "test:lint:stylelint": { + "dependsOn": ["//#install:modules"] + } } } diff --git a/target_chains/ethereum/sdk/solidity/turbo.json b/target_chains/ethereum/sdk/solidity/turbo.json index e7e3e97971..cafeb180c0 100644 --- a/target_chains/ethereum/sdk/solidity/turbo.json +++ b/target_chains/ethereum/sdk/solidity/turbo.json @@ -3,9 +3,11 @@ "extends": ["//"], "tasks": { "build:abis": { + "dependsOn": ["//#install:modules"], "outputs": ["abis/**"] }, "build:bin": { + "dependsOn": ["//#install:modules"], "outputs": ["build/**"] }, "build": { diff --git a/turbo.json b/turbo.json index 8923570dbc..39b6e92795 100644 --- a/turbo.json +++ b/turbo.json @@ -1,10 +1,64 @@ { "$schema": "https://turbo.build/schema.json", "globalEnv": ["NODE_ENV"], + "globalPassThroughEnv": ["COREPACK_HOME"], "ui": "tui", "tasks": { + "//#fix": { + "dependsOn": ["//#fix:lint", "//#fix:format"], + "cache": false + }, + "//#fix:format": { + "dependsOn": ["//#install:modules", "//#fix:lint"], + "cache": false + }, + "//#fix:lint": { + "dependsOn": ["//#install:modules", "^build"], + "cache": false + }, + "//#install:modules": { + "inputs": [ + "**/package.json", + ".npmrc", + ".npmignore", + "pnpm-workspace.yaml", + "!**/.next/**", + "!**/dist/**" + ], + "outputs": ["pnpm-lock.yaml"] + }, + "//#test": { + "dependsOn": [ + "//#test:types", + "//#test:unit", + "//#test:integration", + "//#test:format", + "//#test:lint" + ] + }, + "//#test:format": { + "dependsOn": ["//#install:modules"] + }, + "//#test:lint": { + "dependsOn": ["//#install:modules", "^build"] + }, + "//#test:types": { + "dependsOn": ["//#install:modules", "^build"] + }, + "//#test:unit": { + "dependsOn": ["//#install:modules", "^build"] + }, + "//#test:integration": { + "dependsOn": ["//#install:modules", "^build"] + }, "build": { - "dependsOn": ["^build", "build:cjs", "build:esm"], + "dependsOn": [ + "//#install:modules", + "pull:env", + "^build", + "build:cjs", + "build:esm" + ], "inputs": [ "$TURBO_DEFAULT$", "!README.md", @@ -14,12 +68,32 @@ "!prettier.config.js", "!vercel.json" ], - "outputs": ["dist/**", "lib/**"] + "outputs": ["lib/**", "dist/**", ".next/**", "!.next/cache/**"] }, "build:cjs": { + "dependsOn": ["//#install:modules"], + "inputs": [ + "$TURBO_DEFAULT$", + "!README.md", + "!**/*.test.*", + "!jest.config.js", + "!eslint.config.js", + "!prettier.config.js", + "!vercel.json" + ], "outputs": ["dist/cjs/**"] }, "build:esm": { + "dependsOn": ["//#install:modules"], + "inputs": [ + "$TURBO_DEFAULT$", + "!README.md", + "!**/*.test.*", + "!jest.config.js", + "!eslint.config.js", + "!prettier.config.js", + "!vercel.json" + ], "outputs": ["dist/esm/**"] }, "fix": { @@ -27,11 +101,26 @@ "cache": false }, "fix:format": { - "dependsOn": ["fix:lint"], + "dependsOn": ["//#install:modules", "fix:lint"], "cache": false }, "fix:lint": { - "dependsOn": ["^build"], + "dependsOn": ["//#install:modules", "^build"], + "cache": false + }, + "pull:env": { + "dependsOn": ["//#install:modules"], + "outputs": [".env.local"], + "cache": false + }, + "start:dev": { + "dependsOn": ["//#install:modules", "pull:env"], + "persistent": true, + "cache": false + }, + "start:prod": { + "dependsOn": ["//#install:modules", "build"], + "persistent": true, "cache": false }, "test": { @@ -43,18 +132,20 @@ "test:lint" ] }, - "test:format": {}, + "test:format": { + "dependsOn": ["//#install:modules"] + }, "test:lint": { - "dependsOn": ["^build"] + "dependsOn": ["//#install:modules", "^build"] }, "test:types": { - "dependsOn": ["^build"] + "dependsOn": ["//#install:modules", "^build"] }, "test:unit": { - "dependsOn": ["^build"] + "dependsOn": ["//#install:modules", "^build"] }, "test:integration": { - "dependsOn": ["^build"] + "dependsOn": ["//#install:modules", "^build"] } } } From e04dd2287359aa7bb3c15f0c20a446e75944b119 Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 14:42:57 -0700 Subject: [PATCH 4/7] chore: update readme to say turbo should be run with `pnpm turbo` --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 080179a438..9420c72177 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,6 @@ If you don't use nix at all, then install the required system packages: `package.json`; you can experiment with [corepack](https://nodejs.org/api/corepack.html) to manage your pnpm version for you. -- [turbo](https://turbo.build/repo/docs/getting-started/installation) #### Common tasks @@ -109,13 +108,13 @@ and will only re-run as necessary. For any of the following tasks, you can pass [any valid `turbo run` option](https://turbo.build/repo/docs/reference/run) after `--`, for instance you could run `pnpm test -- --concurrency 2`. -- `pnpm test`: Run all unit tests, integration tests, linting, and format +- `pnpm turbo test`: Run all unit tests, integration tests, linting, and format checks, as well as whatever other code checks any packages support. -- `pnpm fix`: Run auto fixes, including reformatting code and auto-fixing lint - rules where possible. -- `pnpm start:dev`: Start all development servers in parallel. -- `pnpm start:prod`: Run production builds and start production mode servers in - parallel. +- `pnpm turbo fix`: Run auto fixes, including reformatting code and auto-fixing + lint rules where possible. +- `pnpm turbo start:dev`: Start all development servers in parallel. +- `pnpm turbo start:prod`: Run production builds and start production mode + servers in parallel. #### Building a new package From c74bdf096b5e522659bf90abbcfe3b21cdcd7d2e Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 14:49:25 -0700 Subject: [PATCH 5/7] chore: wire up pre-commit to run `turbo fix` on changed packages --- .github/workflows/ci-pre-commit.yml | 12 ++++++++++++ .pre-commit-config.yaml | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/.github/workflows/ci-pre-commit.yml b/.github/workflows/ci-pre-commit.yml index 57c2595070..b84c32b446 100644 --- a/.github/workflows/ci-pre-commit.yml +++ b/.github/workflows/ci-pre-commit.yml @@ -68,4 +68,16 @@ jobs: sudo mv aptos /usr/local/bin/ chmod +x /usr/local/bin/aptos aptos update movefmt + - uses: actions/setup-node@v4 + with: + node-version-file: "package.json" + # Libusb is a build requirement for the node-hid package and so pnpm + # install will fail if this isn't in the build environment and if a + # precompiled binary isn't found. + - name: Install libusb + run: sudo apt install -y libusb-1.0-0-dev libudev-dev + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: true - uses: pre-commit/action@v3.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e683cf47a4..cdee850b32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,6 +25,11 @@ repos: ) - repo: local hooks: + - id: turbo-fix + name: Run turbo fix on packages changed since the last commit + language: system + entry: sh -c 'TURBO_SCM_BASE="HEAD^1" pnpm turbo fix --affected' + pass_filenames: false # Hooks for the remote executor - id: cargo-fmt-remote-executor name: Cargo format for remote executor From 504d0b334a5c975a8efe75b0701c560f4a6b9833 Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 15:32:08 -0700 Subject: [PATCH 6/7] chore: remove pre-commit workflow file This workflow is now redundant since everything pre-commit does is covered by more comprehensive CI jobs. Moving forward, pre-commit should be treated as a devex optimization; no checks should go into pre-commit alone. --- .github/workflows/ci-pre-commit.yml | 83 ----------------------------- 1 file changed, 83 deletions(-) delete mode 100644 .github/workflows/ci-pre-commit.yml diff --git a/.github/workflows/ci-pre-commit.yml b/.github/workflows/ci-pre-commit.yml deleted file mode 100644 index b84c32b446..0000000000 --- a/.github/workflows/ci-pre-commit.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Pre-commit checks - -on: - pull_request: - branches: "**" - push: - branches: [main] - -env: - PYTHON_VERSION: "3.11" - POETRY_VERSION: "1.4.2" -jobs: - pre-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions-rs/toolchain@v1 - with: - profile: default - toolchain: 1.82.0 - - name: Install Rust versions - run: | - rustup install 1.73.0 - rustup install 1.66.1 - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - apps/fortuna - apps/hermes/server - target_chains/ethereum/sdk/stylus - target_chains/cosmwasm - target_chains/fuel/contracts - target_chains/solana - governance/remote_executor - lazer - pythnet/message_buffer - pythnet/pythnet_sdk - pythnet/stake_caps_parameters - # We only save the cache from runs on `main` because the cache is ~5GB, and the total Github Cache limit is 10GB. - # Branches have their own caches, so saving this cache on PRs can result in evicting the main cache. - save-if: ${{ github.ref == 'refs/heads/main' }} - - name: Install protoc - uses: arduino/setup-protoc@v3 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Install poetry - run: pipx install poetry - - name: Install g++ 12 - run: | - sudo apt-get install g++-12 - echo "CXX=/usr/bin/g++-12" >> "${GITHUB_ENV}" - - uses: actions/setup-python@v2 - with: - python-version: ${{ env.PYTHON_VERSION }} - id: setup_python - - name: Cache Poetry cache - uses: actions/cache@v3 - with: - path: ~/.cache/pypoetry - key: poetry-cache-${{ runner.os }}-${{ steps.setup_python.outputs.python-version }}-${{ env.POETRY_VERSION }} - # Install Aptos CLI for Lazer contract formatting and linting - - name: Download Aptos CLI - run: wget https://github.com/aptos-labs/aptos-core/releases/download/aptos-cli-v6.1.1/aptos-cli-6.1.1-Ubuntu-22.04-x86_64.zip - - name: Install Aptos CLI - run: | - unzip aptos-cli-6.1.1-Ubuntu-22.04-x86_64.zip - sudo mv aptos /usr/local/bin/ - chmod +x /usr/local/bin/aptos - aptos update movefmt - - uses: actions/setup-node@v4 - with: - node-version-file: "package.json" - # Libusb is a build requirement for the node-hid package and so pnpm - # install will fail if this isn't in the build environment and if a - # precompiled binary isn't found. - - name: Install libusb - run: sudo apt install -y libusb-1.0-0-dev libudev-dev - - uses: pnpm/action-setup@v4 - name: Install pnpm - with: - run_install: true - - uses: pre-commit/action@v3.0.0 From a9095442eeea3cb9461ffbed43102b64b72e3c07 Mon Sep 17 00:00:00 2001 From: Connor Prussin Date: Thu, 13 Mar 2025 17:06:00 -0700 Subject: [PATCH 7/7] fix: fix message-buffer CI job to run correct prettier version --- .github/workflows/ci-message-buffer.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-message-buffer.yml b/.github/workflows/ci-message-buffer.yml index 27a2a4328b..c160131949 100644 --- a/.github/workflows/ci-message-buffer.yml +++ b/.github/workflows/ci-message-buffer.yml @@ -38,6 +38,9 @@ jobs: run: | sudo apt-get install g++-12 echo "CXX=/usr/bin/g++-12" >> "${GITHUB_ENV}" + - uses: actions/setup-node@v4 + with: + node-version-file: "package.json" # Libusb is a build requirement for the node-hid package and so pnpm # install will fail if this isn't in the build environment and if a # precompiled binary isn't found. @@ -45,15 +48,14 @@ jobs: run: sudo apt install -y libusb-1.0-0-dev libudev-dev - uses: pnpm/action-setup@v4 name: Install pnpm - - name: Install prettier globally - run: pnpm install -g prettier@2.7.1 + with: + run_install: true - name: Build and generate IDLs run: anchor build - name: Copy anchor target files run: cp ./target/idl/message_buffer.json idl/ && cp ./target/types/message_buffer.ts idl/ - - name: Run prettier (to avoid pre-commit failures) - run: | - pnpm dlx prettier@2.7.1 --write "./idl/*" + - name: Fix formatting (to avoid pre-commit failures) + run: pnpm turbo --filter message_buffer fix:format - name: Check IDL changes # Fails if the IDL files are not up to date. Please use anchor build to regenerate the IDL files for # the current version of the contract and update idl directory.