From 56d8a21db57b8ae50a4d62049ec1d451b2ec37dc Mon Sep 17 00:00:00 2001 From: a Date: Sat, 15 Mar 2025 01:24:38 -0500 Subject: [PATCH 1/6] noot --- bun.lock | 3296 ++++++++++++++++++++++++++++++++++++++++++++++ cli/package.json | 2 +- cli/src/bin.ts | 5 + cli/src/index.ts | 10 +- 4 files changed, 3306 insertions(+), 7 deletions(-) create mode 100644 bun.lock create mode 100755 cli/src/bin.ts diff --git a/bun.lock b/bun.lock new file mode 100644 index 000000000..59a8d10c6 --- /dev/null +++ b/bun.lock @@ -0,0 +1,3296 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "ntt", + "devDependencies": { + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "^1.95.8", + "@types/jest": "^29.5.12", + "@types/node": "^20.12.2", + "@wormhole-foundation/sdk": "^1.0.0", + "@wormhole-foundation/wormchain-sdk": "^0.0.1", + "ethers": "^6.5.1", + "ts-jest": "^29.1.2", + "tsx": "^4.7.2", + "typescript": "^5.1.1", + }, + }, + "cli": { + "name": "@wormhole-foundation/ntt-cli", + "version": "1.1.0", + "bin": { + "ntt": "src/index.ts", + }, + "dependencies": { + "chalk": "^5.3.0", + "yargs": "^17.7.2", + }, + "devDependencies": { + "@types/bun": "latest", + "@types/yargs": "^17.0.32", + }, + "peerDependencies": { + "typescript": "^5.0.0", + }, + }, + "evm/ts": { + "name": "@wormhole-foundation/sdk-evm-ntt", + "version": "0.5.0", + "dependencies": { + "@wormhole-foundation/sdk-definitions-ntt": "0.5.0", + "ethers": "^6.5.1", + }, + "devDependencies": { + "@typechain/ethers-v6": "^0.5.1", + "tsx": "^4.7.2", + "typechain": "^8.3.2", + }, + "peerDependencies": { + "@wormhole-foundation/sdk-base": "^1.0.0", + "@wormhole-foundation/sdk-definitions": "^1.0.0", + "@wormhole-foundation/sdk-evm": "^1.0.0", + "@wormhole-foundation/sdk-evm-core": "^1.0.0", + }, + }, + "sdk/definitions": { + "name": "@wormhole-foundation/sdk-definitions-ntt", + "version": "0.5.0", + "peerDependencies": { + "@wormhole-foundation/sdk-base": "^1.0.0", + "@wormhole-foundation/sdk-definitions": "^1.0.0", + }, + }, + "sdk/examples": { + "name": "@wormhole-foundation/sdk-examples-ntt", + "version": "0.5.0", + "dependencies": { + "@wormhole-foundation/sdk": "^1.0.0", + "@wormhole-foundation/sdk-definitions-ntt": "0.5.0", + "@wormhole-foundation/sdk-evm-ntt": "0.5.0", + "@wormhole-foundation/sdk-route-ntt": "0.5.0", + "@wormhole-foundation/sdk-solana-ntt": "0.5.0", + }, + "devDependencies": { + "dotenv": "^16.4.5", + "nock": "^13.3.3", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "tsx": "^4.7.2", + }, + }, + "sdk/route": { + "name": "@wormhole-foundation/sdk-route-ntt", + "version": "0.5.0", + "dependencies": { + "@wormhole-foundation/sdk-definitions-ntt": "0.5.0", + "@wormhole-foundation/sdk-evm-ntt": "0.5.0", + "@wormhole-foundation/sdk-solana-ntt": "0.5.0", + }, + "devDependencies": { + "nock": "^13.3.3", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + }, + "peerDependencies": { + "@wormhole-foundation/sdk-connect": "^1.0.0", + }, + }, + "solana": { + "name": "@wormhole-foundation/sdk-solana-ntt", + "version": "0.5.0", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/spl-token": "0.4.0", + "@solana/web3.js": "^1.95.8", + "@wormhole-foundation/sdk-definitions-ntt": "0.5.0", + "bn.js": "5.2.1", + }, + "devDependencies": { + "@types/bn.js": "^5.1.5", + "nock": "^13.3.3", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "tsx": "^4.7.2", + }, + "peerDependencies": { + "@wormhole-foundation/sdk-base": "^1.0.0", + "@wormhole-foundation/sdk-definitions": "^1.0.0", + "@wormhole-foundation/sdk-solana": "^1.0.0", + "@wormhole-foundation/sdk-solana-core": "^1.0.0", + }, + }, + }, + "packages": { + "@0no-co/graphql.web": ["@0no-co/graphql.web@1.0.11", "", { "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA=="], + + "@0no-co/graphqlsp": ["@0no-co/graphqlsp@1.12.16", "", { "dependencies": { "@gql.tada/internal": "^1.0.0", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" }, "peerDependencies": { "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", "typescript": "^5.0.0" } }, "sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw=="], + + "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.10.1", "", {}, "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@apollo/client": ["@apollo/client@3.11.8", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.18.0", "prop-types": "^15.7.2", "rehackt": "^0.1.0", "response-iterator": "^0.2.6", "symbol-observable": "^4.0.0", "ts-invariant": "^0.10.3", "tslib": "^2.3.0", "zen-observable-ts": "^1.2.5" }, "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-CgG1wbtMjsV2pRGe/eYITmV5B8lXUCYljB2gB/6jWTFQcrvirUVvKg7qtFdjYkQSFbIffU1IDyxgeaN81eTjbA=="], + + "@aptos-labs/aptos-client": ["@aptos-labs/aptos-client@0.1.1", "", { "dependencies": { "axios": "1.7.4", "got": "^11.8.6" } }, "sha512-kJsoy4fAPTOhzVr7Vwq8s/AUg6BQiJDa7WOqRzev4zsuIS3+JCuIZ6vUd7UBsjnxtmguJJulMRs9qWCzVBt2XA=="], + + "@babel/code-frame": ["@babel/code-frame@7.24.2", "", { "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" } }, "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ=="], + + "@babel/compat-data": ["@babel/compat-data@7.24.4", "", {}, "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ=="], + + "@babel/core": ["@babel/core@7.24.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.24.4", "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg=="], + + "@babel/generator": ["@babel/generator@7.24.4", "", { "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" } }, "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.23.6", "", { "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ=="], + + "@babel/helper-environment-visitor": ["@babel/helper-environment-visitor@7.22.20", "", {}, "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA=="], + + "@babel/helper-function-name": ["@babel/helper-function-name@7.23.0", "", { "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" } }, "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw=="], + + "@babel/helper-hoist-variables": ["@babel/helper-hoist-variables@7.22.5", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.24.3", "", { "dependencies": { "@babel/types": "^7.24.0" } }, "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.23.3", "", { "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.24.0", "", {}, "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w=="], + + "@babel/helper-simple-access": ["@babel/helper-simple-access@7.22.5", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w=="], + + "@babel/helper-split-export-declaration": ["@babel/helper-split-export-declaration@7.22.6", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.24.1", "", {}, "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.22.20", "", {}, "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.23.5", "", {}, "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw=="], + + "@babel/helpers": ["@babel/helpers@7.24.4", "", { "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" } }, "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw=="], + + "@babel/highlight": ["@babel/highlight@7.24.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA=="], + + "@babel/parser": ["@babel/parser@7.24.7", "", { "bin": { "parser": "bin/babel-parser.js" } }, "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.24.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.24.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw=="], + + "@babel/runtime": ["@babel/runtime@7.25.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw=="], + + "@babel/template": ["@babel/template@7.24.0", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", "@babel/types": "^7.24.0" } }, "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA=="], + + "@babel/traverse": ["@babel/traverse@7.24.1", "", { "dependencies": { "@babel/code-frame": "^7.24.1", "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ=="], + + "@babel/types": ["@babel/types@7.24.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w=="], + + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], + + "@certusone/wormhole-sdk": ["@certusone/wormhole-sdk@0.2.7", "", { "dependencies": { "@improbable-eng/grpc-web": "^0.14.0", "@solana/spl-token": "^0.1.8", "@solana/web3.js": "^1.24.0", "@terra-money/terra.js": "^3.0.7", "algosdk": "^1.15.0", "axios": "^0.24.0", "bech32": "^2.0.0", "js-base64": "^3.6.1", "protobufjs": "^6.11.2", "rxjs": "^7.3.0" } }, "sha512-AH31t/LFxITqtW6Psep3vZa3UavBRX3rNXefZPZ6xpXoIdEAsit6v2O0NNqdReuJNZwHAKYSrB1tGyQQN1RlhQ=="], + + "@classic-terra/terra.proto": ["@classic-terra/terra.proto@1.1.0", "", { "dependencies": { "@improbable-eng/grpc-web": "^0.14.1", "google-protobuf": "^3.17.3", "long": "^4.0.0", "protobufjs": "~6.11.2" } }, "sha512-bYhQG5LUaGF0KPRY9hYT/HEcd1QExZPQd6zLV/rQkCe/eDxfwFRLzZHpaaAdfWoAAZjsRWqJbUCqCg7gXBbJpw=="], + + "@confio/ics23": ["@confio/ics23@0.6.8", "", { "dependencies": { "@noble/hashes": "^1.0.0", "protobufjs": "^6.8.8" } }, "sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w=="], + + "@coral-xyz/anchor": ["@coral-xyz/anchor@0.29.0", "", { "dependencies": { "@coral-xyz/borsh": "^0.29.0", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "snake-case": "^3.0.4", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA=="], + + "@coral-xyz/borsh": ["@coral-xyz/borsh@0.29.0", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ=="], + + "@cosmjs/amino": ["@cosmjs/amino@0.27.1", "", { "dependencies": { "@cosmjs/crypto": "0.27.1", "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/utils": "0.27.1" } }, "sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA=="], + + "@cosmjs/cosmwasm-stargate": ["@cosmjs/cosmwasm-stargate@0.27.1", "", { "dependencies": { "@cosmjs/amino": "0.27.1", "@cosmjs/crypto": "0.27.1", "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/proto-signing": "0.27.1", "@cosmjs/stargate": "0.27.1", "@cosmjs/tendermint-rpc": "0.27.1", "@cosmjs/utils": "0.27.1", "cosmjs-types": "^0.4.0", "long": "^4.0.0", "pako": "^2.0.2", "protobufjs": "~6.10.2" } }, "sha512-miEAYH4k0YPHRGmp5NTN93lrMg2opxZjr2d4fpRD8H3VVngP4+uUmiI2aUZpHTejlPjqrSTGQnPyycRVMHEFsw=="], + + "@cosmjs/crypto": ["@cosmjs/crypto@0.27.1", "", { "dependencies": { "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/utils": "0.27.1", "bip39": "^3.0.2", "bn.js": "^5.2.0", "elliptic": "^6.5.3", "js-sha3": "^0.8.0", "libsodium-wrappers": "^0.7.6", "ripemd160": "^2.0.2", "sha.js": "^2.4.11" } }, "sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg=="], + + "@cosmjs/encoding": ["@cosmjs/encoding@0.27.1", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw=="], + + "@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.27.1", "", { "dependencies": { "@cosmjs/stream": "0.27.1", "xstream": "^11.14.0" } }, "sha512-AKvsllGr6oN5kiroatIeIIxRdCFetLd8LCWV04RRNkoJ2OefDNb46VlWEQ+gI3ay5GgfVjB9qAcfvbJyrcEv+A=="], + + "@cosmjs/launchpad": ["@cosmjs/launchpad@0.27.1", "", { "dependencies": { "@cosmjs/amino": "0.27.1", "@cosmjs/crypto": "0.27.1", "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/utils": "0.27.1", "axios": "^0.21.2", "fast-deep-equal": "^3.1.3" } }, "sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw=="], + + "@cosmjs/math": ["@cosmjs/math@0.27.1", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ=="], + + "@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.27.1", "", { "dependencies": { "@cosmjs/amino": "0.27.1", "@cosmjs/crypto": "0.27.1", "@cosmjs/math": "0.27.1", "cosmjs-types": "^0.4.0", "long": "^4.0.0", "protobufjs": "~6.10.2" } }, "sha512-t7/VvQivMdM1KgKWai/9ZCEcGFXJtr9Xo0hGcPLTn9wGkh9tmOsUXINYVMsf5D/jWIm1MDPbGCYfdb9V1Od4hw=="], + + "@cosmjs/socket": ["@cosmjs/socket@0.27.1", "", { "dependencies": { "@cosmjs/stream": "0.27.1", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-bKCRsaSXh/TA7efxVCogzS2K3cgC40Ge2itFYmTfgpOE+++52FchCblVCsCYwMNDLS497RP4P0GbeC1VEBToMA=="], + + "@cosmjs/stargate": ["@cosmjs/stargate@0.27.1", "", { "dependencies": { "@confio/ics23": "^0.6.3", "@cosmjs/amino": "0.27.1", "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/proto-signing": "0.27.1", "@cosmjs/stream": "0.27.1", "@cosmjs/tendermint-rpc": "0.27.1", "@cosmjs/utils": "0.27.1", "cosmjs-types": "^0.4.0", "long": "^4.0.0", "protobufjs": "~6.10.2", "xstream": "^11.14.0" } }, "sha512-7hAIyNd6NbhQA51w9mPVyMYw515Hpj0o7SXMaqbc7nxs3hkJNMONQ9RakyMm0U/WeCd6ObcSaPEcdkqbfkc+mg=="], + + "@cosmjs/stream": ["@cosmjs/stream@0.27.1", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-cEyEAVfXEyuUpKYBeEJrOj8Dp/c+M6a0oGJHxvDdhP5gSsaeCPgQXrh7qZFBiUfu3Brmqd+e/bKZm+068l9bBw=="], + + "@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.27.1", "", { "dependencies": { "@cosmjs/crypto": "0.27.1", "@cosmjs/encoding": "0.27.1", "@cosmjs/json-rpc": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/socket": "0.27.1", "@cosmjs/stream": "0.27.1", "axios": "^0.21.2", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-eN1NyBYIiFutDNleEaTfvIJ3S3KA1gP45UHaLhSETm8KyiaUqg/b0Mj6sp7J3h4BhgwLq2zn/TDtIn0k5luedg=="], + + "@cosmjs/utils": ["@cosmjs/utils@0.27.1", "", {}, "sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], + + "@ethersproject/abi": ["@ethersproject/abi@5.7.0", "", { "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA=="], + + "@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0" } }, "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw=="], + + "@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.7.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ=="], + + "@ethersproject/address": ["@ethersproject/address@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/rlp": "^5.7.0" } }, "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA=="], + + "@ethersproject/base64": ["@ethersproject/base64@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ=="], + + "@ethersproject/basex": ["@ethersproject/basex@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw=="], + + "@ethersproject/bignumber": ["@ethersproject/bignumber@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "bn.js": "^5.2.1" } }, "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw=="], + + "@ethersproject/bytes": ["@ethersproject/bytes@5.7.0", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A=="], + + "@ethersproject/constants": ["@ethersproject/constants@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA=="], + + "@ethersproject/contracts": ["@ethersproject/contracts@5.7.0", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0" } }, "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg=="], + + "@ethersproject/hash": ["@ethersproject/hash@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g=="], + + "@ethersproject/hdnode": ["@ethersproject/hdnode@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/signing-key": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wordlists": "^5.7.0" } }, "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg=="], + + "@ethersproject/json-wallets": ["@ethersproject/json-wallets@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hdnode": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g=="], + + "@ethersproject/keccak256": ["@ethersproject/keccak256@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" } }, "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg=="], + + "@ethersproject/logger": ["@ethersproject/logger@5.7.0", "", {}, "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig=="], + + "@ethersproject/networks": ["@ethersproject/networks@5.7.1", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ=="], + + "@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" } }, "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw=="], + + "@ethersproject/properties": ["@ethersproject/properties@5.7.0", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw=="], + + "@ethersproject/providers": ["@ethersproject/providers@5.7.2", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", "ws": "7.4.6" } }, "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg=="], + + "@ethersproject/random": ["@ethersproject/random@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ=="], + + "@ethersproject/rlp": ["@ethersproject/rlp@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w=="], + + "@ethersproject/sha2": ["@ethersproject/sha2@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "hash.js": "1.1.7" } }, "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw=="], + + "@ethersproject/signing-key": ["@ethersproject/signing-key@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "bn.js": "^5.2.1", "elliptic": "6.5.4", "hash.js": "1.1.7" } }, "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q=="], + + "@ethersproject/solidity": ["@ethersproject/solidity@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA=="], + + "@ethersproject/strings": ["@ethersproject/strings@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg=="], + + "@ethersproject/transactions": ["@ethersproject/transactions@5.7.0", "", { "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/signing-key": "^5.7.0" } }, "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ=="], + + "@ethersproject/units": ["@ethersproject/units@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg=="], + + "@ethersproject/wallet": ["@ethersproject/wallet@5.7.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/hdnode": "^5.7.0", "@ethersproject/json-wallets": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/signing-key": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wordlists": "^5.7.0" } }, "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA=="], + + "@ethersproject/web": ["@ethersproject/web@5.7.1", "", { "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w=="], + + "@ethersproject/wordlists": ["@ethersproject/wordlists@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA=="], + + "@gql.tada/cli-utils": ["@gql.tada/cli-utils@1.6.3", "", { "dependencies": { "@0no-co/graphqlsp": "^1.12.13", "@gql.tada/internal": "1.0.8", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" }, "peerDependencies": { "@0no-co/graphqlsp": "^1.12.13", "@gql.tada/svelte-support": "1.0.1", "@gql.tada/vue-support": "1.0.1", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", "typescript": "^5.0.0" }, "optionalPeers": ["@gql.tada/svelte-support", "@gql.tada/vue-support"] }, "sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ=="], + + "@gql.tada/internal": ["@gql.tada/internal@1.0.8", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.5" }, "peerDependencies": { "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", "typescript": "^5.0.0" } }, "sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g=="], + + "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], + + "@improbable-eng/grpc-web": ["@improbable-eng/grpc-web@0.14.1", "", { "dependencies": { "browser-headers": "^0.4.1" }, "peerDependencies": { "google-protobuf": "^3.14.0" } }, "sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw=="], + + "@injectivelabs/core-proto-ts": ["@injectivelabs/core-proto-ts@0.0.34", "", { "dependencies": { "@injectivelabs/grpc-web": "^0.0.1", "google-protobuf": "^3.14.0", "protobufjs": "^7.0.0", "rxjs": "^7.4.0" } }, "sha512-kg25j+aCFCR/zkfn6U7JlH4Be4VEHO77cjfSLCQfOavQZ2nrXy9pvc9X88OBTYTCL7wLngIqAe0edt39bDk3tQ=="], + + "@injectivelabs/dmm-proto-ts": ["@injectivelabs/dmm-proto-ts@1.0.20", "", { "dependencies": { "@injectivelabs/grpc-web": "^0.0.1", "google-protobuf": "^3.14.0", "protobufjs": "^7.0.0", "rxjs": "^7.4.0" } }, "sha512-S9vGOAZbNNa+N5QDW2HcXn7ohvU/4qze6wELA9gF8zu8uWbE+UKWTqzkZ+B4XuG1MkJwoHL7pVcj3M+nC9Qe4A=="], + + "@injectivelabs/exceptions": ["@injectivelabs/exceptions@1.14.16", "", { "dependencies": { "@injectivelabs/grpc-web": "^0.0.1", "@injectivelabs/ts-types": "^1.14.16", "http-status-codes": "^2.2.0", "shx": "^0.3.2" } }, "sha512-6kDldpoLjc69kH2i0RMCYTE/KQ2xnpd37A9et2K6IlhIZTVmAy3t5mBSj956Gzsg/82Q7K9fX8UNoG0iGQiOTw=="], + + "@injectivelabs/grpc-web": ["@injectivelabs/grpc-web@0.0.1", "", { "dependencies": { "browser-headers": "^0.4.1" }, "peerDependencies": { "google-protobuf": "^3.14.0" } }, "sha512-Pu5YgaZp+OvR5UWfqbrPdHer3+gDf+b5fQoY+t2VZx1IAVHX8bzbN9EreYTvTYtFeDpYRWM8P7app2u4EX5wTw=="], + + "@injectivelabs/grpc-web-node-http-transport": ["@injectivelabs/grpc-web-node-http-transport@0.0.2", "", { "peerDependencies": { "@injectivelabs/grpc-web": ">=0.0.1" } }, "sha512-rpyhXLiGY/UMs6v6YmgWHJHiO9l0AgDyVNv+jcutNVt4tQrmNvnpvz2wCAGOFtq5LuX/E9ChtTVpk3gWGqXcGA=="], + + "@injectivelabs/grpc-web-react-native-transport": ["@injectivelabs/grpc-web-react-native-transport@0.0.2", "", { "peerDependencies": { "@injectivelabs/grpc-web": ">=0.0.1" } }, "sha512-mk+aukQXnYNgPsPnu3KBi+FD0ZHQpazIlaBZ2jNZG7QAVmxTWtv3R66Zoq99Wx2dnE946NsZBYAoa0K5oSjnow=="], + + "@injectivelabs/indexer-proto-ts": ["@injectivelabs/indexer-proto-ts@1.11.56", "", { "dependencies": { "@injectivelabs/grpc-web": "^0.0.1", "google-protobuf": "^3.14.0", "protobufjs": "^7.0.0", "rxjs": "^7.4.0" } }, "sha512-hEnN7DTVLGsol9Y/zaaDMDt1BZS/4KpMG419oCyM+MP1FVEOTp2BG/TDnIu7kXOwf66hCugBbnV84bvp2aY7SA=="], + + "@injectivelabs/mito-proto-ts": ["@injectivelabs/mito-proto-ts@1.0.65", "", { "dependencies": { "@injectivelabs/grpc-web": "^0.0.1", "google-protobuf": "^3.14.0", "protobufjs": "^7.0.0", "rxjs": "^7.4.0" } }, "sha512-kceZP68QrgFop387RYyO7tkfJCYxoktuceHTs9DQP3dJceLqj/V2mz0NlpkkacjgE5NhYkQ/zc0Z40hr8tnYqQ=="], + + "@injectivelabs/networks": ["@injectivelabs/networks@1.14.16", "", { "dependencies": { "@injectivelabs/exceptions": "^1.14.16", "@injectivelabs/ts-types": "^1.14.16", "@injectivelabs/utils": "^1.14.16", "shx": "^0.3.2" } }, "sha512-t0gF4uxv/39oAOHsnelX9QUfirxvNKgQYZwNpHvhE6JnEYjRYmaEifqB/LZBZ06Xj+SS/f2DZ7DwNdVTYuvaAw=="], + + "@injectivelabs/sdk-ts": ["@injectivelabs/sdk-ts@1.14.16", "", { "dependencies": { "@apollo/client": "^3.5.8", "@cosmjs/amino": "^0.32.3", "@cosmjs/proto-signing": "^0.32.3", "@cosmjs/stargate": "^0.32.3", "@ethersproject/bytes": "^5.7.0", "@injectivelabs/core-proto-ts": "0.0.34", "@injectivelabs/dmm-proto-ts": "1.0.20", "@injectivelabs/exceptions": "^1.14.16", "@injectivelabs/grpc-web": "^0.0.1", "@injectivelabs/grpc-web-node-http-transport": "^0.0.2", "@injectivelabs/grpc-web-react-native-transport": "^0.0.2", "@injectivelabs/indexer-proto-ts": "1.11.56", "@injectivelabs/mito-proto-ts": "1.0.65", "@injectivelabs/networks": "^1.14.16", "@injectivelabs/test-utils": "^1.14.16", "@injectivelabs/ts-types": "^1.14.16", "@injectivelabs/utils": "^1.14.16", "@metamask/eth-sig-util": "^4.0.0", "@noble/curves": "^1.4.0", "axios": "^1.6.4", "bech32": "^2.0.0", "bip39": "^3.0.4", "cosmjs-types": "^0.9.0", "ethereumjs-util": "^7.1.4", "ethers": "^6.5.1", "google-protobuf": "^3.21.0", "graphql": "^16.3.0", "http-status-codes": "^2.2.0", "js-sha3": "^0.8.0", "jscrypto": "^1.0.3", "keccak256": "^1.0.6", "secp256k1": "^4.0.3", "shx": "^0.3.2", "snakecase-keys": "^5.4.1" } }, "sha512-D8/7CbjK1h3DCNm8p/Lp3RcVnnHI5+JX70Y5rJ2ewjjCZSsWixIEta2mnLX6eH5zQUpfHLl3EC3/mN2Q0MaJww=="], + + "@injectivelabs/test-utils": ["@injectivelabs/test-utils@1.14.16", "", { "dependencies": { "@injectivelabs/exceptions": "^1.14.16", "@injectivelabs/networks": "^1.14.16", "@injectivelabs/ts-types": "^1.14.16", "@injectivelabs/utils": "^1.14.16", "axios": "^1.6.4", "bignumber.js": "^9.0.1", "shx": "^0.3.2", "snakecase-keys": "^5.1.2", "store2": "^2.12.0" } }, "sha512-GCIEctKhQIxka7OexiG/3kUvua4XDA54oH5ltimFncLKKSWH1EQ8xk5euonW0q+3G3VV/YKScxmZ4LcKXtEf4Q=="], + + "@injectivelabs/ts-types": ["@injectivelabs/ts-types@1.14.16", "", { "dependencies": { "shx": "^0.3.2" } }, "sha512-JzAwMQ0jneOCKQZWCHQD400HU5DFUnwD0DYxXCpcHE149BSorova3d+5oTL+HxibOzhr25j9zrCQVVsTC/+MmA=="], + + "@injectivelabs/utils": ["@injectivelabs/utils@1.14.16", "", { "dependencies": { "@injectivelabs/exceptions": "^1.14.16", "@injectivelabs/ts-types": "^1.14.16", "axios": "^1.6.4", "bignumber.js": "^9.0.1", "http-status-codes": "^2.2.0", "shx": "^0.3.2", "snakecase-keys": "^5.1.2", "store2": "^2.12.0" } }, "sha512-eS4SED2VqDD1m20drau8LrGjxmg8W+2CZj1hNXRB1bDk5+dAk92bw1/0LwiwzPsRX1bHV45w9sL0pk0VSZvV6w=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/console": ["@jest/console@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg=="], + + "@jest/core": ["@jest/core@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg=="], + + "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], + + "@jest/expect": ["@jest/expect@29.7.0", "", { "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" } }, "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ=="], + + "@jest/expect-utils": ["@jest/expect-utils@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3" } }, "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA=="], + + "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], + + "@jest/globals": ["@jest/globals@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" } }, "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ=="], + + "@jest/reporters": ["@jest/reporters@29.7.0", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/source-map": ["@jest/source-map@29.6.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw=="], + + "@jest/test-result": ["@jest/test-result@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA=="], + + "@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="], + + "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.5", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@metamask/eth-sig-util": ["@metamask/eth-sig-util@4.0.1", "", { "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", "ethjs-util": "^0.1.6", "tweetnacl": "^1.0.3", "tweetnacl-util": "^0.15.1" } }, "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ=="], + + "@mysten/bcs": ["@mysten/bcs@0.11.1", "", { "dependencies": { "bs58": "^5.0.0" } }, "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA=="], + + "@mysten/sui.js": ["@mysten/sui.js@0.50.1", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0", "@mysten/bcs": "0.11.1", "@noble/curves": "^1.1.0", "@noble/hashes": "^1.3.1", "@scure/bip32": "^1.3.1", "@scure/bip39": "^1.2.1", "@suchipi/femver": "^1.0.0", "bech32": "^2.0.0", "gql.tada": "^1.2.0", "graphql": "^16.8.1", "superstruct": "^1.0.3", "tweetnacl": "^1.0.3" } }, "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w=="], + + "@noble/curves": ["@noble/curves@1.6.0", "", { "dependencies": { "@noble/hashes": "1.5.0" } }, "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ=="], + + "@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "@scure/bip32": ["@scure/bip32@1.5.0", "", { "dependencies": { "@noble/curves": "~1.6.0", "@noble/hashes": "~1.5.0", "@scure/base": "~1.1.7" } }, "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw=="], + + "@scure/bip39": ["@scure/bip39@1.2.1", "", { "dependencies": { "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" } }, "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], + + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], + + "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.2.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="], + + "@solana/codecs-core": ["@solana/codecs-core@2.0.0-experimental.8618508", "", {}, ""], + + "@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508" } }, ""], + + "@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508" } }, ""], + + "@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22" } }, ""], + + "@solana/options": ["@solana/options@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508" } }, ""], + + "@solana/spl-token": ["@solana/spl-token@0.3.9", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.47.4" } }, "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA=="], + + "@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-data-structures": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508", "@solana/codecs-strings": "2.0.0-experimental.8618508", "@solana/options": "2.0.0-experimental.8618508", "@solana/spl-type-length-value": "0.1.0" }, "peerDependencies": { "@solana/web3.js": "^1.87.6" } }, ""], + + "@solana/spl-type-length-value": ["@solana/spl-type-length-value@0.1.0", "", { "dependencies": { "buffer": "^6.0.3" } }, ""], + + "@solana/web3.js": ["@solana/web3.js@1.95.8", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@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", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-sBHzNh7dHMrmNS5xPD1d0Xa2QffW/RXaxu/OysRXBfwTp+LYqGGmMtCYYwrHPrN5rjAmJCsQRNAwv4FM0t3B6g=="], + + "@suchipi/femver": ["@suchipi/femver@1.0.0", "", {}, "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg=="], + + "@swc/helpers": ["@swc/helpers@0.5.12", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], + + "@terra-money/terra.js": ["@terra-money/terra.js@3.1.10", "", { "dependencies": { "@classic-terra/terra.proto": "^1.1.0", "@terra-money/terra.proto": "^2.1.0", "axios": "^0.27.2", "bech32": "^2.0.0", "bip32": "^2.0.6", "bip39": "^3.0.3", "bufferutil": "^4.0.3", "decimal.js": "^10.2.1", "jscrypto": "^1.0.1", "readable-stream": "^3.6.0", "secp256k1": "^4.0.2", "tmp": "^0.2.1", "utf-8-validate": "^5.0.5", "ws": "^7.5.9" } }, "sha512-MqR16LjTUyVD4HnEavP1iBW0c1roCoRHH/E1x9P44pXzgtv2wsMeP+2un4Bnck4Nkv/46Xvy/BSKiY90ll3BKA=="], + + "@terra-money/terra.proto": ["@terra-money/terra.proto@2.1.0", "", { "dependencies": { "@improbable-eng/grpc-web": "^0.14.1", "google-protobuf": "^3.17.3", "long": "^4.0.0", "protobufjs": "~6.11.2" } }, "sha512-rhaMslv3Rkr+QsTQEZs64FKA4QlfO0DfQHaR6yct/EovenMkibDEQ63dEL6yJA6LCaEQGYhyVB9JO9pTUA8ybw=="], + + "@tootallnate/once": ["@tootallnate/once@1.1.2", "", {}, "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="], + + "@tsconfig/node10": ["@tsconfig/node10@1.0.11", "", {}, "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="], + + "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], + + "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], + + "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], + + "@typechain/ethers-v6": ["@typechain/ethers-v6@0.5.1", "", { "dependencies": { "lodash": "^4.17.15", "ts-essentials": "^7.0.1" }, "peerDependencies": { "ethers": "6.x", "typechain": "^8.3.2", "typescript": ">=4.7.0" } }, "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.5", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ=="], + + "@types/bn.js": ["@types/bn.js@5.1.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A=="], + + "@types/bun": ["@types/bun@1.1.0", "", { "dependencies": { "bun-types": "1.1.0" } }, "sha512-QGK0yU4jh0OK1A7DyhPkQuKjHQCC5jSJa3dpWIEhHv/rPfb6zLfdArc4/uUUZBMTcjilsafRXnPWO+1owb572Q=="], + + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/jest": ["@types/jest@29.5.12", "", { "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw=="], + + "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], + + "@types/long": ["@types/long@4.0.2", "", {}, "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="], + + "@types/node": ["@types/node@20.12.7", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg=="], + + "@types/pbkdf2": ["@types/pbkdf2@3.1.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew=="], + + "@types/prettier": ["@types/prettier@2.7.3", "", {}, "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA=="], + + "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], + + "@types/secp256k1": ["@types/secp256k1@4.0.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/uuid": ["@types/uuid@8.3.4", "", {}, "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="], + + "@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@types/yargs": ["@types/yargs@17.0.32", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@wormhole-foundation/ntt-cli": ["@wormhole-foundation/ntt-cli@workspace:cli"], + + "@wormhole-foundation/sdk": ["@wormhole-foundation/sdk@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-algorand": "1.0.0", "@wormhole-foundation/sdk-algorand-core": "1.0.0", "@wormhole-foundation/sdk-algorand-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-aptos": "1.0.0", "@wormhole-foundation/sdk-aptos-core": "1.0.0", "@wormhole-foundation/sdk-aptos-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-base": "1.0.0", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-cosmwasm": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-core": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-ibc": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-definitions": "1.0.0", "@wormhole-foundation/sdk-evm": "1.0.0", "@wormhole-foundation/sdk-evm-cctp": "1.0.0", "@wormhole-foundation/sdk-evm-core": "1.0.0", "@wormhole-foundation/sdk-evm-portico": "1.0.0", "@wormhole-foundation/sdk-evm-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-solana": "1.0.0", "@wormhole-foundation/sdk-solana-cctp": "1.0.0", "@wormhole-foundation/sdk-solana-core": "1.0.0", "@wormhole-foundation/sdk-solana-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-sui": "1.0.0", "@wormhole-foundation/sdk-sui-core": "1.0.0", "@wormhole-foundation/sdk-sui-tokenbridge": "1.0.0" } }, "sha512-QIkRaFe6+3DsOydShqzpTg4h6fiNI0i9N59hgCg33UiSbG87LI0g5bZZgiC1q4cpjBBcgj8w6uo2dAVrBr069Q=="], + + "@wormhole-foundation/sdk-algorand": ["@wormhole-foundation/sdk-algorand@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "algosdk": "2.7.0" } }, "sha512-XoRuyAOcLU1eJ26bGdeN2mzP6thvaoshHrt25d/KnHKYLpjgvAhCyWgAka6qzig0CGrG8z4y0K7SkeThmtwakg=="], + + "@wormhole-foundation/sdk-algorand-core": ["@wormhole-foundation/sdk-algorand-core@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-algorand": "1.0.0", "@wormhole-foundation/sdk-connect": "1.0.0" } }, "sha512-brGzOliC/Zn4uAYxYAKXtJWStQy3FtAmVPLhQkglusIhmk69PNFLBFJ9p8o9sUR/IDgLnVz3/OEOdHANletqsA=="], + + "@wormhole-foundation/sdk-algorand-tokenbridge": ["@wormhole-foundation/sdk-algorand-tokenbridge@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-algorand": "1.0.0", "@wormhole-foundation/sdk-algorand-core": "1.0.0", "@wormhole-foundation/sdk-connect": "1.0.0" } }, "sha512-8CFFdqi78SuKDmCF9gTmkCFYSoPoDaqBsQdvKpUPvBQmDDJDl1NJ6JZrtKbK87FMrSKvDciXk4Dfb3ecezclPQ=="], + + "@wormhole-foundation/sdk-aptos": ["@wormhole-foundation/sdk-aptos@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "aptos": "1.21.0" } }, "sha512-7SPLjjLsVVKuvNBRt1b87IEo0DMOvjxjIiUeM9sTDXdI7As3mLXaA4IliOQXi9+jLHpbq4q5Sk6XSxFgjsGgPQ=="], + + "@wormhole-foundation/sdk-aptos-core": ["@wormhole-foundation/sdk-aptos-core@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-aptos": "1.0.0", "@wormhole-foundation/sdk-connect": "1.0.0" } }, "sha512-u6ZkvJxTq+xr2RCJejZ8Z8/AErnmTtREZfcYStbXprqsGb+MALrYUwF+sMERVZRrY9ltNs2q2/DAxNyRSH0cjw=="], + + "@wormhole-foundation/sdk-aptos-tokenbridge": ["@wormhole-foundation/sdk-aptos-tokenbridge@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-aptos": "1.0.0", "@wormhole-foundation/sdk-connect": "1.0.0" } }, "sha512-LxGkjdQItl2IFGupNGwJiJuN/HYdIP/emmWikMSlcZh4oBAaQrYkU+Pbrp/+gjmLcFp/jTK7G/Mg7Y7DWMx5XQ=="], + + "@wormhole-foundation/sdk-base": ["@wormhole-foundation/sdk-base@1.0.0", "", { "dependencies": { "@scure/base": "^1.1.3" } }, "sha512-PbfvGG/G6qDo3QtW+9R74iAFGeXziOfSumSSRJvH5gAmQmZWUmQ0C8WaBJIzYDoV+67IYenXHYfupVWsblTP3g=="], + + "@wormhole-foundation/sdk-connect": ["@wormhole-foundation/sdk-connect@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-base": "1.0.0", "@wormhole-foundation/sdk-definitions": "1.0.0", "axios": "^1.4.0" } }, "sha512-Q6od8r+tA0TNcyOW0aYVLSyzSymLZscg62fZDY0jXpqec31fFH5zhyEmwAjyaeXvJGYG5TrzbnHVFImwRj08Mg=="], + + "@wormhole-foundation/sdk-cosmwasm": ["@wormhole-foundation/sdk-cosmwasm@1.0.0", "", { "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@cosmjs/proto-signing": "^0.32.0", "@cosmjs/stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.13-beta.2", "@wormhole-foundation/sdk-connect": "1.0.0", "cosmjs-types": "^0.9.0" } }, "sha512-4Fxdz/zxuTq/obZ3ROv7ht+/9f/LS8wBt1n/L31cgYsNxO3B5/w4Rj82EKMiWDnQ0Y0kJKKkrlc08OmYu2F/Kw=="], + + "@wormhole-foundation/sdk-cosmwasm-core": ["@wormhole-foundation/sdk-cosmwasm-core@1.0.0", "", { "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@cosmjs/stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.13-beta.2", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-cosmwasm": "1.0.0" } }, "sha512-bVy015m/nnagbA5r80iylFzY+pnMFJndM3ZPHfM0FkW6mlIppTVrs9o0/NrwV823nEfgdCKdR4n0O/EKUnBY8Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc": ["@wormhole-foundation/sdk-cosmwasm-ibc@1.0.0", "", { "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@cosmjs/stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.13-beta.2", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-cosmwasm": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-core": "1.0.0", "cosmjs-types": "^0.9.0" } }, "sha512-pNMDDbpqNIp3UpKf6Xt85jCRFJSGZ0oNMlEa/B3pJNIsRWTNntcisooSUcXVG2DXoSDcsKioiWAg7qmNe11LIQ=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge": ["@wormhole-foundation/sdk-cosmwasm-tokenbridge@1.0.0", "", { "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.13-beta.2", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-cosmwasm": "1.0.0" } }, "sha512-F2tCLtapdoMwqc8FwyuJpsrmC7ItoAG1S/JklJrABlW7914KCcVqM2I5GzXprWzzWrl8sgtpeA/B+5euIHlKAQ=="], + + "@wormhole-foundation/sdk-definitions": ["@wormhole-foundation/sdk-definitions@1.0.0", "", { "dependencies": { "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", "@wormhole-foundation/sdk-base": "1.0.0" } }, "sha512-lKME4k4lXMCYy6FotibtBVq5F4V5GuDtOyprGuTER47SdY5ZICK7xK8RKjcXlf+2T81sNQ6PkF7VIDteKiRfoA=="], + + "@wormhole-foundation/sdk-definitions-ntt": ["@wormhole-foundation/sdk-definitions-ntt@workspace:sdk/definitions"], + + "@wormhole-foundation/sdk-evm": ["@wormhole-foundation/sdk-evm@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "ethers": "^6.5.1" } }, "sha512-uS6ypLuTT5oGmu3TdC+E2MzMhywTKRfIq9ASUGA9AyfZszSnStvhwz7wBi1uhX6ukyTJXFmmsk0nCuOqTTN+DA=="], + + "@wormhole-foundation/sdk-evm-cctp": ["@wormhole-foundation/sdk-evm-cctp@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-evm": "1.0.0", "ethers": "^6.5.1" } }, "sha512-GKNdFpYcti5Ul6EeEbdNHLV46VWg6D65cL3A66RREeei9VbNChGIegLCtrpU0yFkTVZ7a1svkXFNlX17Gr4LaQ=="], + + "@wormhole-foundation/sdk-evm-core": ["@wormhole-foundation/sdk-evm-core@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-evm": "1.0.0", "ethers": "^6.5.1" } }, "sha512-eDjTqJfosBFmRMv6TNGEku+CLTJcjLpgTvXO2oQ27ckCDCq7rJ/dwEi+DGS2ZQCW/D0e5ires50zaRURApRWjw=="], + + "@wormhole-foundation/sdk-evm-ntt": ["@wormhole-foundation/sdk-evm-ntt@workspace:evm/ts"], + + "@wormhole-foundation/sdk-evm-portico": ["@wormhole-foundation/sdk-evm-portico@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-evm": "1.0.0", "@wormhole-foundation/sdk-evm-core": "1.0.0", "@wormhole-foundation/sdk-evm-tokenbridge": "1.0.0", "ethers": "^6.5.1" } }, "sha512-5uqUr8BCQXWRzAB6yj4PrI8RqEFXUstTGkvUjb7DwVH+fraoZwlkELStkTuVY73mpUnLW5lQFk0+7AXV/rHxqQ=="], + + "@wormhole-foundation/sdk-evm-tokenbridge": ["@wormhole-foundation/sdk-evm-tokenbridge@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-evm": "1.0.0", "@wormhole-foundation/sdk-evm-core": "1.0.0", "ethers": "^6.5.1" } }, "sha512-2lSSG3EIRnXSFzm6fIsAgnN9oS4bszm57WIO9fvt5Za5zO8ne7BqbYmnerdDx9fhp8nbC1oeJ+sQmGHOpV6QXA=="], + + "@wormhole-foundation/sdk-examples-ntt": ["@wormhole-foundation/sdk-examples-ntt@workspace:sdk/examples"], + + "@wormhole-foundation/sdk-route-ntt": ["@wormhole-foundation/sdk-route-ntt@workspace:sdk/route"], + + "@wormhole-foundation/sdk-solana": ["@wormhole-foundation/sdk-solana@1.0.0", "", { "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "^1.95.2", "@wormhole-foundation/sdk-connect": "1.0.0", "rpc-websockets": "^7.10.0" } }, "sha512-iNSXi3vQ6JRyNOlIto7J5EHksRt9avzVptqtrSllGnvm4+X/FENOAorpN887kMvI3qE3KgFtwrUPZa8rqwGxWA=="], + + "@wormhole-foundation/sdk-solana-cctp": ["@wormhole-foundation/sdk-solana-cctp@1.0.0", "", { "dependencies": { "@coral-xyz/anchor": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "^1.95.2", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-solana": "1.0.0" } }, "sha512-rD83p7Gyk3MNy/WEZu2LEm5eOHkRyFZu1MQ0qnQk7N9GwnL/atXmzWPJP5gJAwHpfe5GFEz6jeBxRMWZbK5png=="], + + "@wormhole-foundation/sdk-solana-core": ["@wormhole-foundation/sdk-solana-core@1.0.0", "", { "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/web3.js": "^1.95.2", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-solana": "1.0.0" } }, "sha512-fjETlCMqdkLfs3UNRYfrwHiDh2Nv/7L5wEXZpPiMFy6flSEwU0+QBTpeqdtMnqOJO+Fw6vSzQ+k4XS3CmmNdnA=="], + + "@wormhole-foundation/sdk-solana-ntt": ["@wormhole-foundation/sdk-solana-ntt@workspace:solana"], + + "@wormhole-foundation/sdk-solana-tokenbridge": ["@wormhole-foundation/sdk-solana-tokenbridge@1.0.0", "", { "dependencies": { "@coral-xyz/anchor": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "^1.95.2", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-solana": "1.0.0", "@wormhole-foundation/sdk-solana-core": "1.0.0" } }, "sha512-WgmcSknJafEFSYco/SXq7NI8NUfIMJFv5QDDNTwMp0cK85c4vQdLN0R3jlM5bllvK6wmoWIlyaCG0hsk1KedYg=="], + + "@wormhole-foundation/sdk-sui": ["@wormhole-foundation/sdk-sui@1.0.0", "", { "dependencies": { "@mysten/sui.js": "^0.50.1", "@wormhole-foundation/sdk-connect": "1.0.0" } }, "sha512-PHzR/mNwd0DwDrW2Mho3JQQIAGTBkixbFnlbjZgs2U29+hHzoNjPD6Upx2xWNGC/KcS477yd6mqnj8YARfNG0A=="], + + "@wormhole-foundation/sdk-sui-core": ["@wormhole-foundation/sdk-sui-core@1.0.0", "", { "dependencies": { "@mysten/sui.js": "^0.50.1", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-sui": "1.0.0" } }, "sha512-PVvt7ibiAFrw3mIYnB7ETzUqaE3KYxonG2jPk7nU1xxTeCbtltopKQOWawA+Q0GgbOLtfoSIoJodYE8nGJXVMg=="], + + "@wormhole-foundation/sdk-sui-tokenbridge": ["@wormhole-foundation/sdk-sui-tokenbridge@1.0.0", "", { "dependencies": { "@mysten/sui.js": "^0.50.1", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-sui": "1.0.0", "@wormhole-foundation/sdk-sui-core": "1.0.0" } }, "sha512-vv9Aew0qYLqVFYmN4gRVidncl1c4Sa4YUh9wn98GKEB/14BSIBHkWSqw3Y4cjli/K2kL1ZLfdp0UMViVgruSzA=="], + + "@wormhole-foundation/wormchain-sdk": ["@wormhole-foundation/wormchain-sdk@0.0.1", "", { "dependencies": { "@certusone/wormhole-sdk": "^0.2.0", "@cosmjs/cosmwasm-stargate": "^0.27.1", "@cosmjs/launchpad": "^0.27.1", "@cosmjs/math": "^0.27.1", "@cosmjs/proto-signing": "^0.27.1", "@cosmjs/stargate": "^0.27.1", "@cosmjs/tendermint-rpc": "^0.27.1", "axios": "^0.26.0", "bech32": "^2.0.0", "elliptic": "^6.5.4", "ethers": "^5.5.4", "keccak256": "^1.0.6", "node-fetch": "^2.6.7", "protobufjs": "^6.11.2", "ts-jest": "^27.1.3", "tslint": "^6.1.3", "typescript": "^4.5.5" } }, "sha512-yZbhgyizH6mdAhECtarDMejjgNkrhXlfyPjC5+qVS6NfIxdLv3zcwv0IFiDo92hxbo3Q7Kq67ssa/hdlvLpLCQ=="], + + "@wry/caches": ["@wry/caches@1.0.1", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA=="], + + "@wry/context": ["@wry/context@0.7.4", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ=="], + + "@wry/equality": ["@wry/equality@0.5.7", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw=="], + + "@wry/trie": ["@wry/trie@0.5.0", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA=="], + + "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": "bin.js" }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], + + "abab": ["abab@2.0.6", "", {}, "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="], + + "acorn": ["acorn@8.11.3", "", { "bin": "bin/acorn" }, "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg=="], + + "acorn-globals": ["acorn-globals@6.0.0", "", { "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" } }, "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg=="], + + "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], + + "aes-js": ["aes-js@4.0.0-beta.5", "", {}, "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q=="], + + "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "agentkeepalive": ["agentkeepalive@4.5.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew=="], + + "algo-msgpack-with-bigint": ["algo-msgpack-with-bigint@2.1.1", "", {}, "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ=="], + + "algosdk": ["algosdk@2.7.0", "", { "dependencies": { "algo-msgpack-with-bigint": "^2.1.1", "buffer": "^6.0.3", "hi-base32": "^0.5.1", "js-sha256": "^0.9.0", "js-sha3": "^0.8.0", "js-sha512": "^0.8.0", "json-bigint": "^1.0.0", "tweetnacl": "^1.0.3", "vlq": "^2.0.4" } }, "sha512-sBE9lpV7bup3rZ+q2j3JQaFAE9JwZvjWKX00vPlG8e9txctXbgLL56jZhSWZndqhDI9oI+0P4NldkuQIWdrUyg=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "aptos": ["aptos@1.21.0", "", { "dependencies": { "@aptos-labs/aptos-client": "^0.1.0", "@noble/hashes": "1.3.3", "@scure/bip39": "1.2.1", "eventemitter3": "^5.0.1", "form-data": "4.0.0", "tweetnacl": "1.0.3" } }, "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q=="], + + "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], + + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axios": ["axios@0.26.1", "", { "dependencies": { "follow-redirects": "^1.14.8" } }, "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA=="], + + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.0.1", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ=="], + + "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base-x": ["base-x@3.0.9", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + + "bigint-buffer": ["bigint-buffer@1.1.5", "", { "dependencies": { "bindings": "^1.3.0" } }, "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA=="], + + "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bip32": ["bip32@2.0.6", "", { "dependencies": { "@types/node": "10.12.18", "bs58check": "^2.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "tiny-secp256k1": "^1.1.3", "typeforce": "^1.11.5", "wif": "^2.0.6" } }, "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA=="], + + "bip39": ["bip39@3.1.0", "", { "dependencies": { "@noble/hashes": "^1.2.0" } }, "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A=="], + + "blakejs": ["blakejs@1.2.1", "", {}, "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="], + + "bn.js": ["bn.js@5.2.1", "", {}, "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="], + + "borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], + + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "browser-headers": ["browser-headers@0.4.1", "", {}, "sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg=="], + + "browser-process-hrtime": ["browser-process-hrtime@1.0.0", "", {}, "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="], + + "browserify-aes": ["browserify-aes@1.2.0", "", { "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="], + + "browserslist": ["browserslist@4.23.0", "", { "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": "cli.js" }, "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ=="], + + "bs-logger": ["bs-logger@0.2.6", "", { "dependencies": { "fast-json-stable-stringify": "2.x" } }, "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="], + + "bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "bs58check": ["bs58check@2.1.2", "", { "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", "safe-buffer": "^5.1.2" } }, "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "buffer-layout": ["buffer-layout@1.2.2", "", {}, "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA=="], + + "buffer-xor": ["buffer-xor@1.0.3", "", {}, "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="], + + "bufferutil": ["bufferutil@4.0.8", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw=="], + + "builtin-modules": ["builtin-modules@1.1.1", "", {}, "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ=="], + + "bun-types": ["bun-types@1.1.0", "", { "dependencies": { "@types/node": "~20.11.3", "@types/ws": "~8.5.10" } }, "sha512-GhMDD7TosdJzQPGUOcQD5PZshvXVxDfwGAZs2dq+eSaPsRn3iUCzvpFlsg7Q51bXVzLAUs+FWHlnmpgZ5UggIg=="], + + "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], + + "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001612", "", {}, "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g=="], + + "chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], + + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "cipher-base": ["cipher-base@1.0.4", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="], + + "cjs-module-lexer": ["cjs-module-lexer@1.2.3", "", {}, "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], + + "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], + + "collect-v8-coverage": ["collect-v8-coverage@1.0.2", "", {}, "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q=="], + + "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], + + "command-line-usage": ["command-line-usage@6.1.3", "", { "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", "table-layout": "^1.0.2", "typical": "^5.2.0" } }, "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw=="], + + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cosmjs-types": ["cosmjs-types@0.9.0", "", {}, "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ=="], + + "create-hash": ["create-hash@1.2.0", "", { "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="], + + "create-hmac": ["create-hmac@1.1.7", "", { "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="], + + "create-jest": ["create-jest@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": "bin/create-jest.js" }, "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q=="], + + "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], + + "cross-fetch": ["cross-fetch@3.1.8", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg=="], + + "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + + "crypto-hash": ["crypto-hash@1.3.0", "", {}, "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg=="], + + "cssom": ["cssom@0.4.4", "", {}, "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="], + + "cssstyle": ["cssstyle@2.3.0", "", { "dependencies": { "cssom": "~0.3.6" } }, "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A=="], + + "data-urls": ["data-urls@2.0.0", "", { "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0" } }, "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ=="], + + "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "decimal.js": ["decimal.js@10.4.3", "", {}, "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "dedent": ["dedent@1.5.3", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], + + "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], + + "diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="], + + "domexception": ["domexception@2.0.1", "", { "dependencies": { "webidl-conversions": "^5.0.0" } }, "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg=="], + + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + + "dotenv": ["dotenv@16.4.5", "", {}, ""], + + "electron-to-chromium": ["electron-to-chromium@1.4.749", "", {}, "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q=="], + + "elliptic": ["elliptic@6.5.5", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw=="], + + "emittery": ["emittery@0.8.1", "", {}, "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], + + "es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="], + + "esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": "bin/esbuild" }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], + + "escalade": ["escalade@3.1.2", "", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "ethereum-cryptography": ["ethereum-cryptography@0.1.3", "", { "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", "blakejs": "^1.1.0", "browserify-aes": "^1.2.0", "bs58check": "^2.1.2", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "hash.js": "^1.1.7", "keccak": "^3.0.0", "pbkdf2": "^3.0.17", "randombytes": "^2.1.0", "safe-buffer": "^5.1.2", "scrypt-js": "^3.0.0", "secp256k1": "^4.0.1", "setimmediate": "^1.0.5" } }, "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ=="], + + "ethereumjs-abi": ["ethereumjs-abi@0.6.8", "", { "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" } }, "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA=="], + + "ethereumjs-util": ["ethereumjs-util@7.1.5", "", { "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", "create-hash": "^1.1.2", "ethereum-cryptography": "^0.1.3", "rlp": "^2.2.4" } }, "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg=="], + + "ethers": ["ethers@6.12.0", "", { "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "18.15.13", "aes-js": "4.0.0-beta.5", "tslib": "2.4.0", "ws": "8.5.0" } }, "sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ=="], + + "ethjs-util": ["ethjs-util@0.1.6", "", { "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" } }, "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "exit": ["exit@0.1.2", "", {}, "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="], + + "expect": ["expect@29.7.0", "", { "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw=="], + + "eyes": ["eyes@0.1.8", "", {}, "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="], + + "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, ""], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], + + "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "follow-redirects": ["follow-redirects@1.15.6", "", {}, "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="], + + "form-data": ["form-data@4.0.0", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww=="], + + "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="], + + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "get-tsconfig": ["get-tsconfig@4.7.3", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg=="], + + "glob": ["glob@7.1.7", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ=="], + + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "globalthis": ["globalthis@1.0.3", "", { "dependencies": { "define-properties": "^1.1.3" } }, "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA=="], + + "google-protobuf": ["google-protobuf@3.21.2", "", {}, "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="], + + "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], + + "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], + + "gql.tada": ["gql.tada@1.8.10", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.5", "@0no-co/graphqlsp": "^1.12.13", "@gql.tada/cli-utils": "1.6.3", "@gql.tada/internal": "1.0.8" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "gql-tada": "bin/cli.js", "gql.tada": "bin/cli.js" } }, "sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphql": ["graphql@16.9.0", "", {}, "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw=="], + + "graphql-tag": ["graphql-tag@2.12.6", "", { "dependencies": { "tslib": "^2.1.0" }, "peerDependencies": { "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg=="], + + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.0.3", "", {}, "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="], + + "has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="], + + "hash-base": ["hash-base@3.1.0", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" } }, "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA=="], + + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hi-base32": ["hi-base32@0.5.1", "", {}, "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA=="], + + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "html-encoding-sniffer": ["html-encoding-sniffer@2.0.1", "", { "dependencies": { "whatwg-encoding": "^1.0.5" } }, "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], + + "http-proxy-agent": ["http-proxy-agent@4.0.1", "", { "dependencies": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } }, "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg=="], + + "http-status-codes": ["http-status-codes@2.3.0", "", {}, "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="], + + "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "import-local": ["import-local@3.1.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "interpret": ["interpret@1.4.0", "", {}, "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-core-module": ["is-core-module@2.13.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], + + "is-hex-prefixed": ["is-hex-prefixed@1.0.0", "", {}, "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], + + "istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="], + + "istanbul-reports": ["istanbul-reports@3.1.7", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g=="], + + "jayson": ["jayson@4.1.1", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "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", "json-stringify-safe": "^5.0.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": "bin/jayson.js" }, "sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w=="], + + "jest": ["jest@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": "bin/jest.js" }, "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw=="], + + "jest-changed-files": ["jest-changed-files@29.7.0", "", { "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w=="], + + "jest-circus": ["jest-circus@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw=="], + + "jest-cli": ["jest-cli@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg=="], + + "jest-config": ["jest-config@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" } }, "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ=="], + + "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], + + "jest-docblock": ["jest-docblock@29.7.0", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g=="], + + "jest-each": ["jest-each@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" } }, "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ=="], + + "jest-environment-jsdom": ["jest-environment-jsdom@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1", "jest-util": "^27.5.1", "jsdom": "^16.6.0" } }, "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw=="], + + "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], + + "jest-jasmine2": ["jest-jasmine2@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/source-map": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "expect": "^27.5.1", "is-generator-fn": "^2.0.0", "jest-each": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-runtime": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1", "throat": "^6.0.1" } }, "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ=="], + + "jest-leak-detector": ["jest-leak-detector@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw=="], + + "jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="], + + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], + + "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], + + "jest-pnp-resolver": ["jest-pnp-resolver@1.2.3", "", { "peerDependencies": { "jest-resolve": "*" } }, "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="], + + "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], + + "jest-resolve": ["jest-resolve@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA=="], + + "jest-resolve-dependencies": ["jest-resolve-dependencies@29.7.0", "", { "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" } }, "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA=="], + + "jest-runner": ["jest-runner@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ=="], + + "jest-runtime": ["jest-runtime@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ=="], + + "jest-serializer": ["jest-serializer@27.5.1", "", { "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" } }, "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w=="], + + "jest-snapshot": ["jest-snapshot@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" } }, "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], + + "jest-watcher": ["jest-watcher@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g=="], + + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "js-base64": ["js-base64@3.7.7", "", {}, "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="], + + "js-sha256": ["js-sha256@0.9.0", "", {}, "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="], + + "js-sha3": ["js-sha3@0.8.0", "", {}, "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="], + + "js-sha512": ["js-sha512@0.8.0", "", {}, "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": "bin/js-yaml.js" }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "jscrypto": ["jscrypto@1.0.3", "", { "bin": "bin/cli.js" }, "sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ=="], + + "jsdom": ["jsdom@16.7.0", "", { "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", "data-urls": "^2.0.0", "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "optionalPeers": ["canvas"] }, "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw=="], + + "jsesc": ["jsesc@2.5.2", "", { "bin": "bin/jsesc" }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], + + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], + + "keccak": ["keccak@3.0.4", "", { "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", "readable-stream": "^3.6.0" } }, "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q=="], + + "keccak256": ["keccak256@1.0.6", "", { "dependencies": { "bn.js": "^5.2.0", "buffer": "^6.0.3", "keccak": "^3.0.2" } }, "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "libsodium": ["libsodium@0.7.13", "", {}, "sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw=="], + + "libsodium-sumo": ["libsodium-sumo@0.7.15", "", {}, "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw=="], + + "libsodium-wrappers": ["libsodium-wrappers@0.7.13", "", { "dependencies": { "libsodium": "^0.7.13" } }, "sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw=="], + + "libsodium-wrappers-sumo": ["libsodium-wrappers-sumo@0.7.15", "", { "dependencies": { "libsodium-sumo": "^0.7.15" } }, "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "long": ["long@4.0.0", "", {}, "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "map-obj": ["map-obj@4.3.0", "", {}, "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ=="], + + "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": "bin/cmd.js" }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "nan": ["nan@2.19.0", "", {}, "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "nock": ["nock@13.5.4", "", { "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", "propagate": "^2.0.0" } }, "sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw=="], + + "node-addon-api": ["node-addon-api@2.0.2", "", {}, "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-gyp-build": ["node-gyp-build@4.8.0", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-releases": ["node-releases@2.0.14", "", {}, "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "nwsapi": ["nwsapi@2.2.9", "", {}, "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "optimism": ["optimism@0.18.0", "", { "dependencies": { "@wry/caches": "^1.0.0", "@wry/context": "^0.7.0", "@wry/trie": "^0.4.3", "tslib": "^2.3.0" } }, "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ=="], + + "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "pbkdf2": ["pbkdf2@3.1.2", "", { "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA=="], + + "picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "prettier": ["prettier@2.8.8", "", { "bin": "bin-prettier.js" }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "propagate": ["propagate@2.0.1", "", {}, "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag=="], + + "protobufjs": ["protobufjs@6.11.4", "", { "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/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "psl": ["psl@1.9.0", "", {}, "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="], + + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + + "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "react-is": ["react-is@18.3.0", "", {}, "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readonly-date": ["readonly-date@1.0.0", "", {}, "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ=="], + + "rechoir": ["rechoir@0.6.2", "", { "dependencies": { "resolve": "^1.1.6" } }, "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw=="], + + "reduce-flatten": ["reduce-flatten@2.0.0", "", {}, "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="], + + "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + + "rehackt": ["rehackt@0.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "*" }, "optionalPeers": ["@types/react", "react"] }, "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + + "resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "resolve.exports": ["resolve.exports@2.0.2", "", {}, "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg=="], + + "response-iterator": ["response-iterator@0.2.6", "", {}, "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw=="], + + "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": "bin.js" }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "ripemd160": ["ripemd160@2.0.2", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="], + + "rlp": ["rlp@2.2.7", "", { "dependencies": { "bn.js": "^5.2.0" }, "bin": "bin/rlp" }, "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ=="], + + "rpc-websockets": ["rpc-websockets@9.0.2", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw=="], + + "rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "saxes": ["saxes@5.0.1", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw=="], + + "scrypt-js": ["scrypt-js@3.0.1", "", {}, "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="], + + "secp256k1": ["secp256k1@4.0.3", "", { "dependencies": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" } }, "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA=="], + + "semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "sha.js": ["sha.js@2.4.11", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, "bin": "bin.js" }, "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shelljs": ["shelljs@0.8.5", "", { "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" }, "bin": { "shjs": "bin/shjs" } }, "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow=="], + + "shx": ["shx@0.3.4", "", { "dependencies": { "minimist": "^1.2.3", "shelljs": "^0.8.5" }, "bin": "lib/cli.js" }, "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + + "snakecase-keys": ["snakecase-keys@5.5.0", "", { "dependencies": { "map-obj": "^4.1.0", "snake-case": "^3.0.4", "type-fest": "^3.12.0" } }, "sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "store2": ["store2@2.14.3", "", {}, "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg=="], + + "string-format": ["string-format@2.0.0", "", {}, "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA=="], + + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-hex-prefix": ["strip-hex-prefix@1.0.0", "", { "dependencies": { "is-hex-prefixed": "1.0.0" } }, "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "supports-hyperlinks": ["supports-hyperlinks@2.3.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "symbol-observable": ["symbol-observable@2.0.3", "", {}, "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA=="], + + "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], + + "table-layout": ["table-layout@1.0.2", "", { "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", "typical": "^5.2.0", "wordwrapjs": "^4.0.0" } }, "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A=="], + + "terminal-link": ["terminal-link@2.1.1", "", { "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "text-encoding-utf-8": ["text-encoding-utf-8@1.0.2", "", {}, "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="], + + "throat": ["throat@6.0.2", "", {}, "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tiny-secp256k1": ["tiny-secp256k1@1.1.6", "", { "dependencies": { "bindings": "^1.3.0", "bn.js": "^4.11.8", "create-hmac": "^1.1.7", "elliptic": "^6.4.0", "nan": "^2.13.2" } }, "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA=="], + + "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], + + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + + "tough-cookie": ["tough-cookie@4.1.3", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-command-line-args": ["ts-command-line-args@2.5.1", "", { "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-usage": "^6.1.0", "string-format": "^2.0.0" }, "bin": { "write-markdown": "dist/write-markdown.js" } }, "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw=="], + + "ts-essentials": ["ts-essentials@7.0.3", "", { "peerDependencies": { "typescript": ">=3.7.0" } }, "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ=="], + + "ts-invariant": ["ts-invariant@0.10.3", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ=="], + + "ts-jest": ["ts-jest@29.1.2", "", { "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", "typescript": ">=4.3 <6" }, "bin": "cli.js" }, "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g=="], + + "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], + + "tslib": ["tslib@2.4.0", "", {}, "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="], + + "tslint": ["tslint@6.1.3", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "peerDependencies": { "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" }, "bin": "bin/tslint" }, "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg=="], + + "tsutils": ["tsutils@2.29.0", "", { "dependencies": { "tslib": "^1.8.1" }, "peerDependencies": { "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA=="], + + "tsx": ["tsx@4.7.3", "", { "dependencies": { "esbuild": "~0.19.10", "get-tsconfig": "^4.7.2" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": "dist/cli.mjs" }, "sha512-+fQnMqIp/jxZEXLcj6WzYy9FhcS5/Dfk8y4AtzJ6ejKcKqmfTF8Gso/jtrzDggCF2zTU20gJa6n8XqPYwDAUYQ=="], + + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "tweetnacl-util": ["tweetnacl-util@0.15.1", "", {}, "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + + "typechain": ["typechain@8.3.2", "", { "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", "fs-extra": "^7.0.0", "glob": "7.1.7", "js-sha3": "^0.8.0", "lodash": "^4.17.15", "mkdirp": "^1.0.4", "prettier": "^2.3.1", "ts-command-line-args": "^2.2.0", "ts-essentials": "^7.0.1" }, "peerDependencies": { "typescript": ">=4.3.0" }, "bin": "dist/cli/cli.js" }, "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q=="], + + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + + "typeforce": ["typeforce@1.18.0", "", {}, "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="], + + "typescript": ["typescript@5.4.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="], + + "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], + + "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "update-browserslist-db": ["update-browserslist-db@1.0.13", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg=="], + + "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], + + "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@8.3.2", "", { "bin": "dist/bin/uuid" }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + + "v8-to-istanbul": ["v8-to-istanbul@9.2.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA=="], + + "vlq": ["vlq@2.0.4", "", {}, "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA=="], + + "w3c-hr-time": ["w3c-hr-time@1.0.2", "", { "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ=="], + + "w3c-xmlserializer": ["w3c-xmlserializer@2.0.0", "", { "dependencies": { "xml-name-validator": "^3.0.0" } }, "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-encoding": ["whatwg-encoding@1.0.5", "", { "dependencies": { "iconv-lite": "0.4.24" } }, "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw=="], + + "whatwg-mimetype": ["whatwg-mimetype@2.3.0", "", {}, "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wif": ["wif@2.0.6", "", { "dependencies": { "bs58check": "<3.0.0" } }, "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ=="], + + "wordwrapjs": ["wordwrapjs@4.0.1", "", { "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" } }, "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], + + "ws": ["ws@8.5.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg=="], + + "xml-name-validator": ["xml-name-validator@3.0.0", "", {}, "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="], + + "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], + + "xstream": ["xstream@11.14.0", "", { "dependencies": { "globalthis": "^1.0.1", "symbol-observable": "^2.0.3" } }, "sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, ""], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zen-observable": ["zen-observable@0.8.15", "", {}, "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="], + + "zen-observable-ts": ["zen-observable-ts@1.2.5", "", { "dependencies": { "zen-observable": "0.8.15" } }, "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg=="], + + "@ampproject/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@apollo/client/symbol-observable": ["symbol-observable@4.0.0", "", {}, "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ=="], + + "@apollo/client/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@aptos-labs/aptos-client/axios": ["axios@1.7.4", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@certusone/wormhole-sdk/@solana/spl-token": ["@solana/spl-token@0.1.8", "", { "dependencies": { "@babel/runtime": "^7.10.5", "@solana/web3.js": "^1.21.0", "bn.js": "^5.1.0", "buffer": "6.0.3", "buffer-layout": "^1.2.0", "dotenv": "10.0.0" } }, "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ=="], + + "@certusone/wormhole-sdk/algosdk": ["algosdk@1.24.1", "", { "dependencies": { "algo-msgpack-with-bigint": "^2.1.1", "buffer": "^6.0.2", "cross-fetch": "^3.1.5", "hi-base32": "^0.5.1", "js-sha256": "^0.9.0", "js-sha3": "^0.8.0", "js-sha512": "^0.8.0", "json-bigint": "^1.0.0", "tweetnacl": "^1.0.3", "vlq": "^2.0.4" } }, "sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww=="], + + "@certusone/wormhole-sdk/axios": ["axios@0.24.0", "", { "dependencies": { "follow-redirects": "^1.14.4" } }, "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA=="], + + "@certusone/wormhole-sdk/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + + "@coral-xyz/anchor/superstruct": ["superstruct@0.15.5", "", {}, "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ=="], + + "@cosmjs/cosmwasm-stargate/cosmjs-types": ["cosmjs-types@0.4.1", "", { "dependencies": { "long": "^4.0.0", "protobufjs": "~6.11.2" } }, "sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog=="], + + "@cosmjs/cosmwasm-stargate/protobufjs": ["protobufjs@6.10.3", "", { "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/long": "^4.0.1", "@types/node": "^13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-yvAslS0hNdBhlSKckI4R1l7wunVilX66uvrjzE4MimiAt7/qw1nLpMhZrn/ObuUTM/c3Xnfl01LYMdcSJe6dwg=="], + + "@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@cosmjs/launchpad/@cosmjs/amino": ["@cosmjs/amino@0.27.1", "", { "dependencies": { "@cosmjs/crypto": "0.27.1", "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/utils": "0.27.1" } }, "sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA=="], + + "@cosmjs/launchpad/@cosmjs/crypto": ["@cosmjs/crypto@0.27.1", "", { "dependencies": { "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", "@cosmjs/utils": "0.27.1", "bip39": "^3.0.2", "bn.js": "^5.2.0", "elliptic": "^6.5.3", "js-sha3": "^0.8.0", "libsodium-wrappers": "^0.7.6", "ripemd160": "^2.0.2", "sha.js": "^2.4.11" } }, "sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg=="], + + "@cosmjs/launchpad/@cosmjs/encoding": ["@cosmjs/encoding@0.27.1", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw=="], + + "@cosmjs/launchpad/@cosmjs/math": ["@cosmjs/math@0.27.1", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ=="], + + "@cosmjs/launchpad/@cosmjs/utils": ["@cosmjs/utils@0.27.1", "", {}, "sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg=="], + + "@cosmjs/launchpad/axios": ["axios@0.21.4", "", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="], + + "@cosmjs/proto-signing/cosmjs-types": ["cosmjs-types@0.4.1", "", { "dependencies": { "long": "^4.0.0", "protobufjs": "~6.11.2" } }, "sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog=="], + + "@cosmjs/proto-signing/protobufjs": ["protobufjs@6.10.3", "", { "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/long": "^4.0.1", "@types/node": "^13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-yvAslS0hNdBhlSKckI4R1l7wunVilX66uvrjzE4MimiAt7/qw1nLpMhZrn/ObuUTM/c3Xnfl01LYMdcSJe6dwg=="], + + "@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@cosmjs/stargate/cosmjs-types": ["cosmjs-types@0.4.1", "", { "dependencies": { "long": "^4.0.0", "protobufjs": "~6.11.2" } }, "sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog=="], + + "@cosmjs/stargate/protobufjs": ["protobufjs@6.10.3", "", { "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/long": "^4.0.1", "@types/node": "^13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-yvAslS0hNdBhlSKckI4R1l7wunVilX66uvrjzE4MimiAt7/qw1nLpMhZrn/ObuUTM/c3Xnfl01LYMdcSJe6dwg=="], + + "@cosmjs/tendermint-rpc/axios": ["axios@0.21.4", "", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="], + + "@ethersproject/json-wallets/aes-js": ["aes-js@3.0.0", "", {}, "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw=="], + + "@ethersproject/providers/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@ethersproject/providers/ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], + + "@ethersproject/signing-key/elliptic": ["elliptic@6.5.4", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ=="], + + "@injectivelabs/core-proto-ts/protobufjs": ["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": ">=13.7.0", "long": "^5.0.0" } }, "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw=="], + + "@injectivelabs/dmm-proto-ts/protobufjs": ["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": ">=13.7.0", "long": "^5.0.0" } }, "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw=="], + + "@injectivelabs/indexer-proto-ts/protobufjs": ["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": ">=13.7.0", "long": "^5.0.0" } }, "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw=="], + + "@injectivelabs/mito-proto-ts/protobufjs": ["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": ">=13.7.0", "long": "^5.0.0" } }, "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw=="], + + "@injectivelabs/sdk-ts/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@injectivelabs/sdk-ts/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate": ["@cosmjs/stargate@0.32.4", "", { "dependencies": { "@confio/ics23": "^0.6.8", "@cosmjs/amino": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "xstream": "^11.14.0" } }, "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ=="], + + "@injectivelabs/sdk-ts/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@injectivelabs/sdk-ts/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + + "@injectivelabs/test-utils/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@injectivelabs/utils/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@jest/console/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/core/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/reporters/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@jest/reporters/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/reporters/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@jest/reporters/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.2", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw=="], + + "@jest/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@jest/transform/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@jest/transform/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@metamask/eth-sig-util/ethereumjs-util": ["ethereumjs-util@6.2.1", "", { "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", "create-hash": "^1.1.2", "elliptic": "^6.5.2", "ethereum-cryptography": "^0.1.3", "ethjs-util": "0.1.6", "rlp": "^2.2.3" } }, "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw=="], + + "@mysten/bcs/bs58": ["bs58@5.0.0", "", { "dependencies": { "base-x": "^4.0.0" } }, "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ=="], + + "@mysten/sui.js/@scure/bip39": ["@scure/bip39@1.4.0", "", { "dependencies": { "@noble/hashes": "~1.5.0", "@scure/base": "~1.1.8" } }, "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw=="], + + "@mysten/sui.js/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + + "@mysten/sui.js/superstruct": ["superstruct@1.0.4", "", {}, "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ=="], + + "@noble/curves/@noble/hashes": ["@noble/hashes@1.5.0", "", {}, "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA=="], + + "@scure/bip32/@noble/hashes": ["@noble/hashes@1.5.0", "", {}, "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA=="], + + "@scure/bip39/@noble/hashes": ["@noble/hashes@1.3.3", "", {}, "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA=="], + + "@swc/helpers/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@terra-money/terra.js/axios": ["axios@0.27.2", "", { "dependencies": { "follow-redirects": "^1.14.9", "form-data": "^4.0.0" } }, "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ=="], + + "@terra-money/terra.js/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + + "@terra-money/terra.js/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-connect/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate": ["@cosmjs/cosmwasm-stargate@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "pako": "^2.0.2" } }, "sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate": ["@cosmjs/stargate@0.32.4", "", { "dependencies": { "@confio/ics23": "^0.6.8", "@cosmjs/amino": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "xstream": "^11.14.0" } }, "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate": ["@cosmjs/cosmwasm-stargate@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "pako": "^2.0.2" } }, "sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate": ["@cosmjs/stargate@0.32.4", "", { "dependencies": { "@confio/ics23": "^0.6.8", "@cosmjs/amino": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "xstream": "^11.14.0" } }, "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate": ["@cosmjs/cosmwasm-stargate@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "pako": "^2.0.2" } }, "sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate": ["@cosmjs/stargate@0.32.4", "", { "dependencies": { "@confio/ics23": "^0.6.8", "@cosmjs/amino": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "xstream": "^11.14.0" } }, "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate": ["@cosmjs/cosmwasm-stargate@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "pako": "^2.0.2" } }, "sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA=="], + + "@wormhole-foundation/sdk-solana/rpc-websockets": ["rpc-websockets@7.11.2", "", { "dependencies": { "eventemitter3": "^4.0.7", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-pL9r5N6AVHlMN/vT98+fcO+5+/UcPLf/4tq+WUaid/PPUGS/ttJ3y8e9IqmaWKtShNAysMSjkczuEA49NuV7UQ=="], + + "@wormhole-foundation/sdk-solana-ntt/@solana/spl-token": ["@solana/spl-token@0.4.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-metadata": "^0.1.2", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.89.1" } }, ""], + + "@wormhole-foundation/wormchain-sdk/ethers": ["ethers@5.7.2", "", { "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/base64": "5.7.0", "@ethersproject/basex": "5.7.0", "@ethersproject/bignumber": "5.7.0", "@ethersproject/bytes": "5.7.0", "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", "@ethersproject/hash": "5.7.0", "@ethersproject/hdnode": "5.7.0", "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", "@ethersproject/providers": "5.7.2", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", "@ethersproject/signing-key": "5.7.0", "@ethersproject/solidity": "5.7.0", "@ethersproject/strings": "5.7.0", "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } }, "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest": ["ts-jest@27.1.5", "", { "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, "bin": "cli.js" }, "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA=="], + + "@wormhole-foundation/wormchain-sdk/typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="], + + "@wry/caches/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@wry/context/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@wry/equality/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@wry/trie/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "acorn-globals/acorn": ["acorn@7.4.1", "", { "bin": "bin/acorn" }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="], + + "acorn-globals/acorn-walk": ["acorn-walk@7.2.0", "", {}, "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="], + + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "aptos/@noble/hashes": ["@noble/hashes@1.3.3", "", {}, "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA=="], + + "aptos/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "babel-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "bip32/@types/node": ["@types/node@10.12.18", "", {}, "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ=="], + + "bun-types/@types/node": ["@types/node@20.11.30", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw=="], + + "bun-types/@types/ws": ["@types/ws@8.5.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A=="], + + "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], + + "command-line-usage/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], + + "command-line-usage/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "command-line-usage/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + + "create-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], + + "data-urls/whatwg-url": ["whatwg-url@8.7.0", "", { "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg=="], + + "domexception/webidl-conversions": ["webidl-conversions@5.0.0", "", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="], + + "dot-case/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "elliptic/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "ethereumjs-abi/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "ethereumjs-abi/ethereumjs-util": ["ethereumjs-util@6.2.1", "", { "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", "create-hash": "^1.1.2", "elliptic": "^6.5.2", "ethereum-cryptography": "^0.1.3", "ethjs-util": "0.1.6", "rlp": "^2.2.3" } }, "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw=="], + + "ethers/@noble/curves": ["@noble/curves@1.2.0", "", { "dependencies": { "@noble/hashes": "1.3.2" } }, "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw=="], + + "ethers/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + + "ethers/@types/node": ["@types/node@18.15.13", "", {}, "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q=="], + + "graphql-tag/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "humanize-ms/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "jest-circus/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-cli/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "jest-config/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "jest-diff/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-each/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-environment-jsdom/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "jest-environment-jsdom/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "jest-environment-jsdom/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], + + "jest-environment-jsdom/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "jest-environment-jsdom/jest-util": ["jest-util@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw=="], + + "jest-jasmine2/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "jest-jasmine2/@jest/source-map": ["@jest/source-map@27.5.1", "", { "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", "source-map": "^0.6.0" } }, "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg=="], + + "jest-jasmine2/@jest/test-result": ["@jest/test-result@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag=="], + + "jest-jasmine2/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], + + "jest-jasmine2/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-jasmine2/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "jest-jasmine2/jest-each": ["jest-each@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", "jest-get-type": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ=="], + + "jest-jasmine2/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "jest-jasmine2/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "jest-jasmine2/jest-runtime": ["jest-runtime@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/globals": "^27.5.1", "@jest/source-map": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A=="], + + "jest-jasmine2/jest-snapshot": ["jest-snapshot@27.5.1", "", { "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^27.5.1", "graceful-fs": "^4.2.9", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" } }, "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA=="], + + "jest-jasmine2/jest-util": ["jest-util@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw=="], + + "jest-jasmine2/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "jest-matcher-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-message-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-resolve/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-runner/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-runner/emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "jest-runtime/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-runtime/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "jest-snapshot/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-validate/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-watcher/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-watcher/emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "jsdom/form-data": ["form-data@3.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg=="], + + "jsdom/webidl-conversions": ["webidl-conversions@6.1.0", "", {}, "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="], + + "jsdom/whatwg-url": ["whatwg-url@8.7.0", "", { "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg=="], + + "jsdom/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "lower-case/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "make-dir/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "no-case/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "optimism/@wry/trie": ["@wry/trie@0.4.3", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w=="], + + "optimism/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "rpc-websockets/@types/ws": ["@types/ws@8.5.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ=="], + + "rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "rpc-websockets/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" } }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "rxjs/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "shelljs/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "snake-case/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "supports-hyperlinks/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "supports-hyperlinks/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "table-layout/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], + + "table-layout/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + + "test-exclude/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "tiny-secp256k1/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], + + "ts-command-line-args/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "ts-invariant/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "tslint/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "tslint/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "tslint/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": "bin/cmd.js" }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "tslint/semver": ["semver@5.7.2", "", { "bin": "bin/semver" }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "tslint/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "tsutils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "v8-to-istanbul/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "wordwrapjs/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@certusone/wormhole-sdk/@solana/spl-token/dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], + + "@cosmjs/cosmwasm-stargate/cosmjs-types/protobufjs": ["protobufjs@6.11.4", "", { "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/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], + + "@cosmjs/cosmwasm-stargate/protobufjs/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@cosmjs/launchpad/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@cosmjs/proto-signing/cosmjs-types/protobufjs": ["protobufjs@6.11.4", "", { "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/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], + + "@cosmjs/proto-signing/protobufjs/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@cosmjs/stargate/cosmjs-types/protobufjs": ["protobufjs@6.11.4", "", { "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/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], + + "@cosmjs/stargate/protobufjs/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@ethersproject/signing-key/elliptic/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "@injectivelabs/core-proto-ts/protobufjs/long": ["long@5.2.3", "", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], + + "@injectivelabs/dmm-proto-ts/protobufjs/long": ["long@5.2.3", "", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], + + "@injectivelabs/indexer-proto-ts/protobufjs/long": ["long@5.2.3", "", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], + + "@injectivelabs/mito-proto-ts/protobufjs/long": ["long@5.2.3", "", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], + + "@injectivelabs/sdk-ts/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@injectivelabs/sdk-ts/@cosmjs/amino/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@injectivelabs/sdk-ts/@cosmjs/amino/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@injectivelabs/sdk-ts/@cosmjs/amino/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@injectivelabs/sdk-ts/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@injectivelabs/sdk-ts/@cosmjs/proto-signing/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@injectivelabs/sdk-ts/@cosmjs/proto-signing/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@injectivelabs/sdk-ts/@cosmjs/proto-signing/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@jest/console/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/console/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/core/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/core/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/reporters/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/reporters/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/reporters/istanbul-lib-instrument/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "@jest/transform/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/transform/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/types/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@metamask/eth-sig-util/ethereumjs-util/@types/bn.js": ["@types/bn.js@4.11.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg=="], + + "@metamask/eth-sig-util/ethereumjs-util/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "@mysten/bcs/bs58/base-x": ["base-x@4.0.0", "", {}, "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw=="], + + "@mysten/sui.js/@scure/bip39/@noble/hashes": ["@noble/hashes@1.5.0", "", {}, "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0" } }, "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/stargate": ["@cosmjs/stargate@0.32.4", "", { "dependencies": { "@confio/ics23": "^0.6.8", "@cosmjs/amino": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "xstream": "^11.14.0" } }, "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4" } }, "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/math": ["@cosmjs/math@0.32.4", "", { "dependencies": { "bn.js": "^5.2.0" } }, "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/tendermint-rpc": ["@cosmjs/tendermint-rpc@0.32.4", "", { "dependencies": { "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/json-rpc": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/socket": "^0.32.4", "@cosmjs/stream": "^0.32.4", "@cosmjs/utils": "^0.32.4", "axios": "^1.6.0", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/utils": ["@cosmjs/utils@0.32.4", "", {}, "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w=="], + + "@wormhole-foundation/sdk-solana/rpc-websockets/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" } }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest": ["babel-jest@27.5.1", "", { "dependencies": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest": ["jest@27.5.1", "", { "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", "jest-cli": "^27.5.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": "bin/jest.js" }, "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util": ["jest-util@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "babel-jest/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "babel-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "command-line-usage/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "command-line-usage/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "command-line-usage/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "create-jest/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "create-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "data-urls/whatwg-url/tr46": ["tr46@2.1.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw=="], + + "data-urls/whatwg-url/webidl-conversions": ["webidl-conversions@6.1.0", "", {}, "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="], + + "ethereumjs-abi/ethereumjs-util/@types/bn.js": ["@types/bn.js@4.11.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg=="], + + "istanbul-lib-report/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-circus/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-circus/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-cli/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "jest-config/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-config/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-diff/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-diff/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-each/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-each/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-environment-jsdom/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "jest-environment-jsdom/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + + "jest-environment-jsdom/@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-environment-jsdom/jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-jasmine2/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "jest-jasmine2/@jest/environment/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "jest-jasmine2/@jest/test-result/@jest/console": ["@jest/console@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0" } }, "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg=="], + + "jest-jasmine2/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + + "jest-jasmine2/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-jasmine2/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-jasmine2/expect/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "jest-jasmine2/jest-each/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "jest-jasmine2/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "jest-jasmine2/jest-matcher-utils/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "jest-jasmine2/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "jest-jasmine2/jest-runtime/@jest/globals": ["@jest/globals@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" } }, "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q=="], + + "jest-jasmine2/jest-runtime/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "jest-jasmine2/jest-runtime/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "jest-jasmine2/jest-runtime/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "jest-jasmine2/jest-runtime/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "jest-jasmine2/jest-runtime/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], + + "jest-jasmine2/jest-runtime/jest-resolve": ["jest-resolve@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" } }, "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw=="], + + "jest-jasmine2/jest-snapshot/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "jest-jasmine2/jest-snapshot/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "jest-jasmine2/jest-snapshot/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "jest-jasmine2/jest-snapshot/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "jest-jasmine2/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "jest-jasmine2/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "jest-jasmine2/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-resolve/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-resolve/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-runner/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-runner/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-runtime/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-runtime/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-snapshot/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-snapshot/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-validate/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-validate/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-watcher/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-watcher/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jsdom/whatwg-url/tr46": ["tr46@2.1.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw=="], + + "make-dir/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "ts-command-line-args/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ts-command-line-args/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "tslint/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@injectivelabs/sdk-ts/@cosmjs/amino/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@injectivelabs/sdk-ts/@cosmjs/proto-signing/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@jest/console/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@jest/console/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@jest/core/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@jest/core/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@jest/reporters/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@jest/reporters/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@jest/reporters/istanbul-lib-instrument/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "@jest/transform/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@jest/transform/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@jest/types/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@jest/types/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/stargate/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/stream": ["@cosmjs/stream@0.32.4", "", { "dependencies": { "xstream": "^11.14.0" } }, "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/proto-signing/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/crypto": ["@cosmjs/crypto@0.32.4", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", "libsodium-wrappers-sumo": "^0.7.11" } }, "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.32.4", "", { "dependencies": { "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/tendermint-rpc/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/babel-preset-jest": ["babel-preset-jest@27.5.1", "", { "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core": ["@jest/core@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^27.5.1", "jest-config": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-resolve-dependencies": "^27.5.1", "jest-runner": "^27.5.1", "jest-runtime": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "jest-watcher": "^27.5.1", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli": ["jest-cli@27.5.1", "", { "dependencies": { "@jest/core": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", "jest-config": "^27.5.1", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "prompts": "^2.0.1", "yargs": "^16.2.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "babel-jest/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "babel-jest/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "command-line-usage/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "command-line-usage/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "create-jest/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "create-jest/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-circus/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-circus/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-cli/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-cli/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-config/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-config/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-diff/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-diff/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-each/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-each/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-environment-jsdom/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "jest-environment-jsdom/@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-environment-jsdom/@jest/types/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-environment-jsdom/jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-environment-jsdom/jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-jasmine2/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "jest-jasmine2/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-jasmine2/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-jasmine2/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "jest-jasmine2/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "jest-jasmine2/jest-runtime/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "jest-jasmine2/jest-runtime/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "jest-jasmine2/jest-runtime/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "jest-jasmine2/jest-runtime/jest-resolve/jest-validate": ["jest-validate@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^27.5.1", "leven": "^3.1.0", "pretty-format": "^27.5.1" } }, "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ=="], + + "jest-jasmine2/jest-runtime/jest-resolve/resolve.exports": ["resolve.exports@1.1.1", "", {}, "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ=="], + + "jest-jasmine2/jest-snapshot/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "jest-jasmine2/jest-snapshot/@jest/transform/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], + + "jest-jasmine2/jest-snapshot/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "jest-jasmine2/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "jest-jasmine2/jest-snapshot/jest-haste-map/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], + + "jest-jasmine2/jest-snapshot/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "jest-jasmine2/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "jest-matcher-utils/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-matcher-utils/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-message-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-message-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-resolve/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-resolve/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-runner/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-runner/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-runtime/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-runtime/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-snapshot/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-snapshot/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "jest-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-validate/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-validate/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-watcher/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-watcher/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "make-dir/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "ts-command-line-args/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "ts-command-line-args/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@jest/console/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@jest/core/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@jest/reporters/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@jest/reporters/istanbul-lib-instrument/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "@jest/transform/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@jest/types/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-cosmwasm-core/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-cosmwasm-ibc/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-cosmwasm-tokenbridge/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/sdk-cosmwasm/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/types/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/babel-preset-jest/babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@27.5.1", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/console": ["@jest/console@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0" } }, "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters": ["@jest/reporters@27.5.1", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-haste-map": "^27.5.1", "jest-resolve": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", "v8-to-istanbul": "^8.1.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/test-result": ["@jest/test-result@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-changed-files": ["jest-changed-files@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "execa": "^5.0.0", "throat": "^6.0.1" } }, "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config": ["jest-config@27.5.1", "", { "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", "@jest/types": "^27.5.1", "babel-jest": "^27.5.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.9", "jest-circus": "^27.5.1", "jest-environment-jsdom": "^27.5.1", "jest-environment-node": "^27.5.1", "jest-get-type": "^27.5.1", "jest-jasmine2": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-runner": "^27.5.1", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^27.5.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "ts-node": ">=9.0.0" } }, "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-resolve": ["jest-resolve@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" } }, "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-resolve-dependencies": ["jest-resolve-dependencies@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-snapshot": "^27.5.1" } }, "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner": ["jest-runner@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", "graceful-fs": "^4.2.9", "jest-docblock": "^27.5.1", "jest-environment-jsdom": "^27.5.1", "jest-environment-node": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-leak-detector": "^27.5.1", "jest-message-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-runtime": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime": ["jest-runtime@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/globals": "^27.5.1", "@jest/source-map": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot": ["jest-snapshot@27.5.1", "", { "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^27.5.1", "graceful-fs": "^4.2.9", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" } }, "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate": ["jest-validate@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^27.5.1", "leven": "^3.1.0", "pretty-format": "^27.5.1" } }, "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-watcher": ["jest-watcher@27.5.1", "", { "dependencies": { "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "jest-util": "^27.5.1", "string-length": "^4.0.1" } }, "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result": ["@jest/test-result@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config": ["jest-config@27.5.1", "", { "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", "@jest/types": "^27.5.1", "babel-jest": "^27.5.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.9", "jest-circus": "^27.5.1", "jest-environment-jsdom": "^27.5.1", "jest-environment-node": "^27.5.1", "jest-get-type": "^27.5.1", "jest-jasmine2": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-runner": "^27.5.1", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^27.5.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "ts-node": ">=9.0.0" } }, "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-validate": ["jest-validate@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^27.5.1", "leven": "^3.1.0", "pretty-format": "^27.5.1" } }, "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "babel-jest/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "command-line-usage/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "create-jest/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-circus/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-cli/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-config/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-diff/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-each/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "jest-environment-jsdom/@jest/types/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-environment-jsdom/@jest/types/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-environment-jsdom/jest-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-environment-jsdom/jest-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-jasmine2/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "jest-jasmine2/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-jasmine2/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "jest-jasmine2/jest-runtime/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "jest-jasmine2/jest-runtime/jest-resolve/jest-validate/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "jest-jasmine2/jest-snapshot/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "jest-jasmine2/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "jest-matcher-utils/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-message-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-resolve/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-runner/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-runtime/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-snapshot/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-validate/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-watcher/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "ts-command-line-args/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/jest-haste-map/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/v8-to-istanbul": ["v8-to-istanbul@8.1.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" } }, "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@27.5.1", "", { "dependencies": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-runtime": "^27.5.1" } }, "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus": ["jest-circus@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "expect": "^27.5.1", "is-generator-fn": "^2.0.0", "jest-each": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-runtime": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" } }, "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-environment-node": ["jest-environment-node@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-message-util/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-resolve/resolve.exports": ["resolve.exports@1.1.1", "", {}, "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-docblock": ["jest-docblock@27.5.1", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-environment-node": ["jest-environment-node@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-leak-detector": ["jest-leak-detector@27.5.1", "", { "dependencies": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals": ["@jest/globals@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" } }, "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/source-map": ["@jest/source-map@27.5.1", "", { "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", "source-map": "^0.6.0" } }, "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console": ["@jest/console@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0" } }, "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/types/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@27.5.1", "", { "dependencies": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-runtime": "^27.5.1" } }, "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus": ["jest-circus@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "expect": "^27.5.1", "is-generator-fn": "^2.0.0", "jest-each": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-runtime": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" } }, "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node": ["jest-environment-node@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve": ["jest-resolve@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" } }, "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner": ["jest-runner@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", "graceful-fs": "^4.2.9", "jest-docblock": "^27.5.1", "jest-environment-jsdom": "^27.5.1", "jest-environment-node": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-leak-detector": "^27.5.1", "jest-message-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-runtime": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-validate/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-validate/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-environment-jsdom/@jest/types/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-environment-jsdom/jest-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-jasmine2/jest-runtime/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "jest-jasmine2/jest-snapshot/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/v8-to-istanbul/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/jest-each": ["jest-each@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", "jest-get-type": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-environment-node/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-message-util/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/@jest/environment/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-environment-node/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-environment-node/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-leak-detector/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-leak-detector/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime": ["jest-runtime@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/globals": "^27.5.1", "@jest/source-map": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-each": ["jest-each@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", "jest-get-type": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime": ["jest-runtime@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/globals": "^27.5.1", "@jest/source-map": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot": ["jest-snapshot@27.5.1", "", { "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^27.5.1", "graceful-fs": "^4.2.9", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" } }, "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/resolve.exports": ["resolve.exports@1.1.1", "", {}, "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/console": ["@jest/console@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0" } }, "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-docblock": ["jest-docblock@27.5.1", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-leak-detector": ["jest-leak-detector@27.5.1", "", { "dependencies": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime": ["jest-runtime@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", "@jest/globals": "^27.5.1", "@jest/source-map": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-validate/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-validate/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/babel-jest/@jest/transform/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/@jest/reporters/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-leak-detector/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-leak-detector/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals": ["@jest/globals@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" } }, "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/source-map": ["@jest/source-map@27.5.1", "", { "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", "source-map": "^0.6.0" } }, "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot": ["jest-snapshot@27.5.1", "", { "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^27.5.1", "graceful-fs": "^4.2.9", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" } }, "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/globals": ["@jest/globals@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" } }, "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/source-map": ["@jest/source-map@27.5.1", "", { "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", "source-map": "^0.6.0" } }, "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform": ["@jest/transform@27.5.1", "", { "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/jest-message-util": ["jest-message-util@27.5.1", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals": ["@jest/globals@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" } }, "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/source-map": ["@jest/source-map@27.5.1", "", { "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", "source-map": "^0.6.0" } }, "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-mock": ["jest-mock@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" } }, "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot": ["jest-snapshot@27.5.1", "", { "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^27.5.1", "graceful-fs": "^4.2.9", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" } }, "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runner/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/environment/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/fake-timers/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-mock/@types/node": ["@types/node@13.13.52", "", {}, "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals/expect/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals/expect/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], + } +} diff --git a/cli/package.json b/cli/package.json index b90c0b784..9811c1c16 100644 --- a/cli/package.json +++ b/cli/package.json @@ -11,7 +11,7 @@ "typescript": "^5.0.0" }, "bin": { - "ntt": "src/index.ts" + "ntt": "src/bin.ts" }, "dependencies": { "chalk": "^5.3.0", diff --git a/cli/src/bin.ts b/cli/src/bin.ts new file mode 100755 index 000000000..29ea34ef1 --- /dev/null +++ b/cli/src/bin.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env bun + +import { YARGSCommand } from "./index"; + +YARGSCommand.parse(); diff --git a/cli/src/index.ts b/cli/src/index.ts index 0a1e98c2c..d64e35c32 100755 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -1,4 +1,3 @@ -#!/usr/bin/env bun import "./side-effects"; // doesn't quite work for silencing the bigint error message. why? import evm from "@wormhole-foundation/sdk/platforms/evm"; import solana from "@wormhole-foundation/sdk/platforms/solana"; @@ -16,7 +15,7 @@ import { Connection, Keypair, PublicKey } from "@solana/web3.js"; import * as spl from "@solana/spl-token"; import fs from "fs"; import readline from "readline"; -import { ChainContext, UniversalAddress, Wormhole, assertChain, canonicalAddress, chainToPlatform, chains, isNetwork, networks, platforms, signSendWait, toUniversal, type AccountAddress, type Chain, type ChainAddress, type ConfigOverrides, type Network, type Platform } from "@wormhole-foundation/sdk"; +import { ChainContext, UniversalAddress, Wormhole, assertChain, canonicalAddress, chainToPlatform, chains, isNetwork, networks, platforms, signSendWait, toUniversal, type AccountAddress, type Chain, type ChainAddress, type WormholeConfigOverrides, type Network, type Platform } from "@wormhole-foundation/sdk"; import "@wormhole-foundation/sdk-evm-ntt"; import "@wormhole-foundation/sdk-solana-ntt"; import "@wormhole-foundation/sdk-definitions-ntt"; @@ -39,7 +38,7 @@ import { ethers } from "ethers"; // TODO: check if manager can mint the token in burning mode (on solana it's // simple. on evm we need to simulate with prank) -const overrides: ConfigOverrides = (function () { +const overrides: WormholeConfigOverrides = (function () { // read overrides.json file if exists if (fs.existsSync("overrides.json")) { console.error(chalk.yellow("Using overrides.json")); @@ -196,7 +195,7 @@ async function withCustomEvmDeployerScript(pwd: string, then: () => Promise { @@ -889,7 +888,6 @@ yargs(hideBin(process.argv)) .help() .strict() .demandCommand() - .parse(); // Implicit configuration that's missing from a contract deployment. These are // implicit in the sense that they don't need to be explicitly set in the @@ -1699,7 +1697,7 @@ async function pullDeployments(deployments: Config, network: Network, verbose: b async function pullChainConfig( network: N, manager: ChainAddress, - overrides?: ConfigOverrides + overrides?: WormholeConfigOverrides ): Promise<[ChainConfig, ChainContext, Ntt, number]> { const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); const ch = wh.getChain(manager.chain); From dab83bcfdc75ebe3aa4296c9f9ec2bb7ee7ec07c Mon Sep 17 00:00:00 2001 From: a Date: Sat, 15 Mar 2025 03:21:27 -0500 Subject: [PATCH 2/6] noot --- bun.lock | 314 +-- cli-core/README.md | 37 + cli-core/dist/configuration.d.ts | 11 + cli-core/dist/diff.d.ts | 10 + cli-core/dist/evmsigner.d.ts | 25 + cli-core/dist/getSigner.d.ts | 14 + cli-core/dist/index.cjs | 2410 ++++++++++++++++++++++++ cli-core/dist/index.d.ts | 51 + cli-core/dist/index.js | 2388 +++++++++++++++++++++++ cli-core/dist/side-effects.d.ts | 1 + cli-core/dist/tag.d.ts | 3 + cli-core/package-lock.json | 250 +++ cli-core/package.json | 40 + cli-core/rollup.config.js | 34 + {cli => cli-core}/src/configuration.ts | 0 {cli => cli-core}/src/diff.ts | 0 {cli => cli-core}/src/evmsigner.ts | 0 {cli => cli-core}/src/getSigner.ts | 0 cli-core/src/index.ts | 2068 ++++++++++++++++++++ {cli => cli-core}/src/side-effects.ts | 0 {cli => cli-core}/src/tag.ts | 0 cli-core/test/sepolia-bsc.sh | 90 + cli-core/test/solana.sh | 218 +++ cli-core/tsconfig.json | 29 + cli/package.json | 7 +- cli/src/bin.ts | 5 - cli/src/index.ts | 2069 +------------------- package-lock.json | 2247 +++++++++++++++------- package.json | 4 +- 29 files changed, 9487 insertions(+), 2838 deletions(-) create mode 100644 cli-core/README.md create mode 100644 cli-core/dist/configuration.d.ts create mode 100644 cli-core/dist/diff.d.ts create mode 100644 cli-core/dist/evmsigner.d.ts create mode 100644 cli-core/dist/getSigner.d.ts create mode 100644 cli-core/dist/index.cjs create mode 100644 cli-core/dist/index.d.ts create mode 100644 cli-core/dist/index.js create mode 100644 cli-core/dist/side-effects.d.ts create mode 100644 cli-core/dist/tag.d.ts create mode 100644 cli-core/package-lock.json create mode 100644 cli-core/package.json create mode 100644 cli-core/rollup.config.js rename {cli => cli-core}/src/configuration.ts (100%) rename {cli => cli-core}/src/diff.ts (100%) rename {cli => cli-core}/src/evmsigner.ts (100%) rename {cli => cli-core}/src/getSigner.ts (100%) create mode 100755 cli-core/src/index.ts rename {cli => cli-core}/src/side-effects.ts (100%) rename {cli => cli-core}/src/tag.ts (100%) create mode 100755 cli-core/test/sepolia-bsc.sh create mode 100755 cli-core/test/solana.sh create mode 100644 cli-core/tsconfig.json delete mode 100755 cli/src/bin.ts diff --git a/bun.lock b/bun.lock index 59a8d10c6..a6ee0673a 100644 --- a/bun.lock +++ b/bun.lock @@ -20,9 +20,10 @@ "name": "@wormhole-foundation/ntt-cli", "version": "1.1.0", "bin": { - "ntt": "src/index.ts", + "ntt": "src/bin.ts", }, "dependencies": { + "@wormhole-foundation/ntt-cli-core": "*", "chalk": "^5.3.0", "yargs": "^17.7.2", }, @@ -34,6 +35,29 @@ "typescript": "^5.0.0", }, }, + "cli-core": { + "name": "@wormhole-foundation/ntt-cli-core", + "version": "1.1.0", + "dependencies": { + "@solana/spl-token": "^0.4.13", + "@wormhole-foundation/sdk-definitions-ntt": "*", + "@wormhole-foundation/sdk-evm-ntt": "*", + "@wormhole-foundation/sdk-solana-ntt": "*", + }, + "devDependencies": { + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-typescript": "^12.1.2", + "@types/yargs": "^17.0.32", + "chalk": "^5.3.0", + "rollup": "^4.35.0", + "rollup-plugin-string-import": "^1.2.5", + "yargs": "^17.7.2", + }, + "peerDependencies": { + "typescript": "^5.0.0", + }, + }, "evm/ts": { "name": "@wormhole-foundation/sdk-evm-ntt", "version": "0.5.0", @@ -135,43 +159,31 @@ "@aptos-labs/aptos-client": ["@aptos-labs/aptos-client@0.1.1", "", { "dependencies": { "axios": "1.7.4", "got": "^11.8.6" } }, "sha512-kJsoy4fAPTOhzVr7Vwq8s/AUg6BQiJDa7WOqRzev4zsuIS3+JCuIZ6vUd7UBsjnxtmguJJulMRs9qWCzVBt2XA=="], - "@babel/code-frame": ["@babel/code-frame@7.24.2", "", { "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" } }, "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ=="], + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], - "@babel/compat-data": ["@babel/compat-data@7.24.4", "", {}, "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ=="], + "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], - "@babel/core": ["@babel/core@7.24.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.24.4", "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg=="], + "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], - "@babel/generator": ["@babel/generator@7.24.4", "", { "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" } }, "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw=="], + "@babel/generator": ["@babel/generator@7.26.10", "", { "dependencies": { "@babel/parser": "^7.26.10", "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.23.6", "", { "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], - "@babel/helper-environment-visitor": ["@babel/helper-environment-visitor@7.22.20", "", {}, "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA=="], + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], - "@babel/helper-function-name": ["@babel/helper-function-name@7.23.0", "", { "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" } }, "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], - "@babel/helper-hoist-variables": ["@babel/helper-hoist-variables@7.22.5", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw=="], + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.24.3", "", { "dependencies": { "@babel/types": "^7.24.0" } }, "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.23.3", "", { "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.24.0", "", {}, "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w=="], + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], - "@babel/helper-simple-access": ["@babel/helper-simple-access@7.22.5", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w=="], + "@babel/helpers": ["@babel/helpers@7.26.10", "", { "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.10" } }, "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g=="], - "@babel/helper-split-export-declaration": ["@babel/helper-split-export-declaration@7.22.6", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.24.1", "", {}, "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.22.20", "", {}, "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.23.5", "", {}, "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw=="], - - "@babel/helpers": ["@babel/helpers@7.24.4", "", { "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" } }, "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw=="], - - "@babel/highlight": ["@babel/highlight@7.24.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA=="], - - "@babel/parser": ["@babel/parser@7.24.7", "", { "bin": { "parser": "bin/babel-parser.js" } }, "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw=="], + "@babel/parser": ["@babel/parser@7.26.10", "", { "dependencies": { "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA=="], "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], @@ -179,11 +191,15 @@ "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.26.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A=="], + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.24.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA=="], + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], @@ -197,17 +213,19 @@ "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.24.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw=="], + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="], "@babel/runtime": ["@babel/runtime@7.25.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw=="], - "@babel/template": ["@babel/template@7.24.0", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", "@babel/types": "^7.24.0" } }, "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA=="], + "@babel/template": ["@babel/template@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA=="], - "@babel/traverse": ["@babel/traverse@7.24.1", "", { "dependencies": { "@babel/code-frame": "^7.24.1", "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ=="], + "@babel/traverse": ["@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.3.1", "globals": "^11.1.0" } }, "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A=="], - "@babel/types": ["@babel/types@7.24.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w=="], + "@babel/types": ["@babel/types@7.26.10", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ=="], "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], @@ -421,7 +439,7 @@ "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.5", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], @@ -461,6 +479,52 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" } }, "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA=="], + + "@rollup/plugin-typescript": ["@rollup/plugin-typescript@12.1.2", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.14.0||^3.0.0||^4.0.0", "tslib": "*", "typescript": ">=3.7.0" } }, "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.35.0", "", { "os": "android", "cpu": "arm" }, "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.35.0", "", { "os": "android", "cpu": "arm64" }, "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.35.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.35.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.35.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.35.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.35.0", "", { "os": "linux", "cpu": "arm" }, "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.35.0", "", { "os": "linux", "cpu": "arm" }, "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.35.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.35.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.35.0", "", { "os": "linux", "cpu": "none" }, "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.35.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.35.0", "", { "os": "linux", "cpu": "none" }, "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.35.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.35.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.35.0", "", { "os": "linux", "cpu": "x64" }, "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.35.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.35.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.35.0", "", { "os": "win32", "cpu": "x64" }, "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw=="], + "@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], "@scure/bip32": ["@scure/bip32@1.5.0", "", { "dependencies": { "@noble/curves": "~1.6.0", "@noble/hashes": "~1.5.0", "@scure/base": "~1.1.7" } }, "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw=="], @@ -479,21 +543,25 @@ "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.2.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="], - "@solana/codecs-core": ["@solana/codecs-core@2.0.0-experimental.8618508", "", {}, ""], + "@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/options": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="], + + "@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + + "@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="], - "@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508" } }, ""], + "@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], - "@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508" } }, ""], + "@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="], - "@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22" } }, ""], + "@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], - "@solana/options": ["@solana/options@2.0.0-experimental.8618508", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508" } }, ""], + "@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="], "@solana/spl-token": ["@solana/spl-token@0.3.9", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.47.4" } }, "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA=="], - "@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-experimental.8618508", "@solana/codecs-data-structures": "2.0.0-experimental.8618508", "@solana/codecs-numbers": "2.0.0-experimental.8618508", "@solana/codecs-strings": "2.0.0-experimental.8618508", "@solana/options": "2.0.0-experimental.8618508", "@solana/spl-type-length-value": "0.1.0" }, "peerDependencies": { "@solana/web3.js": "^1.87.6" } }, ""], + "@solana/spl-token-group": ["@solana/spl-token-group@0.0.7", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug=="], - "@solana/spl-type-length-value": ["@solana/spl-type-length-value@0.1.0", "", { "dependencies": { "buffer": "^6.0.3" } }, ""], + "@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.6", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA=="], "@solana/web3.js": ["@solana/web3.js@1.95.8", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@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", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-sBHzNh7dHMrmNS5xPD1d0Xa2QffW/RXaxu/OysRXBfwTp+LYqGGmMtCYYwrHPrN5rjAmJCsQRNAwv4FM0t3B6g=="], @@ -525,16 +593,18 @@ "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - "@types/babel__traverse": ["@types/babel__traverse@7.20.5", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ=="], + "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], "@types/bn.js": ["@types/bn.js@5.1.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A=="], - "@types/bun": ["@types/bun@1.1.0", "", { "dependencies": { "bun-types": "1.1.0" } }, "sha512-QGK0yU4jh0OK1A7DyhPkQuKjHQCC5jSJa3dpWIEhHv/rPfb6zLfdArc4/uUUZBMTcjilsafRXnPWO+1owb572Q=="], + "@types/bun": ["@types/bun@1.2.5", "", { "dependencies": { "bun-types": "1.2.5" } }, "sha512-w2OZTzrZTVtbnJew1pdFmgV99H0/L+Pvw+z1P67HaR18MHOzYnTYOi6qzErhK8HyT+DB782ADVPPE92Xu2/Opg=="], "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], @@ -557,6 +627,8 @@ "@types/prettier": ["@types/prettier@2.7.3", "", {}, "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA=="], + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], "@types/secp256k1": ["@types/secp256k1@4.0.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ=="], @@ -573,6 +645,8 @@ "@wormhole-foundation/ntt-cli": ["@wormhole-foundation/ntt-cli@workspace:cli"], + "@wormhole-foundation/ntt-cli-core": ["@wormhole-foundation/ntt-cli-core@workspace:cli-core"], + "@wormhole-foundation/sdk": ["@wormhole-foundation/sdk@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-algorand": "1.0.0", "@wormhole-foundation/sdk-algorand-core": "1.0.0", "@wormhole-foundation/sdk-algorand-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-aptos": "1.0.0", "@wormhole-foundation/sdk-aptos-core": "1.0.0", "@wormhole-foundation/sdk-aptos-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-base": "1.0.0", "@wormhole-foundation/sdk-connect": "1.0.0", "@wormhole-foundation/sdk-cosmwasm": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-core": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-ibc": "1.0.0", "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-definitions": "1.0.0", "@wormhole-foundation/sdk-evm": "1.0.0", "@wormhole-foundation/sdk-evm-cctp": "1.0.0", "@wormhole-foundation/sdk-evm-core": "1.0.0", "@wormhole-foundation/sdk-evm-portico": "1.0.0", "@wormhole-foundation/sdk-evm-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-solana": "1.0.0", "@wormhole-foundation/sdk-solana-cctp": "1.0.0", "@wormhole-foundation/sdk-solana-core": "1.0.0", "@wormhole-foundation/sdk-solana-tokenbridge": "1.0.0", "@wormhole-foundation/sdk-sui": "1.0.0", "@wormhole-foundation/sdk-sui-core": "1.0.0", "@wormhole-foundation/sdk-sui-tokenbridge": "1.0.0" } }, "sha512-QIkRaFe6+3DsOydShqzpTg4h6fiNI0i9N59hgCg33UiSbG87LI0g5bZZgiC1q4cpjBBcgj8w6uo2dAVrBr069Q=="], "@wormhole-foundation/sdk-algorand": ["@wormhole-foundation/sdk-algorand@1.0.0", "", { "dependencies": { "@wormhole-foundation/sdk-connect": "1.0.0", "algosdk": "2.7.0" } }, "sha512-XoRuyAOcLU1eJ26bGdeN2mzP6thvaoshHrt25d/KnHKYLpjgvAhCyWgAka6qzig0CGrG8z4y0K7SkeThmtwakg=="], @@ -691,7 +765,7 @@ "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], - "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.0.1", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ=="], + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.1.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw=="], "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], @@ -731,7 +805,7 @@ "browserify-aes": ["browserify-aes@1.2.0", "", { "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="], - "browserslist": ["browserslist@4.23.0", "", { "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": "cli.js" }, "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ=="], + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": "cli.js" }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], "bs-logger": ["bs-logger@0.2.6", "", { "dependencies": { "fast-json-stable-stringify": "2.x" } }, "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="], @@ -753,19 +827,21 @@ "builtin-modules": ["builtin-modules@1.1.1", "", {}, "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ=="], - "bun-types": ["bun-types@1.1.0", "", { "dependencies": { "@types/node": "~20.11.3", "@types/ws": "~8.5.10" } }, "sha512-GhMDD7TosdJzQPGUOcQD5PZshvXVxDfwGAZs2dq+eSaPsRn3iUCzvpFlsg7Q51bXVzLAUs+FWHlnmpgZ5UggIg=="], + "bun-types": ["bun-types@1.2.5", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-3oO6LVGGRRKI4kHINx5PIdIgnLRb7l/SprhzqXapmoYkFl5m4j6EvALvbDVuuBFaamB46Ap6HCUxIXNLCGy+tg=="], "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001612", "", {}, "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g=="], + "caniuse-lite": ["caniuse-lite@1.0.30001704", "", {}, "sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew=="], - "chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], + "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], @@ -773,7 +849,7 @@ "cipher-base": ["cipher-base@1.0.4", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="], - "cjs-module-lexer": ["cjs-module-lexer@1.2.3", "", {}, "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ=="], + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], @@ -811,7 +887,7 @@ "cross-fetch": ["cross-fetch@3.1.8", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg=="], - "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "crypto-hash": ["crypto-hash@1.3.0", "", {}, "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg=="], @@ -855,7 +931,9 @@ "dotenv": ["dotenv@16.4.5", "", {}, ""], - "electron-to-chromium": ["electron-to-chromium@1.4.749", "", {}, "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.118", "", {}, "sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA=="], "elliptic": ["elliptic@6.5.5", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw=="], @@ -867,17 +945,21 @@ "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], - "es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], "es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="], "esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": "bin/esbuild" }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], - "escalade": ["escalade@3.1.2", "", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], @@ -887,6 +969,8 @@ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "ethereum-cryptography": ["ethereum-cryptography@0.1.3", "", { "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", "blakejs": "^1.1.0", "browserify-aes": "^1.2.0", "bs58check": "^2.1.2", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "hash.js": "^1.1.7", "keccak": "^3.0.0", "pbkdf2": "^3.0.17", "randombytes": "^2.1.0", "safe-buffer": "^5.1.2", "scrypt-js": "^3.0.0", "secp256k1": "^4.0.1", "setimmediate": "^1.0.5" } }, "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ=="], @@ -917,8 +1001,6 @@ "fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="], - "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, ""], - "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], @@ -945,10 +1027,12 @@ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="], + "get-intrinsic": ["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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "get-tsconfig": ["get-tsconfig@4.7.3", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg=="], @@ -961,7 +1045,7 @@ "google-protobuf": ["google-protobuf@3.21.2", "", {}, "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="], - "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], @@ -977,9 +1061,9 @@ "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - "has-proto": ["has-proto@1.0.3", "", {}, "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - "has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="], + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], "hash-base": ["hash-base@3.1.0", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" } }, "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA=="], @@ -1015,7 +1099,7 @@ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "import-local": ["import-local@3.1.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg=="], + "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], @@ -1035,6 +1119,8 @@ "is-hex-prefixed": ["is-hex-prefixed@1.0.0", "", {}, "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA=="], + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], @@ -1133,7 +1219,7 @@ "jsdom": ["jsdom@16.7.0", "", { "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", "data-urls": "^2.0.0", "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "optionalPeers": ["canvas"] }, "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw=="], - "jsesc": ["jsesc@2.5.2", "", { "bin": "bin/jsesc" }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], + "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], @@ -1195,6 +1281,8 @@ "map-obj": ["map-obj@4.3.0", "", {}, "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], @@ -1237,7 +1325,7 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - "node-releases": ["node-releases@2.0.14", "", {}, "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="], + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -1245,7 +1333,7 @@ "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], - "nwsapi": ["nwsapi@2.2.9", "", {}, "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg=="], + "nwsapi": ["nwsapi@2.2.18", "", {}, "sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -1281,7 +1369,7 @@ "pbkdf2": ["pbkdf2@3.1.2", "", { "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA=="], - "picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -1303,7 +1391,7 @@ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - "psl": ["psl@1.9.0", "", {}, "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="], + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], @@ -1345,7 +1433,7 @@ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "resolve.exports": ["resolve.exports@2.0.2", "", {}, "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg=="], + "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], "response-iterator": ["response-iterator@0.2.6", "", {}, "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw=="], @@ -1357,6 +1445,10 @@ "rlp": ["rlp@2.2.7", "", { "dependencies": { "bn.js": "^5.2.0" }, "bin": "bin/rlp" }, "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ=="], + "rollup": ["rollup@4.35.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.35.0", "@rollup/rollup-android-arm64": "4.35.0", "@rollup/rollup-darwin-arm64": "4.35.0", "@rollup/rollup-darwin-x64": "4.35.0", "@rollup/rollup-freebsd-arm64": "4.35.0", "@rollup/rollup-freebsd-x64": "4.35.0", "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", "@rollup/rollup-linux-arm-musleabihf": "4.35.0", "@rollup/rollup-linux-arm64-gnu": "4.35.0", "@rollup/rollup-linux-arm64-musl": "4.35.0", "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", "@rollup/rollup-linux-riscv64-gnu": "4.35.0", "@rollup/rollup-linux-s390x-gnu": "4.35.0", "@rollup/rollup-linux-x64-gnu": "4.35.0", "@rollup/rollup-linux-x64-musl": "4.35.0", "@rollup/rollup-win32-arm64-msvc": "4.35.0", "@rollup/rollup-win32-ia32-msvc": "4.35.0", "@rollup/rollup-win32-x64-msvc": "4.35.0", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg=="], + + "rollup-plugin-string-import": ["rollup-plugin-string-import@1.2.5", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "4.20.0" } }, "sha512-soVwp0sWcAaN1tFthAGGBx5eQy94iAo2xozYVxyKH/WNHZiN2dJjUTlfdJkZWNXQY5e4333/lbImapski70tdA=="], + "rpc-websockets": ["rpc-websockets@9.0.2", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw=="], "rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="], @@ -1453,13 +1545,11 @@ "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], - "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], - "tough-cookie": ["tough-cookie@4.1.3", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw=="], + "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], @@ -1503,7 +1593,7 @@ "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - "update-browserslist-db": ["update-browserslist-db@1.0.13", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg=="], + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], @@ -1515,7 +1605,7 @@ "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], - "v8-to-istanbul": ["v8-to-istanbul@9.2.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA=="], + "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], "vlq": ["vlq@2.0.4", "", {}, "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA=="], @@ -1557,7 +1647,7 @@ "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, ""], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], @@ -1585,8 +1675,6 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - "@certusone/wormhole-sdk/@solana/spl-token": ["@solana/spl-token@0.1.8", "", { "dependencies": { "@babel/runtime": "^7.10.5", "@solana/web3.js": "^1.21.0", "bn.js": "^5.1.0", "buffer": "6.0.3", "buffer-layout": "^1.2.0", "dotenv": "10.0.0" } }, "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ=="], "@certusone/wormhole-sdk/algosdk": ["algosdk@1.24.1", "", { "dependencies": { "algo-msgpack-with-bigint": "^2.1.1", "buffer": "^6.0.2", "cross-fetch": "^3.1.5", "hi-base32": "^0.5.1", "js-sha256": "^0.9.0", "js-sha3": "^0.8.0", "js-sha512": "^0.8.0", "json-bigint": "^1.0.0", "tweetnacl": "^1.0.3", "vlq": "^2.0.4" } }, "sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww=="], @@ -1669,7 +1757,7 @@ "@jest/reporters/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "@jest/reporters/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.2", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw=="], + "@jest/reporters/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], "@jest/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], @@ -1693,10 +1781,16 @@ "@noble/curves/@noble/hashes": ["@noble/hashes@1.5.0", "", {}, "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA=="], + "@rollup/pluginutils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "@scure/bip32/@noble/hashes": ["@noble/hashes@1.5.0", "", {}, "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA=="], "@scure/bip39/@noble/hashes": ["@noble/hashes@1.3.3", "", {}, "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA=="], + "@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@swc/helpers/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], "@terra-money/terra.js/axios": ["axios@0.27.2", "", { "dependencies": { "follow-redirects": "^1.14.9", "form-data": "^4.0.0" } }, "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ=="], @@ -1705,6 +1799,8 @@ "@terra-money/terra.js/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + "@wormhole-foundation/ntt-cli-core/@solana/spl-token": ["@solana/spl-token@0.4.13", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-group": "^0.0.7", "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.95.5" } }, "sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w=="], + "@wormhole-foundation/sdk-connect/axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], "@wormhole-foundation/sdk-cosmwasm/@cosmjs/cosmwasm-stargate": ["@cosmjs/cosmwasm-stargate@0.32.4", "", { "dependencies": { "@cosmjs/amino": "^0.32.4", "@cosmjs/crypto": "^0.32.4", "@cosmjs/encoding": "^0.32.4", "@cosmjs/math": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@cosmjs/utils": "^0.32.4", "cosmjs-types": "^0.9.0", "pako": "^2.0.2" } }, "sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA=="], @@ -1755,9 +1851,7 @@ "bip32/@types/node": ["@types/node@10.12.18", "", {}, "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ=="], - "bun-types/@types/node": ["@types/node@20.11.30", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw=="], - - "bun-types/@types/ws": ["@types/ws@8.5.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A=="], + "bun-types/@types/ws": ["@types/ws@8.5.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ=="], "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], @@ -1809,8 +1903,6 @@ "jest-cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "jest-cli/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "jest-config/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -1871,7 +1963,7 @@ "jest-snapshot/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "jest-snapshot/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -1883,7 +1975,7 @@ "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "jsdom/form-data": ["form-data@3.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg=="], + "jsdom/form-data": ["form-data@3.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35" } }, "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w=="], "jsdom/webidl-conversions": ["webidl-conversions@6.1.0", "", {}, "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="], @@ -1893,7 +1985,7 @@ "lower-case/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], - "make-dir/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "make-dir/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "no-case/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], @@ -1959,12 +2051,6 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - "@certusone/wormhole-sdk/@solana/spl-token/dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], "@cosmjs/cosmwasm-stargate/cosmjs-types/protobufjs": ["protobufjs@6.11.4", "", { "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/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], @@ -2029,7 +2115,7 @@ "@jest/reporters/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "@jest/reporters/istanbul-lib-instrument/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "@jest/reporters/istanbul-lib-instrument/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "@jest/transform/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -2195,8 +2281,6 @@ "jest-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "jest-cli/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - "jest-config/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-config/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -2263,7 +2347,7 @@ "jest-jasmine2/jest-snapshot/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], - "jest-jasmine2/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "jest-jasmine2/jest-snapshot/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "jest-jasmine2/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], @@ -2293,8 +2377,6 @@ "jest-snapshot/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -2311,8 +2393,6 @@ "jsdom/whatwg-url/tr46": ["tr46@2.1.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw=="], - "make-dir/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "ts-command-line-args/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "ts-command-line-args/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -2321,10 +2401,6 @@ "wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "@injectivelabs/sdk-ts/@cosmjs/amino/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], "@injectivelabs/sdk-ts/@cosmjs/proto-signing/@cosmjs/encoding/bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], @@ -2349,8 +2425,6 @@ "@jest/reporters/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "@jest/reporters/istanbul-lib-instrument/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@jest/transform/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "@jest/transform/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2541,8 +2615,6 @@ "jest-jasmine2/jest-snapshot/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], - "jest-jasmine2/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "jest-matcher-utils/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "jest-matcher-utils/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2567,8 +2639,6 @@ "jest-snapshot/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "jest-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "jest-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2581,16 +2651,12 @@ "jest-watcher/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "make-dir/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "ts-command-line-args/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "ts-command-line-args/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - "@injectivelabs/sdk-ts/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], "@jest/console/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -2599,8 +2665,6 @@ "@jest/reporters/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "@jest/reporters/istanbul-lib-instrument/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "@jest/transform/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "@jest/types/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -2739,8 +2803,6 @@ "jest-jasmine2/jest-snapshot/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "jest-jasmine2/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "jest-matcher-utils/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "jest-message-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -2841,7 +2903,7 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/jest-get-type": ["jest-get-type@27.5.1", "", {}, "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="], @@ -2881,8 +2943,6 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], - "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "jest-environment-jsdom/@jest/fake-timers/jest-message-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2963,8 +3023,6 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-validate/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], @@ -3073,8 +3131,6 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-runtime/@jest/globals/expect/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/@jest/core/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -3123,7 +3179,7 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map": ["jest-haste-map@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], @@ -3193,7 +3249,7 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], @@ -3215,8 +3271,6 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], @@ -3233,7 +3287,7 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], + "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -3253,8 +3307,6 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], @@ -3263,8 +3315,6 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], @@ -3275,20 +3325,14 @@ "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-haste-map/jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff": ["jest-diff@27.5.1", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" } }, "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], "@wormhole-foundation/wormchain-sdk/ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals/expect/jest-matcher-utils/jest-diff/diff-sequences": ["diff-sequences@27.5.1", "", {}, "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="], diff --git a/cli-core/README.md b/cli-core/README.md new file mode 100644 index 000000000..6fa454d9e --- /dev/null +++ b/cli-core/README.md @@ -0,0 +1,37 @@ +# NTT cli + +## Prerequisites + +- [bun](https://bun.sh/docs/installation) + +Depending on the platforms you will deploy on: +- [foundry](https://book.getfoundry.sh/) (evm) +- [anchor](https://book.anchor-lang.com/getting_started/installation.html) (solana) + +## Installation + +Run + +``` bash +curl -fsSL https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh | bash +``` + +The installer will put the `ntt` binary in `$HOME/.bun/bin`, so make sure that directory is included in your `$PATH`. Once `ntt` is installed, it can be updated to the latest release any time by running + +``` bash +ntt update +``` + +Or to a specific branch by running + +``` bash +ntt update --branch foo +``` + +## Development + +The easiest way to work on the CLI is to first install using the script above, then clone the repo, and run + +``` bash +ntt update --path path/to/ntt/repo +``` diff --git a/cli-core/dist/configuration.d.ts b/cli-core/dist/configuration.d.ts new file mode 100644 index 000000000..53f8b3272 --- /dev/null +++ b/cli-core/dist/configuration.d.ts @@ -0,0 +1,11 @@ +import { type Chain } from "@wormhole-foundation/sdk"; +import * as yargs from "yargs"; +type ChainConfig = Partial; +declare const configTemplate: { + scan_api_key: string; +}; +export declare const command: (args: yargs.Argv<{}>) => yargs.Argv<{}>; +export declare function get(chain: Chain, key: keyof ChainConfig, { reportError }: { + reportError?: boolean | undefined; +}): string | undefined; +export {}; diff --git a/cli-core/dist/diff.d.ts b/cli-core/dist/diff.d.ts new file mode 100644 index 000000000..bf94eab48 --- /dev/null +++ b/cli-core/dist/diff.d.ts @@ -0,0 +1,10 @@ +export type Diff = { + push?: T; + pull?: T; +}; +type DiffMap = { + [K in keyof T]: T[K] extends object ? Partial> : Diff; +}; +export declare function diffObjects>(obj1: T, obj2: T): Partial>; +export declare function colorizeDiff(diff: any, indent?: number): string; +export {}; diff --git a/cli-core/dist/evmsigner.d.ts b/cli-core/dist/evmsigner.d.ts new file mode 100644 index 000000000..1e8bcaa80 --- /dev/null +++ b/cli-core/dist/evmsigner.d.ts @@ -0,0 +1,25 @@ +import type { Network, SignOnlySigner, SignedTx, Signer, UnsignedTransaction } from '@wormhole-foundation/sdk-connect'; +import { PlatformNativeSigner } from '@wormhole-foundation/sdk-connect'; +import { type EvmChains } from '@wormhole-foundation/sdk-evm'; +import type { Signer as EthersSigner, Provider } from 'ethers'; +export declare function getEvmSigner(rpc: Provider, key: string | EthersSigner, opts?: { + maxGasLimit?: bigint; + chain?: EvmChains; + debug?: boolean; +}): Promise; +export declare function getEvmSignerForKey(rpc: Provider, privateKey: string): Promise; +export declare function getEvmSignerForSigner(signer: EthersSigner): Promise; +export declare class EvmNativeSigner extends PlatformNativeSigner implements SignOnlySigner { + readonly opts?: { + maxGasLimit?: bigint | undefined; + debug?: boolean | undefined; + } | undefined; + constructor(_chain: C, _address: string, _signer: EthersSigner, opts?: { + maxGasLimit?: bigint | undefined; + debug?: boolean | undefined; + } | undefined); + chain(): C; + address(): string; + sign(tx: UnsignedTransaction[]): Promise; +} +export declare function isEvmNativeSigner(signer: Signer): signer is EvmNativeSigner; diff --git a/cli-core/dist/getSigner.d.ts b/cli-core/dist/getSigner.d.ts new file mode 100644 index 000000000..0a2817884 --- /dev/null +++ b/cli-core/dist/getSigner.d.ts @@ -0,0 +1,14 @@ +import { ChainContext, type Chain, type ChainAddress, type Network, type Signer } from "@wormhole-foundation/sdk"; +export type SignerType = "privateKey" | "ledger"; +export type SignerSource = { + type: SignerType; + source: string; +}; +export interface SignerStuff { + chain: ChainContext; + signer: Signer; + address: ChainAddress; + source: SignerSource; +} +export declare function forgeSignerArgs(source: SignerSource): string; +export declare function getSigner(chain: ChainContext, type: SignerType, source?: string, filePath?: string): Promise>; diff --git a/cli-core/dist/index.cjs b/cli-core/dist/index.cjs new file mode 100644 index 000000000..fccaf9450 --- /dev/null +++ b/cli-core/dist/index.cjs @@ -0,0 +1,2410 @@ +'use strict'; + +var evm = require('@wormhole-foundation/sdk/platforms/evm'); +var solana = require('@wormhole-foundation/sdk/platforms/solana'); +var sdkConnect = require('@wormhole-foundation/sdk-connect'); +var child_process = require('child_process'); +var chalk = require('chalk'); +var yargs = require('yargs'); +var bun = require('bun'); +var helpers = require('yargs/helpers'); +var web3_js = require('@solana/web3.js'); +var spl = require('@solana/spl-token'); +var fs = require('fs'); +var readline = require('readline'); +var sdk = require('@wormhole-foundation/sdk'); +require('@wormhole-foundation/sdk-evm-ntt'); +var sdkSolanaNtt = require('@wormhole-foundation/sdk-solana-ntt'); +require('@wormhole-foundation/sdk-definitions-ntt'); +var sdkSolana = require('@wormhole-foundation/sdk-solana'); +var sdkEvm = require('@wormhole-foundation/sdk-evm'); +var ethers = require('ethers'); + +function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); + } + }); + } + n.default = e; + return Object.freeze(n); +} + +var spl__namespace = /*#__PURE__*/_interopNamespaceDefault(spl); + +// +// when the native secp256k1 is missing, the eccrypto library decides TO PRINT A MESSAGE TO STDOUT: +// https://github.com/bitchan/eccrypto/blob/a4f4a5f85ef5aa1776dfa1b7801cad808264a19c/index.js#L23 +// +// do you use a CLI tool that depends on that library and try to pipe the output +// of the tool into another? tough luck +// +// for lack of a better way to stop this, we patch the console.info function to +// drop that particular message... +// +const info = console.info; +console.info = function (x) { + if (x !== "secp256k1 unavailable, reverting to browser version") { + info(x); + } +}; +const warn = console.warn; +globalThis.console.warn = function (x) { + if (x !== + "bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?)") { + warn(x); + } +}; +// Without this JSON.stringify() blows up +BigInt.prototype.toJSON = function () { + return this.toString(); +}; + +var evmDeployFile = `// SPDX-License-Identifier: Apache 2 +pragma solidity >=0.8.8 <0.9.0; + +import {Script, console} from "forge-std/Script.sol"; +import {DeployWormholeNttBase} from "./helpers/DeployWormholeNttBase.sol"; +import {INttManager} from "../src/interfaces/INttManager.sol"; +import {IWormholeTransceiver} from "../src/interfaces/IWormholeTransceiver.sol"; +import "../src/interfaces/IManagerBase.sol"; +import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; +import {NttManager} from "../src/NttManager/NttManager.sol"; + +interface IWormhole { + function chainId() external view returns (uint16); +} + +contract DeployWormholeNtt is Script, DeployWormholeNttBase { + function run( + address wormhole, + address token, + address wormholeRelayer, + address specialRelayer, + uint8 decimals, + IManagerBase.Mode mode + ) public { + vm.startBroadcast(); + + console.log("Deploying Wormhole Ntt..."); + IWormhole wh = IWormhole(wormhole); + + // sanity check decimals + (bool success, bytes memory queriedDecimals) = + token.staticcall(abi.encodeWithSignature("decimals()")); + + if (success) { + uint8 queriedDecimals = abi.decode(queriedDecimals, (uint8)); + if (queriedDecimals != decimals) { + console.log("Decimals mismatch: ", queriedDecimals, " != ", decimals); + vm.stopBroadcast(); + return; + } + } else { + // NOTE: this might not be a critical error. It could just mean that + // the token contract was compiled against a different EVM version than what the forge script is running on. + // In this case, it's the responsibility of the caller to ensure that the provided decimals are correct + // and that the token contract is valid. + // The best way to ensure that is by calling this script with the queried token decimals (which is what the NTT CLI does). + console.log( + "Failed to query token decimals. Proceeding with provided decimals.", decimals + ); + // the NTT manager initialiser calls the token contract to get the + // decimals as well. We're just going to mock that call to return the provided decimals. + // This is a bit of a hack, but in the worst case (i.e. if the token contract is actually broken), the + // NTT manager initialiser will fail anyway. + vm.mockCall( + token, abi.encodeWithSelector(ERC20.decimals.selector), abi.encode(decimals) + ); + } + + uint16 chainId = wh.chainId(); + + console.log("Chain ID: ", chainId); + + uint256 scale = + decimals > TRIMMED_DECIMALS ? uint256(10 ** (decimals - TRIMMED_DECIMALS)) : 1; + + DeploymentParams memory params = DeploymentParams({ + token: token, + mode: mode, + wormholeChainId: chainId, + rateLimitDuration: 86400, + shouldSkipRatelimiter: false, + wormholeCoreBridge: wormhole, + wormholeRelayerAddr: wormholeRelayer, + specialRelayerAddr: specialRelayer, + consistencyLevel: 202, + gasLimit: 500000, + // the trimming will trim this number to uint64.max + outboundLimit: uint256(type(uint64).max) * scale + }); + + // Deploy NttManager. + address manager = deployNttManager(params); + + // Deploy Wormhole Transceiver. + address transceiver = deployWormholeTransceiver(params, manager); + + // Configure NttManager. + configureNttManager( + manager, transceiver, params.outboundLimit, params.shouldSkipRatelimiter + ); + + vm.stopBroadcast(); + } + + function upgrade( + address manager + ) public { + vm.startBroadcast(); + + NttManager nttManager = NttManager(manager); + + console.log("Upgrading manager..."); + + uint64 rateLimitDuration = nttManager.rateLimitDuration(); + bool shouldSkipRatelimiter = rateLimitDuration == 0; + + NttManager implementation = new NttManager( + nttManager.token(), + nttManager.mode(), + nttManager.chainId(), + nttManager.rateLimitDuration(), + shouldSkipRatelimiter + ); + + nttManager.upgrade(address(implementation)); + + vm.stopBroadcast(); + } +} +`; + +var evmDeployFileHelper = `// SPDX-License-Identifier: Apache 2 +pragma solidity >=0.8.8 <0.9.0; + +import {console2} from "forge-std/Script.sol"; +import {ParseNttConfig} from "./ParseNttConfig.sol"; +import "../../src/interfaces/IManagerBase.sol"; +import "../../src/interfaces/INttManager.sol"; +import "../../src/interfaces/IWormholeTransceiver.sol"; + +import {NttManager} from "../../src/NttManager/NttManager.sol"; +import {WormholeTransceiver} from + "../../src/Transceiver/WormholeTransceiver/WormholeTransceiver.sol"; +import {ERC1967Proxy} from "openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract DeployWormholeNttBase is ParseNttConfig { + struct DeploymentParams { + address token; + IManagerBase.Mode mode; + uint16 wormholeChainId; + uint64 rateLimitDuration; + bool shouldSkipRatelimiter; + address wormholeCoreBridge; + address wormholeRelayerAddr; + address specialRelayerAddr; + uint8 consistencyLevel; + uint256 gasLimit; + uint256 outboundLimit; + } + + // The minimum gas limit to verify a message on mainnet. If you're worried about saving + // gas on testnet, pick up the phone and start dialing! + uint256 constant MIN_WORMHOLE_GAS_LIMIT = 150000; + + function deployNttManager( + DeploymentParams memory params + ) internal returns (address) { + // Deploy the Manager Implementation. + NttManager implementation = new NttManager( + params.token, + params.mode, + params.wormholeChainId, + params.rateLimitDuration, + params.shouldSkipRatelimiter + ); + + // NttManager Proxy + NttManager nttManagerProxy = + NttManager(address(new ERC1967Proxy(address(implementation), ""))); + + nttManagerProxy.initialize(); + + console2.log("NttManager:", address(nttManagerProxy)); + + return address(nttManagerProxy); + } + + function deployWormholeTransceiver( + DeploymentParams memory params, + address nttManager + ) public returns (address) { + // Deploy the Wormhole Transceiver. + WormholeTransceiver implementation = new WormholeTransceiver( + nttManager, + params.wormholeCoreBridge, + params.wormholeRelayerAddr, + params.specialRelayerAddr, + params.consistencyLevel, + params.gasLimit + ); + + WormholeTransceiver transceiverProxy = + WormholeTransceiver(address(new ERC1967Proxy(address(implementation), ""))); + + transceiverProxy.initialize(); + + console2.log("WormholeTransceiver:", address(transceiverProxy)); + + return address(transceiverProxy); + } + + function configureNttManager( + address nttManager, + address transceiver, + uint256 outboundLimit, + bool shouldSkipRateLimiter + ) public { + IManagerBase(nttManager).setTransceiver(transceiver); + console2.log("Transceiver address set on NttManager: ", transceiver); + + if (!shouldSkipRateLimiter) { + INttManager(nttManager).setOutboundLimit(outboundLimit); + console2.log("Outbound rate limit set on NttManager: ", outboundLimit); + } + + // Hardcoded to one since these scripts handle Wormhole-only deployments. + INttManager(nttManager).setThreshold(1); + console2.log("Threshold set on NttManager: %d", uint256(1)); + } + + function _readEnvVariables() internal view returns (DeploymentParams memory params) { + // Token address. + params.token = vm.envAddress("RELEASE_TOKEN_ADDRESS"); + require(params.token != address(0), "Invalid token address"); + + // Mode. + uint8 mode = uint8(vm.envUint("RELEASE_MODE")); + if (mode == 0) { + params.mode = IManagerBase.Mode.LOCKING; + } else if (mode == 1) { + params.mode = IManagerBase.Mode.BURNING; + } else { + revert("Invalid mode"); + } + + // Chain ID. + params.wormholeChainId = uint16(vm.envUint("RELEASE_WORMHOLE_CHAIN_ID")); + require(params.wormholeChainId != 0, "Invalid chain ID"); + + // Rate limit duration. + params.rateLimitDuration = uint64(vm.envUint("RELEASE_RATE_LIMIT_DURATION")); + params.shouldSkipRatelimiter = vm.envBool("RELEASE_SKIP_RATE_LIMIT"); + + // Wormhole Core Bridge address. + params.wormholeCoreBridge = vm.envAddress("RELEASE_CORE_BRIDGE_ADDRESS"); + require(params.wormholeCoreBridge != address(0), "Invalid wormhole core bridge address"); + + // Wormhole relayer, special relayer, consistency level. + params.wormholeRelayerAddr = vm.envAddress("RELEASE_WORMHOLE_RELAYER_ADDRESS"); + params.specialRelayerAddr = vm.envAddress("RELEASE_SPECIAL_RELAYER_ADDRESS"); + params.consistencyLevel = uint8(vm.envUint("RELEASE_CONSISTENCY_LEVEL")); + + params.gasLimit = vm.envUint("RELEASE_GAS_LIMIT"); + require(params.gasLimit >= MIN_WORMHOLE_GAS_LIMIT, "Invalid gas limit"); + + // Outbound rate limiter limit. + params.outboundLimit = vm.envUint("RELEASE_OUTBOUND_LIMIT"); + } +} +`; + +function isObject(obj) { + return obj && typeof obj === 'object' && !Array.isArray(obj); +} +function diffObjects(obj1, obj2) { + const result = {}; + for (const key in obj1) { + if (obj1.hasOwnProperty(key)) { + if (obj2.hasOwnProperty(key)) { + if (isObject(obj1[key]) && isObject(obj2[key])) { + result[key] = diffObjects(obj1[key], obj2[key]); + } + else if (obj1[key] === obj2[key]) ; + else { + result[key] = { pull: obj2[key], push: obj1[key] }; + } + } + else { + result[key] = { push: obj1[key] }; + } + } + } + for (const key in obj2) { + if (obj2.hasOwnProperty(key) && !obj1.hasOwnProperty(key)) { + result[key] = { pull: obj2[key] }; + } + } + // prune empty objects + for (const key in result) { + if (isObject(result[key])) { + if (Object.keys(result[key]).length === 0) { + delete result[key]; + } + } + } + return result; +} +function colorizeDiff(diff, indent = 2) { + if (!isObject(diff)) + return JSON.stringify(diff, null, indent); + const jsonString = JSON.stringify(diff, null, indent); + let result = ''; + const lines = jsonString.split('\n'); + for (const line of lines) { + const trimmedLine = line.trim(); + if (trimmedLine.startsWith('"') && trimmedLine.endsWith(': {')) { + const key = trimmedLine.slice(1, trimmedLine.indexOf('": {')); + if (isObject(diff[key]) && ('push' in diff[key] || 'pull' in diff[key])) { + const push = diff[key].push; + const pull = diff[key].pull; + if (push !== undefined && pull !== undefined) { + result += `${line}\n`; + } + else if (push !== undefined) { + result += line.replace(trimmedLine, chalk.red(trimmedLine)) + '\n'; + } + else if (pull !== undefined) { + result += line.replace(trimmedLine, chalk.green(trimmedLine)) + '\n'; + } + } + else { + result += line + '\n'; + } + } + else if (trimmedLine.startsWith('"push"') || trimmedLine.startsWith('"pull"')) { + const color = trimmedLine.startsWith('"push"') ? chalk.green : chalk.red; + result += line.replace(trimmedLine, color(trimmedLine)) + '\n'; + } + else { + result += line + '\n'; + } + } + return result; +} + +async function getEvmSigner(rpc, key, opts) { + const signer = typeof key === 'string' ? new ethers.Wallet(key, rpc) : key; + const chain = opts?.chain ?? (await sdkEvm.EvmPlatform.chainFromRpc(rpc))[1]; + const managedSigner = new ethers.NonceManager(signer); + if (managedSigner.provider === null) { + try { + managedSigner.connect(rpc); + } + catch (e) { + console.error('Cannot connect to network for signer', e); + } + } + return new EvmNativeSigner(chain, await signer.getAddress(), managedSigner, opts); +} +class EvmNativeSigner extends sdkConnect.PlatformNativeSigner { + opts; + constructor(_chain, _address, _signer, opts) { + super(_chain, _address, _signer); + this.opts = opts; + } + chain() { + return this._chain; + } + address() { + return this._address; + } + async sign(tx) { + const chain = this.chain(); + const signed = []; + let gasLimit; + // Specialized for Mantle and Arbitrum Sepolia + switch (chain) { + case 'Mantle': + gasLimit = 2600000000000n; + break; + case 'ArbitrumSepolia': + gasLimit = 4000000n; + break; + default: + // default gas limit + gasLimit = this.opts?.maxGasLimit ?? 500000n; + break; + } + // TODO: DIFF STARTS HERE + let gasPrice = 200000000000n; // 200gwei + let maxFeePerGas = 6000000000n; // 6gwei + let maxPriorityFeePerGas = 1000000000n; // 1gwei + // Celo does not support this call + if (chain !== 'Celo') { + const feeData = await this._signer.provider.getFeeData(); + gasPrice = feeData.gasPrice ?? gasPrice; + maxFeePerGas = feeData.maxFeePerGas ?? maxFeePerGas; + maxPriorityFeePerGas = + feeData.maxPriorityFeePerGas ?? maxPriorityFeePerGas; + } + // Oasis throws malformed errors unless we + // set it to use legacy transaction parameters + const gasOpts = chain === 'Oasis' + ? { + gasLimit, + gasPrice: gasPrice, + // Hardcode type + type: 0, + } + : { + gasPrice, + maxFeePerGas, + maxPriorityFeePerGas, + gasLimit, + }; + // TODO: DIFF ENDS HERE + for (const txn of tx) { + const { transaction, description } = txn; + if (this.opts?.debug) + console.log(`Signing: ${description} for ${this.address()}`); + const t = { + ...transaction, + ...gasOpts, + from: this.address(), + nonce: await this._signer.getNonce(), + }; + // try { + // const estimate = await this._signer.provider!.estimateGas(t); + // t.gasLimit = estimate + estimate / 10n; // Add 10% buffer + // if (this.opts?.maxGasLimit && t.gasLimit > this.opts?.maxGasLimit) { + // throw new Error( + // `Gas limit ${t.gasLimit} exceeds maxGasLimit ${this.opts?.maxGasLimit}`, + // ); + // } + // } catch (e) { + // console.info('Failed to estimate gas for transaction: ', e); + // console.info('Using gas limit: ', t.gasLimit); + // } + signed.push(await this._signer.signTransaction(t)); + } + return signed; + } +} + +// arguments to pass to `forge` +function forgeSignerArgs(source) { + let signerArgs; + switch (source.type) { + case "privateKey": + signerArgs = `--private-key ${source.source}`; + break; + case "ledger": + signerArgs = `--ledger --mnemonic-derivation-paths "${source.source}"`; + break; + default: + throw new Error("Unsupported signer type"); + } + return signerArgs; +} +async function getSigner(chain, type, source, filePath) { + let signer; + const platform = sdk.chainToPlatform(chain.chain); + switch (platform) { + case "Solana": + switch (type) { + case "privateKey": + let privateKey; + if (filePath) { + // Read the private key from the file if filePath is provided + const keyPair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(filePath, 'utf8')))); + privateKey = sdkConnect.encoding.b58.encode(keyPair.secretKey); + } + else { + const privateKeySource = source ?? process.env.SOLANA_PRIVATE_KEY; + if (privateKeySource === undefined) { + throw new Error("Private key not provided and SOLANA_PRIVATE_KEY env var not set"); + } + privateKey = privateKeySource; + } + signer = await solana.getSigner(await chain.getRpc(), privateKey, { debug: false }); + break; + case "ledger": + throw new Error("Ledger not yet supported on Solana"); + default: + throw new Error("Unsupported signer type"); + } + break; + case "Evm": + switch (type) { + case "privateKey": + source = source ?? process.env.ETH_PRIVATE_KEY; + if (source === undefined) { + throw new Error("ETH_PRIVATE_KEY env var not set"); + } + signer = await getEvmSigner(await chain.getRpc(), source, { debug: true }); + break; + case "ledger": + throw new Error("Ledger not yet supported on Evm"); + default: + throw new Error("Unsupported signer type"); + } + break; + default: + throw new Error("Unrecognized platform: " + platform); + } + return { + chain, + signer: signer, + address: sdk.Wormhole.chainAddress(chain.chain, signer.address()), + source: { type, source } + }; +} + +function getAvailableVersions(platform) { + const tags = child_process.execSync(`git tag --list 'v*+${platform.toLowerCase()}'`, { + stdio: ["ignore", null, null] + }).toString().trim().split("\n"); + return tags.map(tag => tag.split("+")[0].slice(1)); +} +function getGitTagName(platform, version) { + const found = child_process.execSync(`git tag --list 'v${version}+${platform.toLowerCase()}'`, { + stdio: ["ignore", null, null] + }).toString().trim(); + return found; +} + +// TODO: per-network configuration? (i.e. mainnet, testnet, etc) +const configTemplate = { + scan_api_key: "", +}; +function assertChainConfigKey(key) { + const validKeys = Object.keys(configTemplate); + if (!validKeys.includes(key)) { + throw new Error(`Invalid key: ${key}`); + } +} +const options$1 = { + chain: { + describe: "Chain", + type: "string", + choices: sdk.chains, + demandOption: true, + }, + key: { + describe: "Key", + type: "string", + choices: Object.keys(configTemplate), + demandOption: true, + }, + value: { + describe: "Value", + type: "string", + demandOption: true, + }, + local: { + describe: "Use local configuration", + type: "boolean", + default: false, + }, + global: { + describe: "Use global configuration", + type: "boolean", + default: true, + } +}; +const command = (args) => args + .command("set-chain ", "set a configuration value for a chain", (yargs) => yargs + .positional("chain", options$1.chain) + .positional("key", options$1.key) + .positional("value", options$1.value) + .option("local", options$1.local) + .option("global", options$1.global), (argv) => { + const scope = resolveScope(argv.local, argv.global); + sdk.assertChain(argv.chain); + assertChainConfigKey(argv.key); + setChainConfig(scope, argv.chain, argv.key, argv.value); +}) + .command("unset-chain ", "unset a configuration value for a chain", (yargs) => yargs + .positional("chain", options$1.chain) + .positional("key", options$1.key) + .option("local", options$1.local) + .option("global", options$1.global), (argv) => { + const scope = resolveScope(argv.local, argv.global); + assertChainConfigKey(argv.key); + sdk.assertChain(argv.chain); + setChainConfig(scope, argv.chain, argv.key, undefined); +}) + .command("get-chain ", "get a configuration value", (yargs) => yargs + .positional("chain", options$1.chain) + .positional("key", options$1.key) + .option("local", options$1.local) + .option("global", options$1.global), (argv) => { + resolveScope(argv.local, argv.global); + assertChainConfigKey(argv.key); + sdk.assertChain(argv.chain); + const val = getChainConfig(argv.scope, argv.chain, argv.key); + if (!val) { + console.error("undefined"); + } + else { + console.log(val); + } +}) + .demandCommand(); +function findOrCreateConfigFile(scope) { + // if scope is global, touch $HOME/.ntt-cli/config.json + // if scope is local, touch .ntt-cli/config.json. In the latter case, make sure we're in an ntt project (call ensureNttRoot()) + // if the file doesn't exist, write an empty object + let configDir; + switch (scope) { + case "global": + if (!process.env.HOME) { + throw new Error("Could not determine home directory"); + } + configDir = `${process.env.HOME}/.ntt-cli`; + break; + case "local": + ensureNttRoot(); + configDir = ".ntt-cli"; + break; + } + const emptyConfig = { + chains: {}, + }; + if (!fs.existsSync(configDir)) { + fs.mkdirSync(configDir); + } + const configFile = `${configDir}/config.json`; + if (!fs.existsSync(configFile)) { + fs.writeFileSync(configFile, JSON.stringify(emptyConfig, null, 2)); + } + return configFile; +} +function setChainConfig(scope, chain, key, value) { + const configFile = findOrCreateConfigFile(scope); + const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); + if (!config.chains[chain]) { + config.chains[chain] = {}; + } + config.chains[chain][key] = value; + fs.writeFileSync(configFile, JSON.stringify(config, null, 2)); +} +function getChainConfig(scope, chain, key) { + const configFile = findOrCreateConfigFile(scope); + const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); + return config.chains[chain]?.[key]; +} +function envVarName(chain, key) { + return `${chain.toUpperCase()}_${key.toUpperCase()}`; +} +function get(chain, key, { reportError = false }) { + const varName = envVarName(chain, key); + const env = process.env[varName]; + if (env) { + console.info(chalk.yellow(`Using ${varName} for ${chain} ${key}`)); + return env; + } + const local = getChainConfig("local", chain, key); + if (local) { + console.info(chalk.yellow(`Using local configuration for ${chain} ${key} (in .ntt-cli/config.json)`)); + return local; + } + const global = getChainConfig("global", chain, key); + if (global) { + console.info(chalk.yellow(`Using global configuration for ${chain} ${key} (in $HOME/.ntt-cli/config.json)`)); + return global; + } + if (reportError) { + console.error(`Could not find configuration for ${chain} ${key}`); + console.error(`Please set it using 'ntt config set-chain ${chain} ${key} ' or by setting the environment variable ${varName}`); + } +} +function resolveScope(local, global) { + if (local && global) { + throw new Error("Cannot specify both --local and --global"); + } + if (local) { + return "local"; + } + if (global) { + return "global"; + } + throw new Error("Must specify either --local or --global"); +} + +// TODO: contract upgrades on solana +// TODO: set special relaying? +// TODO: currently, we just default all evm chains to standard relaying. should we not do that? what's a good way to configure this? +// TODO: check if manager can mint the token in burning mode (on solana it's +// simple. on evm we need to simulate with prank) +const overrides = (function () { + // read overrides.json file if exists + if (fs.existsSync("overrides.json")) { + console.error(chalk.yellow("Using overrides.json")); + return JSON.parse(fs.readFileSync("overrides.json").toString()); + } + else { + return {}; + } +})(); +const options = { + network: { + alias: "n", + describe: "Network", + choices: sdk.networks, + demandOption: true, + }, + deploymentPath: { + alias: "p", + describe: "Path to the deployment file", + default: "deployment.json", + type: "string", + }, + yes: { + alias: "y", + describe: "Skip confirmation", + type: "boolean", + default: false, + }, + signerType: { + alias: "s", + describe: "Signer type", + type: "string", + choices: ["privateKey", "ledger"], + default: "privateKey", + }, + verbose: { + alias: "v", + describe: "Verbose output", + type: "boolean", + default: false, + }, + chain: { + describe: "Chain", + type: "string", + choices: sdk.chains, + demandOption: true, + }, + address: { + describe: "Address", + type: "string", + demandOption: true, + }, + local: { + describe: "Use the current local version for deployment (advanced).", + type: "boolean", + default: false, + }, + version: { + describe: "Version of NTT to deploy", + type: "string", + demandOption: false, + }, + latest: { + describe: "Use the latest version", + type: "boolean", + default: false, + }, + skipVerify: { + describe: "Skip contract verification", + type: "boolean", + default: false, + }, + payer: { + describe: "Path to the payer json file (Solana)", + type: "string", + }, +}; +// TODO: this is a temporary hack to allow deploying from main (as we only need +// the changes to the evm script) +async function withCustomEvmDeployerScript(pwd, then) { + ensureNttRoot(pwd); + const overrides = [ + { path: `${pwd}/evm/script/DeployWormholeNtt.s.sol`, with: evmDeployFile }, + { path: `${pwd}/evm/script/helpers/DeployWormholeNttBase.sol`, with: evmDeployFileHelper }, + ]; + for (const { path, with: withFile } of overrides) { + const old = `${path}.old`; + if (fs.existsSync(path)) { + fs.copyFileSync(path, old); + } + fs.copyFileSync(withFile, path); + } + try { + return await then(); + } + finally { + // restore old files + for (const { path } of overrides) { + const old = `${path}.old`; + if (fs.existsSync(old)) { + fs.copyFileSync(old, path); + fs.unlinkSync(old); + } + } + } +} +const YARGSCommand = yargs(helpers.hideBin(process.argv)) + .wrap(Math.min(process.stdout.columns || 120, 160)) // Use terminal width, but no more than 160 characters + .scriptName("ntt") + .version((() => { + const ver = nttVersion(); + if (!ver) { + return "unknown"; + } + const { version, commit, path, remote } = ver; + const defaultPath = `${process.env.HOME}/.ntt-cli/.checkout`; + const remoteString = remote.includes("wormhole-foundation") ? "" : `${remote}@`; + if (path === defaultPath) { + return `ntt v${version} (${remoteString}${commit})`; + } + else { + return `ntt v${version} (${remoteString}${commit}) from ${path}`; + } +})()) + // config group of commands + .command("config", "configuration commands", command) + .command("update", "update the NTT CLI", (yargs) => yargs + .option("path", { + describe: "Path to a local NTT repo to install from. If not specified, the latest version will be installed.", + type: "string", +}) + .option("branch", { + describe: "Git branch to install from", + type: "string", +}) + .option("repo", { + describe: "Git repository to install from", + type: "string", +}) + .example("$0 update", "Update the NTT CLI to the latest version") + .example("$0 update --path /path/to/ntt", "Update the NTT CLI from a local repo") + .example("$0 update --branch cli", "Update the NTT CLI to the cli branch"), async (argv) => { + const localPath = argv["path"]; + if (localPath) { + if (argv["ref"]) { + console.error("Cannot specify both --path and --ref"); + process.exit(1); + } + if (argv["repo"]) { + console.error("Cannot specify both --path and --repo"); + process.exit(1); + } + await bun.$ `${localPath}/cli/install.sh`; + } + else { + let branchArg = ""; + let repoArg = ""; + if (argv["branch"]) { + branchArg = `--branch ${argv["branch"]}`; + } + if (argv["repo"]) { + repoArg = `--repo ${argv["repo"]}`; + } + const installScript = "https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh"; + // save it to "$HOME/.ntt-cli/install.sh" + const nttDir = `${process.env.HOME}/.ntt-cli`; + const installer = `${nttDir}/install.sh`; + child_process.execSync(`mkdir -p ${nttDir}`); + child_process.execSync(`curl -s ${installScript} > ${installer}`); + child_process.execSync(`chmod +x ${installer}`); + child_process.execSync(`${installer} ${branchArg} ${repoArg}`, { stdio: "inherit" }); + } +}) + .command("new ", "create a new NTT project", (yargs) => yargs + .positional("path", { + describe: "Path to the project", + type: "string", + demandOption: true, +}) + .example("$0 new my-ntt-project", "Create a new NTT project in the 'my-ntt-project' directory"), async (argv) => { + const git = child_process.execSync("git rev-parse --is-inside-work-tree || echo false", { + stdio: ["inherit", null, null] + }); + if (git.toString().trim() === "true") { + console.error("Already in a git repository"); + process.exit(1); + } + const path = argv["path"]; + await bun.$ `git clone -b main https://github.com/wormhole-foundation/example-native-token-transfers.git ${path}`; +}) + .command("add-chain ", "add a chain to the deployment file", (yargs) => yargs + .positional("chain", options.chain) + // TODO: add ability to specify manager address (then just pull the config) + // .option("manager", { + // describe: "Manager address", + // type: "string", + // }) + .option("program-key", { + describe: "Path to program key json (Solana)", + type: "string", +}) + .option("payer", { + describe: "Path to payer key json (Solana)", + type: "string", +}) + .option("binary", { + describe: "Path to program binary (.so file -- Solana)", + type: "string", +}) + .option("token", { + describe: "Token address", + type: "string", +}) + .option("mode", { + alias: "m", + describe: "Mode", + type: "string", + choices: ["locking", "burning"], +}) + .option("solana-priority-fee", { + describe: "Priority fee for Solana deployment (in microlamports)", + type: "number", + default: 50000, +}) + .option("signer-type", options.signerType) + .option("skip-verify", options.skipVerify) + .option("ver", options.version) + .option("latest", options.latest) + .option("local", options.local) + .option("path", options.deploymentPath) + .option("yes", options.yes) + .example("$0 add-chain Ethereum --token 0x1234... --mode burning --latest", "Add Ethereum chain with the latest contract version in burning mode") + .example("$0 add-chain Solana --token Sol1234... --mode locking --ver 1.0.0", "Add Solana chain with a specific contract version in locking mode") + .example("$0 add-chain Avalanche --token 0xabcd... --mode burning --local", "Add Avalanche chain using the local contract version"), async (argv) => { + const path = argv["path"]; + const deployments = loadConfig(path); + const chain = argv["chain"]; + const version = resolveVersion(argv["latest"], argv["ver"], argv["local"], sdk.chainToPlatform(chain)); + let mode = argv["mode"]; + const signerType = argv["signer-type"]; + const token = argv["token"]; + const network = deployments.network; + if (chain in deployments.chains) { + console.error(`Chain ${chain} already exists in ${path}`); + process.exit(1); + } + validateChain(network, chain); + const existsLocking = Object.values(deployments.chains).some((c) => c.mode === "locking"); + if (existsLocking) { + if (mode && mode === "locking") { + console.error("Only one locking chain is allowed"); + process.exit(1); + } + mode = "burning"; + } + if (!mode) { + console.error("Mode is required (use --mode)"); + process.exit(1); + } + if (!token) { + console.error("Token is required (use --token)"); + process.exit(1); + } + // let's deploy + // TODO: factor out to function to get chain context + const wh = new sdk.Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(chain); + // TODO: make manager configurable + const deployedManager = await deploy(version, mode, ch, token, signerType, !argv["skip-verify"], argv["yes"], argv["payer"], argv["program-key"], argv["binary"], argv["solana-priority-fee"]); + const [config, _ctx, _ntt, decimals] = await pullChainConfig(network, deployedManager, overrides); + console.log("token decimals:", chalk.yellow(decimals)); + deployments.chains[chain] = config; + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Added ${chain} to ${path}`); +}) + .command("upgrade ", "upgrade the contract on a specific chain", (yargs) => yargs + .positional("chain", options.chain) + .option("ver", options.version) + .option("latest", { + describe: "Use the latest version", + type: "boolean", + default: false, +}) + .option("local", options.local) + .option("signer-type", options.signerType) + .option("skip-verify", options.skipVerify) + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("payer", { + describe: "Path to payer key json (Solana)", + type: "string", +}) + .option("program-key", { + describe: "Path to program key json (Solana)", + type: "string", +}) + .option("binary", { + describe: "Path to program binary (.so file -- Solana)", + type: "string", +}) + .example("$0 upgrade Ethereum --latest", "Upgrade the Ethereum contract to the latest version") + .example("$0 upgrade Solana --ver 1.1.0", "Upgrade the Solana contract to version 1.1.0") + .example("$0 upgrade Polygon --local --skip-verify", "Upgrade the Polygon contract using the local version, skipping explorer bytecode verification"), async (argv) => { + const path = argv["path"]; + const deployments = loadConfig(path); + const chain = argv["chain"]; + const signerType = argv["signer-type"]; + const network = deployments.network; + if (!(chain in deployments.chains)) { + console.error(`Chain ${chain} not found in ${path}`); + process.exit(1); + } + const chainConfig = deployments.chains[chain]; + const currentVersion = chainConfig.version; + const platform = sdk.chainToPlatform(chain); + const toVersion = resolveVersion(argv["latest"], argv["ver"], argv["local"], platform); + if (argv["local"]) { + await warnLocalDeployment(argv["yes"]); + } + if (toVersion === currentVersion && !argv["local"]) { + console.log(`Chain ${chain} is already at version ${currentVersion}`); + process.exit(0); + } + console.log(`Upgrading ${chain} from version ${currentVersion} to ${toVersion || 'local version'}`); + if (!argv["yes"]) { + await askForConfirmation(); + } + const wh = new sdk.Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(chain); + const [_, ctx, ntt] = await pullChainConfig(network, { chain, address: sdk.toUniversal(chain, chainConfig.manager) }, overrides); + await upgrade(currentVersion, toVersion, ntt, ctx, signerType, !argv["skip-verify"], argv["payer"], argv["program-key"], argv["binary"]); + // reinit the ntt object to get the new version + // TODO: is there an easier way to do this? + const { ntt: upgraded } = await nttFromManager(ch, chainConfig.manager); + chainConfig.version = getVersion(chain, upgraded); + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Successfully upgraded ${chain} to version ${toVersion || 'local version'}`); +}) + .command("clone
", "initialize a deployment file from an existing contract", (yargs) => yargs + .positional("network", options.network) + .positional("chain", options.chain) + .positional("address", options.address) + .option("path", options.deploymentPath) + .option("verbose", options.verbose) + .example("$0 clone Testnet Ethereum 0x5678...", "Clone an existing Ethereum deployment on Testnet") + .example("$0 clone Mainnet Solana Sol5678... --path custom-clone.json", "Clone an existing Solana deployment on Mainnet to a custom file"), async (argv) => { + if (!sdk.isNetwork(argv["network"])) { + console.error("Invalid network"); + process.exit(1); + } + const path = argv["path"]; + const verbose = argv["verbose"]; + // check if the file exists + if (fs.existsSync(path)) { + console.error(`Deployment file already exists at ${path}`); + process.exit(1); + } + // step 1. grab the config + // step 2. discover registrations + // step 3. grab registered peer configs + // + // NOTE: we don't recursively grab peer configs. This means the + // discovered peers will be the ones that are directly registered with + // the starting manager (the one we're cloning). + // For example, if we're cloning manager A, and it's registered with + // B, and B is registered with C, but C is not registered with A, then + // C will not be included in the cloned deployment. + // We could do peer discovery recursively but that would be a lot + // slower, since peer discovery is already O(n) in the number of + // supported chains (50+), because there is no way to enumerate the peers, so we + // need to query all possible chains to see if they're registered. + const chain = argv["chain"]; + sdk.assertChain(chain); + const manager = argv["address"]; + const network = argv["network"]; + const universalManager = sdk.toUniversal(chain, manager); + const ntts = {}; + const [config, _ctx, ntt, _decimals] = await pullChainConfig(network, { chain, address: universalManager }, overrides); + ntts[chain] = ntt; + const configs = { + [chain]: config, + }; + // discover peers + let count = 0; + for (const c of sdk.chains) { + process.stdout.write(`[${count}/${sdk.chains.length - 1}] Fetching peer config for ${c}`); + await new Promise((resolve) => setTimeout(resolve, 100)); + count++; + const peer = await retryWithExponentialBackoff(() => ntt.getPeer(c), 5, 5000); + process.stdout.write(`\n`); + if (peer === null) { + continue; + } + const address = peer.address.address.toUniversalAddress(); + const [peerConfig, _ctx, peerNtt] = await pullChainConfig(network, { chain: c, address }, overrides); + ntts[c] = peerNtt; + configs[c] = peerConfig; + } + // sort chains by name + const sorted = Object.fromEntries(Object.entries(configs).sort(([a], [b]) => a.localeCompare(b))); + // sleep for a bit to avoid rate limiting when making the getDecimals call + // this can happen when the last we hit the rate limit just in the last iteration of the loop above. + // (happens more often than you'd think, because the rate limiter + // gets more aggressive after each hit) + await new Promise((resolve) => setTimeout(resolve, 2000)); + // now loop through the chains, and query their peer information to get the inbound limits + await pullInboundLimits(ntts, sorted, verbose); + const deployment = { + network: argv["network"], + chains: sorted, + }; + fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); +}) + .command("init ", "initialize a deployment file", (yargs) => yargs + .positional("network", options.network) + .option("path", options.deploymentPath) + .example("$0 init Testnet", "Initialize a new deployment file for the Testnet network") + .example("$0 init Mainnet --path custom.json", "Initialize a new deployment file for Mainnet with a custom file name"), async (argv) => { + if (!sdk.isNetwork(argv["network"])) { + console.error("Invalid network"); + process.exit(1); + } + const deployment = { + network: argv["network"], + chains: {}, + }; + const path = argv["path"]; + // check if the file exists + if (fs.existsSync(path)) { + console.error(`Deployment file already exists at ${path}. Specify a different path with --path`); + process.exit(1); + } + fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); +}) + .command("pull", "pull the remote configuration", (yargs) => yargs + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("verbose", options.verbose) + .example("$0 pull", "Pull the latest configuration from the blockchain for all chains") + .example("$0 pull --yes", "Pull the latest configuration and apply changes without confirmation"), async (argv) => { + const deployments = loadConfig(argv["path"]); + const verbose = argv["verbose"]; + const network = deployments.network; + const path = argv["path"]; + const deps = await pullDeployments(deployments, network, verbose); + let changed = false; + for (const [chain, deployment] of Object.entries(deps)) { + sdk.assertChain(chain); + const diff = diffObjects(deployments.chains[chain], deployment.config.remote); + if (Object.keys(diff).length !== 0) { + console.error(chalk.reset(colorizeDiff({ [chain]: diff }))); + changed = true; + deployments.chains[chain] = deployment.config.remote; + } + } + if (!changed) { + console.log(`${path} is already up to date`); + process.exit(0); + } + if (!argv["yes"]) { + await askForConfirmation(); + } + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Updated ${path}`); +}) + .command("push", "push the local configuration", (yargs) => yargs + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("signer-type", options.signerType) + .option("verbose", options.verbose) + .option("skip-verify", options.skipVerify) + .option("payer", options.payer) + .example("$0 push", "Push local configuration changes to the blockchain") + .example("$0 push --signer-type ledger", "Push changes using a Ledger hardware wallet for signing") + .example("$0 push --skip-verify", "Push changes without verifying contracts on EVM chains") + .example("$0 push --payer ", "Path to the payer json file (Solana), instead of setting SOLANA_PRIVATE_KEY env variable"), async (argv) => { + const deployments = loadConfig(argv["path"]); + const verbose = argv["verbose"]; + const network = deployments.network; + const deps = await pullDeployments(deployments, network, verbose); + const signerType = argv["signer-type"]; + const payerPath = argv["payer"]; + const missing = await missingConfigs(deps, verbose); + if (checkConfigErrors(deps)) { + console.error("There are errors in the config file. Please fix these before continuing."); + process.exit(1); + } + for (const [chain, missingConfig] of Object.entries(missing)) { + sdk.assertChain(chain); + const ntt = deps[chain].ntt; + const ctx = deps[chain].ctx; + const signer = await getSigner(ctx, signerType, undefined, payerPath); + for (const manager of missingConfig.managerPeers) { + const tx = ntt.setPeer(manager.address, manager.tokenDecimals, manager.inboundLimit, signer.address.address); + await sdk.signSendWait(ctx, tx, signer.signer); + } + for (const transceiver of missingConfig.transceiverPeers) { + const tx = ntt.setTransceiverPeer(0, transceiver, signer.address.address); + await sdk.signSendWait(ctx, tx, signer.signer); + } + for (const evmChain of missingConfig.evmChains) { + const tx = (await ntt.getTransceiver(0)).setIsEvmChain(evmChain, true); + await sdk.signSendWait(ctx, tx, signer.signer); + } + for (const relayingTarget of missingConfig.standardRelaying) { + const tx = (await ntt.getTransceiver(0)).setIsWormholeRelayingEnabled(relayingTarget, true); + await sdk.signSendWait(ctx, tx, signer.signer); + } + for (const relayingTarget of missingConfig.specialRelaying) { + const tx = (await ntt.getTransceiver(0)).setIsSpecialRelayingEnabled(relayingTarget, true); + await sdk.signSendWait(ctx, tx, signer.signer); + } + if (missingConfig.solanaWormholeTransceiver) { + if (sdk.chainToPlatform(chain) !== "Solana") { + console.error("Solana wormhole transceiver can only be set on Solana chains"); + continue; + } + const solanaNtt = ntt; + const tx = solanaNtt.registerWormholeTransceiver({ + payer: signer.address.address, + owner: signer.address.address, + }); + try { + await sdk.signSendWait(ctx, tx, signer.signer); + } + catch (e) { + console.error(e.logs); + } + } + if (missingConfig.solanaUpdateLUT) { + if (sdk.chainToPlatform(chain) !== "Solana") { + console.error("Solana update LUT can only be set on Solana chains"); + continue; + } + const solanaNtt = ntt; + const tx = solanaNtt.initializeOrUpdateLUT({ payer: new sdkSolana.SolanaAddress(signer.address.address).unwrap() }); + try { + await sdk.signSendWait(ctx, tx, signer.signer); + } + catch (e) { + console.error(e.logs); + } + } + } + // pull deps again + const depsAfterRegistrations = await pullDeployments(deployments, network, verbose); + for (const [chain, deployment] of Object.entries(depsAfterRegistrations)) { + sdk.assertChain(chain); + await pushDeployment(deployment, signerType, !argv["skip-verify"], argv["yes"], payerPath); + } +}) + .command("status", "check the status of the deployment", (yargs) => yargs + .option("path", options.deploymentPath) + .option("verbose", options.verbose) + .example("$0 status", "Check the status of the deployment across all chains") + .example("$0 status --verbose", "Check the status with detailed output"), async (argv) => { + const path = argv["path"]; + const verbose = argv["verbose"]; + // TODO: I don't like the variable names here + const deployments = loadConfig(path); + const network = deployments.network; + let deps = await pullDeployments(deployments, network, verbose); + let fixable = 0; + const extraInfo = {}; + if (checkConfigErrors(deps)) { + console.error("There are errors in the config file. Please fix these before continuing."); + process.exit(1); + } + // diff remote and local configs + for (const [chain, deployment] of Object.entries(deps)) { + sdk.assertChain(chain); + const local = deployment.config.local; + const remote = deployment.config.remote; + const a = { [chain]: local }; + const b = { [chain]: remote }; + const diff = diffObjects(a, b); + if (Object.keys(diff).length !== 0) { + console.error(chalk.reset(colorizeDiff(diff))); + fixable++; + } + if (verbose) { + const immutables = await getImmutables(chain, deployment.ntt); + if (immutables) { + extraInfo[chain] = immutables; + } + const pdas = await getPdas(chain, deployment.ntt); + if (pdas) { + extraInfo[chain] = pdas; + } + } + } + if (Object.keys(extraInfo).length > 0) { + console.log(chalk.yellow(JSON.stringify(extraInfo, null, 2))); + } + // verify peers + const missing = await missingConfigs(deps, verbose); + if (Object.keys(missing).length > 0) { + fixable++; + } + for (const [chain, missingConfig] of Object.entries(missing)) { + console.error(`${chain} status:`); + for (const manager of missingConfig.managerPeers) { + console.error(` Missing manager peer: ${manager.address.chain}`); + } + for (const transceiver of missingConfig.transceiverPeers) { + console.error(` Missing transceiver peer: ${transceiver.chain}`); + } + for (const evmChain of missingConfig.evmChains) { + console.error(` ${evmChain} needs to be configured as an EVM chain`); + } + for (const relayingTarget of missingConfig.standardRelaying) { + console.warn(` No standard relaying to ${relayingTarget}`); + } + for (const relayingTarget of missingConfig.specialRelaying) { + console.warn(` No special relaying to ${relayingTarget}`); + } + if (missingConfig.solanaWormholeTransceiver) { + console.error(" Missing Solana wormhole transceiver"); + } + if (missingConfig.solanaUpdateLUT) { + console.error(" Missing or outdated LUT"); + } + } + if (fixable > 0) { + console.error("Run `ntt pull` to pull the remote configuration (overwriting the local one)"); + console.error("Run `ntt push` to push the local configuration (overwriting the remote one) by executing the necessary transactions"); + process.exit(1); + } + else { + console.log(`${path} is up to date with the on-chain configuration.`); + process.exit(0); + } +}) + .command("solana", "Solana commands", (yargs) => { + yargs + .command("key-base58 ", "print private key in base58", (yargs) => yargs + .positional("keypair", { + describe: "Path to keypair.json", + type: "string", + demandOption: true, + }), (argv) => { + const keypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(argv["keypair"]).toString()))); + console.log(sdkConnect.encoding.b58.encode(keypair.secretKey)); + }) + .command("token-authority ", "print the token authority address for a given program ID", (yargs) => yargs + .positional("programId", { + describe: "Program ID", + type: "string", + demandOption: true, + }), (argv) => { + const programId = new web3_js.PublicKey(argv["programId"]); + const tokenAuthority = sdkSolanaNtt.NTT.pdas(programId).tokenAuthority(); + console.log(tokenAuthority.toBase58()); + }) + .command("ata ", "print the token authority address for a given program ID", (yargs) => yargs + .positional("mint", { + describe: "Mint address", + type: "string", + demandOption: true, + }) + .positional("owner", { + describe: "Owner address", + type: "string", + demandOption: true, + }) + .positional("tokenProgram", { + describe: "Token program ID", + type: "string", + choices: ["legacy", "token22"], + demandOption: true, + }), (argv) => { + const mint = new web3_js.PublicKey(argv["mint"]); + const owner = new web3_js.PublicKey(argv["owner"]); + const tokenProgram = argv["tokenProgram"] === "legacy" + ? spl__namespace.TOKEN_PROGRAM_ID + : spl__namespace.TOKEN_2022_PROGRAM_ID; + const ata = spl__namespace.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); + console.log(ata.toBase58()); + }) + .demandCommand(); +}) + .help() + .strict() + .demandCommand(); +function checkConfigErrors(deps) { + let fatal = 0; + for (const [chain, deployment] of Object.entries(deps)) { + sdk.assertChain(chain); + const config = deployment.config.local; + if (!checkNumberFormatting(config.limits.outbound, deployment.decimals)) { + console.error(`ERROR: ${chain} has an outbound limit (${config.limits.outbound}) with the wrong number of decimals. The number should have ${deployment.decimals} decimals.`); + fatal++; + } + if (config.limits.outbound === formatNumber(0n, deployment.decimals)) { + console.warn(chalk.yellow(`${chain} has an outbound limit of 0`)); + } + for (const [c, limit] of Object.entries(config.limits.inbound)) { + if (!checkNumberFormatting(limit, deployment.decimals)) { + console.error(`ERROR: ${chain} has an inbound limit with the wrong number of decimals for ${c} (${limit}). The number should have ${deployment.decimals} decimals.`); + fatal++; + } + if (limit === formatNumber(0n, deployment.decimals)) { + console.warn(chalk.yellow(`${chain} has an inbound limit of 0 from ${c}`)); + } + } + } + return fatal; +} +function createWorkTree(platform, version) { + const tag = getGitTagName(platform, version); + if (!tag) { + console.error(`No tag found matching ${version} for ${platform}`); + process.exit(1); + } + const worktreeName = `.deployments/${platform}-${version}`; + if (fs.existsSync(worktreeName)) { + console.log(chalk.yellow(`Worktree already exists at ${worktreeName}. Resetting to ${tag}`)); + child_process.execSync(`git -C ${worktreeName} reset --hard ${tag}`, { + stdio: "inherit" + }); + } + else { + // create worktree + child_process.execSync(`git worktree add ${worktreeName} ${tag}`, { + stdio: "inherit" + }); + } + // NOTE: we create this symlink whether or not the file exists. + // this way, if it's created later, the symlink will be correct + child_process.execSync(`ln -fs $(pwd)/overrides.json $(pwd)/${worktreeName}/overrides.json`, { + stdio: "inherit" + }); + console.log(chalk.green(`Created worktree at ${worktreeName} from tag ${tag}`)); + return worktreeName; +} +async function upgrade(_fromVersion, toVersion, ntt, ctx, signerType, evmVerify, solanaPayer, solanaProgramKeyPath, solanaBinaryPath) { + // TODO: check that fromVersion is safe to upgrade to toVersion from + const platform = sdk.chainToPlatform(ctx.chain); + const worktree = toVersion ? createWorkTree(platform, toVersion) : "."; + switch (platform) { + case "Evm": + const evmNtt = ntt; + const evmCtx = ctx; + return upgradeEvm(worktree, evmNtt, evmCtx, signerType, evmVerify); + case "Solana": + if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { + console.error("Payer not found. Specify with --payer"); + process.exit(1); + } + const solanaNtt = ntt; + const solanaCtx = ctx; + return upgradeSolana(worktree, toVersion, solanaNtt, solanaCtx, solanaPayer, solanaProgramKeyPath, solanaBinaryPath); + default: + throw new Error("Unsupported platform"); + } +} +async function upgradeEvm(pwd, ntt, ctx, signerType, evmVerify) { + ensureNttRoot(pwd); + console.log("Upgrading EVM chain", ctx.chain); + const signer = await getSigner(ctx, signerType); + const signerArgs = forgeSignerArgs(signer.source); + console.log("Installing forge dependencies..."); + child_process.execSync("forge install", { + cwd: `${pwd}/evm`, + stdio: "pipe" + }); + let verifyArgs = ""; + if (evmVerify) { + // TODO: verify etherscan api key? + const etherscanApiKey = get(ctx.chain, "scan_api_key", { reportError: true }); + if (!etherscanApiKey) { + process.exit(1); + } + verifyArgs = `--verify --etherscan-api-key ${etherscanApiKey}`; + } + console.log("Upgrading manager..."); + await withCustomEvmDeployerScript(pwd, async () => { + child_process.execSync(`forge script --via-ir script/DeployWormholeNtt.s.sol \ +--rpc-url ${ctx.config.rpc} \ +--sig "upgrade(address)" \ +${ntt.managerAddress} \ +${signerArgs} \ +--broadcast \ +${verifyArgs} | tee last-run.stdout`, { + cwd: `${pwd}/evm`, + stdio: "inherit" + }); + }); +} +async function upgradeSolana(pwd, version, ntt, ctx, payer, programKeyPath, binaryPath) { + if (version === null) { + throw new Error("Cannot upgrade Solana to local version"); // TODO: this is not hard to enabled + } + const mint = (await (ntt.getConfig())).mint; + await deploySolana(pwd, version, await ntt.getMode(), ctx, mint.toBase58(), payer, false, programKeyPath, binaryPath); + // TODO: call initializeOrUpdateLUT. currently it's done in the following 'ntt push' step. +} +async function deploy(version, mode, ch, token, signerType, evmVerify, yes, solanaPayer, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee) { + if (version === null) { + await warnLocalDeployment(yes); + } + const platform = sdk.chainToPlatform(ch.chain); + const worktree = version ? createWorkTree(platform, version) : "."; + switch (platform) { + case "Evm": + return await deployEvm(worktree, mode, ch, token, signerType, evmVerify); + case "Solana": + if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { + console.error("Payer not found. Specify with --payer"); + process.exit(1); + } + const solanaCtx = ch; + return await deploySolana(worktree, version, mode, solanaCtx, token, solanaPayer, true, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee); + default: + throw new Error("Unsupported platform"); + } +} +async function deployEvm(pwd, mode, ch, token, signerType, verify) { + ensureNttRoot(pwd); + const wormhole = ch.config.contracts.coreBridge; + if (!wormhole) { + console.error("Core bridge not found"); + process.exit(1); + } + const relayer = ch.config.contracts.relayer; + if (!relayer) { + console.error("Relayer not found"); + process.exit(1); + } + const rpc = ch.config.rpc; + // TODO: how to make specialRelayer configurable?? + let specialRelayer; + if (ch.chain === "Avalanche") { + specialRelayer = "0x1a19d8a194630642f750376Ae72b4eDF5aDFd25F"; + } + else if (ch.chain === "Bsc") { + specialRelayer = "0x8C56eE9cd232d23541a697C0eBd3cA597DE3c88D"; + } + else { + specialRelayer = "0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74"; + } + const provider = new ethers.ethers.JsonRpcProvider(rpc); + const abi = ["function decimals() external view returns (uint8)"]; + const tokenContract = new ethers.ethers.Contract(token, abi, provider); + const decimals = await tokenContract.decimals(); + // TODO: should actually make these ENV variables. + const sig = "run(address,address,address,address,uint8,uint8)"; + const modeUint = mode === "locking" ? 0 : 1; + const signer = await getSigner(ch, signerType); + const signerArgs = forgeSignerArgs(signer.source); + // TODO: verify etherscan api key? + let verifyArgs = []; + if (verify) { + const etherscanApiKey = get(ch.chain, "scan_api_key", { reportError: true }); + if (!etherscanApiKey) { + process.exit(1); + } + verifyArgs = ["--verify", "--etherscan-api-key", etherscanApiKey]; + } + console.log("Installing forge dependencies..."); + child_process.execSync("forge install", { + cwd: `${pwd}/evm`, + stdio: "pipe" + }); + console.log("Deploying manager..."); + const deploy = async (simulate) => { + const simulateArg = simulate ? "" : "--skip-simulation"; + await withCustomEvmDeployerScript(pwd, async () => { + try { + child_process.execSync(` +forge script --via-ir script/DeployWormholeNtt.s.sol \ +--rpc-url ${rpc} \ +${simulateArg} \ +--sig "${sig}" ${wormhole} ${token} ${relayer} ${specialRelayer} ${decimals} ${modeUint} \ +--broadcast ${verifyArgs.join(' ')} ${signerArgs} 2>&1 | tee last-run.stdout`, { + cwd: `${pwd}/evm`, + encoding: 'utf8', + stdio: 'inherit' + }); + } + catch (error) { + console.error("Failed to deploy manager"); + // NOTE: we don't exit here. instead, we check if the manager was + // deployed successfully (below) and proceed if it was. + // process.exit(1); + } + }); + return fs.readFileSync(`${pwd}/evm/last-run.stdout`).toString(); + }; + // we attempt to deploy with simulation first, then without if it fails + let out = await deploy(true); + if (out.includes("Simulated execution failed")) { + if (out.includes("NotActivated")) { + console.error("Simulation failed, likely because the token contract is compiled against a different EVM version. It's probably safe to continue without simulation."); + await askForConfirmation("Do you want to proceed with the deployment without simulation?"); + } + else { + console.error("Simulation failed. Please read the error message carefully, and proceed with caution."); + await askForConfirmation("Do you want to proceed with the deployment without simulation?"); + } + out = await deploy(false); + } + if (!out) { + console.error("Failed to deploy manager"); + process.exit(1); + } + const logs = out.split("\n").map((l) => l.trim()).filter((l) => l.length > 0); + const manager = logs.find((l) => l.includes("NttManager: 0x"))?.split(" ")[1]; + if (!manager) { + console.error("Manager not found"); + process.exit(1); + } + const universalManager = sdk.toUniversal(ch.chain, manager); + return { chain: ch.chain, address: universalManager }; +} +async function deploySolana(pwd, version, mode, ch, token, payer, initialize, managerKeyPath, binaryPath, priorityFee) { + ensureNttRoot(pwd); + // TODO: if the binary is provided, we should not check addresses in the source tree. (so we should move around the control flow a bit) + // TODO: factor out some of this into separate functions to help readability of this function (maybe even move to a different file) + const wormhole = ch.config.contracts.coreBridge; + if (!wormhole) { + console.error("Core bridge not found"); + process.exit(1); + } + // grep example_native_token_transfers = ".*" + // in solana/Anchor.toml + // TODO: what if they rename the program? + const existingProgramId = fs.readFileSync(`${pwd}/solana/Anchor.toml`).toString().match(/example_native_token_transfers = "(.*)"/)?.[1]; + if (!existingProgramId) { + console.error("Program ID not found in Anchor.toml (looked for example_native_token_transfers = \"(.*)\")"); + process.exit(1); + } + let programKeypairPath; + let programKeypair; + if (managerKeyPath) { + if (!fs.existsSync(managerKeyPath)) { + console.error(`Program keypair not found: ${managerKeyPath}`); + process.exit(1); + } + programKeypairPath = managerKeyPath; + programKeypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(managerKeyPath).toString()))); + } + else { + const programKeyJson = `${existingProgramId}.json`; + if (!fs.existsSync(programKeyJson)) { + console.error(`Program keypair not found: ${programKeyJson}`); + console.error("Run `solana-keygen` to create a new keypair (either with 'new', or with 'grind'), and pass it to this command with --program-key"); + console.error("For example: solana-keygen grind --starts-with ntt:1 --ignore-case"); + process.exit(1); + } + programKeypairPath = programKeyJson; + programKeypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(programKeyJson).toString()))); + if (existingProgramId !== programKeypair.publicKey.toBase58()) { + console.error(`The private key in ${programKeyJson} does not match the existing program ID: ${existingProgramId}`); + process.exit(1); + } + } + // see if the program key matches the existing program ID. if not, we need + // to update the latter in the Anchor.toml file and the lib.rs file(s) + const providedProgramId = programKeypair.publicKey.toBase58(); + if (providedProgramId !== existingProgramId) { + // only ask for confirmation if the current directory is ".". if it's + // something else (a worktree) then it's a fresh checkout and we just + // override the address anyway. + if (pwd === ".") { + console.error(`Program keypair does not match the existing program ID: ${existingProgramId}`); + await askForConfirmation(`Do you want to update the program ID in the Anchor.toml file and the lib.rs file to ${providedProgramId}?`); + } + const anchorTomlPath = `${pwd}/solana/Anchor.toml`; + const libRsPath = `${pwd}/solana/programs/example-native-token-transfers/src/lib.rs`; + const anchorToml = fs.readFileSync(anchorTomlPath).toString(); + const newAnchorToml = anchorToml.replace(existingProgramId, providedProgramId); + fs.writeFileSync(anchorTomlPath, newAnchorToml); + const libRs = fs.readFileSync(libRsPath).toString(); + const newLibRs = libRs.replace(existingProgramId, providedProgramId); + fs.writeFileSync(libRsPath, newLibRs); + } + // First we check that the provided mint's mint authority is the program's token authority PDA when in burning mode. + // This is checked in the program initialiser anyway, but we can save some + // time by checking it here and failing early (not to mention better + // diagnostics). + const emitter = sdkSolanaNtt.NTT.transceiverPdas(providedProgramId).emitterAccount().toBase58(); + const payerKeypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(payer).toString()))); + // this is not super pretty... I want to initialise the 'ntt' object, but + // because it's not deployed yet, fetching the version will fail, and thus default to whatever the default version is. + // We want to use the correct version (because the sdk's behaviour depends on it), so we first create a dummy ntt instance, + // let that fill in all the necessary fields, and then create a new instance with the correct version. + // It should be possible to avoid this dummy object and just instantiate 'SolanaNtt' directly, but I wasn't + // sure where the various pieces are plugged together and this seemed easier. + // TODO: refactor this to avoid the dummy object + const dummy = await ch.getProtocol("Ntt", { + ntt: { + manager: providedProgramId, + token: token, + transceiver: { wormhole: emitter }, + } + }); + const ntt = new sdkSolanaNtt.SolanaNtt(dummy.network, dummy.chain, dummy.connection, dummy.contracts, version ?? undefined); + // get the mint authority of 'token' + const tokenMint = new web3_js.PublicKey(token); + // const tokenInfo = await ch.connection.getTokenInfo(tokenMint); + const connection = await ch.getRpc(); + const mintInfo = await connection.getAccountInfo(tokenMint); + if (!mintInfo) { + console.error(`Mint ${token} not found on ${ch.chain} ${ch.network}`); + process.exit(1); + } + const mint = spl__namespace.unpackMint(tokenMint, mintInfo, mintInfo.owner); + if (mode === "burning") { + const expectedMintAuthority = ntt.pdas.tokenAuthority().toBase58(); + const actualMintAuthority = mint.mintAuthority?.toBase58() ?? null; + if (actualMintAuthority !== expectedMintAuthority) { + console.error(`Mint authority mismatch for ${token}`); + console.error(`Expected: ${expectedMintAuthority}`); + console.error(`Actual: ${actualMintAuthority}`); + console.error(`Set the mint authority to the program's token authority PDA with e.g.:`); + console.error(`spl-token authorize ${token} mint ${expectedMintAuthority}`); + process.exit(1); + } + } + let binary; + { + if (binaryPath) { + binary = binaryPath; + } + else { + // build the program + // TODO: build with docker + checkAnchorVersion(); + const proc = Bun.spawn(["anchor", + "build", + "-p", "example_native_token_transfers", + "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) + ], { + cwd: `${pwd}/solana` + }); + // const _out = await new Response(proc.stdout).text(); + await proc.exited; + if (proc.exitCode !== 0) { + process.exit(proc.exitCode ?? 1); + } + binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; + } + await checkSolanaBinary(binary, wormhole, providedProgramId, version ?? undefined); + // if buffer.json doesn't exist, create it + if (!fs.existsSync(`buffer.json`)) { + child_process.execSync(`solana-keygen new -o buffer.json --no-bip39-passphrase`); + } + else { + console.info("buffer.json already exists."); + askForConfirmation("Do you want continue an exiting deployment? If not, delete the buffer.json file and run the command again."); + } + const deployCommand = [ + "solana", + "program", + "deploy", + "--program-id", programKeypairPath, + "--buffer", `buffer.json`, + binary, + "--keypair", payer, + "-u", ch.config.rpc, + "--commitment", "finalized" + ]; + if (priorityFee !== undefined) { + deployCommand.push("--with-compute-unit-price", priorityFee.toString()); + } + const deployProc = Bun.spawn(deployCommand); + const out = await new Response(deployProc.stdout).text(); + await deployProc.exited; + if (deployProc.exitCode !== 0) { + process.exit(deployProc.exitCode ?? 1); + } + // success. remove buffer.json + fs.unlinkSync("buffer.json"); + console.log(out); + } + if (initialize) { + // wait 3 seconds + await new Promise((resolve) => setTimeout(resolve, 3000)); + const tx = ntt.initialize(sdk.toUniversal(ch.chain, payerKeypair.publicKey.toBase58()), { + mint: new web3_js.PublicKey(token), + mode, + outboundLimit: 100000000n, + }); + const signer = await getSigner(ch, "privateKey", sdkConnect.encoding.b58.encode(payerKeypair.secretKey)); + try { + await sdk.signSendWait(ch, tx, signer.signer); + } + catch (e) { + console.error(e.logs); + } + } + return { chain: ch.chain, address: sdk.toUniversal(ch.chain, providedProgramId) }; +} +async function missingConfigs(deps, verbose) { + const missingConfigs = {}; + for (const [fromChain, from] of Object.entries(deps)) { + let count = 0; + sdk.assertChain(fromChain); + let missing = { + managerPeers: [], + transceiverPeers: [], + evmChains: [], + standardRelaying: [], + specialRelaying: [], + solanaWormholeTransceiver: false, + solanaUpdateLUT: false, + }; + if (sdk.chainToPlatform(fromChain) === "Solana") { + const solanaNtt = from.ntt; + const selfWormholeTransceiver = solanaNtt.pdas.registeredTransceiver(new web3_js.PublicKey(solanaNtt.contracts.ntt.manager)).toBase58(); + const registeredSelfTransceiver = await retryWithExponentialBackoff(() => solanaNtt.connection.getAccountInfo(new web3_js.PublicKey(selfWormholeTransceiver)), 5, 5000); + if (registeredSelfTransceiver === null) { + count++; + missing.solanaWormholeTransceiver = true; + } + // here we just check if the LUT update function returns an instruction. + // if it does, it means the LUT is missing or outdated. notice that + // we're not actually updating the LUT here, just checking if it's + // missing, so it's ok to use the 0 pubkey as the payer. + const updateLUT = solanaNtt.initializeOrUpdateLUT({ payer: new web3_js.PublicKey(0) }); + // check if async generator is non-empty + if (!(await updateLUT.next()).done) { + count++; + missing.solanaUpdateLUT = true; + } + } + for (const [toChain, to] of Object.entries(deps)) { + sdk.assertChain(toChain); + if (fromChain === toChain) { + continue; + } + if (verbose) { + process.stdout.write(`Verifying registration for ${fromChain} -> ${toChain}......\n`); + } + const peer = await retryWithExponentialBackoff(() => from.ntt.getPeer(toChain), 5, 5000); + if (peer === null) { + const configLimit = from.config.local?.limits?.inbound?.[toChain]?.replace(".", ""); + count++; + missing.managerPeers.push({ + address: to.manager, + tokenDecimals: to.decimals, + inboundLimit: BigInt(configLimit ?? 0), + }); + } + else { + // @ts-ignore TODO + if (!Buffer.from(peer.address.address.address).equals(Buffer.from(to.manager.address.address))) { + console.error(`Peer address mismatch for ${fromChain} -> ${toChain}`); + } + if (peer.tokenDecimals !== to.decimals) { + console.error(`Peer decimals mismatch for ${fromChain} -> ${toChain}`); + } + } + if (sdk.chainToPlatform(fromChain) === "Evm") { + const toIsEvm = sdk.chainToPlatform(toChain) === "Evm"; + const toIsSolana = sdk.chainToPlatform(toChain) === "Solana"; + const whTransceiver = await from.ntt.getTransceiver(0); + if (toIsEvm) { + const remoteToEvm = await whTransceiver.isEvmChain(toChain); + if (!remoteToEvm) { + count++; + missing.evmChains.push(toChain); + } + const standardRelaying = await whTransceiver.isWormholeRelayingEnabled(toChain); + if (!standardRelaying) { + count++; + missing.standardRelaying.push(toChain); + } + } + else if (toIsSolana) { + const specialRelaying = await whTransceiver.isSpecialRelayingEnabled(toChain); + if (!specialRelaying) { + count++; + missing.specialRelaying.push(toChain); + } + } + } + const transceiverPeer = await retryWithExponentialBackoff(() => from.whTransceiver.getPeer(toChain), 5, 5000); + if (transceiverPeer === null) { + count++; + missing.transceiverPeers.push(to.whTransceiver.getAddress()); + } + else { + // @ts-ignore TODO + if (!Buffer.from(transceiverPeer.address.address).equals(Buffer.from(to.whTransceiver.getAddress().address.address))) { + console.error(`Transceiver peer address mismatch for ${fromChain} -> ${toChain}`); + } + } + } + if (count > 0) { + missingConfigs[fromChain] = missing; + } + } + return missingConfigs; +} +async function pushDeployment(deployment, signerType, evmVerify, yes, filePath) { + const diff = diffObjects(deployment.config.local, deployment.config.remote); + if (Object.keys(diff).length === 0) { + return; + } + const canonical = sdk.canonicalAddress(deployment.manager); + console.log(`Pushing changes to ${deployment.manager.chain} (${canonical})`); + console.log(chalk.reset(colorizeDiff(diff))); + if (!yes) { + await askForConfirmation(); + } + const ctx = deployment.ctx; + const signer = await getSigner(ctx, signerType, undefined, filePath); + let txs = []; + // we perform this last to make sure we don't accidentally lock ourselves out + let updateOwner = undefined; + let managerUpgrade; + for (const k of Object.keys(diff)) { + if (k === "version") { + // TODO: check against existing version, and make sure no major version changes + managerUpgrade = { from: diff[k].pull, to: diff[k].push }; + } + else if (k === "owner") { + const address = sdk.toUniversal(deployment.manager.chain, diff[k]?.push); + updateOwner = deployment.ntt.setOwner(address, signer.address.address); + } + else if (k === "pauser") { + const address = sdk.toUniversal(deployment.manager.chain, diff[k]?.push); + txs.push(deployment.ntt.setPauser(address, signer.address.address)); + } + else if (k === "paused") { + if (diff[k]?.push === true) { + txs.push(deployment.ntt.pause(signer.address.address)); + } + else { + txs.push(deployment.ntt.unpause(signer.address.address)); + } + } + else if (k === "limits") { + const newOutbound = diff[k]?.outbound?.push; + if (newOutbound) { + // TODO: verify amount has correct number of decimals? + // remove "." from string and convert to bigint + const newOutboundBigint = BigInt(newOutbound.replace(".", "")); + txs.push(deployment.ntt.setOutboundLimit(newOutboundBigint, signer.address.address)); + } + const inbound = diff[k]?.inbound; + if (inbound) { + for (const chain of Object.keys(inbound)) { + sdk.assertChain(chain); + const newInbound = inbound[chain]?.push; + if (newInbound) { + // TODO: verify amount has correct number of decimals? + const newInboundBigint = BigInt(newInbound.replace(".", "")); + txs.push(deployment.ntt.setInboundLimit(chain, newInboundBigint, signer.address.address)); + } + } + } + } + else if (k === "transceivers") { + // TODO: refactor this nested loop stuff into separate functions at least + // alternatively we could first recursively collect all the things + // to do into a flattened list (with entries like + // transceivers.wormhole.pauser), and have a top-level mapping of + // these entries to how they should be handled + for (const j of Object.keys(diff[k])) { + if (j === "wormhole") { + for (const l of Object.keys(diff[k][j])) { + if (l === "pauser") { + const newTransceiverPauser = sdk.toUniversal(deployment.manager.chain, diff[k][j][l].push); + txs.push(deployment.whTransceiver.setPauser(newTransceiverPauser, signer.address.address)); + } + else { + console.error(`Unsupported field: ${k}.${j}.${l}`); + process.exit(1); + } + } + } + else { + console.error(`Unsupported field: ${k}.${j}`); + process.exit(1); + } + } + } + else { + console.error(`Unsupported field: ${k}`); + process.exit(1); + } + } + if (managerUpgrade) { + await upgrade(managerUpgrade.from, managerUpgrade.to, deployment.ntt, ctx, signerType, evmVerify); + } + for (const tx of txs) { + await sdk.signSendWait(ctx, tx, signer.signer); + } + if (updateOwner) { + await sdk.signSendWait(ctx, updateOwner, signer.signer); + } +} +async function pullDeployments(deployments, network, verbose) { + let deps = {}; + for (const [chain, deployment] of Object.entries(deployments.chains)) { + if (verbose) { + process.stdout.write(`Fetching config for ${chain}......\n`); + } + sdk.assertChain(chain); + const managerAddress = deployment.manager; + if (managerAddress === undefined) { + console.error(`manager field not found for chain ${chain}`); + // process.exit(1); + continue; + } + const [remote, ctx, ntt, decimals] = await pullChainConfig(network, { chain, address: sdk.toUniversal(chain, managerAddress) }, overrides); + const local = deployments.chains[chain]; + // TODO: what if it's not index 0... + // we should check that the address of this transceiver matches the + // address in the config. currently we just assume that ix 0 is the wormhole one + const whTransceiver = await ntt.getTransceiver(0); + if (whTransceiver === null) { + console.error(`Wormhole transceiver not found for ${chain}`); + process.exit(1); + } + deps[chain] = { + ctx, + ntt, + decimals, + manager: { chain, address: sdk.toUniversal(chain, managerAddress) }, + whTransceiver, + config: { + remote, + local, + } + }; + } + const config = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.config.remote])); + const ntts = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.ntt])); + await pullInboundLimits(ntts, config, verbose); + return deps; +} +async function pullChainConfig(network, manager, overrides) { + const wh = new sdk.Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(manager.chain); + const nativeManagerAddress = sdk.canonicalAddress(manager); + const { ntt, addresses } = await nttFromManager(ch, nativeManagerAddress); + const mode = await ntt.getMode(); + const outboundLimit = await ntt.getOutboundLimit(); + const threshold = await ntt.getThreshold(); + const decimals = await ntt.getTokenDecimals(); + // insert decimal point into number + const outboundLimitDecimals = formatNumber(outboundLimit, decimals); + const paused = await ntt.isPaused(); + const owner = await ntt.getOwner(); + const pauser = await ntt.getPauser(); + const version = getVersion(manager.chain, ntt); + const transceiverPauser = await ntt.getTransceiver(0).then((t) => t?.getPauser() ?? null); + const config = { + version, + mode, + paused, + owner: owner.toString(), + manager: nativeManagerAddress, + token: addresses.token, + transceivers: { + threshold, + wormhole: { address: addresses.transceiver.wormhole }, + }, + limits: { + outbound: outboundLimitDecimals, + inbound: {}, + }, + }; + if (transceiverPauser) { + config.transceivers.wormhole.pauser = transceiverPauser.toString(); + } + if (pauser) { + config.pauser = pauser.toString(); + } + return [config, ch, ntt, decimals]; +} +async function getImmutables(chain, ntt) { + const platform = sdk.chainToPlatform(chain); + if (platform !== "Evm") { + return null; + } + const evmNtt = ntt; + const transceiver = await evmNtt.getTransceiver(0); + const consistencyLevel = await transceiver.transceiver.consistencyLevel(); + const wormholeRelayer = await transceiver.transceiver.wormholeRelayer(); + const specialRelayer = await transceiver.transceiver.specialRelayer(); + const gasLimit = await transceiver.transceiver.gasLimit(); + const token = await evmNtt.manager.token(); + const tokenDecimals = await evmNtt.manager.tokenDecimals(); + const whTransceiverImmutables = { + consistencyLevel, + wormholeRelayer, + specialRelayer, + gasLimit, + }; + return { + manager: { + token, + tokenDecimals, + }, + wormholeTransceiver: whTransceiverImmutables, + }; +} +async function getPdas(chain, ntt) { + const platform = sdk.chainToPlatform(chain); + if (platform !== "Solana") { + return null; + } + const solanaNtt = ntt; + const config = solanaNtt.pdas.configAccount(); + const emitter = sdkSolanaNtt.NTT.transceiverPdas(solanaNtt.program.programId).emitterAccount(); + const outboxRateLimit = solanaNtt.pdas.outboxRateLimitAccount(); + const tokenAuthority = solanaNtt.pdas.tokenAuthority(); + const lutAccount = solanaNtt.pdas.lutAccount(); + const lutAuthority = solanaNtt.pdas.lutAuthority(); + return { + config, + emitter, + outboxRateLimit, + tokenAuthority, + lutAccount, + lutAuthority, + }; +} +function getVersion(chain, ntt) { + const platform = sdk.chainToPlatform(chain); + switch (platform) { + case "Evm": + return ntt.version; + case "Solana": + return ntt.version; + default: + throw new Error("Unsupported platform"); + } +} +// TODO: there should be a more elegant way to do this, than creating a +// "dummy" NTT, then calling verifyAddresses to get the contract diff, then +// finally reconstructing the "real" NTT object from that +async function nttFromManager(ch, nativeManagerAddress) { + const onlyManager = await ch.getProtocol("Ntt", { + ntt: { + manager: nativeManagerAddress, + token: null, + transceiver: {}, + } + }); + const diff = await onlyManager.verifyAddresses(); + const addresses = { manager: nativeManagerAddress, ...diff }; + const ntt = await ch.getProtocol("Ntt", { + ntt: addresses + }); + return { ntt, addresses }; +} +function formatNumber(num, decimals) { + if (num === 0n) { + return "0." + "0".repeat(decimals); + } + const str = num.toString(); + const formatted = str.slice(0, -decimals) + "." + str.slice(-decimals); + if (formatted.startsWith(".")) { + return "0" + formatted; + } + return formatted; +} +function checkNumberFormatting(formatted, decimals) { + // check that the string has the correct number of decimals + const parts = formatted.split("."); + if (parts.length !== 2) { + return false; + } + if (parts[1].length !== decimals) { + return false; + } + return true; +} +function cargoNetworkFeature(network) { + switch (network) { + case "Mainnet": + return "mainnet"; + case "Testnet": + return "solana-devnet"; + case "Devnet": + return "tilt-devnet"; + default: + throw new Error("Unsupported network"); + } +} +async function askForConfirmation(prompt = "Do you want to continue?") { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + const answer = await new Promise((resolve) => { + rl.question(`${prompt} [y/n]`, resolve); + }); + rl.close(); + if (answer !== "y") { + console.log("Aborting"); + process.exit(0); + } +} +// NOTE: modifies the config object in place +// TODO: maybe introduce typestate for having pulled inbound limits? +async function pullInboundLimits(ntts, config, verbose) { + for (const [c1, ntt1] of Object.entries(ntts)) { + sdk.assertChain(c1); + const chainConf = config[c1]; + if (!chainConf) { + console.error(`Chain ${c1} not found in deployment`); + process.exit(1); + } + const decimals = await ntt1.getTokenDecimals(); + for (const [c2, ntt2] of Object.entries(ntts)) { + sdk.assertChain(c2); + if (ntt1 === ntt2) { + continue; + } + if (verbose) { + process.stdout.write(`Fetching inbound limit for ${c1} -> ${c2}.......\n`); + } + const peer = await retryWithExponentialBackoff(() => ntt1.getPeer(c2), 5, 5000); + if (chainConf.limits?.inbound === undefined) { + chainConf.limits.inbound = {}; + } + const limit = peer?.inboundLimit ?? 0n; + chainConf.limits.inbound[c2] = formatNumber(limit, decimals); + } + } +} +async function checkSolanaBinary(binary, wormhole, providedProgramId, version) { + // ensure binary path exists + if (!fs.existsSync(binary)) { + console.error(`.so file not found: ${binary}`); + process.exit(1); + } + // console.log(`Checking binary ${binary} for wormhole and provided program ID`); + // convert wormhole and providedProgramId from base58 to hex + const wormholeHex = new web3_js.PublicKey(wormhole).toBuffer().toString("hex"); + const providedProgramIdHex = new web3_js.PublicKey(providedProgramId).toBuffer().toString("hex"); + const versionHex = version ? Buffer.from(version).toString("hex") : undefined; + if (!searchHexInBinary(binary, wormholeHex)) { + console.error(`Wormhole address not found in binary: ${wormhole}`); + process.exit(1); + } + if (!searchHexInBinary(binary, providedProgramIdHex)) { + console.error(`Provided program ID not found in binary: ${providedProgramId}`); + process.exit(1); + } + if (versionHex && !searchHexInBinary(binary, versionHex)) ; +} +// not the most efficient, but at least it's definitely portable +function searchHexInBinary(binaryPath, searchHex) { + const buffer = fs.readFileSync(binaryPath); + const hexString = buffer.toString('hex'); + const found = hexString.includes(searchHex); + return found; +} +function ensureNttRoot(pwd = ".") { + if (!fs.existsSync(`${pwd}/evm/foundry.toml`) || !fs.existsSync(`${pwd}/solana/Anchor.toml`)) { + console.error("Run this command from the root of an NTT project."); + process.exit(1); + } +} +function checkAnchorVersion() { + const expected = "0.29.0"; + try { + child_process.execSync("which anchor"); + } + catch { + console.error("Anchor CLI is not installed.\nSee https://www.anchor-lang.com/docs/installation"); + process.exit(1); + } + const version = child_process.execSync("anchor --version").toString().trim(); + // version looks like "anchor-cli 0.14.0" + const [_, v] = version.split(" "); + if (v !== expected) { + console.error(`Anchor CLI version must be ${expected} but is ${v}`); + process.exit(1); + } +} +function loadConfig(path) { + if (!fs.existsSync(path)) { + console.error(`File not found: ${path}`); + console.error(`Create with 'ntt init' or specify another file with --path`); + process.exit(1); + } + const deployments = JSON.parse(fs.readFileSync(path).toString()); + return deployments; +} +function resolveVersion(latest, ver, local, platform) { + if ((latest ? 1 : 0) + (ver ? 1 : 0) + (local ? 1 : 0) !== 1) { + console.error("Specify exactly one of --latest, --ver, or --local"); + const available = getAvailableVersions(platform); + console.error(`Available versions for ${platform}:\n${available.join("\n")}`); + process.exit(1); + } + if (latest) { + const available = getAvailableVersions(platform); + return available.sort().reverse()[0]; + } + else if (ver) { + return ver; + } + else { + // local version + return null; + } +} +function warnLocalDeployment(yes) { + if (!yes) { + console.warn(chalk.yellow("WARNING: You are deploying from your local working directory.")); + console.warn(chalk.yellow("This bypasses version control and may deploy untested changes.")); + console.warn(chalk.yellow("Ensure your local changes are thoroughly tested and compatible.")); + return askForConfirmation("Are you sure you want to continue with the local deployment?"); + } + return Promise.resolve(); +} +function validateChain(network, chain) { + if (network === "Testnet") { + if (chain === "Ethereum") { + console.error("Ethereum is deprecated on Testnet. Use EthereumSepolia instead."); + process.exit(1); + } + // if on testnet, and the chain has a *Sepolia counterpart, use that instead + if (sdk.chains.find((c) => c === `${c}Sepolia`)) { + console.error(`Chain ${chain} is deprecated. Use ${chain}Sepolia instead.`); + process.exit(1); + } + } +} +function retryWithExponentialBackoff(fn, maxRetries, delay) { + const backoff = (retry) => Math.min(2 ** retry * delay, 10000) + Math.random() * 1000; + const attempt = async (retry) => { + try { + return await fn(); + } + catch (e) { + if (retry >= maxRetries) { + throw e; + } + const time = backoff(retry); + await new Promise((resolve) => setTimeout(resolve, backoff(time))); + return await attempt(retry + 1); + } + }; + return attempt(0); +} +function nttVersion() { + const nttDir = `${process.env.HOME}/.ntt-cli`; + try { + const versionFile = fs.readFileSync(`${nttDir}/version`).toString().trim(); + const [commit, installPath, version, remote] = versionFile.split("\n"); + return { version, commit, path: installPath, remote }; + } + catch { + return null; + } +} + +exports.YARGSCommand = YARGSCommand; +exports.ensureNttRoot = ensureNttRoot; diff --git a/cli-core/dist/index.d.ts b/cli-core/dist/index.d.ts new file mode 100644 index 000000000..9f1afe966 --- /dev/null +++ b/cli-core/dist/index.d.ts @@ -0,0 +1,51 @@ +/// +import "./side-effects"; +import { ChainContext, type Chain, type ChainAddress, type Network } from "@wormhole-foundation/sdk"; +import "@wormhole-foundation/sdk-evm-ntt"; +import "@wormhole-foundation/sdk-solana-ntt"; +import "@wormhole-foundation/sdk-definitions-ntt"; +import type { Ntt, NttTransceiver } from "@wormhole-foundation/sdk-definitions-ntt"; +export type Deployment = { + ctx: ChainContext; + ntt: Ntt; + whTransceiver: NttTransceiver; + decimals: number; + manager: ChainAddress; + config: { + remote?: ChainConfig; + local?: ChainConfig; + }; +}; +export type ChainConfig = { + version: string; + mode: Ntt.Mode; + paused: boolean; + owner: string; + pauser?: string; + manager: string; + token: string; + transceivers: { + threshold: number; + wormhole: { + address: string; + pauser?: string; + }; + }; + limits: { + outbound: string; + inbound: Partial<{ + [C in Chain]: string; + }>; + }; +}; +export type Config = { + network: Network; + chains: Partial<{ + [C in Chain]: ChainConfig; + }>; + defaultLimits?: { + outbound: string; + }; +}; +export declare const YARGSCommand: import("yargs").Argv<{}>; +export declare function ensureNttRoot(pwd?: string): void; diff --git a/cli-core/dist/index.js b/cli-core/dist/index.js new file mode 100644 index 000000000..62f673ca6 --- /dev/null +++ b/cli-core/dist/index.js @@ -0,0 +1,2388 @@ +import evm from '@wormhole-foundation/sdk/platforms/evm'; +import solana from '@wormhole-foundation/sdk/platforms/solana'; +import { PlatformNativeSigner, encoding } from '@wormhole-foundation/sdk-connect'; +import { execSync } from 'child_process'; +import chalk from 'chalk'; +import yargs from 'yargs'; +import { $ } from 'bun'; +import { hideBin } from 'yargs/helpers'; +import { Keypair, PublicKey } from '@solana/web3.js'; +import * as spl from '@solana/spl-token'; +import fs from 'fs'; +import readline from 'readline'; +import { chainToPlatform, Wormhole, chains, assertChain, toUniversal, networks, isNetwork, signSendWait, canonicalAddress } from '@wormhole-foundation/sdk'; +import '@wormhole-foundation/sdk-evm-ntt'; +import { NTT, SolanaNtt } from '@wormhole-foundation/sdk-solana-ntt'; +import '@wormhole-foundation/sdk-definitions-ntt'; +import { SolanaAddress } from '@wormhole-foundation/sdk-solana'; +import { EvmPlatform } from '@wormhole-foundation/sdk-evm'; +import { Wallet, NonceManager, ethers } from 'ethers'; + +// +// when the native secp256k1 is missing, the eccrypto library decides TO PRINT A MESSAGE TO STDOUT: +// https://github.com/bitchan/eccrypto/blob/a4f4a5f85ef5aa1776dfa1b7801cad808264a19c/index.js#L23 +// +// do you use a CLI tool that depends on that library and try to pipe the output +// of the tool into another? tough luck +// +// for lack of a better way to stop this, we patch the console.info function to +// drop that particular message... +// +const info = console.info; +console.info = function (x) { + if (x !== "secp256k1 unavailable, reverting to browser version") { + info(x); + } +}; +const warn = console.warn; +globalThis.console.warn = function (x) { + if (x !== + "bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?)") { + warn(x); + } +}; +// Without this JSON.stringify() blows up +BigInt.prototype.toJSON = function () { + return this.toString(); +}; + +var evmDeployFile = `// SPDX-License-Identifier: Apache 2 +pragma solidity >=0.8.8 <0.9.0; + +import {Script, console} from "forge-std/Script.sol"; +import {DeployWormholeNttBase} from "./helpers/DeployWormholeNttBase.sol"; +import {INttManager} from "../src/interfaces/INttManager.sol"; +import {IWormholeTransceiver} from "../src/interfaces/IWormholeTransceiver.sol"; +import "../src/interfaces/IManagerBase.sol"; +import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; +import {NttManager} from "../src/NttManager/NttManager.sol"; + +interface IWormhole { + function chainId() external view returns (uint16); +} + +contract DeployWormholeNtt is Script, DeployWormholeNttBase { + function run( + address wormhole, + address token, + address wormholeRelayer, + address specialRelayer, + uint8 decimals, + IManagerBase.Mode mode + ) public { + vm.startBroadcast(); + + console.log("Deploying Wormhole Ntt..."); + IWormhole wh = IWormhole(wormhole); + + // sanity check decimals + (bool success, bytes memory queriedDecimals) = + token.staticcall(abi.encodeWithSignature("decimals()")); + + if (success) { + uint8 queriedDecimals = abi.decode(queriedDecimals, (uint8)); + if (queriedDecimals != decimals) { + console.log("Decimals mismatch: ", queriedDecimals, " != ", decimals); + vm.stopBroadcast(); + return; + } + } else { + // NOTE: this might not be a critical error. It could just mean that + // the token contract was compiled against a different EVM version than what the forge script is running on. + // In this case, it's the responsibility of the caller to ensure that the provided decimals are correct + // and that the token contract is valid. + // The best way to ensure that is by calling this script with the queried token decimals (which is what the NTT CLI does). + console.log( + "Failed to query token decimals. Proceeding with provided decimals.", decimals + ); + // the NTT manager initialiser calls the token contract to get the + // decimals as well. We're just going to mock that call to return the provided decimals. + // This is a bit of a hack, but in the worst case (i.e. if the token contract is actually broken), the + // NTT manager initialiser will fail anyway. + vm.mockCall( + token, abi.encodeWithSelector(ERC20.decimals.selector), abi.encode(decimals) + ); + } + + uint16 chainId = wh.chainId(); + + console.log("Chain ID: ", chainId); + + uint256 scale = + decimals > TRIMMED_DECIMALS ? uint256(10 ** (decimals - TRIMMED_DECIMALS)) : 1; + + DeploymentParams memory params = DeploymentParams({ + token: token, + mode: mode, + wormholeChainId: chainId, + rateLimitDuration: 86400, + shouldSkipRatelimiter: false, + wormholeCoreBridge: wormhole, + wormholeRelayerAddr: wormholeRelayer, + specialRelayerAddr: specialRelayer, + consistencyLevel: 202, + gasLimit: 500000, + // the trimming will trim this number to uint64.max + outboundLimit: uint256(type(uint64).max) * scale + }); + + // Deploy NttManager. + address manager = deployNttManager(params); + + // Deploy Wormhole Transceiver. + address transceiver = deployWormholeTransceiver(params, manager); + + // Configure NttManager. + configureNttManager( + manager, transceiver, params.outboundLimit, params.shouldSkipRatelimiter + ); + + vm.stopBroadcast(); + } + + function upgrade( + address manager + ) public { + vm.startBroadcast(); + + NttManager nttManager = NttManager(manager); + + console.log("Upgrading manager..."); + + uint64 rateLimitDuration = nttManager.rateLimitDuration(); + bool shouldSkipRatelimiter = rateLimitDuration == 0; + + NttManager implementation = new NttManager( + nttManager.token(), + nttManager.mode(), + nttManager.chainId(), + nttManager.rateLimitDuration(), + shouldSkipRatelimiter + ); + + nttManager.upgrade(address(implementation)); + + vm.stopBroadcast(); + } +} +`; + +var evmDeployFileHelper = `// SPDX-License-Identifier: Apache 2 +pragma solidity >=0.8.8 <0.9.0; + +import {console2} from "forge-std/Script.sol"; +import {ParseNttConfig} from "./ParseNttConfig.sol"; +import "../../src/interfaces/IManagerBase.sol"; +import "../../src/interfaces/INttManager.sol"; +import "../../src/interfaces/IWormholeTransceiver.sol"; + +import {NttManager} from "../../src/NttManager/NttManager.sol"; +import {WormholeTransceiver} from + "../../src/Transceiver/WormholeTransceiver/WormholeTransceiver.sol"; +import {ERC1967Proxy} from "openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract DeployWormholeNttBase is ParseNttConfig { + struct DeploymentParams { + address token; + IManagerBase.Mode mode; + uint16 wormholeChainId; + uint64 rateLimitDuration; + bool shouldSkipRatelimiter; + address wormholeCoreBridge; + address wormholeRelayerAddr; + address specialRelayerAddr; + uint8 consistencyLevel; + uint256 gasLimit; + uint256 outboundLimit; + } + + // The minimum gas limit to verify a message on mainnet. If you're worried about saving + // gas on testnet, pick up the phone and start dialing! + uint256 constant MIN_WORMHOLE_GAS_LIMIT = 150000; + + function deployNttManager( + DeploymentParams memory params + ) internal returns (address) { + // Deploy the Manager Implementation. + NttManager implementation = new NttManager( + params.token, + params.mode, + params.wormholeChainId, + params.rateLimitDuration, + params.shouldSkipRatelimiter + ); + + // NttManager Proxy + NttManager nttManagerProxy = + NttManager(address(new ERC1967Proxy(address(implementation), ""))); + + nttManagerProxy.initialize(); + + console2.log("NttManager:", address(nttManagerProxy)); + + return address(nttManagerProxy); + } + + function deployWormholeTransceiver( + DeploymentParams memory params, + address nttManager + ) public returns (address) { + // Deploy the Wormhole Transceiver. + WormholeTransceiver implementation = new WormholeTransceiver( + nttManager, + params.wormholeCoreBridge, + params.wormholeRelayerAddr, + params.specialRelayerAddr, + params.consistencyLevel, + params.gasLimit + ); + + WormholeTransceiver transceiverProxy = + WormholeTransceiver(address(new ERC1967Proxy(address(implementation), ""))); + + transceiverProxy.initialize(); + + console2.log("WormholeTransceiver:", address(transceiverProxy)); + + return address(transceiverProxy); + } + + function configureNttManager( + address nttManager, + address transceiver, + uint256 outboundLimit, + bool shouldSkipRateLimiter + ) public { + IManagerBase(nttManager).setTransceiver(transceiver); + console2.log("Transceiver address set on NttManager: ", transceiver); + + if (!shouldSkipRateLimiter) { + INttManager(nttManager).setOutboundLimit(outboundLimit); + console2.log("Outbound rate limit set on NttManager: ", outboundLimit); + } + + // Hardcoded to one since these scripts handle Wormhole-only deployments. + INttManager(nttManager).setThreshold(1); + console2.log("Threshold set on NttManager: %d", uint256(1)); + } + + function _readEnvVariables() internal view returns (DeploymentParams memory params) { + // Token address. + params.token = vm.envAddress("RELEASE_TOKEN_ADDRESS"); + require(params.token != address(0), "Invalid token address"); + + // Mode. + uint8 mode = uint8(vm.envUint("RELEASE_MODE")); + if (mode == 0) { + params.mode = IManagerBase.Mode.LOCKING; + } else if (mode == 1) { + params.mode = IManagerBase.Mode.BURNING; + } else { + revert("Invalid mode"); + } + + // Chain ID. + params.wormholeChainId = uint16(vm.envUint("RELEASE_WORMHOLE_CHAIN_ID")); + require(params.wormholeChainId != 0, "Invalid chain ID"); + + // Rate limit duration. + params.rateLimitDuration = uint64(vm.envUint("RELEASE_RATE_LIMIT_DURATION")); + params.shouldSkipRatelimiter = vm.envBool("RELEASE_SKIP_RATE_LIMIT"); + + // Wormhole Core Bridge address. + params.wormholeCoreBridge = vm.envAddress("RELEASE_CORE_BRIDGE_ADDRESS"); + require(params.wormholeCoreBridge != address(0), "Invalid wormhole core bridge address"); + + // Wormhole relayer, special relayer, consistency level. + params.wormholeRelayerAddr = vm.envAddress("RELEASE_WORMHOLE_RELAYER_ADDRESS"); + params.specialRelayerAddr = vm.envAddress("RELEASE_SPECIAL_RELAYER_ADDRESS"); + params.consistencyLevel = uint8(vm.envUint("RELEASE_CONSISTENCY_LEVEL")); + + params.gasLimit = vm.envUint("RELEASE_GAS_LIMIT"); + require(params.gasLimit >= MIN_WORMHOLE_GAS_LIMIT, "Invalid gas limit"); + + // Outbound rate limiter limit. + params.outboundLimit = vm.envUint("RELEASE_OUTBOUND_LIMIT"); + } +} +`; + +function isObject(obj) { + return obj && typeof obj === 'object' && !Array.isArray(obj); +} +function diffObjects(obj1, obj2) { + const result = {}; + for (const key in obj1) { + if (obj1.hasOwnProperty(key)) { + if (obj2.hasOwnProperty(key)) { + if (isObject(obj1[key]) && isObject(obj2[key])) { + result[key] = diffObjects(obj1[key], obj2[key]); + } + else if (obj1[key] === obj2[key]) ; + else { + result[key] = { pull: obj2[key], push: obj1[key] }; + } + } + else { + result[key] = { push: obj1[key] }; + } + } + } + for (const key in obj2) { + if (obj2.hasOwnProperty(key) && !obj1.hasOwnProperty(key)) { + result[key] = { pull: obj2[key] }; + } + } + // prune empty objects + for (const key in result) { + if (isObject(result[key])) { + if (Object.keys(result[key]).length === 0) { + delete result[key]; + } + } + } + return result; +} +function colorizeDiff(diff, indent = 2) { + if (!isObject(diff)) + return JSON.stringify(diff, null, indent); + const jsonString = JSON.stringify(diff, null, indent); + let result = ''; + const lines = jsonString.split('\n'); + for (const line of lines) { + const trimmedLine = line.trim(); + if (trimmedLine.startsWith('"') && trimmedLine.endsWith(': {')) { + const key = trimmedLine.slice(1, trimmedLine.indexOf('": {')); + if (isObject(diff[key]) && ('push' in diff[key] || 'pull' in diff[key])) { + const push = diff[key].push; + const pull = diff[key].pull; + if (push !== undefined && pull !== undefined) { + result += `${line}\n`; + } + else if (push !== undefined) { + result += line.replace(trimmedLine, chalk.red(trimmedLine)) + '\n'; + } + else if (pull !== undefined) { + result += line.replace(trimmedLine, chalk.green(trimmedLine)) + '\n'; + } + } + else { + result += line + '\n'; + } + } + else if (trimmedLine.startsWith('"push"') || trimmedLine.startsWith('"pull"')) { + const color = trimmedLine.startsWith('"push"') ? chalk.green : chalk.red; + result += line.replace(trimmedLine, color(trimmedLine)) + '\n'; + } + else { + result += line + '\n'; + } + } + return result; +} + +async function getEvmSigner(rpc, key, opts) { + const signer = typeof key === 'string' ? new Wallet(key, rpc) : key; + const chain = opts?.chain ?? (await EvmPlatform.chainFromRpc(rpc))[1]; + const managedSigner = new NonceManager(signer); + if (managedSigner.provider === null) { + try { + managedSigner.connect(rpc); + } + catch (e) { + console.error('Cannot connect to network for signer', e); + } + } + return new EvmNativeSigner(chain, await signer.getAddress(), managedSigner, opts); +} +class EvmNativeSigner extends PlatformNativeSigner { + opts; + constructor(_chain, _address, _signer, opts) { + super(_chain, _address, _signer); + this.opts = opts; + } + chain() { + return this._chain; + } + address() { + return this._address; + } + async sign(tx) { + const chain = this.chain(); + const signed = []; + let gasLimit; + // Specialized for Mantle and Arbitrum Sepolia + switch (chain) { + case 'Mantle': + gasLimit = 2600000000000n; + break; + case 'ArbitrumSepolia': + gasLimit = 4000000n; + break; + default: + // default gas limit + gasLimit = this.opts?.maxGasLimit ?? 500000n; + break; + } + // TODO: DIFF STARTS HERE + let gasPrice = 200000000000n; // 200gwei + let maxFeePerGas = 6000000000n; // 6gwei + let maxPriorityFeePerGas = 1000000000n; // 1gwei + // Celo does not support this call + if (chain !== 'Celo') { + const feeData = await this._signer.provider.getFeeData(); + gasPrice = feeData.gasPrice ?? gasPrice; + maxFeePerGas = feeData.maxFeePerGas ?? maxFeePerGas; + maxPriorityFeePerGas = + feeData.maxPriorityFeePerGas ?? maxPriorityFeePerGas; + } + // Oasis throws malformed errors unless we + // set it to use legacy transaction parameters + const gasOpts = chain === 'Oasis' + ? { + gasLimit, + gasPrice: gasPrice, + // Hardcode type + type: 0, + } + : { + gasPrice, + maxFeePerGas, + maxPriorityFeePerGas, + gasLimit, + }; + // TODO: DIFF ENDS HERE + for (const txn of tx) { + const { transaction, description } = txn; + if (this.opts?.debug) + console.log(`Signing: ${description} for ${this.address()}`); + const t = { + ...transaction, + ...gasOpts, + from: this.address(), + nonce: await this._signer.getNonce(), + }; + // try { + // const estimate = await this._signer.provider!.estimateGas(t); + // t.gasLimit = estimate + estimate / 10n; // Add 10% buffer + // if (this.opts?.maxGasLimit && t.gasLimit > this.opts?.maxGasLimit) { + // throw new Error( + // `Gas limit ${t.gasLimit} exceeds maxGasLimit ${this.opts?.maxGasLimit}`, + // ); + // } + // } catch (e) { + // console.info('Failed to estimate gas for transaction: ', e); + // console.info('Using gas limit: ', t.gasLimit); + // } + signed.push(await this._signer.signTransaction(t)); + } + return signed; + } +} + +// arguments to pass to `forge` +function forgeSignerArgs(source) { + let signerArgs; + switch (source.type) { + case "privateKey": + signerArgs = `--private-key ${source.source}`; + break; + case "ledger": + signerArgs = `--ledger --mnemonic-derivation-paths "${source.source}"`; + break; + default: + throw new Error("Unsupported signer type"); + } + return signerArgs; +} +async function getSigner(chain, type, source, filePath) { + let signer; + const platform = chainToPlatform(chain.chain); + switch (platform) { + case "Solana": + switch (type) { + case "privateKey": + let privateKey; + if (filePath) { + // Read the private key from the file if filePath is provided + const keyPair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(filePath, 'utf8')))); + privateKey = encoding.b58.encode(keyPair.secretKey); + } + else { + const privateKeySource = source ?? process.env.SOLANA_PRIVATE_KEY; + if (privateKeySource === undefined) { + throw new Error("Private key not provided and SOLANA_PRIVATE_KEY env var not set"); + } + privateKey = privateKeySource; + } + signer = await solana.getSigner(await chain.getRpc(), privateKey, { debug: false }); + break; + case "ledger": + throw new Error("Ledger not yet supported on Solana"); + default: + throw new Error("Unsupported signer type"); + } + break; + case "Evm": + switch (type) { + case "privateKey": + source = source ?? process.env.ETH_PRIVATE_KEY; + if (source === undefined) { + throw new Error("ETH_PRIVATE_KEY env var not set"); + } + signer = await getEvmSigner(await chain.getRpc(), source, { debug: true }); + break; + case "ledger": + throw new Error("Ledger not yet supported on Evm"); + default: + throw new Error("Unsupported signer type"); + } + break; + default: + throw new Error("Unrecognized platform: " + platform); + } + return { + chain, + signer: signer, + address: Wormhole.chainAddress(chain.chain, signer.address()), + source: { type, source } + }; +} + +function getAvailableVersions(platform) { + const tags = execSync(`git tag --list 'v*+${platform.toLowerCase()}'`, { + stdio: ["ignore", null, null] + }).toString().trim().split("\n"); + return tags.map(tag => tag.split("+")[0].slice(1)); +} +function getGitTagName(platform, version) { + const found = execSync(`git tag --list 'v${version}+${platform.toLowerCase()}'`, { + stdio: ["ignore", null, null] + }).toString().trim(); + return found; +} + +// TODO: per-network configuration? (i.e. mainnet, testnet, etc) +const configTemplate = { + scan_api_key: "", +}; +function assertChainConfigKey(key) { + const validKeys = Object.keys(configTemplate); + if (!validKeys.includes(key)) { + throw new Error(`Invalid key: ${key}`); + } +} +const options$1 = { + chain: { + describe: "Chain", + type: "string", + choices: chains, + demandOption: true, + }, + key: { + describe: "Key", + type: "string", + choices: Object.keys(configTemplate), + demandOption: true, + }, + value: { + describe: "Value", + type: "string", + demandOption: true, + }, + local: { + describe: "Use local configuration", + type: "boolean", + default: false, + }, + global: { + describe: "Use global configuration", + type: "boolean", + default: true, + } +}; +const command = (args) => args + .command("set-chain ", "set a configuration value for a chain", (yargs) => yargs + .positional("chain", options$1.chain) + .positional("key", options$1.key) + .positional("value", options$1.value) + .option("local", options$1.local) + .option("global", options$1.global), (argv) => { + const scope = resolveScope(argv.local, argv.global); + assertChain(argv.chain); + assertChainConfigKey(argv.key); + setChainConfig(scope, argv.chain, argv.key, argv.value); +}) + .command("unset-chain ", "unset a configuration value for a chain", (yargs) => yargs + .positional("chain", options$1.chain) + .positional("key", options$1.key) + .option("local", options$1.local) + .option("global", options$1.global), (argv) => { + const scope = resolveScope(argv.local, argv.global); + assertChainConfigKey(argv.key); + assertChain(argv.chain); + setChainConfig(scope, argv.chain, argv.key, undefined); +}) + .command("get-chain ", "get a configuration value", (yargs) => yargs + .positional("chain", options$1.chain) + .positional("key", options$1.key) + .option("local", options$1.local) + .option("global", options$1.global), (argv) => { + resolveScope(argv.local, argv.global); + assertChainConfigKey(argv.key); + assertChain(argv.chain); + const val = getChainConfig(argv.scope, argv.chain, argv.key); + if (!val) { + console.error("undefined"); + } + else { + console.log(val); + } +}) + .demandCommand(); +function findOrCreateConfigFile(scope) { + // if scope is global, touch $HOME/.ntt-cli/config.json + // if scope is local, touch .ntt-cli/config.json. In the latter case, make sure we're in an ntt project (call ensureNttRoot()) + // if the file doesn't exist, write an empty object + let configDir; + switch (scope) { + case "global": + if (!process.env.HOME) { + throw new Error("Could not determine home directory"); + } + configDir = `${process.env.HOME}/.ntt-cli`; + break; + case "local": + ensureNttRoot(); + configDir = ".ntt-cli"; + break; + } + const emptyConfig = { + chains: {}, + }; + if (!fs.existsSync(configDir)) { + fs.mkdirSync(configDir); + } + const configFile = `${configDir}/config.json`; + if (!fs.existsSync(configFile)) { + fs.writeFileSync(configFile, JSON.stringify(emptyConfig, null, 2)); + } + return configFile; +} +function setChainConfig(scope, chain, key, value) { + const configFile = findOrCreateConfigFile(scope); + const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); + if (!config.chains[chain]) { + config.chains[chain] = {}; + } + config.chains[chain][key] = value; + fs.writeFileSync(configFile, JSON.stringify(config, null, 2)); +} +function getChainConfig(scope, chain, key) { + const configFile = findOrCreateConfigFile(scope); + const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); + return config.chains[chain]?.[key]; +} +function envVarName(chain, key) { + return `${chain.toUpperCase()}_${key.toUpperCase()}`; +} +function get(chain, key, { reportError = false }) { + const varName = envVarName(chain, key); + const env = process.env[varName]; + if (env) { + console.info(chalk.yellow(`Using ${varName} for ${chain} ${key}`)); + return env; + } + const local = getChainConfig("local", chain, key); + if (local) { + console.info(chalk.yellow(`Using local configuration for ${chain} ${key} (in .ntt-cli/config.json)`)); + return local; + } + const global = getChainConfig("global", chain, key); + if (global) { + console.info(chalk.yellow(`Using global configuration for ${chain} ${key} (in $HOME/.ntt-cli/config.json)`)); + return global; + } + if (reportError) { + console.error(`Could not find configuration for ${chain} ${key}`); + console.error(`Please set it using 'ntt config set-chain ${chain} ${key} ' or by setting the environment variable ${varName}`); + } +} +function resolveScope(local, global) { + if (local && global) { + throw new Error("Cannot specify both --local and --global"); + } + if (local) { + return "local"; + } + if (global) { + return "global"; + } + throw new Error("Must specify either --local or --global"); +} + +// TODO: contract upgrades on solana +// TODO: set special relaying? +// TODO: currently, we just default all evm chains to standard relaying. should we not do that? what's a good way to configure this? +// TODO: check if manager can mint the token in burning mode (on solana it's +// simple. on evm we need to simulate with prank) +const overrides = (function () { + // read overrides.json file if exists + if (fs.existsSync("overrides.json")) { + console.error(chalk.yellow("Using overrides.json")); + return JSON.parse(fs.readFileSync("overrides.json").toString()); + } + else { + return {}; + } +})(); +const options = { + network: { + alias: "n", + describe: "Network", + choices: networks, + demandOption: true, + }, + deploymentPath: { + alias: "p", + describe: "Path to the deployment file", + default: "deployment.json", + type: "string", + }, + yes: { + alias: "y", + describe: "Skip confirmation", + type: "boolean", + default: false, + }, + signerType: { + alias: "s", + describe: "Signer type", + type: "string", + choices: ["privateKey", "ledger"], + default: "privateKey", + }, + verbose: { + alias: "v", + describe: "Verbose output", + type: "boolean", + default: false, + }, + chain: { + describe: "Chain", + type: "string", + choices: chains, + demandOption: true, + }, + address: { + describe: "Address", + type: "string", + demandOption: true, + }, + local: { + describe: "Use the current local version for deployment (advanced).", + type: "boolean", + default: false, + }, + version: { + describe: "Version of NTT to deploy", + type: "string", + demandOption: false, + }, + latest: { + describe: "Use the latest version", + type: "boolean", + default: false, + }, + skipVerify: { + describe: "Skip contract verification", + type: "boolean", + default: false, + }, + payer: { + describe: "Path to the payer json file (Solana)", + type: "string", + }, +}; +// TODO: this is a temporary hack to allow deploying from main (as we only need +// the changes to the evm script) +async function withCustomEvmDeployerScript(pwd, then) { + ensureNttRoot(pwd); + const overrides = [ + { path: `${pwd}/evm/script/DeployWormholeNtt.s.sol`, with: evmDeployFile }, + { path: `${pwd}/evm/script/helpers/DeployWormholeNttBase.sol`, with: evmDeployFileHelper }, + ]; + for (const { path, with: withFile } of overrides) { + const old = `${path}.old`; + if (fs.existsSync(path)) { + fs.copyFileSync(path, old); + } + fs.copyFileSync(withFile, path); + } + try { + return await then(); + } + finally { + // restore old files + for (const { path } of overrides) { + const old = `${path}.old`; + if (fs.existsSync(old)) { + fs.copyFileSync(old, path); + fs.unlinkSync(old); + } + } + } +} +const YARGSCommand = yargs(hideBin(process.argv)) + .wrap(Math.min(process.stdout.columns || 120, 160)) // Use terminal width, but no more than 160 characters + .scriptName("ntt") + .version((() => { + const ver = nttVersion(); + if (!ver) { + return "unknown"; + } + const { version, commit, path, remote } = ver; + const defaultPath = `${process.env.HOME}/.ntt-cli/.checkout`; + const remoteString = remote.includes("wormhole-foundation") ? "" : `${remote}@`; + if (path === defaultPath) { + return `ntt v${version} (${remoteString}${commit})`; + } + else { + return `ntt v${version} (${remoteString}${commit}) from ${path}`; + } +})()) + // config group of commands + .command("config", "configuration commands", command) + .command("update", "update the NTT CLI", (yargs) => yargs + .option("path", { + describe: "Path to a local NTT repo to install from. If not specified, the latest version will be installed.", + type: "string", +}) + .option("branch", { + describe: "Git branch to install from", + type: "string", +}) + .option("repo", { + describe: "Git repository to install from", + type: "string", +}) + .example("$0 update", "Update the NTT CLI to the latest version") + .example("$0 update --path /path/to/ntt", "Update the NTT CLI from a local repo") + .example("$0 update --branch cli", "Update the NTT CLI to the cli branch"), async (argv) => { + const localPath = argv["path"]; + if (localPath) { + if (argv["ref"]) { + console.error("Cannot specify both --path and --ref"); + process.exit(1); + } + if (argv["repo"]) { + console.error("Cannot specify both --path and --repo"); + process.exit(1); + } + await $ `${localPath}/cli/install.sh`; + } + else { + let branchArg = ""; + let repoArg = ""; + if (argv["branch"]) { + branchArg = `--branch ${argv["branch"]}`; + } + if (argv["repo"]) { + repoArg = `--repo ${argv["repo"]}`; + } + const installScript = "https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh"; + // save it to "$HOME/.ntt-cli/install.sh" + const nttDir = `${process.env.HOME}/.ntt-cli`; + const installer = `${nttDir}/install.sh`; + execSync(`mkdir -p ${nttDir}`); + execSync(`curl -s ${installScript} > ${installer}`); + execSync(`chmod +x ${installer}`); + execSync(`${installer} ${branchArg} ${repoArg}`, { stdio: "inherit" }); + } +}) + .command("new ", "create a new NTT project", (yargs) => yargs + .positional("path", { + describe: "Path to the project", + type: "string", + demandOption: true, +}) + .example("$0 new my-ntt-project", "Create a new NTT project in the 'my-ntt-project' directory"), async (argv) => { + const git = execSync("git rev-parse --is-inside-work-tree || echo false", { + stdio: ["inherit", null, null] + }); + if (git.toString().trim() === "true") { + console.error("Already in a git repository"); + process.exit(1); + } + const path = argv["path"]; + await $ `git clone -b main https://github.com/wormhole-foundation/example-native-token-transfers.git ${path}`; +}) + .command("add-chain ", "add a chain to the deployment file", (yargs) => yargs + .positional("chain", options.chain) + // TODO: add ability to specify manager address (then just pull the config) + // .option("manager", { + // describe: "Manager address", + // type: "string", + // }) + .option("program-key", { + describe: "Path to program key json (Solana)", + type: "string", +}) + .option("payer", { + describe: "Path to payer key json (Solana)", + type: "string", +}) + .option("binary", { + describe: "Path to program binary (.so file -- Solana)", + type: "string", +}) + .option("token", { + describe: "Token address", + type: "string", +}) + .option("mode", { + alias: "m", + describe: "Mode", + type: "string", + choices: ["locking", "burning"], +}) + .option("solana-priority-fee", { + describe: "Priority fee for Solana deployment (in microlamports)", + type: "number", + default: 50000, +}) + .option("signer-type", options.signerType) + .option("skip-verify", options.skipVerify) + .option("ver", options.version) + .option("latest", options.latest) + .option("local", options.local) + .option("path", options.deploymentPath) + .option("yes", options.yes) + .example("$0 add-chain Ethereum --token 0x1234... --mode burning --latest", "Add Ethereum chain with the latest contract version in burning mode") + .example("$0 add-chain Solana --token Sol1234... --mode locking --ver 1.0.0", "Add Solana chain with a specific contract version in locking mode") + .example("$0 add-chain Avalanche --token 0xabcd... --mode burning --local", "Add Avalanche chain using the local contract version"), async (argv) => { + const path = argv["path"]; + const deployments = loadConfig(path); + const chain = argv["chain"]; + const version = resolveVersion(argv["latest"], argv["ver"], argv["local"], chainToPlatform(chain)); + let mode = argv["mode"]; + const signerType = argv["signer-type"]; + const token = argv["token"]; + const network = deployments.network; + if (chain in deployments.chains) { + console.error(`Chain ${chain} already exists in ${path}`); + process.exit(1); + } + validateChain(network, chain); + const existsLocking = Object.values(deployments.chains).some((c) => c.mode === "locking"); + if (existsLocking) { + if (mode && mode === "locking") { + console.error("Only one locking chain is allowed"); + process.exit(1); + } + mode = "burning"; + } + if (!mode) { + console.error("Mode is required (use --mode)"); + process.exit(1); + } + if (!token) { + console.error("Token is required (use --token)"); + process.exit(1); + } + // let's deploy + // TODO: factor out to function to get chain context + const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(chain); + // TODO: make manager configurable + const deployedManager = await deploy(version, mode, ch, token, signerType, !argv["skip-verify"], argv["yes"], argv["payer"], argv["program-key"], argv["binary"], argv["solana-priority-fee"]); + const [config, _ctx, _ntt, decimals] = await pullChainConfig(network, deployedManager, overrides); + console.log("token decimals:", chalk.yellow(decimals)); + deployments.chains[chain] = config; + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Added ${chain} to ${path}`); +}) + .command("upgrade ", "upgrade the contract on a specific chain", (yargs) => yargs + .positional("chain", options.chain) + .option("ver", options.version) + .option("latest", { + describe: "Use the latest version", + type: "boolean", + default: false, +}) + .option("local", options.local) + .option("signer-type", options.signerType) + .option("skip-verify", options.skipVerify) + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("payer", { + describe: "Path to payer key json (Solana)", + type: "string", +}) + .option("program-key", { + describe: "Path to program key json (Solana)", + type: "string", +}) + .option("binary", { + describe: "Path to program binary (.so file -- Solana)", + type: "string", +}) + .example("$0 upgrade Ethereum --latest", "Upgrade the Ethereum contract to the latest version") + .example("$0 upgrade Solana --ver 1.1.0", "Upgrade the Solana contract to version 1.1.0") + .example("$0 upgrade Polygon --local --skip-verify", "Upgrade the Polygon contract using the local version, skipping explorer bytecode verification"), async (argv) => { + const path = argv["path"]; + const deployments = loadConfig(path); + const chain = argv["chain"]; + const signerType = argv["signer-type"]; + const network = deployments.network; + if (!(chain in deployments.chains)) { + console.error(`Chain ${chain} not found in ${path}`); + process.exit(1); + } + const chainConfig = deployments.chains[chain]; + const currentVersion = chainConfig.version; + const platform = chainToPlatform(chain); + const toVersion = resolveVersion(argv["latest"], argv["ver"], argv["local"], platform); + if (argv["local"]) { + await warnLocalDeployment(argv["yes"]); + } + if (toVersion === currentVersion && !argv["local"]) { + console.log(`Chain ${chain} is already at version ${currentVersion}`); + process.exit(0); + } + console.log(`Upgrading ${chain} from version ${currentVersion} to ${toVersion || 'local version'}`); + if (!argv["yes"]) { + await askForConfirmation(); + } + const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(chain); + const [_, ctx, ntt] = await pullChainConfig(network, { chain, address: toUniversal(chain, chainConfig.manager) }, overrides); + await upgrade(currentVersion, toVersion, ntt, ctx, signerType, !argv["skip-verify"], argv["payer"], argv["program-key"], argv["binary"]); + // reinit the ntt object to get the new version + // TODO: is there an easier way to do this? + const { ntt: upgraded } = await nttFromManager(ch, chainConfig.manager); + chainConfig.version = getVersion(chain, upgraded); + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Successfully upgraded ${chain} to version ${toVersion || 'local version'}`); +}) + .command("clone
", "initialize a deployment file from an existing contract", (yargs) => yargs + .positional("network", options.network) + .positional("chain", options.chain) + .positional("address", options.address) + .option("path", options.deploymentPath) + .option("verbose", options.verbose) + .example("$0 clone Testnet Ethereum 0x5678...", "Clone an existing Ethereum deployment on Testnet") + .example("$0 clone Mainnet Solana Sol5678... --path custom-clone.json", "Clone an existing Solana deployment on Mainnet to a custom file"), async (argv) => { + if (!isNetwork(argv["network"])) { + console.error("Invalid network"); + process.exit(1); + } + const path = argv["path"]; + const verbose = argv["verbose"]; + // check if the file exists + if (fs.existsSync(path)) { + console.error(`Deployment file already exists at ${path}`); + process.exit(1); + } + // step 1. grab the config + // step 2. discover registrations + // step 3. grab registered peer configs + // + // NOTE: we don't recursively grab peer configs. This means the + // discovered peers will be the ones that are directly registered with + // the starting manager (the one we're cloning). + // For example, if we're cloning manager A, and it's registered with + // B, and B is registered with C, but C is not registered with A, then + // C will not be included in the cloned deployment. + // We could do peer discovery recursively but that would be a lot + // slower, since peer discovery is already O(n) in the number of + // supported chains (50+), because there is no way to enumerate the peers, so we + // need to query all possible chains to see if they're registered. + const chain = argv["chain"]; + assertChain(chain); + const manager = argv["address"]; + const network = argv["network"]; + const universalManager = toUniversal(chain, manager); + const ntts = {}; + const [config, _ctx, ntt, _decimals] = await pullChainConfig(network, { chain, address: universalManager }, overrides); + ntts[chain] = ntt; + const configs = { + [chain]: config, + }; + // discover peers + let count = 0; + for (const c of chains) { + process.stdout.write(`[${count}/${chains.length - 1}] Fetching peer config for ${c}`); + await new Promise((resolve) => setTimeout(resolve, 100)); + count++; + const peer = await retryWithExponentialBackoff(() => ntt.getPeer(c), 5, 5000); + process.stdout.write(`\n`); + if (peer === null) { + continue; + } + const address = peer.address.address.toUniversalAddress(); + const [peerConfig, _ctx, peerNtt] = await pullChainConfig(network, { chain: c, address }, overrides); + ntts[c] = peerNtt; + configs[c] = peerConfig; + } + // sort chains by name + const sorted = Object.fromEntries(Object.entries(configs).sort(([a], [b]) => a.localeCompare(b))); + // sleep for a bit to avoid rate limiting when making the getDecimals call + // this can happen when the last we hit the rate limit just in the last iteration of the loop above. + // (happens more often than you'd think, because the rate limiter + // gets more aggressive after each hit) + await new Promise((resolve) => setTimeout(resolve, 2000)); + // now loop through the chains, and query their peer information to get the inbound limits + await pullInboundLimits(ntts, sorted, verbose); + const deployment = { + network: argv["network"], + chains: sorted, + }; + fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); +}) + .command("init ", "initialize a deployment file", (yargs) => yargs + .positional("network", options.network) + .option("path", options.deploymentPath) + .example("$0 init Testnet", "Initialize a new deployment file for the Testnet network") + .example("$0 init Mainnet --path custom.json", "Initialize a new deployment file for Mainnet with a custom file name"), async (argv) => { + if (!isNetwork(argv["network"])) { + console.error("Invalid network"); + process.exit(1); + } + const deployment = { + network: argv["network"], + chains: {}, + }; + const path = argv["path"]; + // check if the file exists + if (fs.existsSync(path)) { + console.error(`Deployment file already exists at ${path}. Specify a different path with --path`); + process.exit(1); + } + fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); +}) + .command("pull", "pull the remote configuration", (yargs) => yargs + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("verbose", options.verbose) + .example("$0 pull", "Pull the latest configuration from the blockchain for all chains") + .example("$0 pull --yes", "Pull the latest configuration and apply changes without confirmation"), async (argv) => { + const deployments = loadConfig(argv["path"]); + const verbose = argv["verbose"]; + const network = deployments.network; + const path = argv["path"]; + const deps = await pullDeployments(deployments, network, verbose); + let changed = false; + for (const [chain, deployment] of Object.entries(deps)) { + assertChain(chain); + const diff = diffObjects(deployments.chains[chain], deployment.config.remote); + if (Object.keys(diff).length !== 0) { + console.error(chalk.reset(colorizeDiff({ [chain]: diff }))); + changed = true; + deployments.chains[chain] = deployment.config.remote; + } + } + if (!changed) { + console.log(`${path} is already up to date`); + process.exit(0); + } + if (!argv["yes"]) { + await askForConfirmation(); + } + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Updated ${path}`); +}) + .command("push", "push the local configuration", (yargs) => yargs + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("signer-type", options.signerType) + .option("verbose", options.verbose) + .option("skip-verify", options.skipVerify) + .option("payer", options.payer) + .example("$0 push", "Push local configuration changes to the blockchain") + .example("$0 push --signer-type ledger", "Push changes using a Ledger hardware wallet for signing") + .example("$0 push --skip-verify", "Push changes without verifying contracts on EVM chains") + .example("$0 push --payer ", "Path to the payer json file (Solana), instead of setting SOLANA_PRIVATE_KEY env variable"), async (argv) => { + const deployments = loadConfig(argv["path"]); + const verbose = argv["verbose"]; + const network = deployments.network; + const deps = await pullDeployments(deployments, network, verbose); + const signerType = argv["signer-type"]; + const payerPath = argv["payer"]; + const missing = await missingConfigs(deps, verbose); + if (checkConfigErrors(deps)) { + console.error("There are errors in the config file. Please fix these before continuing."); + process.exit(1); + } + for (const [chain, missingConfig] of Object.entries(missing)) { + assertChain(chain); + const ntt = deps[chain].ntt; + const ctx = deps[chain].ctx; + const signer = await getSigner(ctx, signerType, undefined, payerPath); + for (const manager of missingConfig.managerPeers) { + const tx = ntt.setPeer(manager.address, manager.tokenDecimals, manager.inboundLimit, signer.address.address); + await signSendWait(ctx, tx, signer.signer); + } + for (const transceiver of missingConfig.transceiverPeers) { + const tx = ntt.setTransceiverPeer(0, transceiver, signer.address.address); + await signSendWait(ctx, tx, signer.signer); + } + for (const evmChain of missingConfig.evmChains) { + const tx = (await ntt.getTransceiver(0)).setIsEvmChain(evmChain, true); + await signSendWait(ctx, tx, signer.signer); + } + for (const relayingTarget of missingConfig.standardRelaying) { + const tx = (await ntt.getTransceiver(0)).setIsWormholeRelayingEnabled(relayingTarget, true); + await signSendWait(ctx, tx, signer.signer); + } + for (const relayingTarget of missingConfig.specialRelaying) { + const tx = (await ntt.getTransceiver(0)).setIsSpecialRelayingEnabled(relayingTarget, true); + await signSendWait(ctx, tx, signer.signer); + } + if (missingConfig.solanaWormholeTransceiver) { + if (chainToPlatform(chain) !== "Solana") { + console.error("Solana wormhole transceiver can only be set on Solana chains"); + continue; + } + const solanaNtt = ntt; + const tx = solanaNtt.registerWormholeTransceiver({ + payer: signer.address.address, + owner: signer.address.address, + }); + try { + await signSendWait(ctx, tx, signer.signer); + } + catch (e) { + console.error(e.logs); + } + } + if (missingConfig.solanaUpdateLUT) { + if (chainToPlatform(chain) !== "Solana") { + console.error("Solana update LUT can only be set on Solana chains"); + continue; + } + const solanaNtt = ntt; + const tx = solanaNtt.initializeOrUpdateLUT({ payer: new SolanaAddress(signer.address.address).unwrap() }); + try { + await signSendWait(ctx, tx, signer.signer); + } + catch (e) { + console.error(e.logs); + } + } + } + // pull deps again + const depsAfterRegistrations = await pullDeployments(deployments, network, verbose); + for (const [chain, deployment] of Object.entries(depsAfterRegistrations)) { + assertChain(chain); + await pushDeployment(deployment, signerType, !argv["skip-verify"], argv["yes"], payerPath); + } +}) + .command("status", "check the status of the deployment", (yargs) => yargs + .option("path", options.deploymentPath) + .option("verbose", options.verbose) + .example("$0 status", "Check the status of the deployment across all chains") + .example("$0 status --verbose", "Check the status with detailed output"), async (argv) => { + const path = argv["path"]; + const verbose = argv["verbose"]; + // TODO: I don't like the variable names here + const deployments = loadConfig(path); + const network = deployments.network; + let deps = await pullDeployments(deployments, network, verbose); + let fixable = 0; + const extraInfo = {}; + if (checkConfigErrors(deps)) { + console.error("There are errors in the config file. Please fix these before continuing."); + process.exit(1); + } + // diff remote and local configs + for (const [chain, deployment] of Object.entries(deps)) { + assertChain(chain); + const local = deployment.config.local; + const remote = deployment.config.remote; + const a = { [chain]: local }; + const b = { [chain]: remote }; + const diff = diffObjects(a, b); + if (Object.keys(diff).length !== 0) { + console.error(chalk.reset(colorizeDiff(diff))); + fixable++; + } + if (verbose) { + const immutables = await getImmutables(chain, deployment.ntt); + if (immutables) { + extraInfo[chain] = immutables; + } + const pdas = await getPdas(chain, deployment.ntt); + if (pdas) { + extraInfo[chain] = pdas; + } + } + } + if (Object.keys(extraInfo).length > 0) { + console.log(chalk.yellow(JSON.stringify(extraInfo, null, 2))); + } + // verify peers + const missing = await missingConfigs(deps, verbose); + if (Object.keys(missing).length > 0) { + fixable++; + } + for (const [chain, missingConfig] of Object.entries(missing)) { + console.error(`${chain} status:`); + for (const manager of missingConfig.managerPeers) { + console.error(` Missing manager peer: ${manager.address.chain}`); + } + for (const transceiver of missingConfig.transceiverPeers) { + console.error(` Missing transceiver peer: ${transceiver.chain}`); + } + for (const evmChain of missingConfig.evmChains) { + console.error(` ${evmChain} needs to be configured as an EVM chain`); + } + for (const relayingTarget of missingConfig.standardRelaying) { + console.warn(` No standard relaying to ${relayingTarget}`); + } + for (const relayingTarget of missingConfig.specialRelaying) { + console.warn(` No special relaying to ${relayingTarget}`); + } + if (missingConfig.solanaWormholeTransceiver) { + console.error(" Missing Solana wormhole transceiver"); + } + if (missingConfig.solanaUpdateLUT) { + console.error(" Missing or outdated LUT"); + } + } + if (fixable > 0) { + console.error("Run `ntt pull` to pull the remote configuration (overwriting the local one)"); + console.error("Run `ntt push` to push the local configuration (overwriting the remote one) by executing the necessary transactions"); + process.exit(1); + } + else { + console.log(`${path} is up to date with the on-chain configuration.`); + process.exit(0); + } +}) + .command("solana", "Solana commands", (yargs) => { + yargs + .command("key-base58 ", "print private key in base58", (yargs) => yargs + .positional("keypair", { + describe: "Path to keypair.json", + type: "string", + demandOption: true, + }), (argv) => { + const keypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(argv["keypair"]).toString()))); + console.log(encoding.b58.encode(keypair.secretKey)); + }) + .command("token-authority ", "print the token authority address for a given program ID", (yargs) => yargs + .positional("programId", { + describe: "Program ID", + type: "string", + demandOption: true, + }), (argv) => { + const programId = new PublicKey(argv["programId"]); + const tokenAuthority = NTT.pdas(programId).tokenAuthority(); + console.log(tokenAuthority.toBase58()); + }) + .command("ata ", "print the token authority address for a given program ID", (yargs) => yargs + .positional("mint", { + describe: "Mint address", + type: "string", + demandOption: true, + }) + .positional("owner", { + describe: "Owner address", + type: "string", + demandOption: true, + }) + .positional("tokenProgram", { + describe: "Token program ID", + type: "string", + choices: ["legacy", "token22"], + demandOption: true, + }), (argv) => { + const mint = new PublicKey(argv["mint"]); + const owner = new PublicKey(argv["owner"]); + const tokenProgram = argv["tokenProgram"] === "legacy" + ? spl.TOKEN_PROGRAM_ID + : spl.TOKEN_2022_PROGRAM_ID; + const ata = spl.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); + console.log(ata.toBase58()); + }) + .demandCommand(); +}) + .help() + .strict() + .demandCommand(); +function checkConfigErrors(deps) { + let fatal = 0; + for (const [chain, deployment] of Object.entries(deps)) { + assertChain(chain); + const config = deployment.config.local; + if (!checkNumberFormatting(config.limits.outbound, deployment.decimals)) { + console.error(`ERROR: ${chain} has an outbound limit (${config.limits.outbound}) with the wrong number of decimals. The number should have ${deployment.decimals} decimals.`); + fatal++; + } + if (config.limits.outbound === formatNumber(0n, deployment.decimals)) { + console.warn(chalk.yellow(`${chain} has an outbound limit of 0`)); + } + for (const [c, limit] of Object.entries(config.limits.inbound)) { + if (!checkNumberFormatting(limit, deployment.decimals)) { + console.error(`ERROR: ${chain} has an inbound limit with the wrong number of decimals for ${c} (${limit}). The number should have ${deployment.decimals} decimals.`); + fatal++; + } + if (limit === formatNumber(0n, deployment.decimals)) { + console.warn(chalk.yellow(`${chain} has an inbound limit of 0 from ${c}`)); + } + } + } + return fatal; +} +function createWorkTree(platform, version) { + const tag = getGitTagName(platform, version); + if (!tag) { + console.error(`No tag found matching ${version} for ${platform}`); + process.exit(1); + } + const worktreeName = `.deployments/${platform}-${version}`; + if (fs.existsSync(worktreeName)) { + console.log(chalk.yellow(`Worktree already exists at ${worktreeName}. Resetting to ${tag}`)); + execSync(`git -C ${worktreeName} reset --hard ${tag}`, { + stdio: "inherit" + }); + } + else { + // create worktree + execSync(`git worktree add ${worktreeName} ${tag}`, { + stdio: "inherit" + }); + } + // NOTE: we create this symlink whether or not the file exists. + // this way, if it's created later, the symlink will be correct + execSync(`ln -fs $(pwd)/overrides.json $(pwd)/${worktreeName}/overrides.json`, { + stdio: "inherit" + }); + console.log(chalk.green(`Created worktree at ${worktreeName} from tag ${tag}`)); + return worktreeName; +} +async function upgrade(_fromVersion, toVersion, ntt, ctx, signerType, evmVerify, solanaPayer, solanaProgramKeyPath, solanaBinaryPath) { + // TODO: check that fromVersion is safe to upgrade to toVersion from + const platform = chainToPlatform(ctx.chain); + const worktree = toVersion ? createWorkTree(platform, toVersion) : "."; + switch (platform) { + case "Evm": + const evmNtt = ntt; + const evmCtx = ctx; + return upgradeEvm(worktree, evmNtt, evmCtx, signerType, evmVerify); + case "Solana": + if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { + console.error("Payer not found. Specify with --payer"); + process.exit(1); + } + const solanaNtt = ntt; + const solanaCtx = ctx; + return upgradeSolana(worktree, toVersion, solanaNtt, solanaCtx, solanaPayer, solanaProgramKeyPath, solanaBinaryPath); + default: + throw new Error("Unsupported platform"); + } +} +async function upgradeEvm(pwd, ntt, ctx, signerType, evmVerify) { + ensureNttRoot(pwd); + console.log("Upgrading EVM chain", ctx.chain); + const signer = await getSigner(ctx, signerType); + const signerArgs = forgeSignerArgs(signer.source); + console.log("Installing forge dependencies..."); + execSync("forge install", { + cwd: `${pwd}/evm`, + stdio: "pipe" + }); + let verifyArgs = ""; + if (evmVerify) { + // TODO: verify etherscan api key? + const etherscanApiKey = get(ctx.chain, "scan_api_key", { reportError: true }); + if (!etherscanApiKey) { + process.exit(1); + } + verifyArgs = `--verify --etherscan-api-key ${etherscanApiKey}`; + } + console.log("Upgrading manager..."); + await withCustomEvmDeployerScript(pwd, async () => { + execSync(`forge script --via-ir script/DeployWormholeNtt.s.sol \ +--rpc-url ${ctx.config.rpc} \ +--sig "upgrade(address)" \ +${ntt.managerAddress} \ +${signerArgs} \ +--broadcast \ +${verifyArgs} | tee last-run.stdout`, { + cwd: `${pwd}/evm`, + stdio: "inherit" + }); + }); +} +async function upgradeSolana(pwd, version, ntt, ctx, payer, programKeyPath, binaryPath) { + if (version === null) { + throw new Error("Cannot upgrade Solana to local version"); // TODO: this is not hard to enabled + } + const mint = (await (ntt.getConfig())).mint; + await deploySolana(pwd, version, await ntt.getMode(), ctx, mint.toBase58(), payer, false, programKeyPath, binaryPath); + // TODO: call initializeOrUpdateLUT. currently it's done in the following 'ntt push' step. +} +async function deploy(version, mode, ch, token, signerType, evmVerify, yes, solanaPayer, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee) { + if (version === null) { + await warnLocalDeployment(yes); + } + const platform = chainToPlatform(ch.chain); + const worktree = version ? createWorkTree(platform, version) : "."; + switch (platform) { + case "Evm": + return await deployEvm(worktree, mode, ch, token, signerType, evmVerify); + case "Solana": + if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { + console.error("Payer not found. Specify with --payer"); + process.exit(1); + } + const solanaCtx = ch; + return await deploySolana(worktree, version, mode, solanaCtx, token, solanaPayer, true, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee); + default: + throw new Error("Unsupported platform"); + } +} +async function deployEvm(pwd, mode, ch, token, signerType, verify) { + ensureNttRoot(pwd); + const wormhole = ch.config.contracts.coreBridge; + if (!wormhole) { + console.error("Core bridge not found"); + process.exit(1); + } + const relayer = ch.config.contracts.relayer; + if (!relayer) { + console.error("Relayer not found"); + process.exit(1); + } + const rpc = ch.config.rpc; + // TODO: how to make specialRelayer configurable?? + let specialRelayer; + if (ch.chain === "Avalanche") { + specialRelayer = "0x1a19d8a194630642f750376Ae72b4eDF5aDFd25F"; + } + else if (ch.chain === "Bsc") { + specialRelayer = "0x8C56eE9cd232d23541a697C0eBd3cA597DE3c88D"; + } + else { + specialRelayer = "0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74"; + } + const provider = new ethers.JsonRpcProvider(rpc); + const abi = ["function decimals() external view returns (uint8)"]; + const tokenContract = new ethers.Contract(token, abi, provider); + const decimals = await tokenContract.decimals(); + // TODO: should actually make these ENV variables. + const sig = "run(address,address,address,address,uint8,uint8)"; + const modeUint = mode === "locking" ? 0 : 1; + const signer = await getSigner(ch, signerType); + const signerArgs = forgeSignerArgs(signer.source); + // TODO: verify etherscan api key? + let verifyArgs = []; + if (verify) { + const etherscanApiKey = get(ch.chain, "scan_api_key", { reportError: true }); + if (!etherscanApiKey) { + process.exit(1); + } + verifyArgs = ["--verify", "--etherscan-api-key", etherscanApiKey]; + } + console.log("Installing forge dependencies..."); + execSync("forge install", { + cwd: `${pwd}/evm`, + stdio: "pipe" + }); + console.log("Deploying manager..."); + const deploy = async (simulate) => { + const simulateArg = simulate ? "" : "--skip-simulation"; + await withCustomEvmDeployerScript(pwd, async () => { + try { + execSync(` +forge script --via-ir script/DeployWormholeNtt.s.sol \ +--rpc-url ${rpc} \ +${simulateArg} \ +--sig "${sig}" ${wormhole} ${token} ${relayer} ${specialRelayer} ${decimals} ${modeUint} \ +--broadcast ${verifyArgs.join(' ')} ${signerArgs} 2>&1 | tee last-run.stdout`, { + cwd: `${pwd}/evm`, + encoding: 'utf8', + stdio: 'inherit' + }); + } + catch (error) { + console.error("Failed to deploy manager"); + // NOTE: we don't exit here. instead, we check if the manager was + // deployed successfully (below) and proceed if it was. + // process.exit(1); + } + }); + return fs.readFileSync(`${pwd}/evm/last-run.stdout`).toString(); + }; + // we attempt to deploy with simulation first, then without if it fails + let out = await deploy(true); + if (out.includes("Simulated execution failed")) { + if (out.includes("NotActivated")) { + console.error("Simulation failed, likely because the token contract is compiled against a different EVM version. It's probably safe to continue without simulation."); + await askForConfirmation("Do you want to proceed with the deployment without simulation?"); + } + else { + console.error("Simulation failed. Please read the error message carefully, and proceed with caution."); + await askForConfirmation("Do you want to proceed with the deployment without simulation?"); + } + out = await deploy(false); + } + if (!out) { + console.error("Failed to deploy manager"); + process.exit(1); + } + const logs = out.split("\n").map((l) => l.trim()).filter((l) => l.length > 0); + const manager = logs.find((l) => l.includes("NttManager: 0x"))?.split(" ")[1]; + if (!manager) { + console.error("Manager not found"); + process.exit(1); + } + const universalManager = toUniversal(ch.chain, manager); + return { chain: ch.chain, address: universalManager }; +} +async function deploySolana(pwd, version, mode, ch, token, payer, initialize, managerKeyPath, binaryPath, priorityFee) { + ensureNttRoot(pwd); + // TODO: if the binary is provided, we should not check addresses in the source tree. (so we should move around the control flow a bit) + // TODO: factor out some of this into separate functions to help readability of this function (maybe even move to a different file) + const wormhole = ch.config.contracts.coreBridge; + if (!wormhole) { + console.error("Core bridge not found"); + process.exit(1); + } + // grep example_native_token_transfers = ".*" + // in solana/Anchor.toml + // TODO: what if they rename the program? + const existingProgramId = fs.readFileSync(`${pwd}/solana/Anchor.toml`).toString().match(/example_native_token_transfers = "(.*)"/)?.[1]; + if (!existingProgramId) { + console.error("Program ID not found in Anchor.toml (looked for example_native_token_transfers = \"(.*)\")"); + process.exit(1); + } + let programKeypairPath; + let programKeypair; + if (managerKeyPath) { + if (!fs.existsSync(managerKeyPath)) { + console.error(`Program keypair not found: ${managerKeyPath}`); + process.exit(1); + } + programKeypairPath = managerKeyPath; + programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(managerKeyPath).toString()))); + } + else { + const programKeyJson = `${existingProgramId}.json`; + if (!fs.existsSync(programKeyJson)) { + console.error(`Program keypair not found: ${programKeyJson}`); + console.error("Run `solana-keygen` to create a new keypair (either with 'new', or with 'grind'), and pass it to this command with --program-key"); + console.error("For example: solana-keygen grind --starts-with ntt:1 --ignore-case"); + process.exit(1); + } + programKeypairPath = programKeyJson; + programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(programKeyJson).toString()))); + if (existingProgramId !== programKeypair.publicKey.toBase58()) { + console.error(`The private key in ${programKeyJson} does not match the existing program ID: ${existingProgramId}`); + process.exit(1); + } + } + // see if the program key matches the existing program ID. if not, we need + // to update the latter in the Anchor.toml file and the lib.rs file(s) + const providedProgramId = programKeypair.publicKey.toBase58(); + if (providedProgramId !== existingProgramId) { + // only ask for confirmation if the current directory is ".". if it's + // something else (a worktree) then it's a fresh checkout and we just + // override the address anyway. + if (pwd === ".") { + console.error(`Program keypair does not match the existing program ID: ${existingProgramId}`); + await askForConfirmation(`Do you want to update the program ID in the Anchor.toml file and the lib.rs file to ${providedProgramId}?`); + } + const anchorTomlPath = `${pwd}/solana/Anchor.toml`; + const libRsPath = `${pwd}/solana/programs/example-native-token-transfers/src/lib.rs`; + const anchorToml = fs.readFileSync(anchorTomlPath).toString(); + const newAnchorToml = anchorToml.replace(existingProgramId, providedProgramId); + fs.writeFileSync(anchorTomlPath, newAnchorToml); + const libRs = fs.readFileSync(libRsPath).toString(); + const newLibRs = libRs.replace(existingProgramId, providedProgramId); + fs.writeFileSync(libRsPath, newLibRs); + } + // First we check that the provided mint's mint authority is the program's token authority PDA when in burning mode. + // This is checked in the program initialiser anyway, but we can save some + // time by checking it here and failing early (not to mention better + // diagnostics). + const emitter = NTT.transceiverPdas(providedProgramId).emitterAccount().toBase58(); + const payerKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(payer).toString()))); + // this is not super pretty... I want to initialise the 'ntt' object, but + // because it's not deployed yet, fetching the version will fail, and thus default to whatever the default version is. + // We want to use the correct version (because the sdk's behaviour depends on it), so we first create a dummy ntt instance, + // let that fill in all the necessary fields, and then create a new instance with the correct version. + // It should be possible to avoid this dummy object and just instantiate 'SolanaNtt' directly, but I wasn't + // sure where the various pieces are plugged together and this seemed easier. + // TODO: refactor this to avoid the dummy object + const dummy = await ch.getProtocol("Ntt", { + ntt: { + manager: providedProgramId, + token: token, + transceiver: { wormhole: emitter }, + } + }); + const ntt = new SolanaNtt(dummy.network, dummy.chain, dummy.connection, dummy.contracts, version ?? undefined); + // get the mint authority of 'token' + const tokenMint = new PublicKey(token); + // const tokenInfo = await ch.connection.getTokenInfo(tokenMint); + const connection = await ch.getRpc(); + const mintInfo = await connection.getAccountInfo(tokenMint); + if (!mintInfo) { + console.error(`Mint ${token} not found on ${ch.chain} ${ch.network}`); + process.exit(1); + } + const mint = spl.unpackMint(tokenMint, mintInfo, mintInfo.owner); + if (mode === "burning") { + const expectedMintAuthority = ntt.pdas.tokenAuthority().toBase58(); + const actualMintAuthority = mint.mintAuthority?.toBase58() ?? null; + if (actualMintAuthority !== expectedMintAuthority) { + console.error(`Mint authority mismatch for ${token}`); + console.error(`Expected: ${expectedMintAuthority}`); + console.error(`Actual: ${actualMintAuthority}`); + console.error(`Set the mint authority to the program's token authority PDA with e.g.:`); + console.error(`spl-token authorize ${token} mint ${expectedMintAuthority}`); + process.exit(1); + } + } + let binary; + { + if (binaryPath) { + binary = binaryPath; + } + else { + // build the program + // TODO: build with docker + checkAnchorVersion(); + const proc = Bun.spawn(["anchor", + "build", + "-p", "example_native_token_transfers", + "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) + ], { + cwd: `${pwd}/solana` + }); + // const _out = await new Response(proc.stdout).text(); + await proc.exited; + if (proc.exitCode !== 0) { + process.exit(proc.exitCode ?? 1); + } + binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; + } + await checkSolanaBinary(binary, wormhole, providedProgramId, version ?? undefined); + // if buffer.json doesn't exist, create it + if (!fs.existsSync(`buffer.json`)) { + execSync(`solana-keygen new -o buffer.json --no-bip39-passphrase`); + } + else { + console.info("buffer.json already exists."); + askForConfirmation("Do you want continue an exiting deployment? If not, delete the buffer.json file and run the command again."); + } + const deployCommand = [ + "solana", + "program", + "deploy", + "--program-id", programKeypairPath, + "--buffer", `buffer.json`, + binary, + "--keypair", payer, + "-u", ch.config.rpc, + "--commitment", "finalized" + ]; + if (priorityFee !== undefined) { + deployCommand.push("--with-compute-unit-price", priorityFee.toString()); + } + const deployProc = Bun.spawn(deployCommand); + const out = await new Response(deployProc.stdout).text(); + await deployProc.exited; + if (deployProc.exitCode !== 0) { + process.exit(deployProc.exitCode ?? 1); + } + // success. remove buffer.json + fs.unlinkSync("buffer.json"); + console.log(out); + } + if (initialize) { + // wait 3 seconds + await new Promise((resolve) => setTimeout(resolve, 3000)); + const tx = ntt.initialize(toUniversal(ch.chain, payerKeypair.publicKey.toBase58()), { + mint: new PublicKey(token), + mode, + outboundLimit: 100000000n, + }); + const signer = await getSigner(ch, "privateKey", encoding.b58.encode(payerKeypair.secretKey)); + try { + await signSendWait(ch, tx, signer.signer); + } + catch (e) { + console.error(e.logs); + } + } + return { chain: ch.chain, address: toUniversal(ch.chain, providedProgramId) }; +} +async function missingConfigs(deps, verbose) { + const missingConfigs = {}; + for (const [fromChain, from] of Object.entries(deps)) { + let count = 0; + assertChain(fromChain); + let missing = { + managerPeers: [], + transceiverPeers: [], + evmChains: [], + standardRelaying: [], + specialRelaying: [], + solanaWormholeTransceiver: false, + solanaUpdateLUT: false, + }; + if (chainToPlatform(fromChain) === "Solana") { + const solanaNtt = from.ntt; + const selfWormholeTransceiver = solanaNtt.pdas.registeredTransceiver(new PublicKey(solanaNtt.contracts.ntt.manager)).toBase58(); + const registeredSelfTransceiver = await retryWithExponentialBackoff(() => solanaNtt.connection.getAccountInfo(new PublicKey(selfWormholeTransceiver)), 5, 5000); + if (registeredSelfTransceiver === null) { + count++; + missing.solanaWormholeTransceiver = true; + } + // here we just check if the LUT update function returns an instruction. + // if it does, it means the LUT is missing or outdated. notice that + // we're not actually updating the LUT here, just checking if it's + // missing, so it's ok to use the 0 pubkey as the payer. + const updateLUT = solanaNtt.initializeOrUpdateLUT({ payer: new PublicKey(0) }); + // check if async generator is non-empty + if (!(await updateLUT.next()).done) { + count++; + missing.solanaUpdateLUT = true; + } + } + for (const [toChain, to] of Object.entries(deps)) { + assertChain(toChain); + if (fromChain === toChain) { + continue; + } + if (verbose) { + process.stdout.write(`Verifying registration for ${fromChain} -> ${toChain}......\n`); + } + const peer = await retryWithExponentialBackoff(() => from.ntt.getPeer(toChain), 5, 5000); + if (peer === null) { + const configLimit = from.config.local?.limits?.inbound?.[toChain]?.replace(".", ""); + count++; + missing.managerPeers.push({ + address: to.manager, + tokenDecimals: to.decimals, + inboundLimit: BigInt(configLimit ?? 0), + }); + } + else { + // @ts-ignore TODO + if (!Buffer.from(peer.address.address.address).equals(Buffer.from(to.manager.address.address))) { + console.error(`Peer address mismatch for ${fromChain} -> ${toChain}`); + } + if (peer.tokenDecimals !== to.decimals) { + console.error(`Peer decimals mismatch for ${fromChain} -> ${toChain}`); + } + } + if (chainToPlatform(fromChain) === "Evm") { + const toIsEvm = chainToPlatform(toChain) === "Evm"; + const toIsSolana = chainToPlatform(toChain) === "Solana"; + const whTransceiver = await from.ntt.getTransceiver(0); + if (toIsEvm) { + const remoteToEvm = await whTransceiver.isEvmChain(toChain); + if (!remoteToEvm) { + count++; + missing.evmChains.push(toChain); + } + const standardRelaying = await whTransceiver.isWormholeRelayingEnabled(toChain); + if (!standardRelaying) { + count++; + missing.standardRelaying.push(toChain); + } + } + else if (toIsSolana) { + const specialRelaying = await whTransceiver.isSpecialRelayingEnabled(toChain); + if (!specialRelaying) { + count++; + missing.specialRelaying.push(toChain); + } + } + } + const transceiverPeer = await retryWithExponentialBackoff(() => from.whTransceiver.getPeer(toChain), 5, 5000); + if (transceiverPeer === null) { + count++; + missing.transceiverPeers.push(to.whTransceiver.getAddress()); + } + else { + // @ts-ignore TODO + if (!Buffer.from(transceiverPeer.address.address).equals(Buffer.from(to.whTransceiver.getAddress().address.address))) { + console.error(`Transceiver peer address mismatch for ${fromChain} -> ${toChain}`); + } + } + } + if (count > 0) { + missingConfigs[fromChain] = missing; + } + } + return missingConfigs; +} +async function pushDeployment(deployment, signerType, evmVerify, yes, filePath) { + const diff = diffObjects(deployment.config.local, deployment.config.remote); + if (Object.keys(diff).length === 0) { + return; + } + const canonical = canonicalAddress(deployment.manager); + console.log(`Pushing changes to ${deployment.manager.chain} (${canonical})`); + console.log(chalk.reset(colorizeDiff(diff))); + if (!yes) { + await askForConfirmation(); + } + const ctx = deployment.ctx; + const signer = await getSigner(ctx, signerType, undefined, filePath); + let txs = []; + // we perform this last to make sure we don't accidentally lock ourselves out + let updateOwner = undefined; + let managerUpgrade; + for (const k of Object.keys(diff)) { + if (k === "version") { + // TODO: check against existing version, and make sure no major version changes + managerUpgrade = { from: diff[k].pull, to: diff[k].push }; + } + else if (k === "owner") { + const address = toUniversal(deployment.manager.chain, diff[k]?.push); + updateOwner = deployment.ntt.setOwner(address, signer.address.address); + } + else if (k === "pauser") { + const address = toUniversal(deployment.manager.chain, diff[k]?.push); + txs.push(deployment.ntt.setPauser(address, signer.address.address)); + } + else if (k === "paused") { + if (diff[k]?.push === true) { + txs.push(deployment.ntt.pause(signer.address.address)); + } + else { + txs.push(deployment.ntt.unpause(signer.address.address)); + } + } + else if (k === "limits") { + const newOutbound = diff[k]?.outbound?.push; + if (newOutbound) { + // TODO: verify amount has correct number of decimals? + // remove "." from string and convert to bigint + const newOutboundBigint = BigInt(newOutbound.replace(".", "")); + txs.push(deployment.ntt.setOutboundLimit(newOutboundBigint, signer.address.address)); + } + const inbound = diff[k]?.inbound; + if (inbound) { + for (const chain of Object.keys(inbound)) { + assertChain(chain); + const newInbound = inbound[chain]?.push; + if (newInbound) { + // TODO: verify amount has correct number of decimals? + const newInboundBigint = BigInt(newInbound.replace(".", "")); + txs.push(deployment.ntt.setInboundLimit(chain, newInboundBigint, signer.address.address)); + } + } + } + } + else if (k === "transceivers") { + // TODO: refactor this nested loop stuff into separate functions at least + // alternatively we could first recursively collect all the things + // to do into a flattened list (with entries like + // transceivers.wormhole.pauser), and have a top-level mapping of + // these entries to how they should be handled + for (const j of Object.keys(diff[k])) { + if (j === "wormhole") { + for (const l of Object.keys(diff[k][j])) { + if (l === "pauser") { + const newTransceiverPauser = toUniversal(deployment.manager.chain, diff[k][j][l].push); + txs.push(deployment.whTransceiver.setPauser(newTransceiverPauser, signer.address.address)); + } + else { + console.error(`Unsupported field: ${k}.${j}.${l}`); + process.exit(1); + } + } + } + else { + console.error(`Unsupported field: ${k}.${j}`); + process.exit(1); + } + } + } + else { + console.error(`Unsupported field: ${k}`); + process.exit(1); + } + } + if (managerUpgrade) { + await upgrade(managerUpgrade.from, managerUpgrade.to, deployment.ntt, ctx, signerType, evmVerify); + } + for (const tx of txs) { + await signSendWait(ctx, tx, signer.signer); + } + if (updateOwner) { + await signSendWait(ctx, updateOwner, signer.signer); + } +} +async function pullDeployments(deployments, network, verbose) { + let deps = {}; + for (const [chain, deployment] of Object.entries(deployments.chains)) { + if (verbose) { + process.stdout.write(`Fetching config for ${chain}......\n`); + } + assertChain(chain); + const managerAddress = deployment.manager; + if (managerAddress === undefined) { + console.error(`manager field not found for chain ${chain}`); + // process.exit(1); + continue; + } + const [remote, ctx, ntt, decimals] = await pullChainConfig(network, { chain, address: toUniversal(chain, managerAddress) }, overrides); + const local = deployments.chains[chain]; + // TODO: what if it's not index 0... + // we should check that the address of this transceiver matches the + // address in the config. currently we just assume that ix 0 is the wormhole one + const whTransceiver = await ntt.getTransceiver(0); + if (whTransceiver === null) { + console.error(`Wormhole transceiver not found for ${chain}`); + process.exit(1); + } + deps[chain] = { + ctx, + ntt, + decimals, + manager: { chain, address: toUniversal(chain, managerAddress) }, + whTransceiver, + config: { + remote, + local, + } + }; + } + const config = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.config.remote])); + const ntts = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.ntt])); + await pullInboundLimits(ntts, config, verbose); + return deps; +} +async function pullChainConfig(network, manager, overrides) { + const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(manager.chain); + const nativeManagerAddress = canonicalAddress(manager); + const { ntt, addresses } = await nttFromManager(ch, nativeManagerAddress); + const mode = await ntt.getMode(); + const outboundLimit = await ntt.getOutboundLimit(); + const threshold = await ntt.getThreshold(); + const decimals = await ntt.getTokenDecimals(); + // insert decimal point into number + const outboundLimitDecimals = formatNumber(outboundLimit, decimals); + const paused = await ntt.isPaused(); + const owner = await ntt.getOwner(); + const pauser = await ntt.getPauser(); + const version = getVersion(manager.chain, ntt); + const transceiverPauser = await ntt.getTransceiver(0).then((t) => t?.getPauser() ?? null); + const config = { + version, + mode, + paused, + owner: owner.toString(), + manager: nativeManagerAddress, + token: addresses.token, + transceivers: { + threshold, + wormhole: { address: addresses.transceiver.wormhole }, + }, + limits: { + outbound: outboundLimitDecimals, + inbound: {}, + }, + }; + if (transceiverPauser) { + config.transceivers.wormhole.pauser = transceiverPauser.toString(); + } + if (pauser) { + config.pauser = pauser.toString(); + } + return [config, ch, ntt, decimals]; +} +async function getImmutables(chain, ntt) { + const platform = chainToPlatform(chain); + if (platform !== "Evm") { + return null; + } + const evmNtt = ntt; + const transceiver = await evmNtt.getTransceiver(0); + const consistencyLevel = await transceiver.transceiver.consistencyLevel(); + const wormholeRelayer = await transceiver.transceiver.wormholeRelayer(); + const specialRelayer = await transceiver.transceiver.specialRelayer(); + const gasLimit = await transceiver.transceiver.gasLimit(); + const token = await evmNtt.manager.token(); + const tokenDecimals = await evmNtt.manager.tokenDecimals(); + const whTransceiverImmutables = { + consistencyLevel, + wormholeRelayer, + specialRelayer, + gasLimit, + }; + return { + manager: { + token, + tokenDecimals, + }, + wormholeTransceiver: whTransceiverImmutables, + }; +} +async function getPdas(chain, ntt) { + const platform = chainToPlatform(chain); + if (platform !== "Solana") { + return null; + } + const solanaNtt = ntt; + const config = solanaNtt.pdas.configAccount(); + const emitter = NTT.transceiverPdas(solanaNtt.program.programId).emitterAccount(); + const outboxRateLimit = solanaNtt.pdas.outboxRateLimitAccount(); + const tokenAuthority = solanaNtt.pdas.tokenAuthority(); + const lutAccount = solanaNtt.pdas.lutAccount(); + const lutAuthority = solanaNtt.pdas.lutAuthority(); + return { + config, + emitter, + outboxRateLimit, + tokenAuthority, + lutAccount, + lutAuthority, + }; +} +function getVersion(chain, ntt) { + const platform = chainToPlatform(chain); + switch (platform) { + case "Evm": + return ntt.version; + case "Solana": + return ntt.version; + default: + throw new Error("Unsupported platform"); + } +} +// TODO: there should be a more elegant way to do this, than creating a +// "dummy" NTT, then calling verifyAddresses to get the contract diff, then +// finally reconstructing the "real" NTT object from that +async function nttFromManager(ch, nativeManagerAddress) { + const onlyManager = await ch.getProtocol("Ntt", { + ntt: { + manager: nativeManagerAddress, + token: null, + transceiver: {}, + } + }); + const diff = await onlyManager.verifyAddresses(); + const addresses = { manager: nativeManagerAddress, ...diff }; + const ntt = await ch.getProtocol("Ntt", { + ntt: addresses + }); + return { ntt, addresses }; +} +function formatNumber(num, decimals) { + if (num === 0n) { + return "0." + "0".repeat(decimals); + } + const str = num.toString(); + const formatted = str.slice(0, -decimals) + "." + str.slice(-decimals); + if (formatted.startsWith(".")) { + return "0" + formatted; + } + return formatted; +} +function checkNumberFormatting(formatted, decimals) { + // check that the string has the correct number of decimals + const parts = formatted.split("."); + if (parts.length !== 2) { + return false; + } + if (parts[1].length !== decimals) { + return false; + } + return true; +} +function cargoNetworkFeature(network) { + switch (network) { + case "Mainnet": + return "mainnet"; + case "Testnet": + return "solana-devnet"; + case "Devnet": + return "tilt-devnet"; + default: + throw new Error("Unsupported network"); + } +} +async function askForConfirmation(prompt = "Do you want to continue?") { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + const answer = await new Promise((resolve) => { + rl.question(`${prompt} [y/n]`, resolve); + }); + rl.close(); + if (answer !== "y") { + console.log("Aborting"); + process.exit(0); + } +} +// NOTE: modifies the config object in place +// TODO: maybe introduce typestate for having pulled inbound limits? +async function pullInboundLimits(ntts, config, verbose) { + for (const [c1, ntt1] of Object.entries(ntts)) { + assertChain(c1); + const chainConf = config[c1]; + if (!chainConf) { + console.error(`Chain ${c1} not found in deployment`); + process.exit(1); + } + const decimals = await ntt1.getTokenDecimals(); + for (const [c2, ntt2] of Object.entries(ntts)) { + assertChain(c2); + if (ntt1 === ntt2) { + continue; + } + if (verbose) { + process.stdout.write(`Fetching inbound limit for ${c1} -> ${c2}.......\n`); + } + const peer = await retryWithExponentialBackoff(() => ntt1.getPeer(c2), 5, 5000); + if (chainConf.limits?.inbound === undefined) { + chainConf.limits.inbound = {}; + } + const limit = peer?.inboundLimit ?? 0n; + chainConf.limits.inbound[c2] = formatNumber(limit, decimals); + } + } +} +async function checkSolanaBinary(binary, wormhole, providedProgramId, version) { + // ensure binary path exists + if (!fs.existsSync(binary)) { + console.error(`.so file not found: ${binary}`); + process.exit(1); + } + // console.log(`Checking binary ${binary} for wormhole and provided program ID`); + // convert wormhole and providedProgramId from base58 to hex + const wormholeHex = new PublicKey(wormhole).toBuffer().toString("hex"); + const providedProgramIdHex = new PublicKey(providedProgramId).toBuffer().toString("hex"); + const versionHex = version ? Buffer.from(version).toString("hex") : undefined; + if (!searchHexInBinary(binary, wormholeHex)) { + console.error(`Wormhole address not found in binary: ${wormhole}`); + process.exit(1); + } + if (!searchHexInBinary(binary, providedProgramIdHex)) { + console.error(`Provided program ID not found in binary: ${providedProgramId}`); + process.exit(1); + } + if (versionHex && !searchHexInBinary(binary, versionHex)) ; +} +// not the most efficient, but at least it's definitely portable +function searchHexInBinary(binaryPath, searchHex) { + const buffer = fs.readFileSync(binaryPath); + const hexString = buffer.toString('hex'); + const found = hexString.includes(searchHex); + return found; +} +function ensureNttRoot(pwd = ".") { + if (!fs.existsSync(`${pwd}/evm/foundry.toml`) || !fs.existsSync(`${pwd}/solana/Anchor.toml`)) { + console.error("Run this command from the root of an NTT project."); + process.exit(1); + } +} +function checkAnchorVersion() { + const expected = "0.29.0"; + try { + execSync("which anchor"); + } + catch { + console.error("Anchor CLI is not installed.\nSee https://www.anchor-lang.com/docs/installation"); + process.exit(1); + } + const version = execSync("anchor --version").toString().trim(); + // version looks like "anchor-cli 0.14.0" + const [_, v] = version.split(" "); + if (v !== expected) { + console.error(`Anchor CLI version must be ${expected} but is ${v}`); + process.exit(1); + } +} +function loadConfig(path) { + if (!fs.existsSync(path)) { + console.error(`File not found: ${path}`); + console.error(`Create with 'ntt init' or specify another file with --path`); + process.exit(1); + } + const deployments = JSON.parse(fs.readFileSync(path).toString()); + return deployments; +} +function resolveVersion(latest, ver, local, platform) { + if ((latest ? 1 : 0) + (ver ? 1 : 0) + (local ? 1 : 0) !== 1) { + console.error("Specify exactly one of --latest, --ver, or --local"); + const available = getAvailableVersions(platform); + console.error(`Available versions for ${platform}:\n${available.join("\n")}`); + process.exit(1); + } + if (latest) { + const available = getAvailableVersions(platform); + return available.sort().reverse()[0]; + } + else if (ver) { + return ver; + } + else { + // local version + return null; + } +} +function warnLocalDeployment(yes) { + if (!yes) { + console.warn(chalk.yellow("WARNING: You are deploying from your local working directory.")); + console.warn(chalk.yellow("This bypasses version control and may deploy untested changes.")); + console.warn(chalk.yellow("Ensure your local changes are thoroughly tested and compatible.")); + return askForConfirmation("Are you sure you want to continue with the local deployment?"); + } + return Promise.resolve(); +} +function validateChain(network, chain) { + if (network === "Testnet") { + if (chain === "Ethereum") { + console.error("Ethereum is deprecated on Testnet. Use EthereumSepolia instead."); + process.exit(1); + } + // if on testnet, and the chain has a *Sepolia counterpart, use that instead + if (chains.find((c) => c === `${c}Sepolia`)) { + console.error(`Chain ${chain} is deprecated. Use ${chain}Sepolia instead.`); + process.exit(1); + } + } +} +function retryWithExponentialBackoff(fn, maxRetries, delay) { + const backoff = (retry) => Math.min(2 ** retry * delay, 10000) + Math.random() * 1000; + const attempt = async (retry) => { + try { + return await fn(); + } + catch (e) { + if (retry >= maxRetries) { + throw e; + } + const time = backoff(retry); + await new Promise((resolve) => setTimeout(resolve, backoff(time))); + return await attempt(retry + 1); + } + }; + return attempt(0); +} +function nttVersion() { + const nttDir = `${process.env.HOME}/.ntt-cli`; + try { + const versionFile = fs.readFileSync(`${nttDir}/version`).toString().trim(); + const [commit, installPath, version, remote] = versionFile.split("\n"); + return { version, commit, path: installPath, remote }; + } + catch { + return null; + } +} + +export { YARGSCommand, ensureNttRoot }; diff --git a/cli-core/dist/side-effects.d.ts b/cli-core/dist/side-effects.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/cli-core/dist/side-effects.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/cli-core/dist/tag.d.ts b/cli-core/dist/tag.d.ts new file mode 100644 index 000000000..d6cbf1bcd --- /dev/null +++ b/cli-core/dist/tag.d.ts @@ -0,0 +1,3 @@ +import type { Platform } from "@wormhole-foundation/sdk"; +export declare function getAvailableVersions

(platform: P): string[]; +export declare function getGitTagName

(platform: P, version: string): string | undefined; diff --git a/cli-core/package-lock.json b/cli-core/package-lock.json new file mode 100644 index 000000000..29dad3133 --- /dev/null +++ b/cli-core/package-lock.json @@ -0,0 +1,250 @@ +{ + "name": "cli", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cli", + "dependencies": { + "yargs": "^17.7.2" + }, + "bin": { + "cli": "index.ts" + }, + "devDependencies": { + "@types/bun": "latest", + "@types/yargs": "^17.0.32" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/@types/bun": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.0.7.tgz", + "integrity": "sha512-zaPoQi+uBaqy7BwAh6HQ5dSt6H95XeejCSGEukXHYO32xIPdzPXJjNzmCJ64TWCpM4+R7WyPMdCnkZyETAZfuw==", + "dev": true, + "dependencies": { + "bun-types": "1.0.28" + } + }, + "node_modules/@types/node": { + "version": "20.11.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/bun-types": { + "version": "1.0.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "~20.11.3", + "@types/ws": "~8.5.10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/cli-core/package.json b/cli-core/package.json new file mode 100644 index 000000000..a3341b9af --- /dev/null +++ b/cli-core/package.json @@ -0,0 +1,40 @@ +{ + "name": "@wormhole-foundation/ntt-cli-core", + "version": "1.1.0", + "module": "./dist/index.js", + "type": "module", + "devDependencies": { + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-typescript": "^12.1.2", + "@types/yargs": "^17.0.32", + "chalk": "^5.3.0", + "rollup": "^4.35.0", + "rollup-plugin-string-import": "^1.2.5", + "yargs": "^17.7.2" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "overrides": { + "rollup-plugin-string-import": { + "rollup": "^4.35.0" + } + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.ts", + "exports": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "scripts": { + "build": "rollup -c" + }, + "dependencies": { + "@solana/spl-token": "^0.4.13", + "@wormhole-foundation/sdk-definitions-ntt": "*", + "@wormhole-foundation/sdk-evm-ntt": "*", + "@wormhole-foundation/sdk-solana-ntt": "*" + } +} diff --git a/cli-core/rollup.config.js b/cli-core/rollup.config.js new file mode 100644 index 000000000..ede0d0bb9 --- /dev/null +++ b/cli-core/rollup.config.js @@ -0,0 +1,34 @@ +import { importAsString } from 'rollup-plugin-string-import'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import pkg from './package.json' with {type: 'json'}; +import json from '@rollup/plugin-json'; +const minifiedOutputs = [ + { + file: pkg.exports.import, + format: 'esm', + }, + { + file: pkg.exports.require, + format: 'cjs', + }, +]; + +console.log(minifiedOutputs); + + +/** @type {import('rollup').RollupOptions} */ +const config = { + input: 'src/index.ts', + output: minifiedOutputs, + plugins: [ + importAsString({ + include: ['**/*.txt', '**/*.frag', '**/*.vert', '**/*.sol'], + exclude: ['**/*.test.*'], + }), + json(), + typescript(), + ], +} + +export default config; diff --git a/cli/src/configuration.ts b/cli-core/src/configuration.ts similarity index 100% rename from cli/src/configuration.ts rename to cli-core/src/configuration.ts diff --git a/cli/src/diff.ts b/cli-core/src/diff.ts similarity index 100% rename from cli/src/diff.ts rename to cli-core/src/diff.ts diff --git a/cli/src/evmsigner.ts b/cli-core/src/evmsigner.ts similarity index 100% rename from cli/src/evmsigner.ts rename to cli-core/src/evmsigner.ts diff --git a/cli/src/getSigner.ts b/cli-core/src/getSigner.ts similarity index 100% rename from cli/src/getSigner.ts rename to cli-core/src/getSigner.ts diff --git a/cli-core/src/index.ts b/cli-core/src/index.ts new file mode 100755 index 000000000..d64e35c32 --- /dev/null +++ b/cli-core/src/index.ts @@ -0,0 +1,2068 @@ +import "./side-effects"; // doesn't quite work for silencing the bigint error message. why? +import evm from "@wormhole-foundation/sdk/platforms/evm"; +import solana from "@wormhole-foundation/sdk/platforms/solana"; +import { encoding } from '@wormhole-foundation/sdk-connect'; +import { execSync } from "child_process"; + +import evmDeployFile from "../../evm/script/DeployWormholeNtt.s.sol" with { type: "file" }; +import evmDeployFileHelper from "../../evm/script/helpers/DeployWormholeNttBase.sol" with { type: "file" }; + +import chalk from "chalk"; +import yargs from "yargs"; +import { $ } from "bun"; +import { hideBin } from "yargs/helpers"; +import { Connection, Keypair, PublicKey } from "@solana/web3.js"; +import * as spl from "@solana/spl-token"; +import fs from "fs"; +import readline from "readline"; +import { ChainContext, UniversalAddress, Wormhole, assertChain, canonicalAddress, chainToPlatform, chains, isNetwork, networks, platforms, signSendWait, toUniversal, type AccountAddress, type Chain, type ChainAddress, type WormholeConfigOverrides, type Network, type Platform } from "@wormhole-foundation/sdk"; +import "@wormhole-foundation/sdk-evm-ntt"; +import "@wormhole-foundation/sdk-solana-ntt"; +import "@wormhole-foundation/sdk-definitions-ntt"; +import type { Ntt, NttTransceiver } from "@wormhole-foundation/sdk-definitions-ntt"; + +import { type SolanaChains, SolanaAddress } from "@wormhole-foundation/sdk-solana"; + +import { colorizeDiff, diffObjects } from "./diff"; +import { forgeSignerArgs, getSigner, type SignerType } from "./getSigner"; +import { NTT, SolanaNtt } from "@wormhole-foundation/sdk-solana-ntt"; +import type { EvmNtt, EvmNttWormholeTranceiver } from "@wormhole-foundation/sdk-evm-ntt"; +import type { EvmChains } from "@wormhole-foundation/sdk-evm"; +import { getAvailableVersions, getGitTagName } from "./tag"; +import * as configuration from "./configuration"; +import { ethers } from "ethers"; + +// TODO: contract upgrades on solana +// TODO: set special relaying? +// TODO: currently, we just default all evm chains to standard relaying. should we not do that? what's a good way to configure this? + +// TODO: check if manager can mint the token in burning mode (on solana it's +// simple. on evm we need to simulate with prank) +const overrides: WormholeConfigOverrides = (function () { + // read overrides.json file if exists + if (fs.existsSync("overrides.json")) { + console.error(chalk.yellow("Using overrides.json")); + return JSON.parse(fs.readFileSync("overrides.json").toString()); + } else { + return {}; + } +})(); + +export type Deployment = { + ctx: ChainContext, + ntt: Ntt, + whTransceiver: NttTransceiver, + decimals: number, + manager: ChainAddress, + config: { + remote?: ChainConfig, + local?: ChainConfig, + }, +} + +// TODO: rename +export type ChainConfig = { + version: string, + mode: Ntt.Mode, + paused: boolean, + owner: string, + pauser?: string, + manager: string, + token: string, + transceivers: { + threshold: number, + wormhole: { address: string, pauser?: string }, + }, + limits: { + outbound: string, + inbound: Partial<{ [C in Chain]: string }>, + } +} + +export type Config = { + network: Network, + chains: Partial<{ + [C in Chain]: ChainConfig + }>, + defaultLimits?: { + outbound: string, + } +} + +const options = { + network: { + alias: "n", + describe: "Network", + choices: networks, + demandOption: true, + }, + deploymentPath: { + alias: "p", + describe: "Path to the deployment file", + default: "deployment.json", + type: "string", + }, + yes: { + alias: "y", + describe: "Skip confirmation", + type: "boolean", + default: false, + }, + signerType: { + alias: "s", + describe: "Signer type", + type: "string", + choices: ["privateKey", "ledger"], + default: "privateKey", + }, + verbose: { + alias: "v", + describe: "Verbose output", + type: "boolean", + default: false, + }, + chain: { + describe: "Chain", + type: "string", + choices: chains, + demandOption: true, + }, + address: { + describe: "Address", + type: "string", + demandOption: true, + }, + local: { + describe: "Use the current local version for deployment (advanced).", + type: "boolean", + default: false, + }, + version: { + describe: "Version of NTT to deploy", + type: "string", + demandOption: false, + }, + latest: { + describe: "Use the latest version", + type: "boolean", + default: false, + }, + platform: { + describe: "Platform", + type: "string", + choices: platforms, + demandOption: true, + }, + skipVerify: + { + describe: "Skip contract verification", + type: "boolean", + default: false, + }, + payer: { + describe: "Path to the payer json file (Solana)", + type: "string", + }, +} as const; + + +// TODO: this is a temporary hack to allow deploying from main (as we only need +// the changes to the evm script) +async function withCustomEvmDeployerScript(pwd: string, then: () => Promise): Promise { + ensureNttRoot(pwd); + const overrides = [ + { path: `${pwd}/evm/script/DeployWormholeNtt.s.sol`, with: evmDeployFile }, + { path: `${pwd}/evm/script/helpers/DeployWormholeNttBase.sol`, with: evmDeployFileHelper }, + ] + for (const { path, with: withFile } of overrides) { + const old = `${path}.old`; + if (fs.existsSync(path)) { + fs.copyFileSync(path, old); + } + fs.copyFileSync(withFile, path); + } + try { + return await then() + } finally { + // restore old files + for (const { path } of overrides) { + const old = `${path}.old`; + if (fs.existsSync(old)) { + fs.copyFileSync(old, path); + fs.unlinkSync(old); + } + } + } +} + +export const YARGSCommand = yargs(hideBin(process.argv)) + .wrap(Math.min(process.stdout.columns || 120, 160)) // Use terminal width, but no more than 160 characters + .scriptName("ntt") + .version((() => { + const ver = nttVersion(); + if (!ver) { + return "unknown"; + } + const { version, commit, path, remote } = ver; + const defaultPath = `${process.env.HOME}/.ntt-cli/.checkout`; + const remoteString = remote.includes("wormhole-foundation") ? "" : `${remote}@`; + if (path === defaultPath) { + return `ntt v${version} (${remoteString}${commit})`; + } else { + return `ntt v${version} (${remoteString}${commit}) from ${path}`; + } + })()) + // config group of commands + .command("config", + "configuration commands", + configuration.command + ) + .command("update", + "update the NTT CLI", + (yargs) => yargs + .option("path", { + describe: "Path to a local NTT repo to install from. If not specified, the latest version will be installed.", + type: "string", + }) + .option("branch", { + describe: "Git branch to install from", + type: "string", + }) + .option("repo", { + describe: "Git repository to install from", + type: "string", + }) + .example("$0 update", "Update the NTT CLI to the latest version") + .example("$0 update --path /path/to/ntt", "Update the NTT CLI from a local repo") + .example("$0 update --branch cli", "Update the NTT CLI to the cli branch"), + async (argv) => { + const localPath = argv["path"]; + if (localPath) { + if (argv["ref"]) { + console.error("Cannot specify both --path and --ref"); + process.exit(1); + } + if (argv["repo"]) { + console.error("Cannot specify both --path and --repo"); + process.exit(1); + } + await $`${localPath}/cli/install.sh`; + } else { + let branchArg = ""; + let repoArg = ""; + if (argv["branch"]) { + branchArg = `--branch ${argv["branch"]}`; + } + if (argv["repo"]) { + repoArg = `--repo ${argv["repo"]}`; + } + const installScript = "https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh"; + // save it to "$HOME/.ntt-cli/install.sh" + const nttDir = `${process.env.HOME}/.ntt-cli`; + const installer = `${nttDir}/install.sh`; + execSync(`mkdir -p ${nttDir}`); + execSync(`curl -s ${installScript} > ${installer}`); + execSync(`chmod +x ${installer}`); + execSync(`${installer} ${branchArg} ${repoArg}`, { stdio: "inherit" }); + } + }) + .command("new ", + "create a new NTT project", + (yargs) => yargs + .positional("path", { + describe: "Path to the project", + type: "string", + demandOption: true, + }) + .example("$0 new my-ntt-project", "Create a new NTT project in the 'my-ntt-project' directory"), + async (argv) => { + const git = execSync("git rev-parse --is-inside-work-tree || echo false", { + stdio: ["inherit", null, null] + }); + if (git.toString().trim() === "true") { + console.error("Already in a git repository"); + process.exit(1); + } + const path = argv["path"]; + await $`git clone -b main https://github.com/wormhole-foundation/example-native-token-transfers.git ${path}`; + }) + .command("add-chain ", + "add a chain to the deployment file", + (yargs) => yargs + .positional("chain", options.chain) + // TODO: add ability to specify manager address (then just pull the config) + // .option("manager", { + // describe: "Manager address", + // type: "string", + // }) + .option("program-key", { + describe: "Path to program key json (Solana)", + type: "string", + }) + .option("payer", { + describe: "Path to payer key json (Solana)", + type: "string", + }) + .option("binary", { + describe: "Path to program binary (.so file -- Solana)", + type: "string", + }) + .option("token", { + describe: "Token address", + type: "string", + }) + .option("mode", { + alias: "m", + describe: "Mode", + type: "string", + choices: ["locking", "burning"], + }) + .option("solana-priority-fee", { + describe: "Priority fee for Solana deployment (in microlamports)", + type: "number", + default: 50000, + }) + .option("signer-type", options.signerType) + .option("skip-verify", options.skipVerify) + .option("ver", options.version) + .option("latest", options.latest) + .option("local", options.local) + .option("path", options.deploymentPath) + .option("yes", options.yes) + .example("$0 add-chain Ethereum --token 0x1234... --mode burning --latest", "Add Ethereum chain with the latest contract version in burning mode") + .example("$0 add-chain Solana --token Sol1234... --mode locking --ver 1.0.0", "Add Solana chain with a specific contract version in locking mode") + .example("$0 add-chain Avalanche --token 0xabcd... --mode burning --local", "Add Avalanche chain using the local contract version"), + async (argv) => { + const path = argv["path"]; + const deployments: Config = loadConfig(path); + const chain: Chain = argv["chain"]; + const version = resolveVersion(argv["latest"], argv["ver"], argv["local"], chainToPlatform(chain)); + let mode = argv["mode"] as Ntt.Mode | undefined; + const signerType = argv["signer-type"] as SignerType; + const token = argv["token"]; + const network = deployments.network as Network; + + if (chain in deployments.chains) { + console.error(`Chain ${chain} already exists in ${path}`); + process.exit(1); + } + + validateChain(network, chain); + + const existsLocking = Object.values(deployments.chains).some((c) => c.mode === "locking"); + + if (existsLocking) { + if (mode && mode === "locking") { + console.error("Only one locking chain is allowed"); + process.exit(1); + } + mode = "burning"; + } + + if (!mode) { + console.error("Mode is required (use --mode)"); + process.exit(1); + } + + if (!token) { + console.error("Token is required (use --token)"); + process.exit(1); + } + + // let's deploy + + // TODO: factor out to function to get chain context + const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(chain); + + // TODO: make manager configurable + const deployedManager = await deploy(version, mode, ch, token, signerType, !argv["skip-verify"], argv["yes"], argv["payer"], argv["program-key"], argv["binary"], argv["solana-priority-fee"]); + + const [config, _ctx, _ntt, decimals] = + await pullChainConfig(network, deployedManager, overrides); + + console.log("token decimals:", chalk.yellow(decimals)); + + deployments.chains[chain] = config; + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Added ${chain} to ${path}`); + }) + .command("upgrade ", + "upgrade the contract on a specific chain", + (yargs) => yargs + .positional("chain", options.chain) + .option("ver", options.version) + .option("latest", { + describe: "Use the latest version", + type: "boolean", + default: false, + }) + .option("local", options.local) + .option("signer-type", options.signerType) + .option("skip-verify", options.skipVerify) + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("payer", { + describe: "Path to payer key json (Solana)", + type: "string", + }) + .option("program-key", { + describe: "Path to program key json (Solana)", + type: "string", + }) + .option("binary", { + describe: "Path to program binary (.so file -- Solana)", + type: "string", + }) + .example("$0 upgrade Ethereum --latest", "Upgrade the Ethereum contract to the latest version") + .example("$0 upgrade Solana --ver 1.1.0", "Upgrade the Solana contract to version 1.1.0") + .example("$0 upgrade Polygon --local --skip-verify", "Upgrade the Polygon contract using the local version, skipping explorer bytecode verification"), + async (argv) => { + const path = argv["path"]; + const deployments: Config = loadConfig(path); + const chain: Chain = argv["chain"]; + const signerType = argv["signer-type"] as SignerType; + const network = deployments.network as Network; + + if (!(chain in deployments.chains)) { + console.error(`Chain ${chain} not found in ${path}`); + process.exit(1); + } + + const chainConfig = deployments.chains[chain]!; + const currentVersion = chainConfig.version; + const platform = chainToPlatform(chain); + + const toVersion = resolveVersion(argv["latest"], argv["ver"], argv["local"], platform); + + if (argv["local"]) { + await warnLocalDeployment(argv["yes"]); + } + + if (toVersion === currentVersion && !argv["local"]) { + console.log(`Chain ${chain} is already at version ${currentVersion}`); + process.exit(0); + } + + console.log(`Upgrading ${chain} from version ${currentVersion} to ${toVersion || 'local version'}`); + + if (!argv["yes"]) { + await askForConfirmation(); + } + + const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(chain); + + const [_, ctx, ntt] = await pullChainConfig( + network, + { chain, address: toUniversal(chain, chainConfig.manager) }, + overrides + ); + + await upgrade( + currentVersion, + toVersion, + ntt, + ctx, + signerType, + !argv["skip-verify"], + argv["payer"], + argv["program-key"], + argv["binary"] + ); + + // reinit the ntt object to get the new version + // TODO: is there an easier way to do this? + const { ntt: upgraded } = await nttFromManager(ch, chainConfig.manager); + + chainConfig.version = getVersion(chain, upgraded) + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + + console.log(`Successfully upgraded ${chain} to version ${toVersion || 'local version'}`); + } + ) + .command("clone

", + "initialize a deployment file from an existing contract", + (yargs) => yargs + .positional("network", options.network) + .positional("chain", options.chain) + .positional("address", options.address) + .option("path", options.deploymentPath) + .option("verbose", options.verbose) + .example("$0 clone Testnet Ethereum 0x5678...", "Clone an existing Ethereum deployment on Testnet") + .example("$0 clone Mainnet Solana Sol5678... --path custom-clone.json", "Clone an existing Solana deployment on Mainnet to a custom file"), + async (argv) => { + if (!isNetwork(argv["network"])) { + console.error("Invalid network"); + process.exit(1); + } + + const path = argv["path"]; + const verbose = argv["verbose"]; + // check if the file exists + if (fs.existsSync(path)) { + console.error(`Deployment file already exists at ${path}`); + process.exit(1); + } + + // step 1. grab the config + // step 2. discover registrations + // step 3. grab registered peer configs + // + // NOTE: we don't recursively grab peer configs. This means the + // discovered peers will be the ones that are directly registered with + // the starting manager (the one we're cloning). + // For example, if we're cloning manager A, and it's registered with + // B, and B is registered with C, but C is not registered with A, then + // C will not be included in the cloned deployment. + // We could do peer discovery recursively but that would be a lot + // slower, since peer discovery is already O(n) in the number of + // supported chains (50+), because there is no way to enumerate the peers, so we + // need to query all possible chains to see if they're registered. + + const chain = argv["chain"]; + assertChain(chain) + + const manager = argv["address"]; + const network = argv["network"]; + + const universalManager = toUniversal(chain, manager); + + const ntts: Partial<{ [C in Chain]: Ntt }> = {}; + + const [config, _ctx, ntt, _decimals] = + await pullChainConfig(network, { chain, address: universalManager }, overrides); + + ntts[chain] = ntt as any; + + const configs: Partial<{ [C in Chain]: ChainConfig }> = { + [chain]: config, + } + + // discover peers + let count = 0; + for (const c of chains) { + process.stdout.write(`[${count}/${chains.length - 1}] Fetching peer config for ${c}`); + await new Promise((resolve) => setTimeout(resolve, 100)); + count++; + + const peer = await retryWithExponentialBackoff(() => ntt.getPeer(c), 5, 5000); + + process.stdout.write(`\n`); + if (peer === null) { + continue; + } + const address: UniversalAddress = peer.address.address.toUniversalAddress() + const [peerConfig, _ctx, peerNtt] = await pullChainConfig(network, { chain: c, address }, overrides); + ntts[c] = peerNtt as any; + configs[c] = peerConfig; + } + + // sort chains by name + const sorted = Object.fromEntries(Object.entries(configs).sort(([a], [b]) => a.localeCompare(b))); + + // sleep for a bit to avoid rate limiting when making the getDecimals call + // this can happen when the last we hit the rate limit just in the last iteration of the loop above. + // (happens more often than you'd think, because the rate limiter + // gets more aggressive after each hit) + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // now loop through the chains, and query their peer information to get the inbound limits + await pullInboundLimits(ntts, sorted, verbose) + + const deployment: Config = { + network: argv["network"], + chains: sorted, + }; + fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); + }) + .command("init ", + "initialize a deployment file", + (yargs) => yargs + .positional("network", options.network) + .option("path", options.deploymentPath) + .example("$0 init Testnet", "Initialize a new deployment file for the Testnet network") + .example("$0 init Mainnet --path custom.json", "Initialize a new deployment file for Mainnet with a custom file name"), + async (argv) => { + if (!isNetwork(argv["network"])) { + console.error("Invalid network"); + process.exit(1); + } + const deployment = { + network: argv["network"], + chains: {}, + }; + const path = argv["path"]; + // check if the file exists + if (fs.existsSync(path)) { + console.error(`Deployment file already exists at ${path}. Specify a different path with --path`); + process.exit(1); + } + fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); + }) + .command("pull", + "pull the remote configuration", + (yargs) => yargs + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("verbose", options.verbose) + .example("$0 pull", "Pull the latest configuration from the blockchain for all chains") + .example("$0 pull --yes", "Pull the latest configuration and apply changes without confirmation"), + async (argv) => { + const deployments: Config = loadConfig(argv["path"]); + const verbose = argv["verbose"]; + const network = deployments.network as Network; + const path = argv["path"]; + const deps: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); + + let changed = false; + for (const [chain, deployment] of Object.entries(deps)) { + assertChain(chain); + const diff = diffObjects(deployments.chains[chain]!, deployment.config.remote!); + if (Object.keys(diff).length !== 0) { + console.error(chalk.reset(colorizeDiff({ [chain]: diff }))); + changed = true; + deployments.chains[chain] = deployment.config.remote! + } + } + if (!changed) { + console.log(`${path} is already up to date`); + process.exit(0); + } + + if (!argv["yes"]) { + await askForConfirmation(); + } + fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); + console.log(`Updated ${path}`); + }) + .command("push", + "push the local configuration", + (yargs) => yargs + .option("path", options.deploymentPath) + .option("yes", options.yes) + .option("signer-type", options.signerType) + .option("verbose", options.verbose) + .option("skip-verify", options.skipVerify) + .option("payer", options.payer) + .example("$0 push", "Push local configuration changes to the blockchain") + .example("$0 push --signer-type ledger", "Push changes using a Ledger hardware wallet for signing") + .example("$0 push --skip-verify", "Push changes without verifying contracts on EVM chains") + .example("$0 push --payer ", "Path to the payer json file (Solana), instead of setting SOLANA_PRIVATE_KEY env variable"), + async (argv) => { + const deployments: Config = loadConfig(argv["path"]); + const verbose = argv["verbose"]; + const network = deployments.network as Network; + const deps: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); + const signerType = argv["signer-type"] as SignerType; + const payerPath = argv["payer"]; + + const missing = await missingConfigs(deps, verbose); + + if (checkConfigErrors(deps)) { + console.error("There are errors in the config file. Please fix these before continuing."); + process.exit(1); + } + + for (const [chain, missingConfig] of Object.entries(missing)) { + assertChain(chain); + const ntt = deps[chain]!.ntt; + const ctx = deps[chain]!.ctx; + const signer = await getSigner(ctx, signerType, undefined, payerPath); + for (const manager of missingConfig.managerPeers) { + const tx = ntt.setPeer(manager.address, manager.tokenDecimals, manager.inboundLimit, signer.address.address) + await signSendWait(ctx, tx, signer.signer) + } + for (const transceiver of missingConfig.transceiverPeers) { + const tx = ntt.setTransceiverPeer(0, transceiver, signer.address.address) + await signSendWait(ctx, tx, signer.signer) + } + for (const evmChain of missingConfig.evmChains) { + const tx = (await ntt.getTransceiver(0) as EvmNttWormholeTranceiver).setIsEvmChain(evmChain, true) + await signSendWait(ctx, tx, signer.signer) + } + for (const relayingTarget of missingConfig.standardRelaying) { + const tx = (await ntt.getTransceiver(0) as EvmNttWormholeTranceiver).setIsWormholeRelayingEnabled(relayingTarget, true) + await signSendWait(ctx, tx, signer.signer) + } + for (const relayingTarget of missingConfig.specialRelaying) { + const tx = (await ntt.getTransceiver(0) as EvmNttWormholeTranceiver).setIsSpecialRelayingEnabled(relayingTarget, true) + await signSendWait(ctx, tx, signer.signer) + } + if (missingConfig.solanaWormholeTransceiver) { + if (chainToPlatform(chain) !== "Solana") { + console.error("Solana wormhole transceiver can only be set on Solana chains"); + continue; + } + const solanaNtt = ntt as SolanaNtt; + const tx = solanaNtt.registerWormholeTransceiver({ + payer: signer.address.address as AccountAddress, + owner: signer.address.address as AccountAddress, + }) + try { + await signSendWait(ctx, tx, signer.signer) + } catch (e: any) { + console.error(e.logs); + } + } + if (missingConfig.solanaUpdateLUT) { + if (chainToPlatform(chain) !== "Solana") { + console.error("Solana update LUT can only be set on Solana chains"); + continue; + } + const solanaNtt = ntt as SolanaNtt; + const tx = solanaNtt.initializeOrUpdateLUT({ payer: new SolanaAddress(signer.address.address).unwrap() }) + try { + await signSendWait(ctx, tx, signer.signer) + } catch (e: any) { + console.error(e.logs); + } + } + } + + // pull deps again + const depsAfterRegistrations: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); + + for (const [chain, deployment] of Object.entries(depsAfterRegistrations)) { + assertChain(chain); + await pushDeployment(deployment as any, signerType, !argv["skip-verify"], argv["yes"], payerPath); + } + }) + .command("status", + "check the status of the deployment", + (yargs) => yargs + .option("path", options.deploymentPath) + .option("verbose", options.verbose) + .example("$0 status", "Check the status of the deployment across all chains") + .example("$0 status --verbose", "Check the status with detailed output"), + async (argv) => { + const path = argv["path"]; + const verbose = argv["verbose"]; + // TODO: I don't like the variable names here + const deployments: Config = loadConfig(path); + + const network = deployments.network as Network; + + let deps: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); + + let fixable = 0; + + const extraInfo: any = {}; + + if (checkConfigErrors(deps)) { + console.error("There are errors in the config file. Please fix these before continuing."); + process.exit(1); + } + + // diff remote and local configs + for (const [chain, deployment] of Object.entries(deps)) { + assertChain(chain); + const local = deployment.config.local; + const remote = deployment.config.remote; + const a = { [chain]: local! }; + const b = { [chain]: remote! }; + + const diff = diffObjects(a, b); + if (Object.keys(diff).length !== 0) { + console.error(chalk.reset(colorizeDiff(diff))); + fixable++; + } + + if (verbose) { + const immutables = await getImmutables(chain, deployment.ntt); + if (immutables) { + extraInfo[chain] = immutables; + } + const pdas = await getPdas(chain, deployment.ntt); + if (pdas) { + extraInfo[chain] = pdas; + } + } + } + + if (Object.keys(extraInfo).length > 0) { + console.log(chalk.yellow(JSON.stringify(extraInfo, null, 2))); + } + + // verify peers + const missing = await missingConfigs(deps, verbose); + + if (Object.keys(missing).length > 0) { + fixable++; + } + + for (const [chain, missingConfig] of Object.entries(missing)) { + console.error(`${chain} status:`); + for (const manager of missingConfig.managerPeers) { + console.error(` Missing manager peer: ${manager.address.chain}`); + } + for (const transceiver of missingConfig.transceiverPeers) { + console.error(` Missing transceiver peer: ${transceiver.chain}`); + } + for (const evmChain of missingConfig.evmChains) { + console.error(` ${evmChain} needs to be configured as an EVM chain`); + } + for (const relayingTarget of missingConfig.standardRelaying) { + console.warn(` No standard relaying to ${relayingTarget}`); + } + for (const relayingTarget of missingConfig.specialRelaying) { + console.warn(` No special relaying to ${relayingTarget}`); + } + if (missingConfig.solanaWormholeTransceiver) { + console.error(" Missing Solana wormhole transceiver"); + } + if (missingConfig.solanaUpdateLUT) { + console.error(" Missing or outdated LUT"); + } + } + + if (fixable > 0) { + console.error("Run `ntt pull` to pull the remote configuration (overwriting the local one)"); + console.error("Run `ntt push` to push the local configuration (overwriting the remote one) by executing the necessary transactions"); + process.exit(1); + } else { + console.log(`${path} is up to date with the on-chain configuration.`); + process.exit(0); + } + }) + .command("solana", + "Solana commands", + (yargs) => { + yargs + .command("key-base58 ", + "print private key in base58", + (yargs) => yargs + .positional("keypair", { + describe: "Path to keypair.json", + type: "string", + demandOption: true, + }), + (argv) => { + const keypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(argv["keypair"]).toString()))); + console.log(encoding.b58.encode(keypair.secretKey)); + }) + .command("token-authority ", + "print the token authority address for a given program ID", + (yargs) => yargs + .positional("programId", { + describe: "Program ID", + type: "string", + demandOption: true, + }), + (argv) => { + const programId = new PublicKey(argv["programId"]); + const tokenAuthority = NTT.pdas(programId).tokenAuthority(); + console.log(tokenAuthority.toBase58()); + }) + .command("ata ", + "print the token authority address for a given program ID", + (yargs) => yargs + .positional("mint", { + describe: "Mint address", + type: "string", + demandOption: true, + }) + .positional("owner", { + describe: "Owner address", + type: "string", + demandOption: true, + }) + .positional("tokenProgram", { + describe: "Token program ID", + type: "string", + choices: ["legacy", "token22"], + demandOption: true, + }), + (argv) => { + const mint = new PublicKey(argv["mint"]); + const owner = new PublicKey(argv["owner"]); + const tokenProgram = argv["tokenProgram"] === "legacy" + ? spl.TOKEN_PROGRAM_ID + : spl.TOKEN_2022_PROGRAM_ID + const ata = spl.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); + console.log(ata.toBase58()); + }) + .demandCommand() + } + ) + .help() + .strict() + .demandCommand() + +// Implicit configuration that's missing from a contract deployment. These are +// implicit in the sense that they don't need to be explicitly set in the +// deployment file. +// For example, all managers and transceivers need to be registered with each other. +// Additionally, the EVM chains need to be registered as such, and the standard relaying +// needs to be enabled for all chains where this is supported. +type MissingImplicitConfig = { + managerPeers: Ntt.Peer[]; + transceiverPeers: ChainAddress[]; + evmChains: Chain[]; + standardRelaying: Chain[]; + specialRelaying: Chain[]; + solanaWormholeTransceiver: boolean; + solanaUpdateLUT: boolean; +} + +function checkConfigErrors(deps: Partial<{ [C in Chain]: Deployment }>): number { + let fatal = 0; + for (const [chain, deployment] of Object.entries(deps)) { + assertChain(chain); + const config = deployment.config.local!; + if (!checkNumberFormatting(config.limits.outbound, deployment.decimals)) { + console.error(`ERROR: ${chain} has an outbound limit (${config.limits.outbound}) with the wrong number of decimals. The number should have ${deployment.decimals} decimals.`); + fatal++; + } + if (config.limits.outbound === formatNumber(0n, deployment.decimals)) { + console.warn(chalk.yellow(`${chain} has an outbound limit of 0`)); + } + for (const [c, limit] of Object.entries(config.limits.inbound)) { + if (!checkNumberFormatting(limit, deployment.decimals)) { + console.error(`ERROR: ${chain} has an inbound limit with the wrong number of decimals for ${c} (${limit}). The number should have ${deployment.decimals} decimals.`); + fatal++; + } + if (limit === formatNumber(0n, deployment.decimals)) { + console.warn(chalk.yellow(`${chain} has an inbound limit of 0 from ${c}`)); + } + } + } + return fatal; +} + +function createWorkTree(platform: Platform, version: string): string { + const tag = getGitTagName(platform, version); + if (!tag) { + console.error(`No tag found matching ${version} for ${platform}`); + process.exit(1); + } + + const worktreeName = `.deployments/${platform}-${version}`; + + if (fs.existsSync(worktreeName)) { + console.log(chalk.yellow(`Worktree already exists at ${worktreeName}. Resetting to ${tag}`)); + execSync(`git -C ${worktreeName} reset --hard ${tag}`, { + stdio: "inherit" + }); + } else { + // create worktree + execSync(`git worktree add ${worktreeName} ${tag}`, { + stdio: "inherit" + }); + } + + // NOTE: we create this symlink whether or not the file exists. + // this way, if it's created later, the symlink will be correct + execSync(`ln -fs $(pwd)/overrides.json $(pwd)/${worktreeName}/overrides.json`, { + stdio: "inherit" + }); + + console.log(chalk.green(`Created worktree at ${worktreeName} from tag ${tag}`)); + return worktreeName; +} + +async function upgrade( + _fromVersion: string, + toVersion: string | null, + ntt: Ntt, + ctx: ChainContext, + signerType: SignerType, + evmVerify: boolean, + solanaPayer?: string, + solanaProgramKeyPath?: string, + solanaBinaryPath?: string +): Promise { + // TODO: check that fromVersion is safe to upgrade to toVersion from + const platform = chainToPlatform(ctx.chain); + const worktree = toVersion ? createWorkTree(platform, toVersion) : "."; + switch (platform) { + case "Evm": + const evmNtt = ntt as EvmNtt; + const evmCtx = ctx as ChainContext; + return upgradeEvm(worktree, evmNtt, evmCtx, signerType, evmVerify); + case "Solana": + if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { + console.error("Payer not found. Specify with --payer"); + process.exit(1); + } + const solanaNtt = ntt as SolanaNtt; + const solanaCtx = ctx as ChainContext; + return upgradeSolana(worktree, toVersion, solanaNtt, solanaCtx, solanaPayer, solanaProgramKeyPath, solanaBinaryPath); + default: + throw new Error("Unsupported platform"); + } +} + +async function upgradeEvm( + pwd: string, + ntt: EvmNtt, + ctx: ChainContext, + signerType: SignerType, + evmVerify: boolean +): Promise { + ensureNttRoot(pwd); + + console.log("Upgrading EVM chain", ctx.chain); + + const signer = await getSigner(ctx, signerType); + const signerArgs = forgeSignerArgs(signer.source); + + console.log("Installing forge dependencies...") + execSync("forge install", { + cwd: `${pwd}/evm`, + stdio: "pipe" + }); + + let verifyArgs: string = ""; + if (evmVerify) { + // TODO: verify etherscan api key? + const etherscanApiKey = configuration.get(ctx.chain, "scan_api_key", { reportError: true }) + if (!etherscanApiKey) { + process.exit(1); + } + verifyArgs = `--verify --etherscan-api-key ${etherscanApiKey}`; + } + + console.log("Upgrading manager..."); + await withCustomEvmDeployerScript(pwd, async () => { + execSync( + `forge script --via-ir script/DeployWormholeNtt.s.sol \ +--rpc-url ${ctx.config.rpc} \ +--sig "upgrade(address)" \ +${ntt.managerAddress} \ +${signerArgs} \ +--broadcast \ +${verifyArgs} | tee last-run.stdout`, { + cwd: `${pwd}/evm`, + stdio: "inherit" + }); + }); + +} + +async function upgradeSolana( + pwd: string, + version: string | null, + ntt: SolanaNtt, + ctx: ChainContext, + payer: string, + programKeyPath?: string, + binaryPath?: string +): Promise { + if (version === null) { + throw new Error("Cannot upgrade Solana to local version"); // TODO: this is not hard to enabled + } + const mint = (await (ntt.getConfig())).mint; + await deploySolana(pwd, version, await ntt.getMode(), ctx, mint.toBase58(), payer, false, programKeyPath, binaryPath); + // TODO: call initializeOrUpdateLUT. currently it's done in the following 'ntt push' step. +} + +async function deploy( + version: string | null, + mode: Ntt.Mode, + ch: ChainContext, + token: string, + signerType: SignerType, + evmVerify: boolean, + yes: boolean, + solanaPayer?: string, + solanaProgramKeyPath?: string, + solanaBinaryPath?: string, + solanaPriorityFee?: number +): Promise> { + if (version === null) { + await warnLocalDeployment(yes); + } + const platform = chainToPlatform(ch.chain); + const worktree = version ? createWorkTree(platform, version) : "."; + switch (platform) { + case "Evm": + return await deployEvm(worktree, mode, ch, token, signerType, evmVerify); + case "Solana": + if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { + console.error("Payer not found. Specify with --payer"); + process.exit(1); + } + const solanaCtx = ch as ChainContext; + return await deploySolana(worktree, version, mode, solanaCtx, token, solanaPayer, true, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee) as ChainAddress; + default: + throw new Error("Unsupported platform"); + } +} + +async function deployEvm( + pwd: string, + mode: Ntt.Mode, + ch: ChainContext, + token: string, + signerType: SignerType, + verify: boolean, +): Promise> { + ensureNttRoot(pwd); + + const wormhole = ch.config.contracts.coreBridge; + if (!wormhole) { + console.error("Core bridge not found"); + process.exit(1); + } + const relayer = ch.config.contracts.relayer; + if (!relayer) { + console.error("Relayer not found"); + process.exit(1); + } + + const rpc = ch.config.rpc; + // TODO: how to make specialRelayer configurable?? + let specialRelayer: string; + if (ch.chain === "Avalanche") { + specialRelayer = "0x1a19d8a194630642f750376Ae72b4eDF5aDFd25F"; + } else if (ch.chain === "Bsc") { + specialRelayer = "0x8C56eE9cd232d23541a697C0eBd3cA597DE3c88D"; + } else { + specialRelayer = "0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74"; + } + + const provider = new ethers.JsonRpcProvider(rpc); + const abi = ["function decimals() external view returns (uint8)"]; + const tokenContract = new ethers.Contract(token, abi, provider); + const decimals: number = await tokenContract.decimals(); + + // TODO: should actually make these ENV variables. + const sig = "run(address,address,address,address,uint8,uint8)"; + const modeUint = mode === "locking" ? 0 : 1; + const signer = await getSigner(ch, signerType); + const signerArgs = forgeSignerArgs(signer.source); + + // TODO: verify etherscan api key? + let verifyArgs: string[] = []; + if (verify) { + const etherscanApiKey = configuration.get(ch.chain, "scan_api_key", { reportError: true }) + if (!etherscanApiKey) { + process.exit(1); + } + verifyArgs = ["--verify", "--etherscan-api-key", etherscanApiKey] + } + + console.log("Installing forge dependencies...") + execSync("forge install", { + cwd: `${pwd}/evm`, + stdio: "pipe" + }); + + console.log("Deploying manager..."); + const deploy = async (simulate: boolean): Promise => { + const simulateArg = simulate ? "" : "--skip-simulation"; + await withCustomEvmDeployerScript(pwd, async () => { + try { + execSync(` +forge script --via-ir script/DeployWormholeNtt.s.sol \ +--rpc-url ${rpc} \ +${simulateArg} \ +--sig "${sig}" ${wormhole} ${token} ${relayer} ${specialRelayer} ${decimals} ${modeUint} \ +--broadcast ${verifyArgs.join(' ')} ${signerArgs} 2>&1 | tee last-run.stdout`, { + cwd: `${pwd}/evm`, + encoding: 'utf8', + stdio: 'inherit' + }); + } catch (error) { + console.error("Failed to deploy manager"); + // NOTE: we don't exit here. instead, we check if the manager was + // deployed successfully (below) and proceed if it was. + // process.exit(1); + } + }); + return fs.readFileSync(`${pwd}/evm/last-run.stdout`).toString(); + } + + // we attempt to deploy with simulation first, then without if it fails + let out = await deploy(true); + if (out.includes("Simulated execution failed")) { + if (out.includes("NotActivated")) { + console.error("Simulation failed, likely because the token contract is compiled against a different EVM version. It's probably safe to continue without simulation.") + await askForConfirmation("Do you want to proceed with the deployment without simulation?"); + } else { + console.error("Simulation failed. Please read the error message carefully, and proceed with caution."); + await askForConfirmation("Do you want to proceed with the deployment without simulation?"); + } + out = await deploy(false); + } + + if (!out) { + console.error("Failed to deploy manager"); + process.exit(1); + } + const logs = out.split("\n").map((l) => l.trim()).filter((l) => l.length > 0); + const manager = logs.find((l) => l.includes("NttManager: 0x"))?.split(" ")[1]; + if (!manager) { + console.error("Manager not found"); + process.exit(1); + } + const universalManager = toUniversal(ch.chain, manager); + return { chain: ch.chain, address: universalManager }; +} + +async function deploySolana( + pwd: string, + version: string | null, + mode: Ntt.Mode, + ch: ChainContext, + token: string, + payer: string, + initialize: boolean, + managerKeyPath?: string, + binaryPath?: string, + priorityFee?: number +): Promise> { + ensureNttRoot(pwd); + + // TODO: if the binary is provided, we should not check addresses in the source tree. (so we should move around the control flow a bit) + // TODO: factor out some of this into separate functions to help readability of this function (maybe even move to a different file) + + const wormhole = ch.config.contracts.coreBridge; + if (!wormhole) { + console.error("Core bridge not found"); + process.exit(1); + } + + // grep example_native_token_transfers = ".*" + // in solana/Anchor.toml + // TODO: what if they rename the program? + const existingProgramId = fs.readFileSync(`${pwd}/solana/Anchor.toml`).toString().match(/example_native_token_transfers = "(.*)"/)?.[1]; + if (!existingProgramId) { + console.error("Program ID not found in Anchor.toml (looked for example_native_token_transfers = \"(.*)\")"); + process.exit(1); + } + + let programKeypairPath; + let programKeypair; + + if (managerKeyPath) { + if (!fs.existsSync(managerKeyPath)) { + console.error(`Program keypair not found: ${managerKeyPath}`); + process.exit(1); + } + programKeypairPath = managerKeyPath; + programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(managerKeyPath).toString()))); + } else { + const programKeyJson = `${existingProgramId}.json`; + if (!fs.existsSync(programKeyJson)) { + console.error(`Program keypair not found: ${programKeyJson}`); + console.error("Run `solana-keygen` to create a new keypair (either with 'new', or with 'grind'), and pass it to this command with --program-key"); + console.error("For example: solana-keygen grind --starts-with ntt:1 --ignore-case") + process.exit(1); + } + programKeypairPath = programKeyJson; + programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(programKeyJson).toString()))); + if (existingProgramId !== programKeypair.publicKey.toBase58()) { + console.error(`The private key in ${programKeyJson} does not match the existing program ID: ${existingProgramId}`); + process.exit(1); + } + } + + // see if the program key matches the existing program ID. if not, we need + // to update the latter in the Anchor.toml file and the lib.rs file(s) + const providedProgramId = programKeypair.publicKey.toBase58(); + if (providedProgramId !== existingProgramId) { + // only ask for confirmation if the current directory is ".". if it's + // something else (a worktree) then it's a fresh checkout and we just + // override the address anyway. + if (pwd === ".") { + console.error(`Program keypair does not match the existing program ID: ${existingProgramId}`); + await askForConfirmation(`Do you want to update the program ID in the Anchor.toml file and the lib.rs file to ${providedProgramId}?`); + } + + const anchorTomlPath = `${pwd}/solana/Anchor.toml`; + const libRsPath = `${pwd}/solana/programs/example-native-token-transfers/src/lib.rs`; + + const anchorToml = fs.readFileSync(anchorTomlPath).toString(); + const newAnchorToml = anchorToml.replace(existingProgramId, providedProgramId); + fs.writeFileSync(anchorTomlPath, newAnchorToml); + const libRs = fs.readFileSync(libRsPath).toString(); + const newLibRs = libRs.replace(existingProgramId, providedProgramId); + fs.writeFileSync(libRsPath, newLibRs); + } + + + // First we check that the provided mint's mint authority is the program's token authority PDA when in burning mode. + // This is checked in the program initialiser anyway, but we can save some + // time by checking it here and failing early (not to mention better + // diagnostics). + + const emitter = NTT.transceiverPdas(providedProgramId).emitterAccount().toBase58(); + const payerKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(payer).toString()))); + + // this is not super pretty... I want to initialise the 'ntt' object, but + // because it's not deployed yet, fetching the version will fail, and thus default to whatever the default version is. + // We want to use the correct version (because the sdk's behaviour depends on it), so we first create a dummy ntt instance, + // let that fill in all the necessary fields, and then create a new instance with the correct version. + // It should be possible to avoid this dummy object and just instantiate 'SolanaNtt' directly, but I wasn't + // sure where the various pieces are plugged together and this seemed easier. + // TODO: refactor this to avoid the dummy object + const dummy: SolanaNtt = await ch.getProtocol("Ntt", { + ntt: { + manager: providedProgramId, + token: token, + transceiver: { wormhole: emitter }, + } + }) as SolanaNtt; + + const ntt: SolanaNtt = new SolanaNtt( + dummy.network, + dummy.chain, + dummy.connection, + dummy.contracts, + version ?? undefined + ); + + // get the mint authority of 'token' + const tokenMint = new PublicKey(token); + // const tokenInfo = await ch.connection.getTokenInfo(tokenMint); + const connection: Connection = await ch.getRpc(); + const mintInfo = await connection.getAccountInfo(tokenMint) + if (!mintInfo) { + console.error(`Mint ${token} not found on ${ch.chain} ${ch.network}`); + process.exit(1); + } + const mint = spl.unpackMint(tokenMint, mintInfo, mintInfo.owner); + + if (mode === "burning") { + const expectedMintAuthority = ntt.pdas.tokenAuthority().toBase58(); + const actualMintAuthority: string | null = mint.mintAuthority?.toBase58() ?? null; + if (actualMintAuthority !== expectedMintAuthority) { + console.error(`Mint authority mismatch for ${token}`); + console.error(`Expected: ${expectedMintAuthority}`); + console.error(`Actual: ${actualMintAuthority}`); + console.error(`Set the mint authority to the program's token authority PDA with e.g.:`); + console.error(`spl-token authorize ${token} mint ${expectedMintAuthority}`); + process.exit(1); + } + } + + let binary: string; + + const skipDeploy = false; + + if (!skipDeploy) { + if (binaryPath) { + binary = binaryPath; + } else { + // build the program + // TODO: build with docker + checkAnchorVersion(); + const proc = Bun.spawn( + ["anchor", + "build", + "-p", "example_native_token_transfers", + "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) + ], { + cwd: `${pwd}/solana` + }); + + // const _out = await new Response(proc.stdout).text(); + + await proc.exited; + if (proc.exitCode !== 0) { + process.exit(proc.exitCode ?? 1); + } + + binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; + } + + + await checkSolanaBinary(binary, wormhole, providedProgramId, version ?? undefined) + + // if buffer.json doesn't exist, create it + if (!fs.existsSync(`buffer.json`)) { + execSync(`solana-keygen new -o buffer.json --no-bip39-passphrase`); + } else { + console.info("buffer.json already exists.") + askForConfirmation("Do you want continue an exiting deployment? If not, delete the buffer.json file and run the command again."); + } + + const deployCommand = [ + "solana", + "program", + "deploy", + "--program-id", programKeypairPath, + "--buffer", `buffer.json`, + binary, + "--keypair", payer, + "-u", ch.config.rpc, + "--commitment", "finalized" + ]; + + if (priorityFee !== undefined) { + deployCommand.push("--with-compute-unit-price", priorityFee.toString()); + } + + const deployProc = Bun.spawn(deployCommand); + + const out = await new Response(deployProc.stdout).text(); + + await deployProc.exited; + + if (deployProc.exitCode !== 0) { + process.exit(deployProc.exitCode ?? 1); + } + + // success. remove buffer.json + fs.unlinkSync("buffer.json"); + + console.log(out); + } + + if (initialize) { + // wait 3 seconds + await new Promise((resolve) => setTimeout(resolve, 3000)); + + const tx = ntt.initialize( + toUniversal(ch.chain, payerKeypair.publicKey.toBase58()), + { + mint: new PublicKey(token), + mode, + outboundLimit: 100000000n, + }); + + const signer = await getSigner(ch, "privateKey", encoding.b58.encode(payerKeypair.secretKey)); + + try { + await signSendWait(ch, tx, signer.signer); + } catch (e: any) { + console.error(e.logs); + } + } + + return { chain: ch.chain, address: toUniversal(ch.chain, providedProgramId) }; +} + +async function missingConfigs( + deps: Partial<{ [C in Chain]: Deployment }>, + verbose: boolean, +): Promise> { + const missingConfigs: Partial<{ [C in Chain]: MissingImplicitConfig }> = {}; + + for (const [fromChain, from] of Object.entries(deps)) { + let count = 0; + assertChain(fromChain); + + let missing: MissingImplicitConfig = { + managerPeers: [], + transceiverPeers: [], + evmChains: [], + standardRelaying: [], + specialRelaying: [], + solanaWormholeTransceiver: false, + solanaUpdateLUT: false, + }; + + if (chainToPlatform(fromChain) === "Solana") { + const solanaNtt = from.ntt as SolanaNtt; + const selfWormholeTransceiver = solanaNtt.pdas.registeredTransceiver(new PublicKey(solanaNtt.contracts.ntt!.manager)).toBase58(); + const registeredSelfTransceiver = await retryWithExponentialBackoff(() => solanaNtt.connection.getAccountInfo(new PublicKey(selfWormholeTransceiver)), 5, 5000); + if (registeredSelfTransceiver === null) { + count++; + missing.solanaWormholeTransceiver = true; + } + + // here we just check if the LUT update function returns an instruction. + // if it does, it means the LUT is missing or outdated. notice that + // we're not actually updating the LUT here, just checking if it's + // missing, so it's ok to use the 0 pubkey as the payer. + const updateLUT = solanaNtt.initializeOrUpdateLUT({ payer: new PublicKey(0) }); + // check if async generator is non-empty + if (!(await updateLUT.next()).done) { + count++; + missing.solanaUpdateLUT = true; + } + } + + for (const [toChain, to] of Object.entries(deps)) { + assertChain(toChain); + if (fromChain === toChain) { + continue; + } + if (verbose) { + process.stdout.write(`Verifying registration for ${fromChain} -> ${toChain}......\n`); + } + const peer = await retryWithExponentialBackoff(() => from.ntt.getPeer(toChain), 5, 5000); + if (peer === null) { + const configLimit = from.config.local?.limits?.inbound?.[toChain]?.replace(".", ""); + count++; + missing.managerPeers.push({ + address: to.manager, + tokenDecimals: to.decimals, + inboundLimit: BigInt(configLimit ?? 0), + }); + } else { + // @ts-ignore TODO + if (!Buffer.from(peer.address.address.address).equals(Buffer.from(to.manager.address.address))) { + console.error(`Peer address mismatch for ${fromChain} -> ${toChain}`); + } + if (peer.tokenDecimals !== to.decimals) { + console.error(`Peer decimals mismatch for ${fromChain} -> ${toChain}`); + } + } + + if (chainToPlatform(fromChain) === "Evm") { + const toIsEvm = chainToPlatform(toChain) === "Evm"; + const toIsSolana = chainToPlatform(toChain) === "Solana"; + const whTransceiver = await from.ntt.getTransceiver(0) as EvmNttWormholeTranceiver; + + if (toIsEvm) { + const remoteToEvm = await whTransceiver.isEvmChain(toChain); + if (!remoteToEvm) { + count++; + missing.evmChains.push(toChain); + } + + const standardRelaying = await whTransceiver.isWormholeRelayingEnabled(toChain); + if (!standardRelaying) { + count++; + missing.standardRelaying.push(toChain); + } + } else if (toIsSolana) { + const specialRelaying = await whTransceiver.isSpecialRelayingEnabled(toChain); + if (!specialRelaying) { + count++; + missing.specialRelaying.push(toChain); + } + } + } + + const transceiverPeer = await retryWithExponentialBackoff(() => from.whTransceiver.getPeer(toChain), 5, 5000); + if (transceiverPeer === null) { + count++; + missing.transceiverPeers.push(to.whTransceiver.getAddress()); + } else { + // @ts-ignore TODO + if (!Buffer.from(transceiverPeer.address.address).equals(Buffer.from(to.whTransceiver.getAddress().address.address))) { + console.error(`Transceiver peer address mismatch for ${fromChain} -> ${toChain}`); + } + } + + } + if (count > 0) { + missingConfigs[fromChain] = missing; + } + } + return missingConfigs; +} + +async function pushDeployment(deployment: Deployment, signerType: SignerType, evmVerify: boolean, yes: boolean, filePath?: string): Promise { + const diff = diffObjects(deployment.config.local!, deployment.config.remote!); + if (Object.keys(diff).length === 0) { + return; + } + + const canonical = canonicalAddress(deployment.manager); + console.log(`Pushing changes to ${deployment.manager.chain} (${canonical})`) + + console.log(chalk.reset(colorizeDiff(diff))); + if (!yes) { + await askForConfirmation(); + } + + const ctx = deployment.ctx; + + const signer = await getSigner(ctx, signerType, undefined, filePath); + + let txs = []; + // we perform this last to make sure we don't accidentally lock ourselves out + let updateOwner: ReturnType | undefined = undefined; + let managerUpgrade: { from: string, to: string } | undefined; + for (const k of Object.keys(diff)) { + if (k === "version") { + // TODO: check against existing version, and make sure no major version changes + managerUpgrade = { from: diff[k]!.pull!, to: diff[k]!.push! }; + } else if (k === "owner") { + const address: AccountAddress = toUniversal(deployment.manager.chain, diff[k]?.push!); + updateOwner = deployment.ntt.setOwner(address, signer.address.address); + } else if (k === "pauser") { + const address: AccountAddress = toUniversal(deployment.manager.chain, diff[k]?.push!); + txs.push(deployment.ntt.setPauser(address, signer.address.address)); + } else if (k === "paused") { + if (diff[k]?.push === true) { + txs.push(deployment.ntt.pause(signer.address.address)); + } else { + txs.push(deployment.ntt.unpause(signer.address.address)); + } + } else if (k === "limits") { + const newOutbound = diff[k]?.outbound?.push; + if (newOutbound) { + // TODO: verify amount has correct number of decimals? + // remove "." from string and convert to bigint + const newOutboundBigint = BigInt(newOutbound.replace(".", "")); + txs.push(deployment.ntt.setOutboundLimit(newOutboundBigint, signer.address.address)); + } + const inbound = diff[k]?.inbound; + if (inbound) { + for (const chain of Object.keys(inbound)) { + assertChain(chain); + const newInbound = inbound[chain]?.push; + if (newInbound) { + // TODO: verify amount has correct number of decimals? + const newInboundBigint = BigInt(newInbound.replace(".", "")); + txs.push(deployment.ntt.setInboundLimit(chain, newInboundBigint, signer.address.address)); + } + } + } + } else if (k === "transceivers") { + // TODO: refactor this nested loop stuff into separate functions at least + // alternatively we could first recursively collect all the things + // to do into a flattened list (with entries like + // transceivers.wormhole.pauser), and have a top-level mapping of + // these entries to how they should be handled + for (const j of Object.keys(diff[k] as object)) { + if (j === "wormhole") { + for (const l of Object.keys(diff[k]![j] as object)) { + if (l === "pauser") { + const newTransceiverPauser = toUniversal(deployment.manager.chain, diff[k]![j]![l]!.push!); + txs.push(deployment.whTransceiver.setPauser(newTransceiverPauser, signer.address.address)); + } else { + console.error(`Unsupported field: ${k}.${j}.${l}`); + process.exit(1); + } + } + } else { + console.error(`Unsupported field: ${k}.${j}`); + process.exit(1); + + } + } + } else { + console.error(`Unsupported field: ${k}`); + process.exit(1); + } + } + if (managerUpgrade) { + await upgrade(managerUpgrade.from, managerUpgrade.to, deployment.ntt, ctx, signerType, evmVerify); + } + for (const tx of txs) { + await signSendWait(ctx, tx, signer.signer) + } + if (updateOwner) { + await signSendWait(ctx, updateOwner, signer.signer) + } +} + +async function pullDeployments(deployments: Config, network: Network, verbose: boolean): Promise }>> { + let deps: Partial<{ [C in Chain]: Deployment }> = {}; + + for (const [chain, deployment] of Object.entries(deployments.chains)) { + if (verbose) { + process.stdout.write(`Fetching config for ${chain}......\n`); + } + assertChain(chain); + const managerAddress: string | undefined = deployment.manager; + if (managerAddress === undefined) { + console.error(`manager field not found for chain ${chain}`); + // process.exit(1); + continue; + } + const [remote, ctx, ntt, decimals] = await pullChainConfig( + network, + { chain, address: toUniversal(chain, managerAddress) }, + overrides + ); + const local = deployments.chains[chain]; + + // TODO: what if it's not index 0... + // we should check that the address of this transceiver matches the + // address in the config. currently we just assume that ix 0 is the wormhole one + const whTransceiver = await ntt.getTransceiver(0); + if (whTransceiver === null) { + console.error(`Wormhole transceiver not found for ${chain}`); + process.exit(1); + } + + deps[chain] = { + ctx, + ntt, + decimals, + manager: { chain, address: toUniversal(chain, managerAddress) }, + whTransceiver, + config: { + remote, + local, + } + }; + } + + const config = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.config.remote])); + const ntts = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.ntt])); + await pullInboundLimits(ntts, config, verbose); + return deps; +} + +async function pullChainConfig( + network: N, + manager: ChainAddress, + overrides?: WormholeConfigOverrides +): Promise<[ChainConfig, ChainContext, Ntt, number]> { + const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); + const ch = wh.getChain(manager.chain); + + const nativeManagerAddress = canonicalAddress(manager); + + const { ntt, addresses }: { ntt: Ntt; addresses: Partial; } = + await nttFromManager(ch, nativeManagerAddress); + + const mode = await ntt.getMode(); + const outboundLimit = await ntt.getOutboundLimit(); + const threshold = await ntt.getThreshold(); + + const decimals = await ntt.getTokenDecimals(); + // insert decimal point into number + const outboundLimitDecimals = formatNumber(outboundLimit, decimals); + + const paused = await ntt.isPaused(); + const owner = await ntt.getOwner(); + const pauser = await ntt.getPauser(); + + const version = getVersion(manager.chain, ntt); + + const transceiverPauser = await ntt.getTransceiver(0).then((t) => t?.getPauser() ?? null); + + const config: ChainConfig = { + version, + mode, + paused, + owner: owner.toString(), + manager: nativeManagerAddress, + token: addresses.token!, + transceivers: { + threshold, + wormhole: { address: addresses.transceiver!.wormhole! }, + }, + limits: { + outbound: outboundLimitDecimals, + inbound: {}, + }, + }; + if (transceiverPauser) { + config.transceivers.wormhole.pauser = transceiverPauser.toString(); + } + if (pauser) { + config.pauser = pauser.toString(); + } + return [config, ch, ntt, decimals]; +} + +async function getImmutables(chain: C, ntt: Ntt) { + const platform = chainToPlatform(chain); + if (platform !== "Evm") { + return null; + } + const evmNtt = ntt as EvmNtt; + const transceiver = await evmNtt.getTransceiver(0) as EvmNttWormholeTranceiver; + const consistencyLevel = await transceiver.transceiver.consistencyLevel(); + const wormholeRelayer = await transceiver.transceiver.wormholeRelayer(); + const specialRelayer = await transceiver.transceiver.specialRelayer(); + const gasLimit = await transceiver.transceiver.gasLimit(); + + const token = await evmNtt.manager.token(); + const tokenDecimals = await evmNtt.manager.tokenDecimals(); + + const whTransceiverImmutables = { + consistencyLevel, + wormholeRelayer, + specialRelayer, + gasLimit, + }; + return { + manager: { + token, + tokenDecimals, + }, + wormholeTransceiver: whTransceiverImmutables, + }; +} + +async function getPdas(chain: C, ntt: Ntt) { + const platform = chainToPlatform(chain); + if (platform !== "Solana") { + return null; + } + const solanaNtt = ntt as SolanaNtt; + const config = solanaNtt.pdas.configAccount(); + const emitter = NTT.transceiverPdas(solanaNtt.program.programId).emitterAccount(); + const outboxRateLimit = solanaNtt.pdas.outboxRateLimitAccount(); + const tokenAuthority = solanaNtt.pdas.tokenAuthority(); + const lutAccount = solanaNtt.pdas.lutAccount(); + const lutAuthority = solanaNtt.pdas.lutAuthority(); + + return { + config, + emitter, + outboxRateLimit, + tokenAuthority, + lutAccount, + lutAuthority, + }; +} + +function getVersion(chain: C, ntt: Ntt): string { + const platform = chainToPlatform(chain); + switch (platform) { + case "Evm": + return (ntt as EvmNtt).version + case "Solana": + return (ntt as SolanaNtt).version + default: + throw new Error("Unsupported platform"); + } +} + +// TODO: there should be a more elegant way to do this, than creating a +// "dummy" NTT, then calling verifyAddresses to get the contract diff, then +// finally reconstructing the "real" NTT object from that +async function nttFromManager( + ch: ChainContext, + nativeManagerAddress: string +): Promise<{ ntt: Ntt; addresses: Partial }> { + const onlyManager = await ch.getProtocol("Ntt", { + ntt: { + manager: nativeManagerAddress, + token: null, + transceiver: {}, + } + }); + const diff = await onlyManager.verifyAddresses(); + + const addresses: Partial = { manager: nativeManagerAddress, ...diff }; + + const ntt = await ch.getProtocol("Ntt", { + ntt: addresses + }); + return { ntt, addresses }; +} + +function formatNumber(num: bigint, decimals: number) { + if (num === 0n) { + return "0." + "0".repeat(decimals); + } + const str = num.toString(); + const formatted = str.slice(0, -decimals) + "." + str.slice(-decimals); + if (formatted.startsWith(".")) { + return "0" + formatted; + } + return formatted; +} + +function checkNumberFormatting(formatted: string, decimals: number): boolean { + // check that the string has the correct number of decimals + const parts = formatted.split("."); + if (parts.length !== 2) { + return false; + } + if (parts[1].length !== decimals) { + return false; + } + return true; +} + +function cargoNetworkFeature(network: Network): string { + switch (network) { + case "Mainnet": + return "mainnet"; + case "Testnet": + return "solana-devnet"; + case "Devnet": + return "tilt-devnet"; + default: + throw new Error("Unsupported network"); + } +} + + +async function askForConfirmation(prompt: string = "Do you want to continue?"): Promise { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + const answer = await new Promise((resolve) => { + rl.question(`${prompt} [y/n]`, resolve); + }); + rl.close(); + + if (answer !== "y") { + console.log("Aborting"); + process.exit(0); + } +} + +// NOTE: modifies the config object in place +// TODO: maybe introduce typestate for having pulled inbound limits? +async function pullInboundLimits(ntts: Partial<{ [C in Chain]: Ntt }>, config: Config["chains"], verbose: boolean) { + for (const [c1, ntt1] of Object.entries(ntts)) { + assertChain(c1); + const chainConf = config[c1]; + if (!chainConf) { + console.error(`Chain ${c1} not found in deployment`); + process.exit(1); + } + const decimals = await ntt1.getTokenDecimals(); + for (const [c2, ntt2] of Object.entries(ntts)) { + assertChain(c2); + if (ntt1 === ntt2) { + continue; + } + if (verbose) { + process.stdout.write(`Fetching inbound limit for ${c1} -> ${c2}.......\n`); + } + const peer = await retryWithExponentialBackoff(() => ntt1.getPeer(c2), 5, 5000); + if (chainConf.limits?.inbound === undefined) { + chainConf.limits.inbound = {}; + } + + const limit = peer?.inboundLimit ?? 0n; + + chainConf.limits.inbound[c2] = formatNumber(limit, decimals) + + } + } +} + +async function checkSolanaBinary(binary: string, wormhole: string, providedProgramId: string, version?: string) { + // ensure binary path exists + if (!fs.existsSync(binary)) { + console.error(`.so file not found: ${binary}`); + process.exit(1); + } + // console.log(`Checking binary ${binary} for wormhole and provided program ID`); + + // convert wormhole and providedProgramId from base58 to hex + const wormholeHex = new PublicKey(wormhole).toBuffer().toString("hex"); + const providedProgramIdHex = new PublicKey(providedProgramId).toBuffer().toString("hex"); + const versionHex = version ? Buffer.from(version).toString("hex") : undefined; + + if (!searchHexInBinary(binary, wormholeHex)) { + console.error(`Wormhole address not found in binary: ${wormhole}`); + process.exit(1); + } + if (!searchHexInBinary(binary, providedProgramIdHex)) { + console.error(`Provided program ID not found in binary: ${providedProgramId}`); + process.exit(1); + } + if (versionHex && !searchHexInBinary(binary, versionHex)) { + // TODO: figure out how to search for the version string in the binary + // console.error(`Version string not found in binary: ${version}`); + // process.exit(1); + } +} + +// not the most efficient, but at least it's definitely portable +function searchHexInBinary(binaryPath: string, searchHex: string) { + const buffer = fs.readFileSync(binaryPath); + const hexString = buffer.toString('hex'); + const found = hexString.includes(searchHex); + + return found; +} + +export function ensureNttRoot(pwd: string = ".") { + if (!fs.existsSync(`${pwd}/evm/foundry.toml`) || !fs.existsSync(`${pwd}/solana/Anchor.toml`)) { + console.error("Run this command from the root of an NTT project."); + process.exit(1); + } +} + +function checkAnchorVersion() { + const expected = "0.29.0"; + try { + execSync("which anchor"); + } catch { + console.error("Anchor CLI is not installed.\nSee https://www.anchor-lang.com/docs/installation") + process.exit(1); + } + const version = execSync("anchor --version").toString().trim(); + // version looks like "anchor-cli 0.14.0" + const [_, v] = version.split(" "); + if (v !== expected) { + console.error(`Anchor CLI version must be ${expected} but is ${v}`); + process.exit(1); + } +} +function loadConfig(path: string): Config { + if (!fs.existsSync(path)) { + console.error(`File not found: ${path}`); + console.error(`Create with 'ntt init' or specify another file with --path`); + process.exit(1); + } + const deployments: Config = JSON.parse(fs.readFileSync(path).toString()); + return deployments; +} + +function resolveVersion(latest: boolean, ver: string | undefined, local: boolean, platform: Platform): string | null { + if ((latest ? 1 : 0) + (ver ? 1 : 0) + (local ? 1 : 0) !== 1) { + console.error("Specify exactly one of --latest, --ver, or --local"); + const available = getAvailableVersions(platform); + console.error(`Available versions for ${platform}:\n${available.join("\n")}`); + process.exit(1); + } + if (latest) { + const available = getAvailableVersions(platform); + return available.sort().reverse()[0]; + } else if (ver) { + return ver; + } else { + // local version + return null; + } +} + +function warnLocalDeployment(yes: boolean): Promise { + if (!yes) { + console.warn(chalk.yellow("WARNING: You are deploying from your local working directory.")); + console.warn(chalk.yellow("This bypasses version control and may deploy untested changes.")); + console.warn(chalk.yellow("Ensure your local changes are thoroughly tested and compatible.")); + return askForConfirmation("Are you sure you want to continue with the local deployment?"); + } + return Promise.resolve(); +} + +function validateChain(network: N, chain: C) { + if (network === "Testnet") { + if (chain === "Ethereum") { + console.error("Ethereum is deprecated on Testnet. Use EthereumSepolia instead."); + process.exit(1); + } + // if on testnet, and the chain has a *Sepolia counterpart, use that instead + if (chains.find((c) => c === `${c}Sepolia`)) { + console.error(`Chain ${chain} is deprecated. Use ${chain}Sepolia instead.`); + process.exit(1); + } + } +} + +function retryWithExponentialBackoff( + fn: () => Promise, + maxRetries: number, + delay: number, +): Promise { + const backoff = (retry: number) => Math.min(2 ** retry * delay, 10000) + Math.random() * 1000; + const attempt = async (retry: number): Promise => { + try { + return await fn(); + } catch (e) { + if (retry >= maxRetries) { + throw e; + } + const time = backoff(retry); + await new Promise((resolve) => setTimeout(resolve, backoff(time))); + return await attempt(retry + 1); + } + }; + return attempt(0); +} + +function nttVersion(): { version: string, commit: string, path: string, remote: string } | null { + const nttDir = `${process.env.HOME}/.ntt-cli`; + try { + const versionFile = fs.readFileSync(`${nttDir}/version`).toString().trim(); + const [commit, installPath, version, remote] = versionFile.split("\n"); + return { version, commit, path: installPath, remote }; + } catch { + return null; + } +} diff --git a/cli/src/side-effects.ts b/cli-core/src/side-effects.ts similarity index 100% rename from cli/src/side-effects.ts rename to cli-core/src/side-effects.ts diff --git a/cli/src/tag.ts b/cli-core/src/tag.ts similarity index 100% rename from cli/src/tag.ts rename to cli-core/src/tag.ts diff --git a/cli-core/test/sepolia-bsc.sh b/cli-core/test/sepolia-bsc.sh new file mode 100755 index 000000000..3bbc8a144 --- /dev/null +++ b/cli-core/test/sepolia-bsc.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# This script creates two forks (Bsc and Sepolia) and creates an NTT deployment +# on both of them. +# It's safe to run these tests outside of docker, as we create an isolated temporary +# directory for the tests. + +set -euox pipefail + +BSC_PORT=8545 +SEPOLIA_PORT=8546 + +anvil --silent --rpc-url https://bsc-testnet-rpc.publicnode.com -p "$BSC_PORT" & +pid1=$! +anvil --silent --rpc-url wss://ethereum-sepolia-rpc.publicnode.com -p "$SEPOLIA_PORT" & +pid2=$! + +# check both processes are running +if ! kill -0 $pid1 || ! kill -0 $pid2; then + echo "Failed to start the servers" + exit 1 +fi + +# create tmp directory +dir=$(mktemp -d) + +cleanup() { + kill $pid1 $pid2 + rm -rf $dir +} + +trap "cleanup" INT TERM EXIT + +# devnet private key +export ETH_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +echo "Running tests..." +cd $dir +ntt new test-ntt +cd test-ntt +ntt init Testnet + +# write overrides.json +cat < overrides.json +{ + "chains": { + "Bsc": { + "rpc": "http://127.0.0.1:$BSC_PORT" + }, + "Sepolia": { + "rpc": "http://127.0.0.1:$SEPOLIA_PORT" + } + } +} +EOF + +ntt add-chain Bsc --token 0x0B15635FCF5316EdFD2a9A0b0dC3700aeA4D09E6 --mode locking --skip-verify --latest +ntt add-chain Sepolia --token 0xB82381A3fBD3FaFA77B3a7bE693342618240067b --skip-verify --ver 1.0.0 + +ntt pull --yes +ntt push --yes + +# ugprade Sepolia to 1.1.0 +ntt upgrade Sepolia --ver 1.1.0 --skip-verify --yes +# now upgrade to the local version. +ntt upgrade Sepolia --local --skip-verify --yes + +ntt pull --yes + +# transfer ownership to +NEW_OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 +NEW_OWNER_SECRET=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d + +jq '.chains.Bsc.owner = "'$NEW_OWNER'"' deployment.json > deployment.json.tmp && mv deployment.json.tmp deployment.json +jq '.chains.Sepolia.owner = "'$NEW_OWNER'"' deployment.json > deployment.json.tmp && mv deployment.json.tmp deployment.json +ntt push --yes + +# check the owner has been updated +jq '.chains.Bsc.owner == "'$NEW_OWNER'"' deployment.json +jq '.chains.Sepolia.owner == "'$NEW_OWNER'"' deployment.json + +export ETH_PRIVATE_KEY=$NEW_OWNER_SECRET + +jq '.chains.Bsc.paused = true' deployment.json > deployment.json.tmp && mv deployment.json.tmp deployment.json + +ntt push --yes +jq '.chains.Bsc.paused == true' deployment.json + +ntt status + +cat deployment.json diff --git a/cli-core/test/solana.sh b/cli-core/test/solana.sh new file mode 100755 index 000000000..01f06602d --- /dev/null +++ b/cli-core/test/solana.sh @@ -0,0 +1,218 @@ +#!/usr/bin/env bash + +# This script deploys the NTT program to a local Solana test validator and +# upgrades it. +# +# TODO: this script should be separated into +# 1) a general purpose validator startup script +# 2) the actual test script that sets up the NTT program and runs the tests +# +# We could then write multiple tests easily. For now, this will do. +# TODO: add better test coverage (registrations, pausing, etc) + +set -euo pipefail + +# Default values +PORT=6000 +FAUCET_PORT=6100 +NETWORK="http://127.0.0.1:$PORT" +KEYS_DIR="keys" +OVERRIDES_FILE="overrides.json" +DEPLOYMENT_FILE="deployment.json" +KEEP_ALIVE=false +USE_TMP_DIR=false + +# Function to display usage information +usage() { + cat << EOF +Usage: $0 [options] + +Options: + -h, --help Show this help message + -p, --port PORT Set the RPC port (default: 6000) + -f, --faucet-port PORT Set the faucet port (default: 6100) + -k, --keys-dir DIR Set the keys directory (default: keys) + -o, --overrides FILE Set the overrides file (default: overrides.json) + -d, --deployment FILE Set the deployment file (default: deployment.json) + --keep-alive Keep the validator running after the script finishes + --use-tmp-dir Use a temporary directory for deployment (useful for testing) +EOF + exit 1 +} + +# Parse command-line options +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage + ;; + -p|--port) + PORT="$2" + shift 2 + ;; + -f|--faucet-port) + FAUCET_PORT="$2" + shift 2 + ;; + -k|--keys-dir) + KEYS_DIR="$2" + shift 2 + ;; + -o|--overrides) + OVERRIDES_FILE="$2" + shift 2 + ;; + -d|--deployment) + DEPLOYMENT_FILE="$2" + shift 2 + ;; + --keep-alive) + KEEP_ALIVE=true + shift + ;; + --use-tmp-dir) + USE_TMP_DIR=true + shift + ;; + *) + echo "Unknown option: $1" + usage + ;; + esac +done + +# Update NETWORK variable based on potentially changed PORT +NETWORK="http://127.0.0.1:$PORT" + +validator_dir=$(mktemp -d) + +if [ "$USE_TMP_DIR" = true ]; then + tmp_dir=$(mktemp -d) + cd "$tmp_dir" || exit + ntt new test-ntt + cd test-ntt || exit +fi + +# Function to clean up resources +cleanup() { + echo "Cleaning up..." + kill "$pid" 2>/dev/null || true + rm -rf "$validator_dir" + if [ "$USE_TMP_DIR" = true ]; then + rm -rf "$tmp_dir" + fi + if [ -f "${OVERRIDES_FILE}.bak" ]; then + mv "${OVERRIDES_FILE}.bak" "$OVERRIDES_FILE" + else + rm -f "$OVERRIDES_FILE" + fi + solana config set --keypair "$old_default_keypair" > /dev/null +} + +# Set up trap for cleanup +trap cleanup EXIT + +# Prepare directories and files +rm -rf "$KEYS_DIR" +mkdir -p "$KEYS_DIR" + +# Backup and create overrides file +cp "$OVERRIDES_FILE" "${OVERRIDES_FILE}.bak" 2>/dev/null || true +cat << EOF > "$OVERRIDES_FILE" +{ + "chains": { + "Solana": { + "rpc": "$NETWORK" + } + } +} +EOF + +# Start Solana test validator +pushd "$validator_dir" || exit +# TODO: the deployment doesn't fully work, because we need to load in the wormhole program and its associated +# accounts. This is a bit tedious, but would be great to do. +# NOTE: this will not run in an emulated x86 docker environment (on an arm mac +# host), because the binary needs AVX instructions which the emulator doesn't +# support. +solana-test-validator --rpc-port "$PORT" --faucet-port "$FAUCET_PORT" > /dev/null 2>&1 & +pid=$! +popd || exit + +old_default_keypair=$(solana config get keypair | awk '{print $3}') + +# Wait for validator to start +echo "Waiting for Solana test validator to start..." +for _ in {1..30}; do + if solana cluster-version -u "$NETWORK" &>/dev/null; then + echo "Solana test validator started successfully." + break + fi + sleep 1 +done + +# Check if validator started successfully +if ! kill -0 "$pid" 2>/dev/null; then + echo "Failed to start solana-test-validator" + exit 1 +fi + +# Initialize NTT +rm -rf "$DEPLOYMENT_FILE" +ntt init Mainnet + +# Generate and configure keypairs +pushd "$KEYS_DIR" || exit +keypair=$(solana-keygen grind --starts-with w:1 --ignore-case | grep 'Wrote keypair' | awk '{print $4}') +keypair=$(realpath "$keypair") +solana config set --keypair "$keypair" + +# Airdrop SOL +solana airdrop 50 -u "$NETWORK" --keypair "$keypair" +# This steps is a bit voodoo -- we airdrop to this special address, which is +# needed for querying the program version. For more info, grep for these pubkeys in the ntt repo. +solana airdrop 1 Hk3SdYTJFpawrvRz4qRztuEt2SqoCG7BGj2yJfDJSFbJ -u "$NETWORK" --keypair "$keypair" > /dev/null +solana airdrop 1 98evdAiWr7ey9MAQzoQQMwFQkTsSR6KkWQuFqKrgwNwb -u "$NETWORK" --keypair "$keypair" > /dev/null + +# Create and configure token +token=$(spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb -u "$NETWORK" | grep "Address:" | awk '{print $2}') +echo "Token: $token" + +ntt_keypair=$(solana-keygen grind --starts-with ntt:1 --ignore-case | grep 'Wrote keypair' | awk '{print $4}') +ntt_keypair_without_json=${ntt_keypair%.json} +ntt_keypair=$(realpath "$ntt_keypair") +popd || exit + +# Set token authority +authority=$(ntt solana token-authority "$ntt_keypair_without_json") +echo "Authority: $authority" +spl-token authorize "$token" mint "$authority" -u "$NETWORK" + +# Add chain and upgrade +ntt add-chain Solana --ver 1.0.0 --mode burning --token "$token" --payer "$keypair" --program-key "$ntt_keypair" + +echo "Getting status" +ntt status || true + +solana program extend "$ntt_keypair_without_json" 100000 -u "$NETWORK" +ntt upgrade Solana --ver 2.0.0 --payer "$keypair" --program-key "$ntt_keypair" --yes +ntt status || true + +ntt push --payer "$keypair" --yes + +cat "$DEPLOYMENT_FILE" + +if [ "$KEEP_ALIVE" = true ]; then + # wait for C-c to kill the validator + # print information about the running validator + echo "===============================" + echo "Validator is running on port $PORT" + echo "Faucet is running on port $FAUCET_PORT" + echo "Keys are stored in $KEYS_DIR" + echo "Overrides are stored in $OVERRIDES_FILE" + + echo "Press Ctrl-C to stop the validator..." + while true; do + sleep 1 + done +fi diff --git a/cli-core/tsconfig.json b/cli-core/tsconfig.json new file mode 100644 index 000000000..9b2922680 --- /dev/null +++ b/cli-core/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "declaration": true, + // Enable latest features + "outDir": "./dist", + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/cli/package.json b/cli/package.json index 9811c1c16..f25fc3594 100644 --- a/cli/package.json +++ b/cli/package.json @@ -10,10 +10,15 @@ "peerDependencies": { "typescript": "^5.0.0" }, + "scripts": { + "compile": "bun --bun run --filter '*' build" + }, "bin": { - "ntt": "src/bin.ts" + "ntt": "src/index.ts" }, "dependencies": { + "@wormhole-foundation/ntt-cli-core": "*", + "bun": "^1.2.5", "chalk": "^5.3.0", "yargs": "^17.7.2" } diff --git a/cli/src/bin.ts b/cli/src/bin.ts deleted file mode 100755 index 29ea34ef1..000000000 --- a/cli/src/bin.ts +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bun - -import { YARGSCommand } from "./index"; - -YARGSCommand.parse(); diff --git a/cli/src/index.ts b/cli/src/index.ts index d64e35c32..6f8b1781b 100755 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -1,2068 +1,5 @@ -import "./side-effects"; // doesn't quite work for silencing the bigint error message. why? -import evm from "@wormhole-foundation/sdk/platforms/evm"; -import solana from "@wormhole-foundation/sdk/platforms/solana"; -import { encoding } from '@wormhole-foundation/sdk-connect'; -import { execSync } from "child_process"; +#!/usr/bin/env bun -import evmDeployFile from "../../evm/script/DeployWormholeNtt.s.sol" with { type: "file" }; -import evmDeployFileHelper from "../../evm/script/helpers/DeployWormholeNttBase.sol" with { type: "file" }; +import { YARGSCommand } from "@wormhole-foundation/ntt-cli-core"; -import chalk from "chalk"; -import yargs from "yargs"; -import { $ } from "bun"; -import { hideBin } from "yargs/helpers"; -import { Connection, Keypair, PublicKey } from "@solana/web3.js"; -import * as spl from "@solana/spl-token"; -import fs from "fs"; -import readline from "readline"; -import { ChainContext, UniversalAddress, Wormhole, assertChain, canonicalAddress, chainToPlatform, chains, isNetwork, networks, platforms, signSendWait, toUniversal, type AccountAddress, type Chain, type ChainAddress, type WormholeConfigOverrides, type Network, type Platform } from "@wormhole-foundation/sdk"; -import "@wormhole-foundation/sdk-evm-ntt"; -import "@wormhole-foundation/sdk-solana-ntt"; -import "@wormhole-foundation/sdk-definitions-ntt"; -import type { Ntt, NttTransceiver } from "@wormhole-foundation/sdk-definitions-ntt"; - -import { type SolanaChains, SolanaAddress } from "@wormhole-foundation/sdk-solana"; - -import { colorizeDiff, diffObjects } from "./diff"; -import { forgeSignerArgs, getSigner, type SignerType } from "./getSigner"; -import { NTT, SolanaNtt } from "@wormhole-foundation/sdk-solana-ntt"; -import type { EvmNtt, EvmNttWormholeTranceiver } from "@wormhole-foundation/sdk-evm-ntt"; -import type { EvmChains } from "@wormhole-foundation/sdk-evm"; -import { getAvailableVersions, getGitTagName } from "./tag"; -import * as configuration from "./configuration"; -import { ethers } from "ethers"; - -// TODO: contract upgrades on solana -// TODO: set special relaying? -// TODO: currently, we just default all evm chains to standard relaying. should we not do that? what's a good way to configure this? - -// TODO: check if manager can mint the token in burning mode (on solana it's -// simple. on evm we need to simulate with prank) -const overrides: WormholeConfigOverrides = (function () { - // read overrides.json file if exists - if (fs.existsSync("overrides.json")) { - console.error(chalk.yellow("Using overrides.json")); - return JSON.parse(fs.readFileSync("overrides.json").toString()); - } else { - return {}; - } -})(); - -export type Deployment = { - ctx: ChainContext, - ntt: Ntt, - whTransceiver: NttTransceiver, - decimals: number, - manager: ChainAddress, - config: { - remote?: ChainConfig, - local?: ChainConfig, - }, -} - -// TODO: rename -export type ChainConfig = { - version: string, - mode: Ntt.Mode, - paused: boolean, - owner: string, - pauser?: string, - manager: string, - token: string, - transceivers: { - threshold: number, - wormhole: { address: string, pauser?: string }, - }, - limits: { - outbound: string, - inbound: Partial<{ [C in Chain]: string }>, - } -} - -export type Config = { - network: Network, - chains: Partial<{ - [C in Chain]: ChainConfig - }>, - defaultLimits?: { - outbound: string, - } -} - -const options = { - network: { - alias: "n", - describe: "Network", - choices: networks, - demandOption: true, - }, - deploymentPath: { - alias: "p", - describe: "Path to the deployment file", - default: "deployment.json", - type: "string", - }, - yes: { - alias: "y", - describe: "Skip confirmation", - type: "boolean", - default: false, - }, - signerType: { - alias: "s", - describe: "Signer type", - type: "string", - choices: ["privateKey", "ledger"], - default: "privateKey", - }, - verbose: { - alias: "v", - describe: "Verbose output", - type: "boolean", - default: false, - }, - chain: { - describe: "Chain", - type: "string", - choices: chains, - demandOption: true, - }, - address: { - describe: "Address", - type: "string", - demandOption: true, - }, - local: { - describe: "Use the current local version for deployment (advanced).", - type: "boolean", - default: false, - }, - version: { - describe: "Version of NTT to deploy", - type: "string", - demandOption: false, - }, - latest: { - describe: "Use the latest version", - type: "boolean", - default: false, - }, - platform: { - describe: "Platform", - type: "string", - choices: platforms, - demandOption: true, - }, - skipVerify: - { - describe: "Skip contract verification", - type: "boolean", - default: false, - }, - payer: { - describe: "Path to the payer json file (Solana)", - type: "string", - }, -} as const; - - -// TODO: this is a temporary hack to allow deploying from main (as we only need -// the changes to the evm script) -async function withCustomEvmDeployerScript(pwd: string, then: () => Promise): Promise { - ensureNttRoot(pwd); - const overrides = [ - { path: `${pwd}/evm/script/DeployWormholeNtt.s.sol`, with: evmDeployFile }, - { path: `${pwd}/evm/script/helpers/DeployWormholeNttBase.sol`, with: evmDeployFileHelper }, - ] - for (const { path, with: withFile } of overrides) { - const old = `${path}.old`; - if (fs.existsSync(path)) { - fs.copyFileSync(path, old); - } - fs.copyFileSync(withFile, path); - } - try { - return await then() - } finally { - // restore old files - for (const { path } of overrides) { - const old = `${path}.old`; - if (fs.existsSync(old)) { - fs.copyFileSync(old, path); - fs.unlinkSync(old); - } - } - } -} - -export const YARGSCommand = yargs(hideBin(process.argv)) - .wrap(Math.min(process.stdout.columns || 120, 160)) // Use terminal width, but no more than 160 characters - .scriptName("ntt") - .version((() => { - const ver = nttVersion(); - if (!ver) { - return "unknown"; - } - const { version, commit, path, remote } = ver; - const defaultPath = `${process.env.HOME}/.ntt-cli/.checkout`; - const remoteString = remote.includes("wormhole-foundation") ? "" : `${remote}@`; - if (path === defaultPath) { - return `ntt v${version} (${remoteString}${commit})`; - } else { - return `ntt v${version} (${remoteString}${commit}) from ${path}`; - } - })()) - // config group of commands - .command("config", - "configuration commands", - configuration.command - ) - .command("update", - "update the NTT CLI", - (yargs) => yargs - .option("path", { - describe: "Path to a local NTT repo to install from. If not specified, the latest version will be installed.", - type: "string", - }) - .option("branch", { - describe: "Git branch to install from", - type: "string", - }) - .option("repo", { - describe: "Git repository to install from", - type: "string", - }) - .example("$0 update", "Update the NTT CLI to the latest version") - .example("$0 update --path /path/to/ntt", "Update the NTT CLI from a local repo") - .example("$0 update --branch cli", "Update the NTT CLI to the cli branch"), - async (argv) => { - const localPath = argv["path"]; - if (localPath) { - if (argv["ref"]) { - console.error("Cannot specify both --path and --ref"); - process.exit(1); - } - if (argv["repo"]) { - console.error("Cannot specify both --path and --repo"); - process.exit(1); - } - await $`${localPath}/cli/install.sh`; - } else { - let branchArg = ""; - let repoArg = ""; - if (argv["branch"]) { - branchArg = `--branch ${argv["branch"]}`; - } - if (argv["repo"]) { - repoArg = `--repo ${argv["repo"]}`; - } - const installScript = "https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh"; - // save it to "$HOME/.ntt-cli/install.sh" - const nttDir = `${process.env.HOME}/.ntt-cli`; - const installer = `${nttDir}/install.sh`; - execSync(`mkdir -p ${nttDir}`); - execSync(`curl -s ${installScript} > ${installer}`); - execSync(`chmod +x ${installer}`); - execSync(`${installer} ${branchArg} ${repoArg}`, { stdio: "inherit" }); - } - }) - .command("new ", - "create a new NTT project", - (yargs) => yargs - .positional("path", { - describe: "Path to the project", - type: "string", - demandOption: true, - }) - .example("$0 new my-ntt-project", "Create a new NTT project in the 'my-ntt-project' directory"), - async (argv) => { - const git = execSync("git rev-parse --is-inside-work-tree || echo false", { - stdio: ["inherit", null, null] - }); - if (git.toString().trim() === "true") { - console.error("Already in a git repository"); - process.exit(1); - } - const path = argv["path"]; - await $`git clone -b main https://github.com/wormhole-foundation/example-native-token-transfers.git ${path}`; - }) - .command("add-chain ", - "add a chain to the deployment file", - (yargs) => yargs - .positional("chain", options.chain) - // TODO: add ability to specify manager address (then just pull the config) - // .option("manager", { - // describe: "Manager address", - // type: "string", - // }) - .option("program-key", { - describe: "Path to program key json (Solana)", - type: "string", - }) - .option("payer", { - describe: "Path to payer key json (Solana)", - type: "string", - }) - .option("binary", { - describe: "Path to program binary (.so file -- Solana)", - type: "string", - }) - .option("token", { - describe: "Token address", - type: "string", - }) - .option("mode", { - alias: "m", - describe: "Mode", - type: "string", - choices: ["locking", "burning"], - }) - .option("solana-priority-fee", { - describe: "Priority fee for Solana deployment (in microlamports)", - type: "number", - default: 50000, - }) - .option("signer-type", options.signerType) - .option("skip-verify", options.skipVerify) - .option("ver", options.version) - .option("latest", options.latest) - .option("local", options.local) - .option("path", options.deploymentPath) - .option("yes", options.yes) - .example("$0 add-chain Ethereum --token 0x1234... --mode burning --latest", "Add Ethereum chain with the latest contract version in burning mode") - .example("$0 add-chain Solana --token Sol1234... --mode locking --ver 1.0.0", "Add Solana chain with a specific contract version in locking mode") - .example("$0 add-chain Avalanche --token 0xabcd... --mode burning --local", "Add Avalanche chain using the local contract version"), - async (argv) => { - const path = argv["path"]; - const deployments: Config = loadConfig(path); - const chain: Chain = argv["chain"]; - const version = resolveVersion(argv["latest"], argv["ver"], argv["local"], chainToPlatform(chain)); - let mode = argv["mode"] as Ntt.Mode | undefined; - const signerType = argv["signer-type"] as SignerType; - const token = argv["token"]; - const network = deployments.network as Network; - - if (chain in deployments.chains) { - console.error(`Chain ${chain} already exists in ${path}`); - process.exit(1); - } - - validateChain(network, chain); - - const existsLocking = Object.values(deployments.chains).some((c) => c.mode === "locking"); - - if (existsLocking) { - if (mode && mode === "locking") { - console.error("Only one locking chain is allowed"); - process.exit(1); - } - mode = "burning"; - } - - if (!mode) { - console.error("Mode is required (use --mode)"); - process.exit(1); - } - - if (!token) { - console.error("Token is required (use --token)"); - process.exit(1); - } - - // let's deploy - - // TODO: factor out to function to get chain context - const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(chain); - - // TODO: make manager configurable - const deployedManager = await deploy(version, mode, ch, token, signerType, !argv["skip-verify"], argv["yes"], argv["payer"], argv["program-key"], argv["binary"], argv["solana-priority-fee"]); - - const [config, _ctx, _ntt, decimals] = - await pullChainConfig(network, deployedManager, overrides); - - console.log("token decimals:", chalk.yellow(decimals)); - - deployments.chains[chain] = config; - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Added ${chain} to ${path}`); - }) - .command("upgrade ", - "upgrade the contract on a specific chain", - (yargs) => yargs - .positional("chain", options.chain) - .option("ver", options.version) - .option("latest", { - describe: "Use the latest version", - type: "boolean", - default: false, - }) - .option("local", options.local) - .option("signer-type", options.signerType) - .option("skip-verify", options.skipVerify) - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("payer", { - describe: "Path to payer key json (Solana)", - type: "string", - }) - .option("program-key", { - describe: "Path to program key json (Solana)", - type: "string", - }) - .option("binary", { - describe: "Path to program binary (.so file -- Solana)", - type: "string", - }) - .example("$0 upgrade Ethereum --latest", "Upgrade the Ethereum contract to the latest version") - .example("$0 upgrade Solana --ver 1.1.0", "Upgrade the Solana contract to version 1.1.0") - .example("$0 upgrade Polygon --local --skip-verify", "Upgrade the Polygon contract using the local version, skipping explorer bytecode verification"), - async (argv) => { - const path = argv["path"]; - const deployments: Config = loadConfig(path); - const chain: Chain = argv["chain"]; - const signerType = argv["signer-type"] as SignerType; - const network = deployments.network as Network; - - if (!(chain in deployments.chains)) { - console.error(`Chain ${chain} not found in ${path}`); - process.exit(1); - } - - const chainConfig = deployments.chains[chain]!; - const currentVersion = chainConfig.version; - const platform = chainToPlatform(chain); - - const toVersion = resolveVersion(argv["latest"], argv["ver"], argv["local"], platform); - - if (argv["local"]) { - await warnLocalDeployment(argv["yes"]); - } - - if (toVersion === currentVersion && !argv["local"]) { - console.log(`Chain ${chain} is already at version ${currentVersion}`); - process.exit(0); - } - - console.log(`Upgrading ${chain} from version ${currentVersion} to ${toVersion || 'local version'}`); - - if (!argv["yes"]) { - await askForConfirmation(); - } - - const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(chain); - - const [_, ctx, ntt] = await pullChainConfig( - network, - { chain, address: toUniversal(chain, chainConfig.manager) }, - overrides - ); - - await upgrade( - currentVersion, - toVersion, - ntt, - ctx, - signerType, - !argv["skip-verify"], - argv["payer"], - argv["program-key"], - argv["binary"] - ); - - // reinit the ntt object to get the new version - // TODO: is there an easier way to do this? - const { ntt: upgraded } = await nttFromManager(ch, chainConfig.manager); - - chainConfig.version = getVersion(chain, upgraded) - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - - console.log(`Successfully upgraded ${chain} to version ${toVersion || 'local version'}`); - } - ) - .command("clone
", - "initialize a deployment file from an existing contract", - (yargs) => yargs - .positional("network", options.network) - .positional("chain", options.chain) - .positional("address", options.address) - .option("path", options.deploymentPath) - .option("verbose", options.verbose) - .example("$0 clone Testnet Ethereum 0x5678...", "Clone an existing Ethereum deployment on Testnet") - .example("$0 clone Mainnet Solana Sol5678... --path custom-clone.json", "Clone an existing Solana deployment on Mainnet to a custom file"), - async (argv) => { - if (!isNetwork(argv["network"])) { - console.error("Invalid network"); - process.exit(1); - } - - const path = argv["path"]; - const verbose = argv["verbose"]; - // check if the file exists - if (fs.existsSync(path)) { - console.error(`Deployment file already exists at ${path}`); - process.exit(1); - } - - // step 1. grab the config - // step 2. discover registrations - // step 3. grab registered peer configs - // - // NOTE: we don't recursively grab peer configs. This means the - // discovered peers will be the ones that are directly registered with - // the starting manager (the one we're cloning). - // For example, if we're cloning manager A, and it's registered with - // B, and B is registered with C, but C is not registered with A, then - // C will not be included in the cloned deployment. - // We could do peer discovery recursively but that would be a lot - // slower, since peer discovery is already O(n) in the number of - // supported chains (50+), because there is no way to enumerate the peers, so we - // need to query all possible chains to see if they're registered. - - const chain = argv["chain"]; - assertChain(chain) - - const manager = argv["address"]; - const network = argv["network"]; - - const universalManager = toUniversal(chain, manager); - - const ntts: Partial<{ [C in Chain]: Ntt }> = {}; - - const [config, _ctx, ntt, _decimals] = - await pullChainConfig(network, { chain, address: universalManager }, overrides); - - ntts[chain] = ntt as any; - - const configs: Partial<{ [C in Chain]: ChainConfig }> = { - [chain]: config, - } - - // discover peers - let count = 0; - for (const c of chains) { - process.stdout.write(`[${count}/${chains.length - 1}] Fetching peer config for ${c}`); - await new Promise((resolve) => setTimeout(resolve, 100)); - count++; - - const peer = await retryWithExponentialBackoff(() => ntt.getPeer(c), 5, 5000); - - process.stdout.write(`\n`); - if (peer === null) { - continue; - } - const address: UniversalAddress = peer.address.address.toUniversalAddress() - const [peerConfig, _ctx, peerNtt] = await pullChainConfig(network, { chain: c, address }, overrides); - ntts[c] = peerNtt as any; - configs[c] = peerConfig; - } - - // sort chains by name - const sorted = Object.fromEntries(Object.entries(configs).sort(([a], [b]) => a.localeCompare(b))); - - // sleep for a bit to avoid rate limiting when making the getDecimals call - // this can happen when the last we hit the rate limit just in the last iteration of the loop above. - // (happens more often than you'd think, because the rate limiter - // gets more aggressive after each hit) - await new Promise((resolve) => setTimeout(resolve, 2000)); - - // now loop through the chains, and query their peer information to get the inbound limits - await pullInboundLimits(ntts, sorted, verbose) - - const deployment: Config = { - network: argv["network"], - chains: sorted, - }; - fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); - }) - .command("init ", - "initialize a deployment file", - (yargs) => yargs - .positional("network", options.network) - .option("path", options.deploymentPath) - .example("$0 init Testnet", "Initialize a new deployment file for the Testnet network") - .example("$0 init Mainnet --path custom.json", "Initialize a new deployment file for Mainnet with a custom file name"), - async (argv) => { - if (!isNetwork(argv["network"])) { - console.error("Invalid network"); - process.exit(1); - } - const deployment = { - network: argv["network"], - chains: {}, - }; - const path = argv["path"]; - // check if the file exists - if (fs.existsSync(path)) { - console.error(`Deployment file already exists at ${path}. Specify a different path with --path`); - process.exit(1); - } - fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); - }) - .command("pull", - "pull the remote configuration", - (yargs) => yargs - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("verbose", options.verbose) - .example("$0 pull", "Pull the latest configuration from the blockchain for all chains") - .example("$0 pull --yes", "Pull the latest configuration and apply changes without confirmation"), - async (argv) => { - const deployments: Config = loadConfig(argv["path"]); - const verbose = argv["verbose"]; - const network = deployments.network as Network; - const path = argv["path"]; - const deps: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); - - let changed = false; - for (const [chain, deployment] of Object.entries(deps)) { - assertChain(chain); - const diff = diffObjects(deployments.chains[chain]!, deployment.config.remote!); - if (Object.keys(diff).length !== 0) { - console.error(chalk.reset(colorizeDiff({ [chain]: diff }))); - changed = true; - deployments.chains[chain] = deployment.config.remote! - } - } - if (!changed) { - console.log(`${path} is already up to date`); - process.exit(0); - } - - if (!argv["yes"]) { - await askForConfirmation(); - } - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Updated ${path}`); - }) - .command("push", - "push the local configuration", - (yargs) => yargs - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("signer-type", options.signerType) - .option("verbose", options.verbose) - .option("skip-verify", options.skipVerify) - .option("payer", options.payer) - .example("$0 push", "Push local configuration changes to the blockchain") - .example("$0 push --signer-type ledger", "Push changes using a Ledger hardware wallet for signing") - .example("$0 push --skip-verify", "Push changes without verifying contracts on EVM chains") - .example("$0 push --payer ", "Path to the payer json file (Solana), instead of setting SOLANA_PRIVATE_KEY env variable"), - async (argv) => { - const deployments: Config = loadConfig(argv["path"]); - const verbose = argv["verbose"]; - const network = deployments.network as Network; - const deps: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); - const signerType = argv["signer-type"] as SignerType; - const payerPath = argv["payer"]; - - const missing = await missingConfigs(deps, verbose); - - if (checkConfigErrors(deps)) { - console.error("There are errors in the config file. Please fix these before continuing."); - process.exit(1); - } - - for (const [chain, missingConfig] of Object.entries(missing)) { - assertChain(chain); - const ntt = deps[chain]!.ntt; - const ctx = deps[chain]!.ctx; - const signer = await getSigner(ctx, signerType, undefined, payerPath); - for (const manager of missingConfig.managerPeers) { - const tx = ntt.setPeer(manager.address, manager.tokenDecimals, manager.inboundLimit, signer.address.address) - await signSendWait(ctx, tx, signer.signer) - } - for (const transceiver of missingConfig.transceiverPeers) { - const tx = ntt.setTransceiverPeer(0, transceiver, signer.address.address) - await signSendWait(ctx, tx, signer.signer) - } - for (const evmChain of missingConfig.evmChains) { - const tx = (await ntt.getTransceiver(0) as EvmNttWormholeTranceiver).setIsEvmChain(evmChain, true) - await signSendWait(ctx, tx, signer.signer) - } - for (const relayingTarget of missingConfig.standardRelaying) { - const tx = (await ntt.getTransceiver(0) as EvmNttWormholeTranceiver).setIsWormholeRelayingEnabled(relayingTarget, true) - await signSendWait(ctx, tx, signer.signer) - } - for (const relayingTarget of missingConfig.specialRelaying) { - const tx = (await ntt.getTransceiver(0) as EvmNttWormholeTranceiver).setIsSpecialRelayingEnabled(relayingTarget, true) - await signSendWait(ctx, tx, signer.signer) - } - if (missingConfig.solanaWormholeTransceiver) { - if (chainToPlatform(chain) !== "Solana") { - console.error("Solana wormhole transceiver can only be set on Solana chains"); - continue; - } - const solanaNtt = ntt as SolanaNtt; - const tx = solanaNtt.registerWormholeTransceiver({ - payer: signer.address.address as AccountAddress, - owner: signer.address.address as AccountAddress, - }) - try { - await signSendWait(ctx, tx, signer.signer) - } catch (e: any) { - console.error(e.logs); - } - } - if (missingConfig.solanaUpdateLUT) { - if (chainToPlatform(chain) !== "Solana") { - console.error("Solana update LUT can only be set on Solana chains"); - continue; - } - const solanaNtt = ntt as SolanaNtt; - const tx = solanaNtt.initializeOrUpdateLUT({ payer: new SolanaAddress(signer.address.address).unwrap() }) - try { - await signSendWait(ctx, tx, signer.signer) - } catch (e: any) { - console.error(e.logs); - } - } - } - - // pull deps again - const depsAfterRegistrations: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); - - for (const [chain, deployment] of Object.entries(depsAfterRegistrations)) { - assertChain(chain); - await pushDeployment(deployment as any, signerType, !argv["skip-verify"], argv["yes"], payerPath); - } - }) - .command("status", - "check the status of the deployment", - (yargs) => yargs - .option("path", options.deploymentPath) - .option("verbose", options.verbose) - .example("$0 status", "Check the status of the deployment across all chains") - .example("$0 status --verbose", "Check the status with detailed output"), - async (argv) => { - const path = argv["path"]; - const verbose = argv["verbose"]; - // TODO: I don't like the variable names here - const deployments: Config = loadConfig(path); - - const network = deployments.network as Network; - - let deps: Partial<{ [C in Chain]: Deployment }> = await pullDeployments(deployments, network, verbose); - - let fixable = 0; - - const extraInfo: any = {}; - - if (checkConfigErrors(deps)) { - console.error("There are errors in the config file. Please fix these before continuing."); - process.exit(1); - } - - // diff remote and local configs - for (const [chain, deployment] of Object.entries(deps)) { - assertChain(chain); - const local = deployment.config.local; - const remote = deployment.config.remote; - const a = { [chain]: local! }; - const b = { [chain]: remote! }; - - const diff = diffObjects(a, b); - if (Object.keys(diff).length !== 0) { - console.error(chalk.reset(colorizeDiff(diff))); - fixable++; - } - - if (verbose) { - const immutables = await getImmutables(chain, deployment.ntt); - if (immutables) { - extraInfo[chain] = immutables; - } - const pdas = await getPdas(chain, deployment.ntt); - if (pdas) { - extraInfo[chain] = pdas; - } - } - } - - if (Object.keys(extraInfo).length > 0) { - console.log(chalk.yellow(JSON.stringify(extraInfo, null, 2))); - } - - // verify peers - const missing = await missingConfigs(deps, verbose); - - if (Object.keys(missing).length > 0) { - fixable++; - } - - for (const [chain, missingConfig] of Object.entries(missing)) { - console.error(`${chain} status:`); - for (const manager of missingConfig.managerPeers) { - console.error(` Missing manager peer: ${manager.address.chain}`); - } - for (const transceiver of missingConfig.transceiverPeers) { - console.error(` Missing transceiver peer: ${transceiver.chain}`); - } - for (const evmChain of missingConfig.evmChains) { - console.error(` ${evmChain} needs to be configured as an EVM chain`); - } - for (const relayingTarget of missingConfig.standardRelaying) { - console.warn(` No standard relaying to ${relayingTarget}`); - } - for (const relayingTarget of missingConfig.specialRelaying) { - console.warn(` No special relaying to ${relayingTarget}`); - } - if (missingConfig.solanaWormholeTransceiver) { - console.error(" Missing Solana wormhole transceiver"); - } - if (missingConfig.solanaUpdateLUT) { - console.error(" Missing or outdated LUT"); - } - } - - if (fixable > 0) { - console.error("Run `ntt pull` to pull the remote configuration (overwriting the local one)"); - console.error("Run `ntt push` to push the local configuration (overwriting the remote one) by executing the necessary transactions"); - process.exit(1); - } else { - console.log(`${path} is up to date with the on-chain configuration.`); - process.exit(0); - } - }) - .command("solana", - "Solana commands", - (yargs) => { - yargs - .command("key-base58 ", - "print private key in base58", - (yargs) => yargs - .positional("keypair", { - describe: "Path to keypair.json", - type: "string", - demandOption: true, - }), - (argv) => { - const keypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(argv["keypair"]).toString()))); - console.log(encoding.b58.encode(keypair.secretKey)); - }) - .command("token-authority ", - "print the token authority address for a given program ID", - (yargs) => yargs - .positional("programId", { - describe: "Program ID", - type: "string", - demandOption: true, - }), - (argv) => { - const programId = new PublicKey(argv["programId"]); - const tokenAuthority = NTT.pdas(programId).tokenAuthority(); - console.log(tokenAuthority.toBase58()); - }) - .command("ata ", - "print the token authority address for a given program ID", - (yargs) => yargs - .positional("mint", { - describe: "Mint address", - type: "string", - demandOption: true, - }) - .positional("owner", { - describe: "Owner address", - type: "string", - demandOption: true, - }) - .positional("tokenProgram", { - describe: "Token program ID", - type: "string", - choices: ["legacy", "token22"], - demandOption: true, - }), - (argv) => { - const mint = new PublicKey(argv["mint"]); - const owner = new PublicKey(argv["owner"]); - const tokenProgram = argv["tokenProgram"] === "legacy" - ? spl.TOKEN_PROGRAM_ID - : spl.TOKEN_2022_PROGRAM_ID - const ata = spl.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); - console.log(ata.toBase58()); - }) - .demandCommand() - } - ) - .help() - .strict() - .demandCommand() - -// Implicit configuration that's missing from a contract deployment. These are -// implicit in the sense that they don't need to be explicitly set in the -// deployment file. -// For example, all managers and transceivers need to be registered with each other. -// Additionally, the EVM chains need to be registered as such, and the standard relaying -// needs to be enabled for all chains where this is supported. -type MissingImplicitConfig = { - managerPeers: Ntt.Peer[]; - transceiverPeers: ChainAddress[]; - evmChains: Chain[]; - standardRelaying: Chain[]; - specialRelaying: Chain[]; - solanaWormholeTransceiver: boolean; - solanaUpdateLUT: boolean; -} - -function checkConfigErrors(deps: Partial<{ [C in Chain]: Deployment }>): number { - let fatal = 0; - for (const [chain, deployment] of Object.entries(deps)) { - assertChain(chain); - const config = deployment.config.local!; - if (!checkNumberFormatting(config.limits.outbound, deployment.decimals)) { - console.error(`ERROR: ${chain} has an outbound limit (${config.limits.outbound}) with the wrong number of decimals. The number should have ${deployment.decimals} decimals.`); - fatal++; - } - if (config.limits.outbound === formatNumber(0n, deployment.decimals)) { - console.warn(chalk.yellow(`${chain} has an outbound limit of 0`)); - } - for (const [c, limit] of Object.entries(config.limits.inbound)) { - if (!checkNumberFormatting(limit, deployment.decimals)) { - console.error(`ERROR: ${chain} has an inbound limit with the wrong number of decimals for ${c} (${limit}). The number should have ${deployment.decimals} decimals.`); - fatal++; - } - if (limit === formatNumber(0n, deployment.decimals)) { - console.warn(chalk.yellow(`${chain} has an inbound limit of 0 from ${c}`)); - } - } - } - return fatal; -} - -function createWorkTree(platform: Platform, version: string): string { - const tag = getGitTagName(platform, version); - if (!tag) { - console.error(`No tag found matching ${version} for ${platform}`); - process.exit(1); - } - - const worktreeName = `.deployments/${platform}-${version}`; - - if (fs.existsSync(worktreeName)) { - console.log(chalk.yellow(`Worktree already exists at ${worktreeName}. Resetting to ${tag}`)); - execSync(`git -C ${worktreeName} reset --hard ${tag}`, { - stdio: "inherit" - }); - } else { - // create worktree - execSync(`git worktree add ${worktreeName} ${tag}`, { - stdio: "inherit" - }); - } - - // NOTE: we create this symlink whether or not the file exists. - // this way, if it's created later, the symlink will be correct - execSync(`ln -fs $(pwd)/overrides.json $(pwd)/${worktreeName}/overrides.json`, { - stdio: "inherit" - }); - - console.log(chalk.green(`Created worktree at ${worktreeName} from tag ${tag}`)); - return worktreeName; -} - -async function upgrade( - _fromVersion: string, - toVersion: string | null, - ntt: Ntt, - ctx: ChainContext, - signerType: SignerType, - evmVerify: boolean, - solanaPayer?: string, - solanaProgramKeyPath?: string, - solanaBinaryPath?: string -): Promise { - // TODO: check that fromVersion is safe to upgrade to toVersion from - const platform = chainToPlatform(ctx.chain); - const worktree = toVersion ? createWorkTree(platform, toVersion) : "."; - switch (platform) { - case "Evm": - const evmNtt = ntt as EvmNtt; - const evmCtx = ctx as ChainContext; - return upgradeEvm(worktree, evmNtt, evmCtx, signerType, evmVerify); - case "Solana": - if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { - console.error("Payer not found. Specify with --payer"); - process.exit(1); - } - const solanaNtt = ntt as SolanaNtt; - const solanaCtx = ctx as ChainContext; - return upgradeSolana(worktree, toVersion, solanaNtt, solanaCtx, solanaPayer, solanaProgramKeyPath, solanaBinaryPath); - default: - throw new Error("Unsupported platform"); - } -} - -async function upgradeEvm( - pwd: string, - ntt: EvmNtt, - ctx: ChainContext, - signerType: SignerType, - evmVerify: boolean -): Promise { - ensureNttRoot(pwd); - - console.log("Upgrading EVM chain", ctx.chain); - - const signer = await getSigner(ctx, signerType); - const signerArgs = forgeSignerArgs(signer.source); - - console.log("Installing forge dependencies...") - execSync("forge install", { - cwd: `${pwd}/evm`, - stdio: "pipe" - }); - - let verifyArgs: string = ""; - if (evmVerify) { - // TODO: verify etherscan api key? - const etherscanApiKey = configuration.get(ctx.chain, "scan_api_key", { reportError: true }) - if (!etherscanApiKey) { - process.exit(1); - } - verifyArgs = `--verify --etherscan-api-key ${etherscanApiKey}`; - } - - console.log("Upgrading manager..."); - await withCustomEvmDeployerScript(pwd, async () => { - execSync( - `forge script --via-ir script/DeployWormholeNtt.s.sol \ ---rpc-url ${ctx.config.rpc} \ ---sig "upgrade(address)" \ -${ntt.managerAddress} \ -${signerArgs} \ ---broadcast \ -${verifyArgs} | tee last-run.stdout`, { - cwd: `${pwd}/evm`, - stdio: "inherit" - }); - }); - -} - -async function upgradeSolana( - pwd: string, - version: string | null, - ntt: SolanaNtt, - ctx: ChainContext, - payer: string, - programKeyPath?: string, - binaryPath?: string -): Promise { - if (version === null) { - throw new Error("Cannot upgrade Solana to local version"); // TODO: this is not hard to enabled - } - const mint = (await (ntt.getConfig())).mint; - await deploySolana(pwd, version, await ntt.getMode(), ctx, mint.toBase58(), payer, false, programKeyPath, binaryPath); - // TODO: call initializeOrUpdateLUT. currently it's done in the following 'ntt push' step. -} - -async function deploy( - version: string | null, - mode: Ntt.Mode, - ch: ChainContext, - token: string, - signerType: SignerType, - evmVerify: boolean, - yes: boolean, - solanaPayer?: string, - solanaProgramKeyPath?: string, - solanaBinaryPath?: string, - solanaPriorityFee?: number -): Promise> { - if (version === null) { - await warnLocalDeployment(yes); - } - const platform = chainToPlatform(ch.chain); - const worktree = version ? createWorkTree(platform, version) : "."; - switch (platform) { - case "Evm": - return await deployEvm(worktree, mode, ch, token, signerType, evmVerify); - case "Solana": - if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { - console.error("Payer not found. Specify with --payer"); - process.exit(1); - } - const solanaCtx = ch as ChainContext; - return await deploySolana(worktree, version, mode, solanaCtx, token, solanaPayer, true, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee) as ChainAddress; - default: - throw new Error("Unsupported platform"); - } -} - -async function deployEvm( - pwd: string, - mode: Ntt.Mode, - ch: ChainContext, - token: string, - signerType: SignerType, - verify: boolean, -): Promise> { - ensureNttRoot(pwd); - - const wormhole = ch.config.contracts.coreBridge; - if (!wormhole) { - console.error("Core bridge not found"); - process.exit(1); - } - const relayer = ch.config.contracts.relayer; - if (!relayer) { - console.error("Relayer not found"); - process.exit(1); - } - - const rpc = ch.config.rpc; - // TODO: how to make specialRelayer configurable?? - let specialRelayer: string; - if (ch.chain === "Avalanche") { - specialRelayer = "0x1a19d8a194630642f750376Ae72b4eDF5aDFd25F"; - } else if (ch.chain === "Bsc") { - specialRelayer = "0x8C56eE9cd232d23541a697C0eBd3cA597DE3c88D"; - } else { - specialRelayer = "0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74"; - } - - const provider = new ethers.JsonRpcProvider(rpc); - const abi = ["function decimals() external view returns (uint8)"]; - const tokenContract = new ethers.Contract(token, abi, provider); - const decimals: number = await tokenContract.decimals(); - - // TODO: should actually make these ENV variables. - const sig = "run(address,address,address,address,uint8,uint8)"; - const modeUint = mode === "locking" ? 0 : 1; - const signer = await getSigner(ch, signerType); - const signerArgs = forgeSignerArgs(signer.source); - - // TODO: verify etherscan api key? - let verifyArgs: string[] = []; - if (verify) { - const etherscanApiKey = configuration.get(ch.chain, "scan_api_key", { reportError: true }) - if (!etherscanApiKey) { - process.exit(1); - } - verifyArgs = ["--verify", "--etherscan-api-key", etherscanApiKey] - } - - console.log("Installing forge dependencies...") - execSync("forge install", { - cwd: `${pwd}/evm`, - stdio: "pipe" - }); - - console.log("Deploying manager..."); - const deploy = async (simulate: boolean): Promise => { - const simulateArg = simulate ? "" : "--skip-simulation"; - await withCustomEvmDeployerScript(pwd, async () => { - try { - execSync(` -forge script --via-ir script/DeployWormholeNtt.s.sol \ ---rpc-url ${rpc} \ -${simulateArg} \ ---sig "${sig}" ${wormhole} ${token} ${relayer} ${specialRelayer} ${decimals} ${modeUint} \ ---broadcast ${verifyArgs.join(' ')} ${signerArgs} 2>&1 | tee last-run.stdout`, { - cwd: `${pwd}/evm`, - encoding: 'utf8', - stdio: 'inherit' - }); - } catch (error) { - console.error("Failed to deploy manager"); - // NOTE: we don't exit here. instead, we check if the manager was - // deployed successfully (below) and proceed if it was. - // process.exit(1); - } - }); - return fs.readFileSync(`${pwd}/evm/last-run.stdout`).toString(); - } - - // we attempt to deploy with simulation first, then without if it fails - let out = await deploy(true); - if (out.includes("Simulated execution failed")) { - if (out.includes("NotActivated")) { - console.error("Simulation failed, likely because the token contract is compiled against a different EVM version. It's probably safe to continue without simulation.") - await askForConfirmation("Do you want to proceed with the deployment without simulation?"); - } else { - console.error("Simulation failed. Please read the error message carefully, and proceed with caution."); - await askForConfirmation("Do you want to proceed with the deployment without simulation?"); - } - out = await deploy(false); - } - - if (!out) { - console.error("Failed to deploy manager"); - process.exit(1); - } - const logs = out.split("\n").map((l) => l.trim()).filter((l) => l.length > 0); - const manager = logs.find((l) => l.includes("NttManager: 0x"))?.split(" ")[1]; - if (!manager) { - console.error("Manager not found"); - process.exit(1); - } - const universalManager = toUniversal(ch.chain, manager); - return { chain: ch.chain, address: universalManager }; -} - -async function deploySolana( - pwd: string, - version: string | null, - mode: Ntt.Mode, - ch: ChainContext, - token: string, - payer: string, - initialize: boolean, - managerKeyPath?: string, - binaryPath?: string, - priorityFee?: number -): Promise> { - ensureNttRoot(pwd); - - // TODO: if the binary is provided, we should not check addresses in the source tree. (so we should move around the control flow a bit) - // TODO: factor out some of this into separate functions to help readability of this function (maybe even move to a different file) - - const wormhole = ch.config.contracts.coreBridge; - if (!wormhole) { - console.error("Core bridge not found"); - process.exit(1); - } - - // grep example_native_token_transfers = ".*" - // in solana/Anchor.toml - // TODO: what if they rename the program? - const existingProgramId = fs.readFileSync(`${pwd}/solana/Anchor.toml`).toString().match(/example_native_token_transfers = "(.*)"/)?.[1]; - if (!existingProgramId) { - console.error("Program ID not found in Anchor.toml (looked for example_native_token_transfers = \"(.*)\")"); - process.exit(1); - } - - let programKeypairPath; - let programKeypair; - - if (managerKeyPath) { - if (!fs.existsSync(managerKeyPath)) { - console.error(`Program keypair not found: ${managerKeyPath}`); - process.exit(1); - } - programKeypairPath = managerKeyPath; - programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(managerKeyPath).toString()))); - } else { - const programKeyJson = `${existingProgramId}.json`; - if (!fs.existsSync(programKeyJson)) { - console.error(`Program keypair not found: ${programKeyJson}`); - console.error("Run `solana-keygen` to create a new keypair (either with 'new', or with 'grind'), and pass it to this command with --program-key"); - console.error("For example: solana-keygen grind --starts-with ntt:1 --ignore-case") - process.exit(1); - } - programKeypairPath = programKeyJson; - programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(programKeyJson).toString()))); - if (existingProgramId !== programKeypair.publicKey.toBase58()) { - console.error(`The private key in ${programKeyJson} does not match the existing program ID: ${existingProgramId}`); - process.exit(1); - } - } - - // see if the program key matches the existing program ID. if not, we need - // to update the latter in the Anchor.toml file and the lib.rs file(s) - const providedProgramId = programKeypair.publicKey.toBase58(); - if (providedProgramId !== existingProgramId) { - // only ask for confirmation if the current directory is ".". if it's - // something else (a worktree) then it's a fresh checkout and we just - // override the address anyway. - if (pwd === ".") { - console.error(`Program keypair does not match the existing program ID: ${existingProgramId}`); - await askForConfirmation(`Do you want to update the program ID in the Anchor.toml file and the lib.rs file to ${providedProgramId}?`); - } - - const anchorTomlPath = `${pwd}/solana/Anchor.toml`; - const libRsPath = `${pwd}/solana/programs/example-native-token-transfers/src/lib.rs`; - - const anchorToml = fs.readFileSync(anchorTomlPath).toString(); - const newAnchorToml = anchorToml.replace(existingProgramId, providedProgramId); - fs.writeFileSync(anchorTomlPath, newAnchorToml); - const libRs = fs.readFileSync(libRsPath).toString(); - const newLibRs = libRs.replace(existingProgramId, providedProgramId); - fs.writeFileSync(libRsPath, newLibRs); - } - - - // First we check that the provided mint's mint authority is the program's token authority PDA when in burning mode. - // This is checked in the program initialiser anyway, but we can save some - // time by checking it here and failing early (not to mention better - // diagnostics). - - const emitter = NTT.transceiverPdas(providedProgramId).emitterAccount().toBase58(); - const payerKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(payer).toString()))); - - // this is not super pretty... I want to initialise the 'ntt' object, but - // because it's not deployed yet, fetching the version will fail, and thus default to whatever the default version is. - // We want to use the correct version (because the sdk's behaviour depends on it), so we first create a dummy ntt instance, - // let that fill in all the necessary fields, and then create a new instance with the correct version. - // It should be possible to avoid this dummy object and just instantiate 'SolanaNtt' directly, but I wasn't - // sure where the various pieces are plugged together and this seemed easier. - // TODO: refactor this to avoid the dummy object - const dummy: SolanaNtt = await ch.getProtocol("Ntt", { - ntt: { - manager: providedProgramId, - token: token, - transceiver: { wormhole: emitter }, - } - }) as SolanaNtt; - - const ntt: SolanaNtt = new SolanaNtt( - dummy.network, - dummy.chain, - dummy.connection, - dummy.contracts, - version ?? undefined - ); - - // get the mint authority of 'token' - const tokenMint = new PublicKey(token); - // const tokenInfo = await ch.connection.getTokenInfo(tokenMint); - const connection: Connection = await ch.getRpc(); - const mintInfo = await connection.getAccountInfo(tokenMint) - if (!mintInfo) { - console.error(`Mint ${token} not found on ${ch.chain} ${ch.network}`); - process.exit(1); - } - const mint = spl.unpackMint(tokenMint, mintInfo, mintInfo.owner); - - if (mode === "burning") { - const expectedMintAuthority = ntt.pdas.tokenAuthority().toBase58(); - const actualMintAuthority: string | null = mint.mintAuthority?.toBase58() ?? null; - if (actualMintAuthority !== expectedMintAuthority) { - console.error(`Mint authority mismatch for ${token}`); - console.error(`Expected: ${expectedMintAuthority}`); - console.error(`Actual: ${actualMintAuthority}`); - console.error(`Set the mint authority to the program's token authority PDA with e.g.:`); - console.error(`spl-token authorize ${token} mint ${expectedMintAuthority}`); - process.exit(1); - } - } - - let binary: string; - - const skipDeploy = false; - - if (!skipDeploy) { - if (binaryPath) { - binary = binaryPath; - } else { - // build the program - // TODO: build with docker - checkAnchorVersion(); - const proc = Bun.spawn( - ["anchor", - "build", - "-p", "example_native_token_transfers", - "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) - ], { - cwd: `${pwd}/solana` - }); - - // const _out = await new Response(proc.stdout).text(); - - await proc.exited; - if (proc.exitCode !== 0) { - process.exit(proc.exitCode ?? 1); - } - - binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; - } - - - await checkSolanaBinary(binary, wormhole, providedProgramId, version ?? undefined) - - // if buffer.json doesn't exist, create it - if (!fs.existsSync(`buffer.json`)) { - execSync(`solana-keygen new -o buffer.json --no-bip39-passphrase`); - } else { - console.info("buffer.json already exists.") - askForConfirmation("Do you want continue an exiting deployment? If not, delete the buffer.json file and run the command again."); - } - - const deployCommand = [ - "solana", - "program", - "deploy", - "--program-id", programKeypairPath, - "--buffer", `buffer.json`, - binary, - "--keypair", payer, - "-u", ch.config.rpc, - "--commitment", "finalized" - ]; - - if (priorityFee !== undefined) { - deployCommand.push("--with-compute-unit-price", priorityFee.toString()); - } - - const deployProc = Bun.spawn(deployCommand); - - const out = await new Response(deployProc.stdout).text(); - - await deployProc.exited; - - if (deployProc.exitCode !== 0) { - process.exit(deployProc.exitCode ?? 1); - } - - // success. remove buffer.json - fs.unlinkSync("buffer.json"); - - console.log(out); - } - - if (initialize) { - // wait 3 seconds - await new Promise((resolve) => setTimeout(resolve, 3000)); - - const tx = ntt.initialize( - toUniversal(ch.chain, payerKeypair.publicKey.toBase58()), - { - mint: new PublicKey(token), - mode, - outboundLimit: 100000000n, - }); - - const signer = await getSigner(ch, "privateKey", encoding.b58.encode(payerKeypair.secretKey)); - - try { - await signSendWait(ch, tx, signer.signer); - } catch (e: any) { - console.error(e.logs); - } - } - - return { chain: ch.chain, address: toUniversal(ch.chain, providedProgramId) }; -} - -async function missingConfigs( - deps: Partial<{ [C in Chain]: Deployment }>, - verbose: boolean, -): Promise> { - const missingConfigs: Partial<{ [C in Chain]: MissingImplicitConfig }> = {}; - - for (const [fromChain, from] of Object.entries(deps)) { - let count = 0; - assertChain(fromChain); - - let missing: MissingImplicitConfig = { - managerPeers: [], - transceiverPeers: [], - evmChains: [], - standardRelaying: [], - specialRelaying: [], - solanaWormholeTransceiver: false, - solanaUpdateLUT: false, - }; - - if (chainToPlatform(fromChain) === "Solana") { - const solanaNtt = from.ntt as SolanaNtt; - const selfWormholeTransceiver = solanaNtt.pdas.registeredTransceiver(new PublicKey(solanaNtt.contracts.ntt!.manager)).toBase58(); - const registeredSelfTransceiver = await retryWithExponentialBackoff(() => solanaNtt.connection.getAccountInfo(new PublicKey(selfWormholeTransceiver)), 5, 5000); - if (registeredSelfTransceiver === null) { - count++; - missing.solanaWormholeTransceiver = true; - } - - // here we just check if the LUT update function returns an instruction. - // if it does, it means the LUT is missing or outdated. notice that - // we're not actually updating the LUT here, just checking if it's - // missing, so it's ok to use the 0 pubkey as the payer. - const updateLUT = solanaNtt.initializeOrUpdateLUT({ payer: new PublicKey(0) }); - // check if async generator is non-empty - if (!(await updateLUT.next()).done) { - count++; - missing.solanaUpdateLUT = true; - } - } - - for (const [toChain, to] of Object.entries(deps)) { - assertChain(toChain); - if (fromChain === toChain) { - continue; - } - if (verbose) { - process.stdout.write(`Verifying registration for ${fromChain} -> ${toChain}......\n`); - } - const peer = await retryWithExponentialBackoff(() => from.ntt.getPeer(toChain), 5, 5000); - if (peer === null) { - const configLimit = from.config.local?.limits?.inbound?.[toChain]?.replace(".", ""); - count++; - missing.managerPeers.push({ - address: to.manager, - tokenDecimals: to.decimals, - inboundLimit: BigInt(configLimit ?? 0), - }); - } else { - // @ts-ignore TODO - if (!Buffer.from(peer.address.address.address).equals(Buffer.from(to.manager.address.address))) { - console.error(`Peer address mismatch for ${fromChain} -> ${toChain}`); - } - if (peer.tokenDecimals !== to.decimals) { - console.error(`Peer decimals mismatch for ${fromChain} -> ${toChain}`); - } - } - - if (chainToPlatform(fromChain) === "Evm") { - const toIsEvm = chainToPlatform(toChain) === "Evm"; - const toIsSolana = chainToPlatform(toChain) === "Solana"; - const whTransceiver = await from.ntt.getTransceiver(0) as EvmNttWormholeTranceiver; - - if (toIsEvm) { - const remoteToEvm = await whTransceiver.isEvmChain(toChain); - if (!remoteToEvm) { - count++; - missing.evmChains.push(toChain); - } - - const standardRelaying = await whTransceiver.isWormholeRelayingEnabled(toChain); - if (!standardRelaying) { - count++; - missing.standardRelaying.push(toChain); - } - } else if (toIsSolana) { - const specialRelaying = await whTransceiver.isSpecialRelayingEnabled(toChain); - if (!specialRelaying) { - count++; - missing.specialRelaying.push(toChain); - } - } - } - - const transceiverPeer = await retryWithExponentialBackoff(() => from.whTransceiver.getPeer(toChain), 5, 5000); - if (transceiverPeer === null) { - count++; - missing.transceiverPeers.push(to.whTransceiver.getAddress()); - } else { - // @ts-ignore TODO - if (!Buffer.from(transceiverPeer.address.address).equals(Buffer.from(to.whTransceiver.getAddress().address.address))) { - console.error(`Transceiver peer address mismatch for ${fromChain} -> ${toChain}`); - } - } - - } - if (count > 0) { - missingConfigs[fromChain] = missing; - } - } - return missingConfigs; -} - -async function pushDeployment(deployment: Deployment, signerType: SignerType, evmVerify: boolean, yes: boolean, filePath?: string): Promise { - const diff = diffObjects(deployment.config.local!, deployment.config.remote!); - if (Object.keys(diff).length === 0) { - return; - } - - const canonical = canonicalAddress(deployment.manager); - console.log(`Pushing changes to ${deployment.manager.chain} (${canonical})`) - - console.log(chalk.reset(colorizeDiff(diff))); - if (!yes) { - await askForConfirmation(); - } - - const ctx = deployment.ctx; - - const signer = await getSigner(ctx, signerType, undefined, filePath); - - let txs = []; - // we perform this last to make sure we don't accidentally lock ourselves out - let updateOwner: ReturnType | undefined = undefined; - let managerUpgrade: { from: string, to: string } | undefined; - for (const k of Object.keys(diff)) { - if (k === "version") { - // TODO: check against existing version, and make sure no major version changes - managerUpgrade = { from: diff[k]!.pull!, to: diff[k]!.push! }; - } else if (k === "owner") { - const address: AccountAddress = toUniversal(deployment.manager.chain, diff[k]?.push!); - updateOwner = deployment.ntt.setOwner(address, signer.address.address); - } else if (k === "pauser") { - const address: AccountAddress = toUniversal(deployment.manager.chain, diff[k]?.push!); - txs.push(deployment.ntt.setPauser(address, signer.address.address)); - } else if (k === "paused") { - if (diff[k]?.push === true) { - txs.push(deployment.ntt.pause(signer.address.address)); - } else { - txs.push(deployment.ntt.unpause(signer.address.address)); - } - } else if (k === "limits") { - const newOutbound = diff[k]?.outbound?.push; - if (newOutbound) { - // TODO: verify amount has correct number of decimals? - // remove "." from string and convert to bigint - const newOutboundBigint = BigInt(newOutbound.replace(".", "")); - txs.push(deployment.ntt.setOutboundLimit(newOutboundBigint, signer.address.address)); - } - const inbound = diff[k]?.inbound; - if (inbound) { - for (const chain of Object.keys(inbound)) { - assertChain(chain); - const newInbound = inbound[chain]?.push; - if (newInbound) { - // TODO: verify amount has correct number of decimals? - const newInboundBigint = BigInt(newInbound.replace(".", "")); - txs.push(deployment.ntt.setInboundLimit(chain, newInboundBigint, signer.address.address)); - } - } - } - } else if (k === "transceivers") { - // TODO: refactor this nested loop stuff into separate functions at least - // alternatively we could first recursively collect all the things - // to do into a flattened list (with entries like - // transceivers.wormhole.pauser), and have a top-level mapping of - // these entries to how they should be handled - for (const j of Object.keys(diff[k] as object)) { - if (j === "wormhole") { - for (const l of Object.keys(diff[k]![j] as object)) { - if (l === "pauser") { - const newTransceiverPauser = toUniversal(deployment.manager.chain, diff[k]![j]![l]!.push!); - txs.push(deployment.whTransceiver.setPauser(newTransceiverPauser, signer.address.address)); - } else { - console.error(`Unsupported field: ${k}.${j}.${l}`); - process.exit(1); - } - } - } else { - console.error(`Unsupported field: ${k}.${j}`); - process.exit(1); - - } - } - } else { - console.error(`Unsupported field: ${k}`); - process.exit(1); - } - } - if (managerUpgrade) { - await upgrade(managerUpgrade.from, managerUpgrade.to, deployment.ntt, ctx, signerType, evmVerify); - } - for (const tx of txs) { - await signSendWait(ctx, tx, signer.signer) - } - if (updateOwner) { - await signSendWait(ctx, updateOwner, signer.signer) - } -} - -async function pullDeployments(deployments: Config, network: Network, verbose: boolean): Promise }>> { - let deps: Partial<{ [C in Chain]: Deployment }> = {}; - - for (const [chain, deployment] of Object.entries(deployments.chains)) { - if (verbose) { - process.stdout.write(`Fetching config for ${chain}......\n`); - } - assertChain(chain); - const managerAddress: string | undefined = deployment.manager; - if (managerAddress === undefined) { - console.error(`manager field not found for chain ${chain}`); - // process.exit(1); - continue; - } - const [remote, ctx, ntt, decimals] = await pullChainConfig( - network, - { chain, address: toUniversal(chain, managerAddress) }, - overrides - ); - const local = deployments.chains[chain]; - - // TODO: what if it's not index 0... - // we should check that the address of this transceiver matches the - // address in the config. currently we just assume that ix 0 is the wormhole one - const whTransceiver = await ntt.getTransceiver(0); - if (whTransceiver === null) { - console.error(`Wormhole transceiver not found for ${chain}`); - process.exit(1); - } - - deps[chain] = { - ctx, - ntt, - decimals, - manager: { chain, address: toUniversal(chain, managerAddress) }, - whTransceiver, - config: { - remote, - local, - } - }; - } - - const config = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.config.remote])); - const ntts = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.ntt])); - await pullInboundLimits(ntts, config, verbose); - return deps; -} - -async function pullChainConfig( - network: N, - manager: ChainAddress, - overrides?: WormholeConfigOverrides -): Promise<[ChainConfig, ChainContext, Ntt, number]> { - const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(manager.chain); - - const nativeManagerAddress = canonicalAddress(manager); - - const { ntt, addresses }: { ntt: Ntt; addresses: Partial; } = - await nttFromManager(ch, nativeManagerAddress); - - const mode = await ntt.getMode(); - const outboundLimit = await ntt.getOutboundLimit(); - const threshold = await ntt.getThreshold(); - - const decimals = await ntt.getTokenDecimals(); - // insert decimal point into number - const outboundLimitDecimals = formatNumber(outboundLimit, decimals); - - const paused = await ntt.isPaused(); - const owner = await ntt.getOwner(); - const pauser = await ntt.getPauser(); - - const version = getVersion(manager.chain, ntt); - - const transceiverPauser = await ntt.getTransceiver(0).then((t) => t?.getPauser() ?? null); - - const config: ChainConfig = { - version, - mode, - paused, - owner: owner.toString(), - manager: nativeManagerAddress, - token: addresses.token!, - transceivers: { - threshold, - wormhole: { address: addresses.transceiver!.wormhole! }, - }, - limits: { - outbound: outboundLimitDecimals, - inbound: {}, - }, - }; - if (transceiverPauser) { - config.transceivers.wormhole.pauser = transceiverPauser.toString(); - } - if (pauser) { - config.pauser = pauser.toString(); - } - return [config, ch, ntt, decimals]; -} - -async function getImmutables(chain: C, ntt: Ntt) { - const platform = chainToPlatform(chain); - if (platform !== "Evm") { - return null; - } - const evmNtt = ntt as EvmNtt; - const transceiver = await evmNtt.getTransceiver(0) as EvmNttWormholeTranceiver; - const consistencyLevel = await transceiver.transceiver.consistencyLevel(); - const wormholeRelayer = await transceiver.transceiver.wormholeRelayer(); - const specialRelayer = await transceiver.transceiver.specialRelayer(); - const gasLimit = await transceiver.transceiver.gasLimit(); - - const token = await evmNtt.manager.token(); - const tokenDecimals = await evmNtt.manager.tokenDecimals(); - - const whTransceiverImmutables = { - consistencyLevel, - wormholeRelayer, - specialRelayer, - gasLimit, - }; - return { - manager: { - token, - tokenDecimals, - }, - wormholeTransceiver: whTransceiverImmutables, - }; -} - -async function getPdas(chain: C, ntt: Ntt) { - const platform = chainToPlatform(chain); - if (platform !== "Solana") { - return null; - } - const solanaNtt = ntt as SolanaNtt; - const config = solanaNtt.pdas.configAccount(); - const emitter = NTT.transceiverPdas(solanaNtt.program.programId).emitterAccount(); - const outboxRateLimit = solanaNtt.pdas.outboxRateLimitAccount(); - const tokenAuthority = solanaNtt.pdas.tokenAuthority(); - const lutAccount = solanaNtt.pdas.lutAccount(); - const lutAuthority = solanaNtt.pdas.lutAuthority(); - - return { - config, - emitter, - outboxRateLimit, - tokenAuthority, - lutAccount, - lutAuthority, - }; -} - -function getVersion(chain: C, ntt: Ntt): string { - const platform = chainToPlatform(chain); - switch (platform) { - case "Evm": - return (ntt as EvmNtt).version - case "Solana": - return (ntt as SolanaNtt).version - default: - throw new Error("Unsupported platform"); - } -} - -// TODO: there should be a more elegant way to do this, than creating a -// "dummy" NTT, then calling verifyAddresses to get the contract diff, then -// finally reconstructing the "real" NTT object from that -async function nttFromManager( - ch: ChainContext, - nativeManagerAddress: string -): Promise<{ ntt: Ntt; addresses: Partial }> { - const onlyManager = await ch.getProtocol("Ntt", { - ntt: { - manager: nativeManagerAddress, - token: null, - transceiver: {}, - } - }); - const diff = await onlyManager.verifyAddresses(); - - const addresses: Partial = { manager: nativeManagerAddress, ...diff }; - - const ntt = await ch.getProtocol("Ntt", { - ntt: addresses - }); - return { ntt, addresses }; -} - -function formatNumber(num: bigint, decimals: number) { - if (num === 0n) { - return "0." + "0".repeat(decimals); - } - const str = num.toString(); - const formatted = str.slice(0, -decimals) + "." + str.slice(-decimals); - if (formatted.startsWith(".")) { - return "0" + formatted; - } - return formatted; -} - -function checkNumberFormatting(formatted: string, decimals: number): boolean { - // check that the string has the correct number of decimals - const parts = formatted.split("."); - if (parts.length !== 2) { - return false; - } - if (parts[1].length !== decimals) { - return false; - } - return true; -} - -function cargoNetworkFeature(network: Network): string { - switch (network) { - case "Mainnet": - return "mainnet"; - case "Testnet": - return "solana-devnet"; - case "Devnet": - return "tilt-devnet"; - default: - throw new Error("Unsupported network"); - } -} - - -async function askForConfirmation(prompt: string = "Do you want to continue?"): Promise { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - const answer = await new Promise((resolve) => { - rl.question(`${prompt} [y/n]`, resolve); - }); - rl.close(); - - if (answer !== "y") { - console.log("Aborting"); - process.exit(0); - } -} - -// NOTE: modifies the config object in place -// TODO: maybe introduce typestate for having pulled inbound limits? -async function pullInboundLimits(ntts: Partial<{ [C in Chain]: Ntt }>, config: Config["chains"], verbose: boolean) { - for (const [c1, ntt1] of Object.entries(ntts)) { - assertChain(c1); - const chainConf = config[c1]; - if (!chainConf) { - console.error(`Chain ${c1} not found in deployment`); - process.exit(1); - } - const decimals = await ntt1.getTokenDecimals(); - for (const [c2, ntt2] of Object.entries(ntts)) { - assertChain(c2); - if (ntt1 === ntt2) { - continue; - } - if (verbose) { - process.stdout.write(`Fetching inbound limit for ${c1} -> ${c2}.......\n`); - } - const peer = await retryWithExponentialBackoff(() => ntt1.getPeer(c2), 5, 5000); - if (chainConf.limits?.inbound === undefined) { - chainConf.limits.inbound = {}; - } - - const limit = peer?.inboundLimit ?? 0n; - - chainConf.limits.inbound[c2] = formatNumber(limit, decimals) - - } - } -} - -async function checkSolanaBinary(binary: string, wormhole: string, providedProgramId: string, version?: string) { - // ensure binary path exists - if (!fs.existsSync(binary)) { - console.error(`.so file not found: ${binary}`); - process.exit(1); - } - // console.log(`Checking binary ${binary} for wormhole and provided program ID`); - - // convert wormhole and providedProgramId from base58 to hex - const wormholeHex = new PublicKey(wormhole).toBuffer().toString("hex"); - const providedProgramIdHex = new PublicKey(providedProgramId).toBuffer().toString("hex"); - const versionHex = version ? Buffer.from(version).toString("hex") : undefined; - - if (!searchHexInBinary(binary, wormholeHex)) { - console.error(`Wormhole address not found in binary: ${wormhole}`); - process.exit(1); - } - if (!searchHexInBinary(binary, providedProgramIdHex)) { - console.error(`Provided program ID not found in binary: ${providedProgramId}`); - process.exit(1); - } - if (versionHex && !searchHexInBinary(binary, versionHex)) { - // TODO: figure out how to search for the version string in the binary - // console.error(`Version string not found in binary: ${version}`); - // process.exit(1); - } -} - -// not the most efficient, but at least it's definitely portable -function searchHexInBinary(binaryPath: string, searchHex: string) { - const buffer = fs.readFileSync(binaryPath); - const hexString = buffer.toString('hex'); - const found = hexString.includes(searchHex); - - return found; -} - -export function ensureNttRoot(pwd: string = ".") { - if (!fs.existsSync(`${pwd}/evm/foundry.toml`) || !fs.existsSync(`${pwd}/solana/Anchor.toml`)) { - console.error("Run this command from the root of an NTT project."); - process.exit(1); - } -} - -function checkAnchorVersion() { - const expected = "0.29.0"; - try { - execSync("which anchor"); - } catch { - console.error("Anchor CLI is not installed.\nSee https://www.anchor-lang.com/docs/installation") - process.exit(1); - } - const version = execSync("anchor --version").toString().trim(); - // version looks like "anchor-cli 0.14.0" - const [_, v] = version.split(" "); - if (v !== expected) { - console.error(`Anchor CLI version must be ${expected} but is ${v}`); - process.exit(1); - } -} -function loadConfig(path: string): Config { - if (!fs.existsSync(path)) { - console.error(`File not found: ${path}`); - console.error(`Create with 'ntt init' or specify another file with --path`); - process.exit(1); - } - const deployments: Config = JSON.parse(fs.readFileSync(path).toString()); - return deployments; -} - -function resolveVersion(latest: boolean, ver: string | undefined, local: boolean, platform: Platform): string | null { - if ((latest ? 1 : 0) + (ver ? 1 : 0) + (local ? 1 : 0) !== 1) { - console.error("Specify exactly one of --latest, --ver, or --local"); - const available = getAvailableVersions(platform); - console.error(`Available versions for ${platform}:\n${available.join("\n")}`); - process.exit(1); - } - if (latest) { - const available = getAvailableVersions(platform); - return available.sort().reverse()[0]; - } else if (ver) { - return ver; - } else { - // local version - return null; - } -} - -function warnLocalDeployment(yes: boolean): Promise { - if (!yes) { - console.warn(chalk.yellow("WARNING: You are deploying from your local working directory.")); - console.warn(chalk.yellow("This bypasses version control and may deploy untested changes.")); - console.warn(chalk.yellow("Ensure your local changes are thoroughly tested and compatible.")); - return askForConfirmation("Are you sure you want to continue with the local deployment?"); - } - return Promise.resolve(); -} - -function validateChain(network: N, chain: C) { - if (network === "Testnet") { - if (chain === "Ethereum") { - console.error("Ethereum is deprecated on Testnet. Use EthereumSepolia instead."); - process.exit(1); - } - // if on testnet, and the chain has a *Sepolia counterpart, use that instead - if (chains.find((c) => c === `${c}Sepolia`)) { - console.error(`Chain ${chain} is deprecated. Use ${chain}Sepolia instead.`); - process.exit(1); - } - } -} - -function retryWithExponentialBackoff( - fn: () => Promise, - maxRetries: number, - delay: number, -): Promise { - const backoff = (retry: number) => Math.min(2 ** retry * delay, 10000) + Math.random() * 1000; - const attempt = async (retry: number): Promise => { - try { - return await fn(); - } catch (e) { - if (retry >= maxRetries) { - throw e; - } - const time = backoff(retry); - await new Promise((resolve) => setTimeout(resolve, backoff(time))); - return await attempt(retry + 1); - } - }; - return attempt(0); -} - -function nttVersion(): { version: string, commit: string, path: string, remote: string } | null { - const nttDir = `${process.env.HOME}/.ntt-cli`; - try { - const versionFile = fs.readFileSync(`${nttDir}/version`).toString().trim(); - const [commit, installPath, version, remote] = versionFile.split("\n"); - return { version, commit, path: installPath, remote }; - } catch { - return null; - } -} +YARGSCommand.parse(); diff --git a/package-lock.json b/package-lock.json index 780760dcb..bb28295d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "solana", "sdk/route", "sdk/examples", - "cli" + "cli", + "cli-core" ], "devDependencies": { "@solana/spl-token": "0.3.9", @@ -33,11 +34,13 @@ "name": "@wormhole-foundation/ntt-cli", "version": "1.1.0", "dependencies": { + "@wormhole-foundation/ntt-cli-core": "*", + "bun": "^1.2.5", "chalk": "^5.3.0", "yargs": "^17.7.2" }, "bin": { - "ntt": "src/index.ts" + "ntt": "src/bin.ts" }, "devDependencies": { "@types/bun": "latest", @@ -47,44 +50,70 @@ "typescript": "^5.0.0" } }, - "cli/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "cli-core": { + "name": "@wormhole-foundation/ntt-cli-core", + "version": "1.1.0", + "dependencies": { + "@solana/spl-token": "^0.4.13", + "@wormhole-foundation/sdk-definitions-ntt": "*", + "@wormhole-foundation/sdk-evm-ntt": "*", + "@wormhole-foundation/sdk-solana-ntt": "*" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "devDependencies": { + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-typescript": "^12.1.2", + "@types/yargs": "^17.0.32", + "chalk": "^5.3.0", + "rollup": "^4.35.0", + "rollup-plugin-string-import": "^1.2.5", + "yargs": "^17.7.2" + }, + "peerDependencies": { + "typescript": "^5.0.0" } }, - "cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "cli-core/node_modules/@solana/spl-token": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.13.tgz", + "integrity": "sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w==", + "license": "Apache-2.0", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.7", + "@solana/spl-token-metadata": "^0.1.6", + "buffer": "^6.0.3" }, "engines": { - "node": ">=12" + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.95.5" } }, - "cli/node_modules/yargs": { - "version": "17.7.2", + "cli-core/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "evm/ts": { @@ -146,6 +175,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -220,12 +250,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -233,32 +265,34 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -274,31 +308,34 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -306,68 +343,32 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -377,177 +378,73 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "@babel/types": "^7.26.10" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -560,6 +457,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -573,6 +471,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -586,6 +485,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -594,11 +494,46 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -612,6 +547,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -621,13 +557,14 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -641,6 +578,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -654,6 +592,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -667,6 +606,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -680,6 +620,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -693,6 +634,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -706,6 +648,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -714,11 +657,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -731,13 +692,14 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -758,35 +720,34 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@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.3.1", "globals": "^11.1.0" }, @@ -795,15 +756,15 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -814,6 +775,7 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@certusone/wormhole-sdk": { @@ -2661,6 +2623,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.3.1", @@ -2678,6 +2641,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -2688,6 +2652,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -2698,6 +2663,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -2716,6 +2682,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^29.7.0", @@ -2764,6 +2731,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", @@ -2780,6 +2748,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "expect": "^29.7.0", @@ -2806,6 +2775,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -2824,6 +2794,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^29.7.0", @@ -2840,6 +2811,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", @@ -2896,6 +2868,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", @@ -2911,6 +2884,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^29.7.0", @@ -2927,6 +2901,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/test-result": "^29.7.0", @@ -2943,6 +2918,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2983,10 +2959,11 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -3011,6 +2988,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6.0.0" @@ -3027,6 +3005,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3170,6 +3149,149 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@oven/bun-darwin-aarch64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.2.5.tgz", + "integrity": "sha512-ggZfdpgUJ/OiWrfcfTgHeSTHcec5HAjkGrZHL9FJ/R60sydRKPYHgAgexdIoJAGfsCVAL+x7y8NSTRIAX8J4Ng==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.2.5.tgz", + "integrity": "sha512-4zqyQLJB33s99KcTxH6yQqH5EYBmF1qofQTtLsToIFbIZN1NqSp/aegYiGmxO5Kj/BuWsy8Wf8MS6vX2O0o2Lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-darwin-x64-baseline": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.2.5.tgz", + "integrity": "sha512-3W1RO3/D6Z1S79J47F/DLzmK+dgkYq5hS1ShOCSBAYTTA2b1ZuymaN8avGzSb9ed5W0QfxtyeAksfEY2xUBOqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-linux-aarch64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.2.5.tgz", + "integrity": "sha512-NQFtAVyQyJhLYrhFVxKdh6cqrDNc60pBnBGLQSO8PU+oyFyiJ3e3gGXjLzMbxd6cJxNIK5FZ0JIq96WljKAhlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-aarch64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64-musl/-/bun-linux-aarch64-musl-1.2.5.tgz", + "integrity": "sha512-URlISBOE2HQi8qdru691OYywJRwChxMfXFbk26tCgdZ01LgGAKsIjAYylefuSsPuA697imDN3Pel3D7rveusmw==", + "cpu": [ + "aarch64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.2.5.tgz", + "integrity": "sha512-pa3kQ4cXNV0jk5aM8+Hdmxr+b4QoPVgeAIA454SN5l3hMGfNsHjczKpsz0ksInZ8506iMMTCPEBXpyQJcSme+Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-baseline": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.2.5.tgz", + "integrity": "sha512-fCm/qp7e3VYlaoRs6NIEsKubPqyxjzLv8/qZkxeLLOlPd7CS8L26UY4KPOSjA+wrhPT+Nxsyvl/EEJq2R/iauA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-DuU2kQnY48g9tNWjFrZqyG+U2emCBwlhOPxbuY/TMVVNSTMAcQbE/bb3s2pZdhZH5ssjc5SH/ZyWU1TePcYB2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-musl-baseline": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.2.5.tgz", + "integrity": "sha512-H7tuJz7mZvOTPo4yLbIXIxkiDGWSGd2DbwGl4zNol/FURqGsKQVqpomv86yl9KCXsUUOm5FX2i5Ed+ro8N//Cg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-windows-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.2.5.tgz", + "integrity": "sha512-oNDdPmzsCyvCATiYgkKWgxOeEx2F7m/i2MGUba+YJAeVXJsJg9iPJrLVBtETvKoSAgkXViwoUEw2U25jRYsp4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oven/bun-windows-x64-baseline": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.2.5.tgz", + "integrity": "sha512-j5FxI8FeKfWI6rEXA+1O3ASBMTp5CFcZ7MR+/aCpiBKrDse32wLaZMVGnvqQqs4y0YHUvR8b7eXHHTboezjL1w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -3219,10 +3341,385 @@ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", + "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", + "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", + "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", + "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", + "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", + "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", + "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", + "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", + "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", + "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", + "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", + "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", + "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", + "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", + "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", + "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", + "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", + "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", + "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", + "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", + "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@scure/base": { "version": "1.1.9", @@ -3302,6 +3799,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "type-detect": "4.0.8" @@ -3312,6 +3810,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" @@ -3342,6 +3841,129 @@ "node": ">= 10" } }, + "node_modules/@solana/codecs": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", + "integrity": "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-data-structures": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/codecs-strings": "2.0.0-rc.1", + "@solana/options": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", + "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz", + "integrity": "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", + "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-strings": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", + "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" + } + }, + "node_modules/@solana/errors": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", + "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/errors/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@solana/options": { + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", + "integrity": "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-data-structures": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/codecs-strings": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, "node_modules/@solana/spl-token": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", @@ -3358,6 +3980,36 @@ "@solana/web3.js": "^1.47.4" } }, + "node_modules/@solana/spl-token-group": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz", + "integrity": "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==", + "license": "Apache-2.0", + "dependencies": { + "@solana/codecs": "2.0.0-rc.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.95.3" + } + }, + "node_modules/@solana/spl-token-metadata": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz", + "integrity": "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/codecs": "2.0.0-rc.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.95.3" + } + }, "node_modules/@solana/web3.js": { "version": "1.95.8", "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.8.tgz", @@ -3518,6 +4170,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 6" @@ -3567,6 +4220,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -3581,6 +4235,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/types": "^7.0.0" @@ -3591,6 +4246,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3598,10 +4254,11 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/types": "^7.20.7" @@ -3643,11 +4300,19 @@ "@types/node": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -3727,6 +4392,13 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -3781,6 +4453,10 @@ "resolved": "cli", "link": true }, + "node_modules/@wormhole-foundation/ntt-cli-core": { + "resolved": "cli-core", + "link": true + }, "node_modules/@wormhole-foundation/sdk": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-1.0.0.tgz", @@ -4451,6 +5127,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -4469,6 +5146,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^27.5.1", @@ -4517,6 +5195,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/fake-timers": "^27.5.1", @@ -4533,6 +5212,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -4551,6 +5231,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -4566,6 +5247,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", @@ -4611,6 +5293,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "callsites": "^3.0.0", @@ -4626,6 +5309,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^27.5.1", @@ -4642,6 +5326,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/test-result": "^27.5.1", @@ -4658,6 +5343,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.1.0", @@ -4701,6 +5387,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "type-detect": "4.0.8" @@ -4711,6 +5398,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@sinonjs/commons": "^1.7.0" @@ -4721,6 +5409,7 @@ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -4748,6 +5437,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -4770,6 +5460,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/transform": "^27.5.1", @@ -4793,6 +5484,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/template": "^7.3.3", @@ -4809,6 +5501,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", @@ -4827,11 +5520,25 @@ "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", "dev": true }, + "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/cosmjs-types": { @@ -4849,6 +5556,7 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/diff-sequences": { @@ -4856,6 +5564,7 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -4866,6 +5575,7 @@ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -4927,6 +5637,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -4943,6 +5654,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/core": "^7.12.3", @@ -4960,6 +5672,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/core": "^27.5.1", @@ -4986,6 +5699,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5001,6 +5715,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -5032,6 +5747,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/core": "^27.5.1", @@ -5067,6 +5783,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.8.0", @@ -5111,6 +5828,7 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -5127,6 +5845,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5140,6 +5859,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5157,6 +5877,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -5175,6 +5896,7 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5185,6 +5907,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5212,6 +5935,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "jest-get-type": "^27.5.1", @@ -5226,6 +5950,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -5242,6 +5967,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -5263,6 +5989,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5277,6 +6004,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5287,6 +6015,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5309,6 +6038,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5324,6 +6054,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^27.5.1", @@ -5357,6 +6088,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -5391,6 +6123,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.7.2", @@ -5421,14 +6154,12 @@ } }, "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5458,6 +6189,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -5476,6 +6208,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/test-result": "^27.5.1", @@ -5495,6 +6228,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -5522,6 +6256,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^5.0.1", @@ -5537,6 +6272,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/resolve.exports": { @@ -5544,6 +6280,7 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -5554,6 +6291,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -5641,6 +6379,7 @@ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -5656,6 +6395,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">= 8" @@ -5666,6 +6406,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "imurmurhash": "^0.1.4", @@ -5680,6 +6421,26 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@wormhole-foundation/wormchain-sdk/node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -5739,6 +6500,7 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/acorn": { @@ -5758,6 +6520,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "acorn": "^7.1.1", @@ -5769,6 +6532,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "peer": true, "bin": { "acorn": "bin/acorn" @@ -5782,6 +6546,7 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.4.0" @@ -5797,6 +6562,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "4" @@ -5848,6 +6614,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "type-fest": "^0.21.3" @@ -5886,6 +6653,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "normalize-path": "^3.0.0", @@ -5985,6 +6753,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/transform": "^29.7.0", @@ -6007,6 +6776,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -6024,6 +6794,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/core": "^7.12.3", @@ -6041,6 +6812,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/template": "^7.3.3", @@ -6053,24 +6825,28 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -6081,6 +6857,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", @@ -6246,6 +7023,7 @@ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true, + "license": "BSD-2-Clause", "peer": true }, "node_modules/browserify-aes": { @@ -6262,9 +7040,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -6280,12 +7058,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -6329,6 +7108,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "node-int64": "^0.4.0" @@ -6362,6 +7142,7 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/buffer-layout": { @@ -6399,6 +7180,40 @@ "node": ">=0.10.0" } }, + "node_modules/bun": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/bun/-/bun-1.2.5.tgz", + "integrity": "sha512-fbQLt+DPiGUrPKdmsHRRT7cQAlfjdxPVFvLZrsUPmKiTdv+pU50ypdx9yRJluknSbyaZchFVV7Lx2KXikXKX2Q==", + "cpu": [ + "arm64", + "x64", + "aarch64" + ], + "hasInstallScript": true, + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32" + ], + "bin": { + "bun": "bin/bun.exe", + "bunx": "bin/bun.exe" + }, + "optionalDependencies": { + "@oven/bun-darwin-aarch64": "1.2.5", + "@oven/bun-darwin-x64": "1.2.5", + "@oven/bun-darwin-x64-baseline": "1.2.5", + "@oven/bun-linux-aarch64": "1.2.5", + "@oven/bun-linux-aarch64-musl": "1.2.5", + "@oven/bun-linux-x64": "1.2.5", + "@oven/bun-linux-x64-baseline": "1.2.5", + "@oven/bun-linux-x64-musl": "1.2.5", + "@oven/bun-linux-x64-musl-baseline": "1.2.5", + "@oven/bun-windows-x64": "1.2.5", + "@oven/bun-windows-x64-baseline": "1.2.5" + } + }, "node_modules/bun-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.0.tgz", @@ -6452,11 +7267,27 @@ "node": ">=8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -6474,9 +7305,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "version": "1.0.30001704", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001704.tgz", + "integrity": "sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==", "dev": true, "funding": [ { @@ -6492,6 +7323,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "CC-BY-4.0", "peer": true }, "node_modules/chalk": { @@ -6515,6 +7347,7 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -6545,22 +7378,25 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "peer": true, + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone-response": { @@ -6579,6 +7415,7 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "iojs": ">= 1.0.0", @@ -6590,6 +7427,7 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/color-convert": { @@ -6753,6 +7591,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/cosmjs-types": { @@ -6790,6 +7629,7 @@ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -6822,10 +7662,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "path-key": "^3.1.0", @@ -6852,6 +7693,7 @@ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/cssstyle": { @@ -6859,6 +7701,7 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cssom": "~0.3.6" @@ -6872,6 +7715,7 @@ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/data-urls": { @@ -6879,6 +7723,7 @@ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "abab": "^2.0.3", @@ -6894,6 +7739,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "punycode": "^2.1.1" @@ -6907,6 +7753,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=10.4" @@ -6917,6 +7764,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.7.0", @@ -6986,6 +7834,7 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -7010,7 +7859,6 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -7079,6 +7927,7 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -7108,6 +7957,7 @@ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "deprecated": "Use your platform's native DOMException instead", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" @@ -7121,6 +7971,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=8" @@ -7144,11 +7995,28 @@ "node": ">=10" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", - "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", + "version": "1.5.118", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.118.tgz", + "integrity": "sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/elliptic": { @@ -7175,6 +8043,7 @@ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=12" @@ -7201,18 +8070,17 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -7225,6 +8093,37 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -7277,9 +8176,10 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -7298,6 +8198,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { "esprima": "^4.0.1", @@ -7333,16 +8234,25 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -7533,6 +8443,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -7557,6 +8468,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -7621,6 +8533,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "bser": "2.1.1" @@ -7660,6 +8573,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^5.0.0", @@ -7756,6 +8670,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6.9.0" @@ -7770,15 +8685,23 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "peer": true, "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", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7792,11 +8715,27 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -7847,6 +8786,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -7872,11 +8812,12 @@ "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7972,10 +8913,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -7983,10 +8927,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -8055,6 +9005,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" @@ -8068,6 +9019,7 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/http-cache-semantics": { @@ -8080,6 +9032,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@tootallnate/once": "1", @@ -8112,6 +9065,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "agent-base": "6", @@ -8126,6 +9080,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "peer": true, "engines": { "node": ">=10.17.0" @@ -8144,6 +9099,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -8172,10 +9128,11 @@ ] }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -8196,6 +9153,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.8.19" @@ -8228,6 +9186,7 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/is-core-module": { @@ -8254,6 +9213,7 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8268,6 +9228,13 @@ "npm": ">=3" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8282,6 +9249,7 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/is-stream": { @@ -8289,6 +9257,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -8302,6 +9271,7 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/isexe": { @@ -8309,6 +9279,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/isomorphic-ws": { @@ -8324,16 +9295,18 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/core": "^7.23.9", @@ -8346,28 +9319,13 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -8375,18 +9333,12 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", @@ -8402,6 +9354,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "debug": "^4.1.1", @@ -8417,6 +9370,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "html-escaper": "^2.0.0", @@ -8481,6 +9435,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/core": "^29.7.0", @@ -8508,6 +9463,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "execa": "^5.0.0", @@ -8523,6 +9479,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^29.7.0", @@ -8555,6 +9512,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/core": "^29.7.0", @@ -8584,45 +9542,12 @@ } } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8684,6 +9609,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "detect-newline": "^3.0.0" @@ -8697,6 +9623,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8714,6 +9641,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -8733,6 +9661,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/fake-timers": "^27.5.1", @@ -8749,6 +9678,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -8767,6 +9697,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -8784,6 +9715,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "type-detect": "4.0.8" @@ -8794,6 +9726,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@sinonjs/commons": "^1.7.0" @@ -8804,6 +9737,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/yargs-parser": "*" @@ -8814,6 +9748,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -8827,6 +9762,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8848,6 +9784,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -8862,6 +9799,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -8880,6 +9818,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^5.0.1", @@ -8895,6 +9834,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/jest-environment-node": { @@ -8902,6 +9842,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^29.7.0", @@ -8929,6 +9870,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8955,6 +9897,7 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -8984,6 +9927,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9002,6 +9946,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/fake-timers": "^27.5.1", @@ -9018,6 +9963,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9036,6 +9982,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -9051,6 +9998,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "callsites": "^3.0.0", @@ -9066,6 +10014,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^27.5.1", @@ -9082,6 +10031,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.1.0", @@ -9109,6 +10059,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -9126,6 +10077,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "type-detect": "4.0.8" @@ -9136,6 +10088,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@sinonjs/commons": "^1.7.0" @@ -9146,6 +10099,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/yargs-parser": "*" @@ -9156,6 +10110,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -9169,6 +10124,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/jest-jasmine2/node_modules/diff-sequences": { @@ -9176,6 +10132,7 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -9186,6 +10143,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9202,6 +10160,7 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -9218,6 +10177,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9235,6 +10195,7 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -9245,6 +10206,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9272,6 +10234,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -9288,6 +10251,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -9309,6 +10273,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9323,6 +10288,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -9333,6 +10299,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9355,6 +10322,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^27.5.1", @@ -9389,6 +10357,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.7.2", @@ -9423,6 +10392,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9441,6 +10411,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^27.5.1", @@ -9459,6 +10430,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -9469,24 +10441,12 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-jasmine2/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-jasmine2/node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^5.0.1", @@ -9502,6 +10462,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/jest-jasmine2/node_modules/resolve.exports": { @@ -9509,20 +10470,19 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" } }, "node_modules/jest-jasmine2/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -9535,6 +10495,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -9551,6 +10512,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "imurmurhash": "^0.1.4", @@ -9559,18 +10521,12 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/jest-jasmine2/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "jest-get-type": "^29.6.3", @@ -9620,6 +10576,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -9635,6 +10592,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -9653,6 +10611,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -9663,6 +10622,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -9684,6 +10644,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "jest-regex-util": "^29.6.3", @@ -9698,6 +10659,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/console": "^29.7.0", @@ -9731,6 +10693,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^29.7.0", @@ -9765,6 +10728,7 @@ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -9779,6 +10743,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.11.6", @@ -9806,28 +10771,13 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -9835,13 +10785,6 @@ "node": ">=10" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -9864,6 +10807,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -9882,6 +10826,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jest/test-result": "^29.7.0", @@ -9902,6 +10847,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -9918,6 +10864,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -9981,6 +10928,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "abab": "^2.0.5", @@ -10024,15 +10972,17 @@ } }, "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -10043,6 +10993,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "punycode": "^2.1.1" @@ -10056,6 +11007,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=10.4" @@ -10066,6 +11018,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.7.0", @@ -10077,16 +11030,17 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "peer": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-bigint": { @@ -10107,6 +11061,7 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/json-stringify-safe": { @@ -10195,6 +11150,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10205,6 +11161,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10243,6 +11200,7 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/locate-path": { @@ -10250,6 +11208,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^4.1.0" @@ -10313,6 +11272,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "yallist": "^3.0.2" @@ -10323,6 +11283,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "semver": "^7.5.3" @@ -10334,28 +11295,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -10363,13 +11309,6 @@ "node": ">=10" } }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -10381,6 +11320,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "tmpl": "1.0.5" @@ -10397,6 +11337,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10412,6 +11363,7 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/micromatch": { @@ -10451,6 +11403,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10521,6 +11474,7 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/no-case": { @@ -10585,13 +11539,15 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/normalize-path": { @@ -10599,6 +11555,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -10620,6 +11577,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "path-key": "^3.0.0" @@ -10629,10 +11587,11 @@ } }, "node_modules/nwsapi": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", - "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.18.tgz", + "integrity": "sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/object-assign": { @@ -10664,6 +11623,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "mimic-fn": "^2.1.0" @@ -10710,6 +11670,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "yocto-queue": "^0.1.0" @@ -10726,6 +11687,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.2.0" @@ -10739,6 +11701,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -10755,6 +11718,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10770,6 +11734,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", @@ -10789,6 +11754,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/path-exists": { @@ -10796,6 +11762,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -10814,6 +11781,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -10840,10 +11808,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -10862,6 +11831,7 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 6" @@ -10872,6 +11842,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "find-up": "^4.0.0" @@ -10932,6 +11903,7 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "kleur": "^3.0.3", @@ -10992,11 +11964,18 @@ "license": "MIT" }, "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } }, "node_modules/pump": { "version": "3.0.2", @@ -11012,6 +11991,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -11032,6 +12012,7 @@ "url": "https://opencollective.com/fast-check" } ], + "license": "MIT", "peer": true }, "node_modules/querystringify": { @@ -11039,6 +12020,7 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/quick-lru": { @@ -11138,6 +12120,7 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/resolve": { @@ -11166,6 +12149,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "resolve-from": "^5.0.0" @@ -11179,6 +12163,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -11194,10 +12179,11 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -11226,7 +12212,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -11258,6 +12246,58 @@ "rlp": "bin/rlp" } }, + "node_modules/rollup": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", + "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.35.0", + "@rollup/rollup-android-arm64": "4.35.0", + "@rollup/rollup-darwin-arm64": "4.35.0", + "@rollup/rollup-darwin-x64": "4.35.0", + "@rollup/rollup-freebsd-arm64": "4.35.0", + "@rollup/rollup-freebsd-x64": "4.35.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", + "@rollup/rollup-linux-arm-musleabihf": "4.35.0", + "@rollup/rollup-linux-arm64-gnu": "4.35.0", + "@rollup/rollup-linux-arm64-musl": "4.35.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", + "@rollup/rollup-linux-riscv64-gnu": "4.35.0", + "@rollup/rollup-linux-s390x-gnu": "4.35.0", + "@rollup/rollup-linux-x64-gnu": "4.35.0", + "@rollup/rollup-linux-x64-musl": "4.35.0", + "@rollup/rollup-win32-arm64-msvc": "4.35.0", + "@rollup/rollup-win32-ia32-msvc": "4.35.0", + "@rollup/rollup-win32-x64-msvc": "4.35.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-string-import": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rollup-plugin-string-import/-/rollup-plugin-string-import-1.2.5.tgz", + "integrity": "sha512-soVwp0sWcAaN1tFthAGGBx5eQy94iAo2xozYVxyKH/WNHZiN2dJjUTlfdJkZWNXQY5e4333/lbImapski70tdA==", + "dev": true, + "license": "GPL-3.0-or-later", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "peerDependencies": { + "rollup": "4.20.0" + } + }, "node_modules/rpc-websockets": { "version": "7.11.2", "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.11.2.tgz", @@ -11330,6 +12370,7 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/saxes": { @@ -11337,6 +12378,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "xmlchars": "^2.2.0" @@ -11369,6 +12411,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" @@ -11396,6 +12439,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "shebang-regex": "^3.0.0" @@ -11409,6 +12453,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -11450,6 +12495,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/sisteransi": { @@ -11457,6 +12503,7 @@ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/slash": { @@ -11506,6 +12553,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -11516,6 +12564,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -11564,6 +12613,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "char-regex": "^1.0.2", @@ -11602,6 +12652,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -11612,6 +12663,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -11634,6 +12686,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -11667,6 +12720,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0", @@ -11700,6 +12754,7 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/table-layout": { @@ -11740,6 +12795,7 @@ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -11757,6 +12813,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -11777,6 +12834,7 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/through": { @@ -11821,18 +12879,9 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11851,10 +12900,11 @@ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "psl": "^1.1.33", @@ -12220,6 +13270,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -12230,6 +13281,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=10" @@ -12287,6 +13339,7 @@ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-typedarray": "^1.0.0" @@ -12329,15 +13382,16 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -12353,10 +13407,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "peer": true, "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -12370,6 +13425,7 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "querystringify": "^2.1.1", @@ -12409,10 +13465,11 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -12434,6 +13491,7 @@ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "browser-process-hrtime": "^1.0.0" @@ -12444,6 +13502,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" @@ -12457,6 +13516,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "makeerror": "1.0.12" @@ -12472,6 +13532,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "iconv-lite": "0.4.24" @@ -12482,6 +13543,7 @@ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/whatwg-url": { @@ -12498,6 +13560,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -12544,6 +13607,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12566,6 +13630,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "imurmurhash": "^0.1.4", @@ -12600,6 +13665,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true, + "license": "Apache-2.0", "peer": true }, "node_modules/xmlchars": { @@ -12607,6 +13673,7 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/xstream": { @@ -12639,25 +13706,25 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "peer": true, + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -12668,16 +13735,6 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -12692,6 +13749,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -12825,44 +13883,6 @@ "@wormhole-foundation/sdk-solana-core": "^1.0.0" } }, - "solana/node_modules/@solana/codecs-core": { - "version": "2.0.0-experimental.8618508", - "license": "MIT" - }, - "solana/node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-experimental.8618508", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - } - }, - "solana/node_modules/@solana/codecs-numbers": { - "version": "2.0.0-experimental.8618508", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508" - } - }, - "solana/node_modules/@solana/codecs-strings": { - "version": "2.0.0-experimental.8618508", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22" - } - }, - "solana/node_modules/@solana/options": { - "version": "2.0.0-experimental.8618508", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - } - }, "solana/node_modules/@solana/spl-token": { "version": "0.4.0", "license": "Apache-2.0", @@ -12878,39 +13898,6 @@ "peerDependencies": { "@solana/web3.js": "^1.89.1" } - }, - "solana/node_modules/@solana/spl-token-metadata": { - "version": "0.1.2", - "license": "Apache-2.0", - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-data-structures": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508", - "@solana/codecs-strings": "2.0.0-experimental.8618508", - "@solana/options": "2.0.0-experimental.8618508", - "@solana/spl-type-length-value": "0.1.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.87.6" - } - }, - "solana/node_modules/@solana/spl-type-length-value": { - "version": "0.1.0", - "license": "Apache-2.0", - "dependencies": { - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - } - }, - "solana/node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "license": "CC0-1.0", - "peer": true } } } diff --git a/package.json b/package.json index 2f2293458..6e54d1306 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "build:deps": "npm run build:contracts --workspaces --if-present && npm run generate", "version": "tsx setSdkVersion.ts" }, + "overrides": {}, "devDependencies": { "@solana/spl-token": "0.3.9", "@solana/web3.js": "^1.95.8", @@ -34,6 +35,7 @@ "solana", "sdk/route", "sdk/examples", - "cli" + "cli", + "cli-core" ] } From 94dcd01ea95fbba8f81eb777012c82aebccfcd58 Mon Sep 17 00:00:00 2001 From: a Date: Sat, 15 Mar 2025 14:51:27 -0500 Subject: [PATCH 3/6] noot --- cli-core/.gitignore | 1 + cli-core/dist/configuration.d.ts | 11 - cli-core/dist/diff.d.ts | 10 - cli-core/dist/evmsigner.d.ts | 25 - cli-core/dist/getSigner.d.ts | 14 - cli-core/dist/index.cjs | 2410 ------------------------------ cli-core/dist/index.d.ts | 51 - cli-core/dist/index.js | 2388 ----------------------------- cli-core/dist/side-effects.d.ts | 1 - cli-core/dist/tag.d.ts | 3 - 10 files changed, 1 insertion(+), 4913 deletions(-) create mode 100644 cli-core/.gitignore delete mode 100644 cli-core/dist/configuration.d.ts delete mode 100644 cli-core/dist/diff.d.ts delete mode 100644 cli-core/dist/evmsigner.d.ts delete mode 100644 cli-core/dist/getSigner.d.ts delete mode 100644 cli-core/dist/index.cjs delete mode 100644 cli-core/dist/index.d.ts delete mode 100644 cli-core/dist/index.js delete mode 100644 cli-core/dist/side-effects.d.ts delete mode 100644 cli-core/dist/tag.d.ts diff --git a/cli-core/.gitignore b/cli-core/.gitignore new file mode 100644 index 000000000..1521c8b76 --- /dev/null +++ b/cli-core/.gitignore @@ -0,0 +1 @@ +dist diff --git a/cli-core/dist/configuration.d.ts b/cli-core/dist/configuration.d.ts deleted file mode 100644 index 53f8b3272..000000000 --- a/cli-core/dist/configuration.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { type Chain } from "@wormhole-foundation/sdk"; -import * as yargs from "yargs"; -type ChainConfig = Partial; -declare const configTemplate: { - scan_api_key: string; -}; -export declare const command: (args: yargs.Argv<{}>) => yargs.Argv<{}>; -export declare function get(chain: Chain, key: keyof ChainConfig, { reportError }: { - reportError?: boolean | undefined; -}): string | undefined; -export {}; diff --git a/cli-core/dist/diff.d.ts b/cli-core/dist/diff.d.ts deleted file mode 100644 index bf94eab48..000000000 --- a/cli-core/dist/diff.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type Diff = { - push?: T; - pull?: T; -}; -type DiffMap = { - [K in keyof T]: T[K] extends object ? Partial> : Diff; -}; -export declare function diffObjects>(obj1: T, obj2: T): Partial>; -export declare function colorizeDiff(diff: any, indent?: number): string; -export {}; diff --git a/cli-core/dist/evmsigner.d.ts b/cli-core/dist/evmsigner.d.ts deleted file mode 100644 index 1e8bcaa80..000000000 --- a/cli-core/dist/evmsigner.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Network, SignOnlySigner, SignedTx, Signer, UnsignedTransaction } from '@wormhole-foundation/sdk-connect'; -import { PlatformNativeSigner } from '@wormhole-foundation/sdk-connect'; -import { type EvmChains } from '@wormhole-foundation/sdk-evm'; -import type { Signer as EthersSigner, Provider } from 'ethers'; -export declare function getEvmSigner(rpc: Provider, key: string | EthersSigner, opts?: { - maxGasLimit?: bigint; - chain?: EvmChains; - debug?: boolean; -}): Promise; -export declare function getEvmSignerForKey(rpc: Provider, privateKey: string): Promise; -export declare function getEvmSignerForSigner(signer: EthersSigner): Promise; -export declare class EvmNativeSigner extends PlatformNativeSigner implements SignOnlySigner { - readonly opts?: { - maxGasLimit?: bigint | undefined; - debug?: boolean | undefined; - } | undefined; - constructor(_chain: C, _address: string, _signer: EthersSigner, opts?: { - maxGasLimit?: bigint | undefined; - debug?: boolean | undefined; - } | undefined); - chain(): C; - address(): string; - sign(tx: UnsignedTransaction[]): Promise; -} -export declare function isEvmNativeSigner(signer: Signer): signer is EvmNativeSigner; diff --git a/cli-core/dist/getSigner.d.ts b/cli-core/dist/getSigner.d.ts deleted file mode 100644 index 0a2817884..000000000 --- a/cli-core/dist/getSigner.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ChainContext, type Chain, type ChainAddress, type Network, type Signer } from "@wormhole-foundation/sdk"; -export type SignerType = "privateKey" | "ledger"; -export type SignerSource = { - type: SignerType; - source: string; -}; -export interface SignerStuff { - chain: ChainContext; - signer: Signer; - address: ChainAddress; - source: SignerSource; -} -export declare function forgeSignerArgs(source: SignerSource): string; -export declare function getSigner(chain: ChainContext, type: SignerType, source?: string, filePath?: string): Promise>; diff --git a/cli-core/dist/index.cjs b/cli-core/dist/index.cjs deleted file mode 100644 index fccaf9450..000000000 --- a/cli-core/dist/index.cjs +++ /dev/null @@ -1,2410 +0,0 @@ -'use strict'; - -var evm = require('@wormhole-foundation/sdk/platforms/evm'); -var solana = require('@wormhole-foundation/sdk/platforms/solana'); -var sdkConnect = require('@wormhole-foundation/sdk-connect'); -var child_process = require('child_process'); -var chalk = require('chalk'); -var yargs = require('yargs'); -var bun = require('bun'); -var helpers = require('yargs/helpers'); -var web3_js = require('@solana/web3.js'); -var spl = require('@solana/spl-token'); -var fs = require('fs'); -var readline = require('readline'); -var sdk = require('@wormhole-foundation/sdk'); -require('@wormhole-foundation/sdk-evm-ntt'); -var sdkSolanaNtt = require('@wormhole-foundation/sdk-solana-ntt'); -require('@wormhole-foundation/sdk-definitions-ntt'); -var sdkSolana = require('@wormhole-foundation/sdk-solana'); -var sdkEvm = require('@wormhole-foundation/sdk-evm'); -var ethers = require('ethers'); - -function _interopNamespaceDefault(e) { - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { return e[k]; } - }); - } - }); - } - n.default = e; - return Object.freeze(n); -} - -var spl__namespace = /*#__PURE__*/_interopNamespaceDefault(spl); - -// -// when the native secp256k1 is missing, the eccrypto library decides TO PRINT A MESSAGE TO STDOUT: -// https://github.com/bitchan/eccrypto/blob/a4f4a5f85ef5aa1776dfa1b7801cad808264a19c/index.js#L23 -// -// do you use a CLI tool that depends on that library and try to pipe the output -// of the tool into another? tough luck -// -// for lack of a better way to stop this, we patch the console.info function to -// drop that particular message... -// -const info = console.info; -console.info = function (x) { - if (x !== "secp256k1 unavailable, reverting to browser version") { - info(x); - } -}; -const warn = console.warn; -globalThis.console.warn = function (x) { - if (x !== - "bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?)") { - warn(x); - } -}; -// Without this JSON.stringify() blows up -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - -var evmDeployFile = `// SPDX-License-Identifier: Apache 2 -pragma solidity >=0.8.8 <0.9.0; - -import {Script, console} from "forge-std/Script.sol"; -import {DeployWormholeNttBase} from "./helpers/DeployWormholeNttBase.sol"; -import {INttManager} from "../src/interfaces/INttManager.sol"; -import {IWormholeTransceiver} from "../src/interfaces/IWormholeTransceiver.sol"; -import "../src/interfaces/IManagerBase.sol"; -import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; -import {NttManager} from "../src/NttManager/NttManager.sol"; - -interface IWormhole { - function chainId() external view returns (uint16); -} - -contract DeployWormholeNtt is Script, DeployWormholeNttBase { - function run( - address wormhole, - address token, - address wormholeRelayer, - address specialRelayer, - uint8 decimals, - IManagerBase.Mode mode - ) public { - vm.startBroadcast(); - - console.log("Deploying Wormhole Ntt..."); - IWormhole wh = IWormhole(wormhole); - - // sanity check decimals - (bool success, bytes memory queriedDecimals) = - token.staticcall(abi.encodeWithSignature("decimals()")); - - if (success) { - uint8 queriedDecimals = abi.decode(queriedDecimals, (uint8)); - if (queriedDecimals != decimals) { - console.log("Decimals mismatch: ", queriedDecimals, " != ", decimals); - vm.stopBroadcast(); - return; - } - } else { - // NOTE: this might not be a critical error. It could just mean that - // the token contract was compiled against a different EVM version than what the forge script is running on. - // In this case, it's the responsibility of the caller to ensure that the provided decimals are correct - // and that the token contract is valid. - // The best way to ensure that is by calling this script with the queried token decimals (which is what the NTT CLI does). - console.log( - "Failed to query token decimals. Proceeding with provided decimals.", decimals - ); - // the NTT manager initialiser calls the token contract to get the - // decimals as well. We're just going to mock that call to return the provided decimals. - // This is a bit of a hack, but in the worst case (i.e. if the token contract is actually broken), the - // NTT manager initialiser will fail anyway. - vm.mockCall( - token, abi.encodeWithSelector(ERC20.decimals.selector), abi.encode(decimals) - ); - } - - uint16 chainId = wh.chainId(); - - console.log("Chain ID: ", chainId); - - uint256 scale = - decimals > TRIMMED_DECIMALS ? uint256(10 ** (decimals - TRIMMED_DECIMALS)) : 1; - - DeploymentParams memory params = DeploymentParams({ - token: token, - mode: mode, - wormholeChainId: chainId, - rateLimitDuration: 86400, - shouldSkipRatelimiter: false, - wormholeCoreBridge: wormhole, - wormholeRelayerAddr: wormholeRelayer, - specialRelayerAddr: specialRelayer, - consistencyLevel: 202, - gasLimit: 500000, - // the trimming will trim this number to uint64.max - outboundLimit: uint256(type(uint64).max) * scale - }); - - // Deploy NttManager. - address manager = deployNttManager(params); - - // Deploy Wormhole Transceiver. - address transceiver = deployWormholeTransceiver(params, manager); - - // Configure NttManager. - configureNttManager( - manager, transceiver, params.outboundLimit, params.shouldSkipRatelimiter - ); - - vm.stopBroadcast(); - } - - function upgrade( - address manager - ) public { - vm.startBroadcast(); - - NttManager nttManager = NttManager(manager); - - console.log("Upgrading manager..."); - - uint64 rateLimitDuration = nttManager.rateLimitDuration(); - bool shouldSkipRatelimiter = rateLimitDuration == 0; - - NttManager implementation = new NttManager( - nttManager.token(), - nttManager.mode(), - nttManager.chainId(), - nttManager.rateLimitDuration(), - shouldSkipRatelimiter - ); - - nttManager.upgrade(address(implementation)); - - vm.stopBroadcast(); - } -} -`; - -var evmDeployFileHelper = `// SPDX-License-Identifier: Apache 2 -pragma solidity >=0.8.8 <0.9.0; - -import {console2} from "forge-std/Script.sol"; -import {ParseNttConfig} from "./ParseNttConfig.sol"; -import "../../src/interfaces/IManagerBase.sol"; -import "../../src/interfaces/INttManager.sol"; -import "../../src/interfaces/IWormholeTransceiver.sol"; - -import {NttManager} from "../../src/NttManager/NttManager.sol"; -import {WormholeTransceiver} from - "../../src/Transceiver/WormholeTransceiver/WormholeTransceiver.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol"; - -contract DeployWormholeNttBase is ParseNttConfig { - struct DeploymentParams { - address token; - IManagerBase.Mode mode; - uint16 wormholeChainId; - uint64 rateLimitDuration; - bool shouldSkipRatelimiter; - address wormholeCoreBridge; - address wormholeRelayerAddr; - address specialRelayerAddr; - uint8 consistencyLevel; - uint256 gasLimit; - uint256 outboundLimit; - } - - // The minimum gas limit to verify a message on mainnet. If you're worried about saving - // gas on testnet, pick up the phone and start dialing! - uint256 constant MIN_WORMHOLE_GAS_LIMIT = 150000; - - function deployNttManager( - DeploymentParams memory params - ) internal returns (address) { - // Deploy the Manager Implementation. - NttManager implementation = new NttManager( - params.token, - params.mode, - params.wormholeChainId, - params.rateLimitDuration, - params.shouldSkipRatelimiter - ); - - // NttManager Proxy - NttManager nttManagerProxy = - NttManager(address(new ERC1967Proxy(address(implementation), ""))); - - nttManagerProxy.initialize(); - - console2.log("NttManager:", address(nttManagerProxy)); - - return address(nttManagerProxy); - } - - function deployWormholeTransceiver( - DeploymentParams memory params, - address nttManager - ) public returns (address) { - // Deploy the Wormhole Transceiver. - WormholeTransceiver implementation = new WormholeTransceiver( - nttManager, - params.wormholeCoreBridge, - params.wormholeRelayerAddr, - params.specialRelayerAddr, - params.consistencyLevel, - params.gasLimit - ); - - WormholeTransceiver transceiverProxy = - WormholeTransceiver(address(new ERC1967Proxy(address(implementation), ""))); - - transceiverProxy.initialize(); - - console2.log("WormholeTransceiver:", address(transceiverProxy)); - - return address(transceiverProxy); - } - - function configureNttManager( - address nttManager, - address transceiver, - uint256 outboundLimit, - bool shouldSkipRateLimiter - ) public { - IManagerBase(nttManager).setTransceiver(transceiver); - console2.log("Transceiver address set on NttManager: ", transceiver); - - if (!shouldSkipRateLimiter) { - INttManager(nttManager).setOutboundLimit(outboundLimit); - console2.log("Outbound rate limit set on NttManager: ", outboundLimit); - } - - // Hardcoded to one since these scripts handle Wormhole-only deployments. - INttManager(nttManager).setThreshold(1); - console2.log("Threshold set on NttManager: %d", uint256(1)); - } - - function _readEnvVariables() internal view returns (DeploymentParams memory params) { - // Token address. - params.token = vm.envAddress("RELEASE_TOKEN_ADDRESS"); - require(params.token != address(0), "Invalid token address"); - - // Mode. - uint8 mode = uint8(vm.envUint("RELEASE_MODE")); - if (mode == 0) { - params.mode = IManagerBase.Mode.LOCKING; - } else if (mode == 1) { - params.mode = IManagerBase.Mode.BURNING; - } else { - revert("Invalid mode"); - } - - // Chain ID. - params.wormholeChainId = uint16(vm.envUint("RELEASE_WORMHOLE_CHAIN_ID")); - require(params.wormholeChainId != 0, "Invalid chain ID"); - - // Rate limit duration. - params.rateLimitDuration = uint64(vm.envUint("RELEASE_RATE_LIMIT_DURATION")); - params.shouldSkipRatelimiter = vm.envBool("RELEASE_SKIP_RATE_LIMIT"); - - // Wormhole Core Bridge address. - params.wormholeCoreBridge = vm.envAddress("RELEASE_CORE_BRIDGE_ADDRESS"); - require(params.wormholeCoreBridge != address(0), "Invalid wormhole core bridge address"); - - // Wormhole relayer, special relayer, consistency level. - params.wormholeRelayerAddr = vm.envAddress("RELEASE_WORMHOLE_RELAYER_ADDRESS"); - params.specialRelayerAddr = vm.envAddress("RELEASE_SPECIAL_RELAYER_ADDRESS"); - params.consistencyLevel = uint8(vm.envUint("RELEASE_CONSISTENCY_LEVEL")); - - params.gasLimit = vm.envUint("RELEASE_GAS_LIMIT"); - require(params.gasLimit >= MIN_WORMHOLE_GAS_LIMIT, "Invalid gas limit"); - - // Outbound rate limiter limit. - params.outboundLimit = vm.envUint("RELEASE_OUTBOUND_LIMIT"); - } -} -`; - -function isObject(obj) { - return obj && typeof obj === 'object' && !Array.isArray(obj); -} -function diffObjects(obj1, obj2) { - const result = {}; - for (const key in obj1) { - if (obj1.hasOwnProperty(key)) { - if (obj2.hasOwnProperty(key)) { - if (isObject(obj1[key]) && isObject(obj2[key])) { - result[key] = diffObjects(obj1[key], obj2[key]); - } - else if (obj1[key] === obj2[key]) ; - else { - result[key] = { pull: obj2[key], push: obj1[key] }; - } - } - else { - result[key] = { push: obj1[key] }; - } - } - } - for (const key in obj2) { - if (obj2.hasOwnProperty(key) && !obj1.hasOwnProperty(key)) { - result[key] = { pull: obj2[key] }; - } - } - // prune empty objects - for (const key in result) { - if (isObject(result[key])) { - if (Object.keys(result[key]).length === 0) { - delete result[key]; - } - } - } - return result; -} -function colorizeDiff(diff, indent = 2) { - if (!isObject(diff)) - return JSON.stringify(diff, null, indent); - const jsonString = JSON.stringify(diff, null, indent); - let result = ''; - const lines = jsonString.split('\n'); - for (const line of lines) { - const trimmedLine = line.trim(); - if (trimmedLine.startsWith('"') && trimmedLine.endsWith(': {')) { - const key = trimmedLine.slice(1, trimmedLine.indexOf('": {')); - if (isObject(diff[key]) && ('push' in diff[key] || 'pull' in diff[key])) { - const push = diff[key].push; - const pull = diff[key].pull; - if (push !== undefined && pull !== undefined) { - result += `${line}\n`; - } - else if (push !== undefined) { - result += line.replace(trimmedLine, chalk.red(trimmedLine)) + '\n'; - } - else if (pull !== undefined) { - result += line.replace(trimmedLine, chalk.green(trimmedLine)) + '\n'; - } - } - else { - result += line + '\n'; - } - } - else if (trimmedLine.startsWith('"push"') || trimmedLine.startsWith('"pull"')) { - const color = trimmedLine.startsWith('"push"') ? chalk.green : chalk.red; - result += line.replace(trimmedLine, color(trimmedLine)) + '\n'; - } - else { - result += line + '\n'; - } - } - return result; -} - -async function getEvmSigner(rpc, key, opts) { - const signer = typeof key === 'string' ? new ethers.Wallet(key, rpc) : key; - const chain = opts?.chain ?? (await sdkEvm.EvmPlatform.chainFromRpc(rpc))[1]; - const managedSigner = new ethers.NonceManager(signer); - if (managedSigner.provider === null) { - try { - managedSigner.connect(rpc); - } - catch (e) { - console.error('Cannot connect to network for signer', e); - } - } - return new EvmNativeSigner(chain, await signer.getAddress(), managedSigner, opts); -} -class EvmNativeSigner extends sdkConnect.PlatformNativeSigner { - opts; - constructor(_chain, _address, _signer, opts) { - super(_chain, _address, _signer); - this.opts = opts; - } - chain() { - return this._chain; - } - address() { - return this._address; - } - async sign(tx) { - const chain = this.chain(); - const signed = []; - let gasLimit; - // Specialized for Mantle and Arbitrum Sepolia - switch (chain) { - case 'Mantle': - gasLimit = 2600000000000n; - break; - case 'ArbitrumSepolia': - gasLimit = 4000000n; - break; - default: - // default gas limit - gasLimit = this.opts?.maxGasLimit ?? 500000n; - break; - } - // TODO: DIFF STARTS HERE - let gasPrice = 200000000000n; // 200gwei - let maxFeePerGas = 6000000000n; // 6gwei - let maxPriorityFeePerGas = 1000000000n; // 1gwei - // Celo does not support this call - if (chain !== 'Celo') { - const feeData = await this._signer.provider.getFeeData(); - gasPrice = feeData.gasPrice ?? gasPrice; - maxFeePerGas = feeData.maxFeePerGas ?? maxFeePerGas; - maxPriorityFeePerGas = - feeData.maxPriorityFeePerGas ?? maxPriorityFeePerGas; - } - // Oasis throws malformed errors unless we - // set it to use legacy transaction parameters - const gasOpts = chain === 'Oasis' - ? { - gasLimit, - gasPrice: gasPrice, - // Hardcode type - type: 0, - } - : { - gasPrice, - maxFeePerGas, - maxPriorityFeePerGas, - gasLimit, - }; - // TODO: DIFF ENDS HERE - for (const txn of tx) { - const { transaction, description } = txn; - if (this.opts?.debug) - console.log(`Signing: ${description} for ${this.address()}`); - const t = { - ...transaction, - ...gasOpts, - from: this.address(), - nonce: await this._signer.getNonce(), - }; - // try { - // const estimate = await this._signer.provider!.estimateGas(t); - // t.gasLimit = estimate + estimate / 10n; // Add 10% buffer - // if (this.opts?.maxGasLimit && t.gasLimit > this.opts?.maxGasLimit) { - // throw new Error( - // `Gas limit ${t.gasLimit} exceeds maxGasLimit ${this.opts?.maxGasLimit}`, - // ); - // } - // } catch (e) { - // console.info('Failed to estimate gas for transaction: ', e); - // console.info('Using gas limit: ', t.gasLimit); - // } - signed.push(await this._signer.signTransaction(t)); - } - return signed; - } -} - -// arguments to pass to `forge` -function forgeSignerArgs(source) { - let signerArgs; - switch (source.type) { - case "privateKey": - signerArgs = `--private-key ${source.source}`; - break; - case "ledger": - signerArgs = `--ledger --mnemonic-derivation-paths "${source.source}"`; - break; - default: - throw new Error("Unsupported signer type"); - } - return signerArgs; -} -async function getSigner(chain, type, source, filePath) { - let signer; - const platform = sdk.chainToPlatform(chain.chain); - switch (platform) { - case "Solana": - switch (type) { - case "privateKey": - let privateKey; - if (filePath) { - // Read the private key from the file if filePath is provided - const keyPair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(filePath, 'utf8')))); - privateKey = sdkConnect.encoding.b58.encode(keyPair.secretKey); - } - else { - const privateKeySource = source ?? process.env.SOLANA_PRIVATE_KEY; - if (privateKeySource === undefined) { - throw new Error("Private key not provided and SOLANA_PRIVATE_KEY env var not set"); - } - privateKey = privateKeySource; - } - signer = await solana.getSigner(await chain.getRpc(), privateKey, { debug: false }); - break; - case "ledger": - throw new Error("Ledger not yet supported on Solana"); - default: - throw new Error("Unsupported signer type"); - } - break; - case "Evm": - switch (type) { - case "privateKey": - source = source ?? process.env.ETH_PRIVATE_KEY; - if (source === undefined) { - throw new Error("ETH_PRIVATE_KEY env var not set"); - } - signer = await getEvmSigner(await chain.getRpc(), source, { debug: true }); - break; - case "ledger": - throw new Error("Ledger not yet supported on Evm"); - default: - throw new Error("Unsupported signer type"); - } - break; - default: - throw new Error("Unrecognized platform: " + platform); - } - return { - chain, - signer: signer, - address: sdk.Wormhole.chainAddress(chain.chain, signer.address()), - source: { type, source } - }; -} - -function getAvailableVersions(platform) { - const tags = child_process.execSync(`git tag --list 'v*+${platform.toLowerCase()}'`, { - stdio: ["ignore", null, null] - }).toString().trim().split("\n"); - return tags.map(tag => tag.split("+")[0].slice(1)); -} -function getGitTagName(platform, version) { - const found = child_process.execSync(`git tag --list 'v${version}+${platform.toLowerCase()}'`, { - stdio: ["ignore", null, null] - }).toString().trim(); - return found; -} - -// TODO: per-network configuration? (i.e. mainnet, testnet, etc) -const configTemplate = { - scan_api_key: "", -}; -function assertChainConfigKey(key) { - const validKeys = Object.keys(configTemplate); - if (!validKeys.includes(key)) { - throw new Error(`Invalid key: ${key}`); - } -} -const options$1 = { - chain: { - describe: "Chain", - type: "string", - choices: sdk.chains, - demandOption: true, - }, - key: { - describe: "Key", - type: "string", - choices: Object.keys(configTemplate), - demandOption: true, - }, - value: { - describe: "Value", - type: "string", - demandOption: true, - }, - local: { - describe: "Use local configuration", - type: "boolean", - default: false, - }, - global: { - describe: "Use global configuration", - type: "boolean", - default: true, - } -}; -const command = (args) => args - .command("set-chain ", "set a configuration value for a chain", (yargs) => yargs - .positional("chain", options$1.chain) - .positional("key", options$1.key) - .positional("value", options$1.value) - .option("local", options$1.local) - .option("global", options$1.global), (argv) => { - const scope = resolveScope(argv.local, argv.global); - sdk.assertChain(argv.chain); - assertChainConfigKey(argv.key); - setChainConfig(scope, argv.chain, argv.key, argv.value); -}) - .command("unset-chain ", "unset a configuration value for a chain", (yargs) => yargs - .positional("chain", options$1.chain) - .positional("key", options$1.key) - .option("local", options$1.local) - .option("global", options$1.global), (argv) => { - const scope = resolveScope(argv.local, argv.global); - assertChainConfigKey(argv.key); - sdk.assertChain(argv.chain); - setChainConfig(scope, argv.chain, argv.key, undefined); -}) - .command("get-chain ", "get a configuration value", (yargs) => yargs - .positional("chain", options$1.chain) - .positional("key", options$1.key) - .option("local", options$1.local) - .option("global", options$1.global), (argv) => { - resolveScope(argv.local, argv.global); - assertChainConfigKey(argv.key); - sdk.assertChain(argv.chain); - const val = getChainConfig(argv.scope, argv.chain, argv.key); - if (!val) { - console.error("undefined"); - } - else { - console.log(val); - } -}) - .demandCommand(); -function findOrCreateConfigFile(scope) { - // if scope is global, touch $HOME/.ntt-cli/config.json - // if scope is local, touch .ntt-cli/config.json. In the latter case, make sure we're in an ntt project (call ensureNttRoot()) - // if the file doesn't exist, write an empty object - let configDir; - switch (scope) { - case "global": - if (!process.env.HOME) { - throw new Error("Could not determine home directory"); - } - configDir = `${process.env.HOME}/.ntt-cli`; - break; - case "local": - ensureNttRoot(); - configDir = ".ntt-cli"; - break; - } - const emptyConfig = { - chains: {}, - }; - if (!fs.existsSync(configDir)) { - fs.mkdirSync(configDir); - } - const configFile = `${configDir}/config.json`; - if (!fs.existsSync(configFile)) { - fs.writeFileSync(configFile, JSON.stringify(emptyConfig, null, 2)); - } - return configFile; -} -function setChainConfig(scope, chain, key, value) { - const configFile = findOrCreateConfigFile(scope); - const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); - if (!config.chains[chain]) { - config.chains[chain] = {}; - } - config.chains[chain][key] = value; - fs.writeFileSync(configFile, JSON.stringify(config, null, 2)); -} -function getChainConfig(scope, chain, key) { - const configFile = findOrCreateConfigFile(scope); - const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); - return config.chains[chain]?.[key]; -} -function envVarName(chain, key) { - return `${chain.toUpperCase()}_${key.toUpperCase()}`; -} -function get(chain, key, { reportError = false }) { - const varName = envVarName(chain, key); - const env = process.env[varName]; - if (env) { - console.info(chalk.yellow(`Using ${varName} for ${chain} ${key}`)); - return env; - } - const local = getChainConfig("local", chain, key); - if (local) { - console.info(chalk.yellow(`Using local configuration for ${chain} ${key} (in .ntt-cli/config.json)`)); - return local; - } - const global = getChainConfig("global", chain, key); - if (global) { - console.info(chalk.yellow(`Using global configuration for ${chain} ${key} (in $HOME/.ntt-cli/config.json)`)); - return global; - } - if (reportError) { - console.error(`Could not find configuration for ${chain} ${key}`); - console.error(`Please set it using 'ntt config set-chain ${chain} ${key} ' or by setting the environment variable ${varName}`); - } -} -function resolveScope(local, global) { - if (local && global) { - throw new Error("Cannot specify both --local and --global"); - } - if (local) { - return "local"; - } - if (global) { - return "global"; - } - throw new Error("Must specify either --local or --global"); -} - -// TODO: contract upgrades on solana -// TODO: set special relaying? -// TODO: currently, we just default all evm chains to standard relaying. should we not do that? what's a good way to configure this? -// TODO: check if manager can mint the token in burning mode (on solana it's -// simple. on evm we need to simulate with prank) -const overrides = (function () { - // read overrides.json file if exists - if (fs.existsSync("overrides.json")) { - console.error(chalk.yellow("Using overrides.json")); - return JSON.parse(fs.readFileSync("overrides.json").toString()); - } - else { - return {}; - } -})(); -const options = { - network: { - alias: "n", - describe: "Network", - choices: sdk.networks, - demandOption: true, - }, - deploymentPath: { - alias: "p", - describe: "Path to the deployment file", - default: "deployment.json", - type: "string", - }, - yes: { - alias: "y", - describe: "Skip confirmation", - type: "boolean", - default: false, - }, - signerType: { - alias: "s", - describe: "Signer type", - type: "string", - choices: ["privateKey", "ledger"], - default: "privateKey", - }, - verbose: { - alias: "v", - describe: "Verbose output", - type: "boolean", - default: false, - }, - chain: { - describe: "Chain", - type: "string", - choices: sdk.chains, - demandOption: true, - }, - address: { - describe: "Address", - type: "string", - demandOption: true, - }, - local: { - describe: "Use the current local version for deployment (advanced).", - type: "boolean", - default: false, - }, - version: { - describe: "Version of NTT to deploy", - type: "string", - demandOption: false, - }, - latest: { - describe: "Use the latest version", - type: "boolean", - default: false, - }, - skipVerify: { - describe: "Skip contract verification", - type: "boolean", - default: false, - }, - payer: { - describe: "Path to the payer json file (Solana)", - type: "string", - }, -}; -// TODO: this is a temporary hack to allow deploying from main (as we only need -// the changes to the evm script) -async function withCustomEvmDeployerScript(pwd, then) { - ensureNttRoot(pwd); - const overrides = [ - { path: `${pwd}/evm/script/DeployWormholeNtt.s.sol`, with: evmDeployFile }, - { path: `${pwd}/evm/script/helpers/DeployWormholeNttBase.sol`, with: evmDeployFileHelper }, - ]; - for (const { path, with: withFile } of overrides) { - const old = `${path}.old`; - if (fs.existsSync(path)) { - fs.copyFileSync(path, old); - } - fs.copyFileSync(withFile, path); - } - try { - return await then(); - } - finally { - // restore old files - for (const { path } of overrides) { - const old = `${path}.old`; - if (fs.existsSync(old)) { - fs.copyFileSync(old, path); - fs.unlinkSync(old); - } - } - } -} -const YARGSCommand = yargs(helpers.hideBin(process.argv)) - .wrap(Math.min(process.stdout.columns || 120, 160)) // Use terminal width, but no more than 160 characters - .scriptName("ntt") - .version((() => { - const ver = nttVersion(); - if (!ver) { - return "unknown"; - } - const { version, commit, path, remote } = ver; - const defaultPath = `${process.env.HOME}/.ntt-cli/.checkout`; - const remoteString = remote.includes("wormhole-foundation") ? "" : `${remote}@`; - if (path === defaultPath) { - return `ntt v${version} (${remoteString}${commit})`; - } - else { - return `ntt v${version} (${remoteString}${commit}) from ${path}`; - } -})()) - // config group of commands - .command("config", "configuration commands", command) - .command("update", "update the NTT CLI", (yargs) => yargs - .option("path", { - describe: "Path to a local NTT repo to install from. If not specified, the latest version will be installed.", - type: "string", -}) - .option("branch", { - describe: "Git branch to install from", - type: "string", -}) - .option("repo", { - describe: "Git repository to install from", - type: "string", -}) - .example("$0 update", "Update the NTT CLI to the latest version") - .example("$0 update --path /path/to/ntt", "Update the NTT CLI from a local repo") - .example("$0 update --branch cli", "Update the NTT CLI to the cli branch"), async (argv) => { - const localPath = argv["path"]; - if (localPath) { - if (argv["ref"]) { - console.error("Cannot specify both --path and --ref"); - process.exit(1); - } - if (argv["repo"]) { - console.error("Cannot specify both --path and --repo"); - process.exit(1); - } - await bun.$ `${localPath}/cli/install.sh`; - } - else { - let branchArg = ""; - let repoArg = ""; - if (argv["branch"]) { - branchArg = `--branch ${argv["branch"]}`; - } - if (argv["repo"]) { - repoArg = `--repo ${argv["repo"]}`; - } - const installScript = "https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh"; - // save it to "$HOME/.ntt-cli/install.sh" - const nttDir = `${process.env.HOME}/.ntt-cli`; - const installer = `${nttDir}/install.sh`; - child_process.execSync(`mkdir -p ${nttDir}`); - child_process.execSync(`curl -s ${installScript} > ${installer}`); - child_process.execSync(`chmod +x ${installer}`); - child_process.execSync(`${installer} ${branchArg} ${repoArg}`, { stdio: "inherit" }); - } -}) - .command("new ", "create a new NTT project", (yargs) => yargs - .positional("path", { - describe: "Path to the project", - type: "string", - demandOption: true, -}) - .example("$0 new my-ntt-project", "Create a new NTT project in the 'my-ntt-project' directory"), async (argv) => { - const git = child_process.execSync("git rev-parse --is-inside-work-tree || echo false", { - stdio: ["inherit", null, null] - }); - if (git.toString().trim() === "true") { - console.error("Already in a git repository"); - process.exit(1); - } - const path = argv["path"]; - await bun.$ `git clone -b main https://github.com/wormhole-foundation/example-native-token-transfers.git ${path}`; -}) - .command("add-chain ", "add a chain to the deployment file", (yargs) => yargs - .positional("chain", options.chain) - // TODO: add ability to specify manager address (then just pull the config) - // .option("manager", { - // describe: "Manager address", - // type: "string", - // }) - .option("program-key", { - describe: "Path to program key json (Solana)", - type: "string", -}) - .option("payer", { - describe: "Path to payer key json (Solana)", - type: "string", -}) - .option("binary", { - describe: "Path to program binary (.so file -- Solana)", - type: "string", -}) - .option("token", { - describe: "Token address", - type: "string", -}) - .option("mode", { - alias: "m", - describe: "Mode", - type: "string", - choices: ["locking", "burning"], -}) - .option("solana-priority-fee", { - describe: "Priority fee for Solana deployment (in microlamports)", - type: "number", - default: 50000, -}) - .option("signer-type", options.signerType) - .option("skip-verify", options.skipVerify) - .option("ver", options.version) - .option("latest", options.latest) - .option("local", options.local) - .option("path", options.deploymentPath) - .option("yes", options.yes) - .example("$0 add-chain Ethereum --token 0x1234... --mode burning --latest", "Add Ethereum chain with the latest contract version in burning mode") - .example("$0 add-chain Solana --token Sol1234... --mode locking --ver 1.0.0", "Add Solana chain with a specific contract version in locking mode") - .example("$0 add-chain Avalanche --token 0xabcd... --mode burning --local", "Add Avalanche chain using the local contract version"), async (argv) => { - const path = argv["path"]; - const deployments = loadConfig(path); - const chain = argv["chain"]; - const version = resolveVersion(argv["latest"], argv["ver"], argv["local"], sdk.chainToPlatform(chain)); - let mode = argv["mode"]; - const signerType = argv["signer-type"]; - const token = argv["token"]; - const network = deployments.network; - if (chain in deployments.chains) { - console.error(`Chain ${chain} already exists in ${path}`); - process.exit(1); - } - validateChain(network, chain); - const existsLocking = Object.values(deployments.chains).some((c) => c.mode === "locking"); - if (existsLocking) { - if (mode && mode === "locking") { - console.error("Only one locking chain is allowed"); - process.exit(1); - } - mode = "burning"; - } - if (!mode) { - console.error("Mode is required (use --mode)"); - process.exit(1); - } - if (!token) { - console.error("Token is required (use --token)"); - process.exit(1); - } - // let's deploy - // TODO: factor out to function to get chain context - const wh = new sdk.Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(chain); - // TODO: make manager configurable - const deployedManager = await deploy(version, mode, ch, token, signerType, !argv["skip-verify"], argv["yes"], argv["payer"], argv["program-key"], argv["binary"], argv["solana-priority-fee"]); - const [config, _ctx, _ntt, decimals] = await pullChainConfig(network, deployedManager, overrides); - console.log("token decimals:", chalk.yellow(decimals)); - deployments.chains[chain] = config; - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Added ${chain} to ${path}`); -}) - .command("upgrade ", "upgrade the contract on a specific chain", (yargs) => yargs - .positional("chain", options.chain) - .option("ver", options.version) - .option("latest", { - describe: "Use the latest version", - type: "boolean", - default: false, -}) - .option("local", options.local) - .option("signer-type", options.signerType) - .option("skip-verify", options.skipVerify) - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("payer", { - describe: "Path to payer key json (Solana)", - type: "string", -}) - .option("program-key", { - describe: "Path to program key json (Solana)", - type: "string", -}) - .option("binary", { - describe: "Path to program binary (.so file -- Solana)", - type: "string", -}) - .example("$0 upgrade Ethereum --latest", "Upgrade the Ethereum contract to the latest version") - .example("$0 upgrade Solana --ver 1.1.0", "Upgrade the Solana contract to version 1.1.0") - .example("$0 upgrade Polygon --local --skip-verify", "Upgrade the Polygon contract using the local version, skipping explorer bytecode verification"), async (argv) => { - const path = argv["path"]; - const deployments = loadConfig(path); - const chain = argv["chain"]; - const signerType = argv["signer-type"]; - const network = deployments.network; - if (!(chain in deployments.chains)) { - console.error(`Chain ${chain} not found in ${path}`); - process.exit(1); - } - const chainConfig = deployments.chains[chain]; - const currentVersion = chainConfig.version; - const platform = sdk.chainToPlatform(chain); - const toVersion = resolveVersion(argv["latest"], argv["ver"], argv["local"], platform); - if (argv["local"]) { - await warnLocalDeployment(argv["yes"]); - } - if (toVersion === currentVersion && !argv["local"]) { - console.log(`Chain ${chain} is already at version ${currentVersion}`); - process.exit(0); - } - console.log(`Upgrading ${chain} from version ${currentVersion} to ${toVersion || 'local version'}`); - if (!argv["yes"]) { - await askForConfirmation(); - } - const wh = new sdk.Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(chain); - const [_, ctx, ntt] = await pullChainConfig(network, { chain, address: sdk.toUniversal(chain, chainConfig.manager) }, overrides); - await upgrade(currentVersion, toVersion, ntt, ctx, signerType, !argv["skip-verify"], argv["payer"], argv["program-key"], argv["binary"]); - // reinit the ntt object to get the new version - // TODO: is there an easier way to do this? - const { ntt: upgraded } = await nttFromManager(ch, chainConfig.manager); - chainConfig.version = getVersion(chain, upgraded); - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Successfully upgraded ${chain} to version ${toVersion || 'local version'}`); -}) - .command("clone
", "initialize a deployment file from an existing contract", (yargs) => yargs - .positional("network", options.network) - .positional("chain", options.chain) - .positional("address", options.address) - .option("path", options.deploymentPath) - .option("verbose", options.verbose) - .example("$0 clone Testnet Ethereum 0x5678...", "Clone an existing Ethereum deployment on Testnet") - .example("$0 clone Mainnet Solana Sol5678... --path custom-clone.json", "Clone an existing Solana deployment on Mainnet to a custom file"), async (argv) => { - if (!sdk.isNetwork(argv["network"])) { - console.error("Invalid network"); - process.exit(1); - } - const path = argv["path"]; - const verbose = argv["verbose"]; - // check if the file exists - if (fs.existsSync(path)) { - console.error(`Deployment file already exists at ${path}`); - process.exit(1); - } - // step 1. grab the config - // step 2. discover registrations - // step 3. grab registered peer configs - // - // NOTE: we don't recursively grab peer configs. This means the - // discovered peers will be the ones that are directly registered with - // the starting manager (the one we're cloning). - // For example, if we're cloning manager A, and it's registered with - // B, and B is registered with C, but C is not registered with A, then - // C will not be included in the cloned deployment. - // We could do peer discovery recursively but that would be a lot - // slower, since peer discovery is already O(n) in the number of - // supported chains (50+), because there is no way to enumerate the peers, so we - // need to query all possible chains to see if they're registered. - const chain = argv["chain"]; - sdk.assertChain(chain); - const manager = argv["address"]; - const network = argv["network"]; - const universalManager = sdk.toUniversal(chain, manager); - const ntts = {}; - const [config, _ctx, ntt, _decimals] = await pullChainConfig(network, { chain, address: universalManager }, overrides); - ntts[chain] = ntt; - const configs = { - [chain]: config, - }; - // discover peers - let count = 0; - for (const c of sdk.chains) { - process.stdout.write(`[${count}/${sdk.chains.length - 1}] Fetching peer config for ${c}`); - await new Promise((resolve) => setTimeout(resolve, 100)); - count++; - const peer = await retryWithExponentialBackoff(() => ntt.getPeer(c), 5, 5000); - process.stdout.write(`\n`); - if (peer === null) { - continue; - } - const address = peer.address.address.toUniversalAddress(); - const [peerConfig, _ctx, peerNtt] = await pullChainConfig(network, { chain: c, address }, overrides); - ntts[c] = peerNtt; - configs[c] = peerConfig; - } - // sort chains by name - const sorted = Object.fromEntries(Object.entries(configs).sort(([a], [b]) => a.localeCompare(b))); - // sleep for a bit to avoid rate limiting when making the getDecimals call - // this can happen when the last we hit the rate limit just in the last iteration of the loop above. - // (happens more often than you'd think, because the rate limiter - // gets more aggressive after each hit) - await new Promise((resolve) => setTimeout(resolve, 2000)); - // now loop through the chains, and query their peer information to get the inbound limits - await pullInboundLimits(ntts, sorted, verbose); - const deployment = { - network: argv["network"], - chains: sorted, - }; - fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); -}) - .command("init ", "initialize a deployment file", (yargs) => yargs - .positional("network", options.network) - .option("path", options.deploymentPath) - .example("$0 init Testnet", "Initialize a new deployment file for the Testnet network") - .example("$0 init Mainnet --path custom.json", "Initialize a new deployment file for Mainnet with a custom file name"), async (argv) => { - if (!sdk.isNetwork(argv["network"])) { - console.error("Invalid network"); - process.exit(1); - } - const deployment = { - network: argv["network"], - chains: {}, - }; - const path = argv["path"]; - // check if the file exists - if (fs.existsSync(path)) { - console.error(`Deployment file already exists at ${path}. Specify a different path with --path`); - process.exit(1); - } - fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); -}) - .command("pull", "pull the remote configuration", (yargs) => yargs - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("verbose", options.verbose) - .example("$0 pull", "Pull the latest configuration from the blockchain for all chains") - .example("$0 pull --yes", "Pull the latest configuration and apply changes without confirmation"), async (argv) => { - const deployments = loadConfig(argv["path"]); - const verbose = argv["verbose"]; - const network = deployments.network; - const path = argv["path"]; - const deps = await pullDeployments(deployments, network, verbose); - let changed = false; - for (const [chain, deployment] of Object.entries(deps)) { - sdk.assertChain(chain); - const diff = diffObjects(deployments.chains[chain], deployment.config.remote); - if (Object.keys(diff).length !== 0) { - console.error(chalk.reset(colorizeDiff({ [chain]: diff }))); - changed = true; - deployments.chains[chain] = deployment.config.remote; - } - } - if (!changed) { - console.log(`${path} is already up to date`); - process.exit(0); - } - if (!argv["yes"]) { - await askForConfirmation(); - } - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Updated ${path}`); -}) - .command("push", "push the local configuration", (yargs) => yargs - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("signer-type", options.signerType) - .option("verbose", options.verbose) - .option("skip-verify", options.skipVerify) - .option("payer", options.payer) - .example("$0 push", "Push local configuration changes to the blockchain") - .example("$0 push --signer-type ledger", "Push changes using a Ledger hardware wallet for signing") - .example("$0 push --skip-verify", "Push changes without verifying contracts on EVM chains") - .example("$0 push --payer ", "Path to the payer json file (Solana), instead of setting SOLANA_PRIVATE_KEY env variable"), async (argv) => { - const deployments = loadConfig(argv["path"]); - const verbose = argv["verbose"]; - const network = deployments.network; - const deps = await pullDeployments(deployments, network, verbose); - const signerType = argv["signer-type"]; - const payerPath = argv["payer"]; - const missing = await missingConfigs(deps, verbose); - if (checkConfigErrors(deps)) { - console.error("There are errors in the config file. Please fix these before continuing."); - process.exit(1); - } - for (const [chain, missingConfig] of Object.entries(missing)) { - sdk.assertChain(chain); - const ntt = deps[chain].ntt; - const ctx = deps[chain].ctx; - const signer = await getSigner(ctx, signerType, undefined, payerPath); - for (const manager of missingConfig.managerPeers) { - const tx = ntt.setPeer(manager.address, manager.tokenDecimals, manager.inboundLimit, signer.address.address); - await sdk.signSendWait(ctx, tx, signer.signer); - } - for (const transceiver of missingConfig.transceiverPeers) { - const tx = ntt.setTransceiverPeer(0, transceiver, signer.address.address); - await sdk.signSendWait(ctx, tx, signer.signer); - } - for (const evmChain of missingConfig.evmChains) { - const tx = (await ntt.getTransceiver(0)).setIsEvmChain(evmChain, true); - await sdk.signSendWait(ctx, tx, signer.signer); - } - for (const relayingTarget of missingConfig.standardRelaying) { - const tx = (await ntt.getTransceiver(0)).setIsWormholeRelayingEnabled(relayingTarget, true); - await sdk.signSendWait(ctx, tx, signer.signer); - } - for (const relayingTarget of missingConfig.specialRelaying) { - const tx = (await ntt.getTransceiver(0)).setIsSpecialRelayingEnabled(relayingTarget, true); - await sdk.signSendWait(ctx, tx, signer.signer); - } - if (missingConfig.solanaWormholeTransceiver) { - if (sdk.chainToPlatform(chain) !== "Solana") { - console.error("Solana wormhole transceiver can only be set on Solana chains"); - continue; - } - const solanaNtt = ntt; - const tx = solanaNtt.registerWormholeTransceiver({ - payer: signer.address.address, - owner: signer.address.address, - }); - try { - await sdk.signSendWait(ctx, tx, signer.signer); - } - catch (e) { - console.error(e.logs); - } - } - if (missingConfig.solanaUpdateLUT) { - if (sdk.chainToPlatform(chain) !== "Solana") { - console.error("Solana update LUT can only be set on Solana chains"); - continue; - } - const solanaNtt = ntt; - const tx = solanaNtt.initializeOrUpdateLUT({ payer: new sdkSolana.SolanaAddress(signer.address.address).unwrap() }); - try { - await sdk.signSendWait(ctx, tx, signer.signer); - } - catch (e) { - console.error(e.logs); - } - } - } - // pull deps again - const depsAfterRegistrations = await pullDeployments(deployments, network, verbose); - for (const [chain, deployment] of Object.entries(depsAfterRegistrations)) { - sdk.assertChain(chain); - await pushDeployment(deployment, signerType, !argv["skip-verify"], argv["yes"], payerPath); - } -}) - .command("status", "check the status of the deployment", (yargs) => yargs - .option("path", options.deploymentPath) - .option("verbose", options.verbose) - .example("$0 status", "Check the status of the deployment across all chains") - .example("$0 status --verbose", "Check the status with detailed output"), async (argv) => { - const path = argv["path"]; - const verbose = argv["verbose"]; - // TODO: I don't like the variable names here - const deployments = loadConfig(path); - const network = deployments.network; - let deps = await pullDeployments(deployments, network, verbose); - let fixable = 0; - const extraInfo = {}; - if (checkConfigErrors(deps)) { - console.error("There are errors in the config file. Please fix these before continuing."); - process.exit(1); - } - // diff remote and local configs - for (const [chain, deployment] of Object.entries(deps)) { - sdk.assertChain(chain); - const local = deployment.config.local; - const remote = deployment.config.remote; - const a = { [chain]: local }; - const b = { [chain]: remote }; - const diff = diffObjects(a, b); - if (Object.keys(diff).length !== 0) { - console.error(chalk.reset(colorizeDiff(diff))); - fixable++; - } - if (verbose) { - const immutables = await getImmutables(chain, deployment.ntt); - if (immutables) { - extraInfo[chain] = immutables; - } - const pdas = await getPdas(chain, deployment.ntt); - if (pdas) { - extraInfo[chain] = pdas; - } - } - } - if (Object.keys(extraInfo).length > 0) { - console.log(chalk.yellow(JSON.stringify(extraInfo, null, 2))); - } - // verify peers - const missing = await missingConfigs(deps, verbose); - if (Object.keys(missing).length > 0) { - fixable++; - } - for (const [chain, missingConfig] of Object.entries(missing)) { - console.error(`${chain} status:`); - for (const manager of missingConfig.managerPeers) { - console.error(` Missing manager peer: ${manager.address.chain}`); - } - for (const transceiver of missingConfig.transceiverPeers) { - console.error(` Missing transceiver peer: ${transceiver.chain}`); - } - for (const evmChain of missingConfig.evmChains) { - console.error(` ${evmChain} needs to be configured as an EVM chain`); - } - for (const relayingTarget of missingConfig.standardRelaying) { - console.warn(` No standard relaying to ${relayingTarget}`); - } - for (const relayingTarget of missingConfig.specialRelaying) { - console.warn(` No special relaying to ${relayingTarget}`); - } - if (missingConfig.solanaWormholeTransceiver) { - console.error(" Missing Solana wormhole transceiver"); - } - if (missingConfig.solanaUpdateLUT) { - console.error(" Missing or outdated LUT"); - } - } - if (fixable > 0) { - console.error("Run `ntt pull` to pull the remote configuration (overwriting the local one)"); - console.error("Run `ntt push` to push the local configuration (overwriting the remote one) by executing the necessary transactions"); - process.exit(1); - } - else { - console.log(`${path} is up to date with the on-chain configuration.`); - process.exit(0); - } -}) - .command("solana", "Solana commands", (yargs) => { - yargs - .command("key-base58 ", "print private key in base58", (yargs) => yargs - .positional("keypair", { - describe: "Path to keypair.json", - type: "string", - demandOption: true, - }), (argv) => { - const keypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(argv["keypair"]).toString()))); - console.log(sdkConnect.encoding.b58.encode(keypair.secretKey)); - }) - .command("token-authority ", "print the token authority address for a given program ID", (yargs) => yargs - .positional("programId", { - describe: "Program ID", - type: "string", - demandOption: true, - }), (argv) => { - const programId = new web3_js.PublicKey(argv["programId"]); - const tokenAuthority = sdkSolanaNtt.NTT.pdas(programId).tokenAuthority(); - console.log(tokenAuthority.toBase58()); - }) - .command("ata ", "print the token authority address for a given program ID", (yargs) => yargs - .positional("mint", { - describe: "Mint address", - type: "string", - demandOption: true, - }) - .positional("owner", { - describe: "Owner address", - type: "string", - demandOption: true, - }) - .positional("tokenProgram", { - describe: "Token program ID", - type: "string", - choices: ["legacy", "token22"], - demandOption: true, - }), (argv) => { - const mint = new web3_js.PublicKey(argv["mint"]); - const owner = new web3_js.PublicKey(argv["owner"]); - const tokenProgram = argv["tokenProgram"] === "legacy" - ? spl__namespace.TOKEN_PROGRAM_ID - : spl__namespace.TOKEN_2022_PROGRAM_ID; - const ata = spl__namespace.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); - console.log(ata.toBase58()); - }) - .demandCommand(); -}) - .help() - .strict() - .demandCommand(); -function checkConfigErrors(deps) { - let fatal = 0; - for (const [chain, deployment] of Object.entries(deps)) { - sdk.assertChain(chain); - const config = deployment.config.local; - if (!checkNumberFormatting(config.limits.outbound, deployment.decimals)) { - console.error(`ERROR: ${chain} has an outbound limit (${config.limits.outbound}) with the wrong number of decimals. The number should have ${deployment.decimals} decimals.`); - fatal++; - } - if (config.limits.outbound === formatNumber(0n, deployment.decimals)) { - console.warn(chalk.yellow(`${chain} has an outbound limit of 0`)); - } - for (const [c, limit] of Object.entries(config.limits.inbound)) { - if (!checkNumberFormatting(limit, deployment.decimals)) { - console.error(`ERROR: ${chain} has an inbound limit with the wrong number of decimals for ${c} (${limit}). The number should have ${deployment.decimals} decimals.`); - fatal++; - } - if (limit === formatNumber(0n, deployment.decimals)) { - console.warn(chalk.yellow(`${chain} has an inbound limit of 0 from ${c}`)); - } - } - } - return fatal; -} -function createWorkTree(platform, version) { - const tag = getGitTagName(platform, version); - if (!tag) { - console.error(`No tag found matching ${version} for ${platform}`); - process.exit(1); - } - const worktreeName = `.deployments/${platform}-${version}`; - if (fs.existsSync(worktreeName)) { - console.log(chalk.yellow(`Worktree already exists at ${worktreeName}. Resetting to ${tag}`)); - child_process.execSync(`git -C ${worktreeName} reset --hard ${tag}`, { - stdio: "inherit" - }); - } - else { - // create worktree - child_process.execSync(`git worktree add ${worktreeName} ${tag}`, { - stdio: "inherit" - }); - } - // NOTE: we create this symlink whether or not the file exists. - // this way, if it's created later, the symlink will be correct - child_process.execSync(`ln -fs $(pwd)/overrides.json $(pwd)/${worktreeName}/overrides.json`, { - stdio: "inherit" - }); - console.log(chalk.green(`Created worktree at ${worktreeName} from tag ${tag}`)); - return worktreeName; -} -async function upgrade(_fromVersion, toVersion, ntt, ctx, signerType, evmVerify, solanaPayer, solanaProgramKeyPath, solanaBinaryPath) { - // TODO: check that fromVersion is safe to upgrade to toVersion from - const platform = sdk.chainToPlatform(ctx.chain); - const worktree = toVersion ? createWorkTree(platform, toVersion) : "."; - switch (platform) { - case "Evm": - const evmNtt = ntt; - const evmCtx = ctx; - return upgradeEvm(worktree, evmNtt, evmCtx, signerType, evmVerify); - case "Solana": - if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { - console.error("Payer not found. Specify with --payer"); - process.exit(1); - } - const solanaNtt = ntt; - const solanaCtx = ctx; - return upgradeSolana(worktree, toVersion, solanaNtt, solanaCtx, solanaPayer, solanaProgramKeyPath, solanaBinaryPath); - default: - throw new Error("Unsupported platform"); - } -} -async function upgradeEvm(pwd, ntt, ctx, signerType, evmVerify) { - ensureNttRoot(pwd); - console.log("Upgrading EVM chain", ctx.chain); - const signer = await getSigner(ctx, signerType); - const signerArgs = forgeSignerArgs(signer.source); - console.log("Installing forge dependencies..."); - child_process.execSync("forge install", { - cwd: `${pwd}/evm`, - stdio: "pipe" - }); - let verifyArgs = ""; - if (evmVerify) { - // TODO: verify etherscan api key? - const etherscanApiKey = get(ctx.chain, "scan_api_key", { reportError: true }); - if (!etherscanApiKey) { - process.exit(1); - } - verifyArgs = `--verify --etherscan-api-key ${etherscanApiKey}`; - } - console.log("Upgrading manager..."); - await withCustomEvmDeployerScript(pwd, async () => { - child_process.execSync(`forge script --via-ir script/DeployWormholeNtt.s.sol \ ---rpc-url ${ctx.config.rpc} \ ---sig "upgrade(address)" \ -${ntt.managerAddress} \ -${signerArgs} \ ---broadcast \ -${verifyArgs} | tee last-run.stdout`, { - cwd: `${pwd}/evm`, - stdio: "inherit" - }); - }); -} -async function upgradeSolana(pwd, version, ntt, ctx, payer, programKeyPath, binaryPath) { - if (version === null) { - throw new Error("Cannot upgrade Solana to local version"); // TODO: this is not hard to enabled - } - const mint = (await (ntt.getConfig())).mint; - await deploySolana(pwd, version, await ntt.getMode(), ctx, mint.toBase58(), payer, false, programKeyPath, binaryPath); - // TODO: call initializeOrUpdateLUT. currently it's done in the following 'ntt push' step. -} -async function deploy(version, mode, ch, token, signerType, evmVerify, yes, solanaPayer, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee) { - if (version === null) { - await warnLocalDeployment(yes); - } - const platform = sdk.chainToPlatform(ch.chain); - const worktree = version ? createWorkTree(platform, version) : "."; - switch (platform) { - case "Evm": - return await deployEvm(worktree, mode, ch, token, signerType, evmVerify); - case "Solana": - if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { - console.error("Payer not found. Specify with --payer"); - process.exit(1); - } - const solanaCtx = ch; - return await deploySolana(worktree, version, mode, solanaCtx, token, solanaPayer, true, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee); - default: - throw new Error("Unsupported platform"); - } -} -async function deployEvm(pwd, mode, ch, token, signerType, verify) { - ensureNttRoot(pwd); - const wormhole = ch.config.contracts.coreBridge; - if (!wormhole) { - console.error("Core bridge not found"); - process.exit(1); - } - const relayer = ch.config.contracts.relayer; - if (!relayer) { - console.error("Relayer not found"); - process.exit(1); - } - const rpc = ch.config.rpc; - // TODO: how to make specialRelayer configurable?? - let specialRelayer; - if (ch.chain === "Avalanche") { - specialRelayer = "0x1a19d8a194630642f750376Ae72b4eDF5aDFd25F"; - } - else if (ch.chain === "Bsc") { - specialRelayer = "0x8C56eE9cd232d23541a697C0eBd3cA597DE3c88D"; - } - else { - specialRelayer = "0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74"; - } - const provider = new ethers.ethers.JsonRpcProvider(rpc); - const abi = ["function decimals() external view returns (uint8)"]; - const tokenContract = new ethers.ethers.Contract(token, abi, provider); - const decimals = await tokenContract.decimals(); - // TODO: should actually make these ENV variables. - const sig = "run(address,address,address,address,uint8,uint8)"; - const modeUint = mode === "locking" ? 0 : 1; - const signer = await getSigner(ch, signerType); - const signerArgs = forgeSignerArgs(signer.source); - // TODO: verify etherscan api key? - let verifyArgs = []; - if (verify) { - const etherscanApiKey = get(ch.chain, "scan_api_key", { reportError: true }); - if (!etherscanApiKey) { - process.exit(1); - } - verifyArgs = ["--verify", "--etherscan-api-key", etherscanApiKey]; - } - console.log("Installing forge dependencies..."); - child_process.execSync("forge install", { - cwd: `${pwd}/evm`, - stdio: "pipe" - }); - console.log("Deploying manager..."); - const deploy = async (simulate) => { - const simulateArg = simulate ? "" : "--skip-simulation"; - await withCustomEvmDeployerScript(pwd, async () => { - try { - child_process.execSync(` -forge script --via-ir script/DeployWormholeNtt.s.sol \ ---rpc-url ${rpc} \ -${simulateArg} \ ---sig "${sig}" ${wormhole} ${token} ${relayer} ${specialRelayer} ${decimals} ${modeUint} \ ---broadcast ${verifyArgs.join(' ')} ${signerArgs} 2>&1 | tee last-run.stdout`, { - cwd: `${pwd}/evm`, - encoding: 'utf8', - stdio: 'inherit' - }); - } - catch (error) { - console.error("Failed to deploy manager"); - // NOTE: we don't exit here. instead, we check if the manager was - // deployed successfully (below) and proceed if it was. - // process.exit(1); - } - }); - return fs.readFileSync(`${pwd}/evm/last-run.stdout`).toString(); - }; - // we attempt to deploy with simulation first, then without if it fails - let out = await deploy(true); - if (out.includes("Simulated execution failed")) { - if (out.includes("NotActivated")) { - console.error("Simulation failed, likely because the token contract is compiled against a different EVM version. It's probably safe to continue without simulation."); - await askForConfirmation("Do you want to proceed with the deployment without simulation?"); - } - else { - console.error("Simulation failed. Please read the error message carefully, and proceed with caution."); - await askForConfirmation("Do you want to proceed with the deployment without simulation?"); - } - out = await deploy(false); - } - if (!out) { - console.error("Failed to deploy manager"); - process.exit(1); - } - const logs = out.split("\n").map((l) => l.trim()).filter((l) => l.length > 0); - const manager = logs.find((l) => l.includes("NttManager: 0x"))?.split(" ")[1]; - if (!manager) { - console.error("Manager not found"); - process.exit(1); - } - const universalManager = sdk.toUniversal(ch.chain, manager); - return { chain: ch.chain, address: universalManager }; -} -async function deploySolana(pwd, version, mode, ch, token, payer, initialize, managerKeyPath, binaryPath, priorityFee) { - ensureNttRoot(pwd); - // TODO: if the binary is provided, we should not check addresses in the source tree. (so we should move around the control flow a bit) - // TODO: factor out some of this into separate functions to help readability of this function (maybe even move to a different file) - const wormhole = ch.config.contracts.coreBridge; - if (!wormhole) { - console.error("Core bridge not found"); - process.exit(1); - } - // grep example_native_token_transfers = ".*" - // in solana/Anchor.toml - // TODO: what if they rename the program? - const existingProgramId = fs.readFileSync(`${pwd}/solana/Anchor.toml`).toString().match(/example_native_token_transfers = "(.*)"/)?.[1]; - if (!existingProgramId) { - console.error("Program ID not found in Anchor.toml (looked for example_native_token_transfers = \"(.*)\")"); - process.exit(1); - } - let programKeypairPath; - let programKeypair; - if (managerKeyPath) { - if (!fs.existsSync(managerKeyPath)) { - console.error(`Program keypair not found: ${managerKeyPath}`); - process.exit(1); - } - programKeypairPath = managerKeyPath; - programKeypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(managerKeyPath).toString()))); - } - else { - const programKeyJson = `${existingProgramId}.json`; - if (!fs.existsSync(programKeyJson)) { - console.error(`Program keypair not found: ${programKeyJson}`); - console.error("Run `solana-keygen` to create a new keypair (either with 'new', or with 'grind'), and pass it to this command with --program-key"); - console.error("For example: solana-keygen grind --starts-with ntt:1 --ignore-case"); - process.exit(1); - } - programKeypairPath = programKeyJson; - programKeypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(programKeyJson).toString()))); - if (existingProgramId !== programKeypair.publicKey.toBase58()) { - console.error(`The private key in ${programKeyJson} does not match the existing program ID: ${existingProgramId}`); - process.exit(1); - } - } - // see if the program key matches the existing program ID. if not, we need - // to update the latter in the Anchor.toml file and the lib.rs file(s) - const providedProgramId = programKeypair.publicKey.toBase58(); - if (providedProgramId !== existingProgramId) { - // only ask for confirmation if the current directory is ".". if it's - // something else (a worktree) then it's a fresh checkout and we just - // override the address anyway. - if (pwd === ".") { - console.error(`Program keypair does not match the existing program ID: ${existingProgramId}`); - await askForConfirmation(`Do you want to update the program ID in the Anchor.toml file and the lib.rs file to ${providedProgramId}?`); - } - const anchorTomlPath = `${pwd}/solana/Anchor.toml`; - const libRsPath = `${pwd}/solana/programs/example-native-token-transfers/src/lib.rs`; - const anchorToml = fs.readFileSync(anchorTomlPath).toString(); - const newAnchorToml = anchorToml.replace(existingProgramId, providedProgramId); - fs.writeFileSync(anchorTomlPath, newAnchorToml); - const libRs = fs.readFileSync(libRsPath).toString(); - const newLibRs = libRs.replace(existingProgramId, providedProgramId); - fs.writeFileSync(libRsPath, newLibRs); - } - // First we check that the provided mint's mint authority is the program's token authority PDA when in burning mode. - // This is checked in the program initialiser anyway, but we can save some - // time by checking it here and failing early (not to mention better - // diagnostics). - const emitter = sdkSolanaNtt.NTT.transceiverPdas(providedProgramId).emitterAccount().toBase58(); - const payerKeypair = web3_js.Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(payer).toString()))); - // this is not super pretty... I want to initialise the 'ntt' object, but - // because it's not deployed yet, fetching the version will fail, and thus default to whatever the default version is. - // We want to use the correct version (because the sdk's behaviour depends on it), so we first create a dummy ntt instance, - // let that fill in all the necessary fields, and then create a new instance with the correct version. - // It should be possible to avoid this dummy object and just instantiate 'SolanaNtt' directly, but I wasn't - // sure where the various pieces are plugged together and this seemed easier. - // TODO: refactor this to avoid the dummy object - const dummy = await ch.getProtocol("Ntt", { - ntt: { - manager: providedProgramId, - token: token, - transceiver: { wormhole: emitter }, - } - }); - const ntt = new sdkSolanaNtt.SolanaNtt(dummy.network, dummy.chain, dummy.connection, dummy.contracts, version ?? undefined); - // get the mint authority of 'token' - const tokenMint = new web3_js.PublicKey(token); - // const tokenInfo = await ch.connection.getTokenInfo(tokenMint); - const connection = await ch.getRpc(); - const mintInfo = await connection.getAccountInfo(tokenMint); - if (!mintInfo) { - console.error(`Mint ${token} not found on ${ch.chain} ${ch.network}`); - process.exit(1); - } - const mint = spl__namespace.unpackMint(tokenMint, mintInfo, mintInfo.owner); - if (mode === "burning") { - const expectedMintAuthority = ntt.pdas.tokenAuthority().toBase58(); - const actualMintAuthority = mint.mintAuthority?.toBase58() ?? null; - if (actualMintAuthority !== expectedMintAuthority) { - console.error(`Mint authority mismatch for ${token}`); - console.error(`Expected: ${expectedMintAuthority}`); - console.error(`Actual: ${actualMintAuthority}`); - console.error(`Set the mint authority to the program's token authority PDA with e.g.:`); - console.error(`spl-token authorize ${token} mint ${expectedMintAuthority}`); - process.exit(1); - } - } - let binary; - { - if (binaryPath) { - binary = binaryPath; - } - else { - // build the program - // TODO: build with docker - checkAnchorVersion(); - const proc = Bun.spawn(["anchor", - "build", - "-p", "example_native_token_transfers", - "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) - ], { - cwd: `${pwd}/solana` - }); - // const _out = await new Response(proc.stdout).text(); - await proc.exited; - if (proc.exitCode !== 0) { - process.exit(proc.exitCode ?? 1); - } - binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; - } - await checkSolanaBinary(binary, wormhole, providedProgramId, version ?? undefined); - // if buffer.json doesn't exist, create it - if (!fs.existsSync(`buffer.json`)) { - child_process.execSync(`solana-keygen new -o buffer.json --no-bip39-passphrase`); - } - else { - console.info("buffer.json already exists."); - askForConfirmation("Do you want continue an exiting deployment? If not, delete the buffer.json file and run the command again."); - } - const deployCommand = [ - "solana", - "program", - "deploy", - "--program-id", programKeypairPath, - "--buffer", `buffer.json`, - binary, - "--keypair", payer, - "-u", ch.config.rpc, - "--commitment", "finalized" - ]; - if (priorityFee !== undefined) { - deployCommand.push("--with-compute-unit-price", priorityFee.toString()); - } - const deployProc = Bun.spawn(deployCommand); - const out = await new Response(deployProc.stdout).text(); - await deployProc.exited; - if (deployProc.exitCode !== 0) { - process.exit(deployProc.exitCode ?? 1); - } - // success. remove buffer.json - fs.unlinkSync("buffer.json"); - console.log(out); - } - if (initialize) { - // wait 3 seconds - await new Promise((resolve) => setTimeout(resolve, 3000)); - const tx = ntt.initialize(sdk.toUniversal(ch.chain, payerKeypair.publicKey.toBase58()), { - mint: new web3_js.PublicKey(token), - mode, - outboundLimit: 100000000n, - }); - const signer = await getSigner(ch, "privateKey", sdkConnect.encoding.b58.encode(payerKeypair.secretKey)); - try { - await sdk.signSendWait(ch, tx, signer.signer); - } - catch (e) { - console.error(e.logs); - } - } - return { chain: ch.chain, address: sdk.toUniversal(ch.chain, providedProgramId) }; -} -async function missingConfigs(deps, verbose) { - const missingConfigs = {}; - for (const [fromChain, from] of Object.entries(deps)) { - let count = 0; - sdk.assertChain(fromChain); - let missing = { - managerPeers: [], - transceiverPeers: [], - evmChains: [], - standardRelaying: [], - specialRelaying: [], - solanaWormholeTransceiver: false, - solanaUpdateLUT: false, - }; - if (sdk.chainToPlatform(fromChain) === "Solana") { - const solanaNtt = from.ntt; - const selfWormholeTransceiver = solanaNtt.pdas.registeredTransceiver(new web3_js.PublicKey(solanaNtt.contracts.ntt.manager)).toBase58(); - const registeredSelfTransceiver = await retryWithExponentialBackoff(() => solanaNtt.connection.getAccountInfo(new web3_js.PublicKey(selfWormholeTransceiver)), 5, 5000); - if (registeredSelfTransceiver === null) { - count++; - missing.solanaWormholeTransceiver = true; - } - // here we just check if the LUT update function returns an instruction. - // if it does, it means the LUT is missing or outdated. notice that - // we're not actually updating the LUT here, just checking if it's - // missing, so it's ok to use the 0 pubkey as the payer. - const updateLUT = solanaNtt.initializeOrUpdateLUT({ payer: new web3_js.PublicKey(0) }); - // check if async generator is non-empty - if (!(await updateLUT.next()).done) { - count++; - missing.solanaUpdateLUT = true; - } - } - for (const [toChain, to] of Object.entries(deps)) { - sdk.assertChain(toChain); - if (fromChain === toChain) { - continue; - } - if (verbose) { - process.stdout.write(`Verifying registration for ${fromChain} -> ${toChain}......\n`); - } - const peer = await retryWithExponentialBackoff(() => from.ntt.getPeer(toChain), 5, 5000); - if (peer === null) { - const configLimit = from.config.local?.limits?.inbound?.[toChain]?.replace(".", ""); - count++; - missing.managerPeers.push({ - address: to.manager, - tokenDecimals: to.decimals, - inboundLimit: BigInt(configLimit ?? 0), - }); - } - else { - // @ts-ignore TODO - if (!Buffer.from(peer.address.address.address).equals(Buffer.from(to.manager.address.address))) { - console.error(`Peer address mismatch for ${fromChain} -> ${toChain}`); - } - if (peer.tokenDecimals !== to.decimals) { - console.error(`Peer decimals mismatch for ${fromChain} -> ${toChain}`); - } - } - if (sdk.chainToPlatform(fromChain) === "Evm") { - const toIsEvm = sdk.chainToPlatform(toChain) === "Evm"; - const toIsSolana = sdk.chainToPlatform(toChain) === "Solana"; - const whTransceiver = await from.ntt.getTransceiver(0); - if (toIsEvm) { - const remoteToEvm = await whTransceiver.isEvmChain(toChain); - if (!remoteToEvm) { - count++; - missing.evmChains.push(toChain); - } - const standardRelaying = await whTransceiver.isWormholeRelayingEnabled(toChain); - if (!standardRelaying) { - count++; - missing.standardRelaying.push(toChain); - } - } - else if (toIsSolana) { - const specialRelaying = await whTransceiver.isSpecialRelayingEnabled(toChain); - if (!specialRelaying) { - count++; - missing.specialRelaying.push(toChain); - } - } - } - const transceiverPeer = await retryWithExponentialBackoff(() => from.whTransceiver.getPeer(toChain), 5, 5000); - if (transceiverPeer === null) { - count++; - missing.transceiverPeers.push(to.whTransceiver.getAddress()); - } - else { - // @ts-ignore TODO - if (!Buffer.from(transceiverPeer.address.address).equals(Buffer.from(to.whTransceiver.getAddress().address.address))) { - console.error(`Transceiver peer address mismatch for ${fromChain} -> ${toChain}`); - } - } - } - if (count > 0) { - missingConfigs[fromChain] = missing; - } - } - return missingConfigs; -} -async function pushDeployment(deployment, signerType, evmVerify, yes, filePath) { - const diff = diffObjects(deployment.config.local, deployment.config.remote); - if (Object.keys(diff).length === 0) { - return; - } - const canonical = sdk.canonicalAddress(deployment.manager); - console.log(`Pushing changes to ${deployment.manager.chain} (${canonical})`); - console.log(chalk.reset(colorizeDiff(diff))); - if (!yes) { - await askForConfirmation(); - } - const ctx = deployment.ctx; - const signer = await getSigner(ctx, signerType, undefined, filePath); - let txs = []; - // we perform this last to make sure we don't accidentally lock ourselves out - let updateOwner = undefined; - let managerUpgrade; - for (const k of Object.keys(diff)) { - if (k === "version") { - // TODO: check against existing version, and make sure no major version changes - managerUpgrade = { from: diff[k].pull, to: diff[k].push }; - } - else if (k === "owner") { - const address = sdk.toUniversal(deployment.manager.chain, diff[k]?.push); - updateOwner = deployment.ntt.setOwner(address, signer.address.address); - } - else if (k === "pauser") { - const address = sdk.toUniversal(deployment.manager.chain, diff[k]?.push); - txs.push(deployment.ntt.setPauser(address, signer.address.address)); - } - else if (k === "paused") { - if (diff[k]?.push === true) { - txs.push(deployment.ntt.pause(signer.address.address)); - } - else { - txs.push(deployment.ntt.unpause(signer.address.address)); - } - } - else if (k === "limits") { - const newOutbound = diff[k]?.outbound?.push; - if (newOutbound) { - // TODO: verify amount has correct number of decimals? - // remove "." from string and convert to bigint - const newOutboundBigint = BigInt(newOutbound.replace(".", "")); - txs.push(deployment.ntt.setOutboundLimit(newOutboundBigint, signer.address.address)); - } - const inbound = diff[k]?.inbound; - if (inbound) { - for (const chain of Object.keys(inbound)) { - sdk.assertChain(chain); - const newInbound = inbound[chain]?.push; - if (newInbound) { - // TODO: verify amount has correct number of decimals? - const newInboundBigint = BigInt(newInbound.replace(".", "")); - txs.push(deployment.ntt.setInboundLimit(chain, newInboundBigint, signer.address.address)); - } - } - } - } - else if (k === "transceivers") { - // TODO: refactor this nested loop stuff into separate functions at least - // alternatively we could first recursively collect all the things - // to do into a flattened list (with entries like - // transceivers.wormhole.pauser), and have a top-level mapping of - // these entries to how they should be handled - for (const j of Object.keys(diff[k])) { - if (j === "wormhole") { - for (const l of Object.keys(diff[k][j])) { - if (l === "pauser") { - const newTransceiverPauser = sdk.toUniversal(deployment.manager.chain, diff[k][j][l].push); - txs.push(deployment.whTransceiver.setPauser(newTransceiverPauser, signer.address.address)); - } - else { - console.error(`Unsupported field: ${k}.${j}.${l}`); - process.exit(1); - } - } - } - else { - console.error(`Unsupported field: ${k}.${j}`); - process.exit(1); - } - } - } - else { - console.error(`Unsupported field: ${k}`); - process.exit(1); - } - } - if (managerUpgrade) { - await upgrade(managerUpgrade.from, managerUpgrade.to, deployment.ntt, ctx, signerType, evmVerify); - } - for (const tx of txs) { - await sdk.signSendWait(ctx, tx, signer.signer); - } - if (updateOwner) { - await sdk.signSendWait(ctx, updateOwner, signer.signer); - } -} -async function pullDeployments(deployments, network, verbose) { - let deps = {}; - for (const [chain, deployment] of Object.entries(deployments.chains)) { - if (verbose) { - process.stdout.write(`Fetching config for ${chain}......\n`); - } - sdk.assertChain(chain); - const managerAddress = deployment.manager; - if (managerAddress === undefined) { - console.error(`manager field not found for chain ${chain}`); - // process.exit(1); - continue; - } - const [remote, ctx, ntt, decimals] = await pullChainConfig(network, { chain, address: sdk.toUniversal(chain, managerAddress) }, overrides); - const local = deployments.chains[chain]; - // TODO: what if it's not index 0... - // we should check that the address of this transceiver matches the - // address in the config. currently we just assume that ix 0 is the wormhole one - const whTransceiver = await ntt.getTransceiver(0); - if (whTransceiver === null) { - console.error(`Wormhole transceiver not found for ${chain}`); - process.exit(1); - } - deps[chain] = { - ctx, - ntt, - decimals, - manager: { chain, address: sdk.toUniversal(chain, managerAddress) }, - whTransceiver, - config: { - remote, - local, - } - }; - } - const config = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.config.remote])); - const ntts = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.ntt])); - await pullInboundLimits(ntts, config, verbose); - return deps; -} -async function pullChainConfig(network, manager, overrides) { - const wh = new sdk.Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(manager.chain); - const nativeManagerAddress = sdk.canonicalAddress(manager); - const { ntt, addresses } = await nttFromManager(ch, nativeManagerAddress); - const mode = await ntt.getMode(); - const outboundLimit = await ntt.getOutboundLimit(); - const threshold = await ntt.getThreshold(); - const decimals = await ntt.getTokenDecimals(); - // insert decimal point into number - const outboundLimitDecimals = formatNumber(outboundLimit, decimals); - const paused = await ntt.isPaused(); - const owner = await ntt.getOwner(); - const pauser = await ntt.getPauser(); - const version = getVersion(manager.chain, ntt); - const transceiverPauser = await ntt.getTransceiver(0).then((t) => t?.getPauser() ?? null); - const config = { - version, - mode, - paused, - owner: owner.toString(), - manager: nativeManagerAddress, - token: addresses.token, - transceivers: { - threshold, - wormhole: { address: addresses.transceiver.wormhole }, - }, - limits: { - outbound: outboundLimitDecimals, - inbound: {}, - }, - }; - if (transceiverPauser) { - config.transceivers.wormhole.pauser = transceiverPauser.toString(); - } - if (pauser) { - config.pauser = pauser.toString(); - } - return [config, ch, ntt, decimals]; -} -async function getImmutables(chain, ntt) { - const platform = sdk.chainToPlatform(chain); - if (platform !== "Evm") { - return null; - } - const evmNtt = ntt; - const transceiver = await evmNtt.getTransceiver(0); - const consistencyLevel = await transceiver.transceiver.consistencyLevel(); - const wormholeRelayer = await transceiver.transceiver.wormholeRelayer(); - const specialRelayer = await transceiver.transceiver.specialRelayer(); - const gasLimit = await transceiver.transceiver.gasLimit(); - const token = await evmNtt.manager.token(); - const tokenDecimals = await evmNtt.manager.tokenDecimals(); - const whTransceiverImmutables = { - consistencyLevel, - wormholeRelayer, - specialRelayer, - gasLimit, - }; - return { - manager: { - token, - tokenDecimals, - }, - wormholeTransceiver: whTransceiverImmutables, - }; -} -async function getPdas(chain, ntt) { - const platform = sdk.chainToPlatform(chain); - if (platform !== "Solana") { - return null; - } - const solanaNtt = ntt; - const config = solanaNtt.pdas.configAccount(); - const emitter = sdkSolanaNtt.NTT.transceiverPdas(solanaNtt.program.programId).emitterAccount(); - const outboxRateLimit = solanaNtt.pdas.outboxRateLimitAccount(); - const tokenAuthority = solanaNtt.pdas.tokenAuthority(); - const lutAccount = solanaNtt.pdas.lutAccount(); - const lutAuthority = solanaNtt.pdas.lutAuthority(); - return { - config, - emitter, - outboxRateLimit, - tokenAuthority, - lutAccount, - lutAuthority, - }; -} -function getVersion(chain, ntt) { - const platform = sdk.chainToPlatform(chain); - switch (platform) { - case "Evm": - return ntt.version; - case "Solana": - return ntt.version; - default: - throw new Error("Unsupported platform"); - } -} -// TODO: there should be a more elegant way to do this, than creating a -// "dummy" NTT, then calling verifyAddresses to get the contract diff, then -// finally reconstructing the "real" NTT object from that -async function nttFromManager(ch, nativeManagerAddress) { - const onlyManager = await ch.getProtocol("Ntt", { - ntt: { - manager: nativeManagerAddress, - token: null, - transceiver: {}, - } - }); - const diff = await onlyManager.verifyAddresses(); - const addresses = { manager: nativeManagerAddress, ...diff }; - const ntt = await ch.getProtocol("Ntt", { - ntt: addresses - }); - return { ntt, addresses }; -} -function formatNumber(num, decimals) { - if (num === 0n) { - return "0." + "0".repeat(decimals); - } - const str = num.toString(); - const formatted = str.slice(0, -decimals) + "." + str.slice(-decimals); - if (formatted.startsWith(".")) { - return "0" + formatted; - } - return formatted; -} -function checkNumberFormatting(formatted, decimals) { - // check that the string has the correct number of decimals - const parts = formatted.split("."); - if (parts.length !== 2) { - return false; - } - if (parts[1].length !== decimals) { - return false; - } - return true; -} -function cargoNetworkFeature(network) { - switch (network) { - case "Mainnet": - return "mainnet"; - case "Testnet": - return "solana-devnet"; - case "Devnet": - return "tilt-devnet"; - default: - throw new Error("Unsupported network"); - } -} -async function askForConfirmation(prompt = "Do you want to continue?") { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - const answer = await new Promise((resolve) => { - rl.question(`${prompt} [y/n]`, resolve); - }); - rl.close(); - if (answer !== "y") { - console.log("Aborting"); - process.exit(0); - } -} -// NOTE: modifies the config object in place -// TODO: maybe introduce typestate for having pulled inbound limits? -async function pullInboundLimits(ntts, config, verbose) { - for (const [c1, ntt1] of Object.entries(ntts)) { - sdk.assertChain(c1); - const chainConf = config[c1]; - if (!chainConf) { - console.error(`Chain ${c1} not found in deployment`); - process.exit(1); - } - const decimals = await ntt1.getTokenDecimals(); - for (const [c2, ntt2] of Object.entries(ntts)) { - sdk.assertChain(c2); - if (ntt1 === ntt2) { - continue; - } - if (verbose) { - process.stdout.write(`Fetching inbound limit for ${c1} -> ${c2}.......\n`); - } - const peer = await retryWithExponentialBackoff(() => ntt1.getPeer(c2), 5, 5000); - if (chainConf.limits?.inbound === undefined) { - chainConf.limits.inbound = {}; - } - const limit = peer?.inboundLimit ?? 0n; - chainConf.limits.inbound[c2] = formatNumber(limit, decimals); - } - } -} -async function checkSolanaBinary(binary, wormhole, providedProgramId, version) { - // ensure binary path exists - if (!fs.existsSync(binary)) { - console.error(`.so file not found: ${binary}`); - process.exit(1); - } - // console.log(`Checking binary ${binary} for wormhole and provided program ID`); - // convert wormhole and providedProgramId from base58 to hex - const wormholeHex = new web3_js.PublicKey(wormhole).toBuffer().toString("hex"); - const providedProgramIdHex = new web3_js.PublicKey(providedProgramId).toBuffer().toString("hex"); - const versionHex = version ? Buffer.from(version).toString("hex") : undefined; - if (!searchHexInBinary(binary, wormholeHex)) { - console.error(`Wormhole address not found in binary: ${wormhole}`); - process.exit(1); - } - if (!searchHexInBinary(binary, providedProgramIdHex)) { - console.error(`Provided program ID not found in binary: ${providedProgramId}`); - process.exit(1); - } - if (versionHex && !searchHexInBinary(binary, versionHex)) ; -} -// not the most efficient, but at least it's definitely portable -function searchHexInBinary(binaryPath, searchHex) { - const buffer = fs.readFileSync(binaryPath); - const hexString = buffer.toString('hex'); - const found = hexString.includes(searchHex); - return found; -} -function ensureNttRoot(pwd = ".") { - if (!fs.existsSync(`${pwd}/evm/foundry.toml`) || !fs.existsSync(`${pwd}/solana/Anchor.toml`)) { - console.error("Run this command from the root of an NTT project."); - process.exit(1); - } -} -function checkAnchorVersion() { - const expected = "0.29.0"; - try { - child_process.execSync("which anchor"); - } - catch { - console.error("Anchor CLI is not installed.\nSee https://www.anchor-lang.com/docs/installation"); - process.exit(1); - } - const version = child_process.execSync("anchor --version").toString().trim(); - // version looks like "anchor-cli 0.14.0" - const [_, v] = version.split(" "); - if (v !== expected) { - console.error(`Anchor CLI version must be ${expected} but is ${v}`); - process.exit(1); - } -} -function loadConfig(path) { - if (!fs.existsSync(path)) { - console.error(`File not found: ${path}`); - console.error(`Create with 'ntt init' or specify another file with --path`); - process.exit(1); - } - const deployments = JSON.parse(fs.readFileSync(path).toString()); - return deployments; -} -function resolveVersion(latest, ver, local, platform) { - if ((latest ? 1 : 0) + (ver ? 1 : 0) + (local ? 1 : 0) !== 1) { - console.error("Specify exactly one of --latest, --ver, or --local"); - const available = getAvailableVersions(platform); - console.error(`Available versions for ${platform}:\n${available.join("\n")}`); - process.exit(1); - } - if (latest) { - const available = getAvailableVersions(platform); - return available.sort().reverse()[0]; - } - else if (ver) { - return ver; - } - else { - // local version - return null; - } -} -function warnLocalDeployment(yes) { - if (!yes) { - console.warn(chalk.yellow("WARNING: You are deploying from your local working directory.")); - console.warn(chalk.yellow("This bypasses version control and may deploy untested changes.")); - console.warn(chalk.yellow("Ensure your local changes are thoroughly tested and compatible.")); - return askForConfirmation("Are you sure you want to continue with the local deployment?"); - } - return Promise.resolve(); -} -function validateChain(network, chain) { - if (network === "Testnet") { - if (chain === "Ethereum") { - console.error("Ethereum is deprecated on Testnet. Use EthereumSepolia instead."); - process.exit(1); - } - // if on testnet, and the chain has a *Sepolia counterpart, use that instead - if (sdk.chains.find((c) => c === `${c}Sepolia`)) { - console.error(`Chain ${chain} is deprecated. Use ${chain}Sepolia instead.`); - process.exit(1); - } - } -} -function retryWithExponentialBackoff(fn, maxRetries, delay) { - const backoff = (retry) => Math.min(2 ** retry * delay, 10000) + Math.random() * 1000; - const attempt = async (retry) => { - try { - return await fn(); - } - catch (e) { - if (retry >= maxRetries) { - throw e; - } - const time = backoff(retry); - await new Promise((resolve) => setTimeout(resolve, backoff(time))); - return await attempt(retry + 1); - } - }; - return attempt(0); -} -function nttVersion() { - const nttDir = `${process.env.HOME}/.ntt-cli`; - try { - const versionFile = fs.readFileSync(`${nttDir}/version`).toString().trim(); - const [commit, installPath, version, remote] = versionFile.split("\n"); - return { version, commit, path: installPath, remote }; - } - catch { - return null; - } -} - -exports.YARGSCommand = YARGSCommand; -exports.ensureNttRoot = ensureNttRoot; diff --git a/cli-core/dist/index.d.ts b/cli-core/dist/index.d.ts deleted file mode 100644 index 9f1afe966..000000000 --- a/cli-core/dist/index.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/// -import "./side-effects"; -import { ChainContext, type Chain, type ChainAddress, type Network } from "@wormhole-foundation/sdk"; -import "@wormhole-foundation/sdk-evm-ntt"; -import "@wormhole-foundation/sdk-solana-ntt"; -import "@wormhole-foundation/sdk-definitions-ntt"; -import type { Ntt, NttTransceiver } from "@wormhole-foundation/sdk-definitions-ntt"; -export type Deployment = { - ctx: ChainContext; - ntt: Ntt; - whTransceiver: NttTransceiver; - decimals: number; - manager: ChainAddress; - config: { - remote?: ChainConfig; - local?: ChainConfig; - }; -}; -export type ChainConfig = { - version: string; - mode: Ntt.Mode; - paused: boolean; - owner: string; - pauser?: string; - manager: string; - token: string; - transceivers: { - threshold: number; - wormhole: { - address: string; - pauser?: string; - }; - }; - limits: { - outbound: string; - inbound: Partial<{ - [C in Chain]: string; - }>; - }; -}; -export type Config = { - network: Network; - chains: Partial<{ - [C in Chain]: ChainConfig; - }>; - defaultLimits?: { - outbound: string; - }; -}; -export declare const YARGSCommand: import("yargs").Argv<{}>; -export declare function ensureNttRoot(pwd?: string): void; diff --git a/cli-core/dist/index.js b/cli-core/dist/index.js deleted file mode 100644 index 62f673ca6..000000000 --- a/cli-core/dist/index.js +++ /dev/null @@ -1,2388 +0,0 @@ -import evm from '@wormhole-foundation/sdk/platforms/evm'; -import solana from '@wormhole-foundation/sdk/platforms/solana'; -import { PlatformNativeSigner, encoding } from '@wormhole-foundation/sdk-connect'; -import { execSync } from 'child_process'; -import chalk from 'chalk'; -import yargs from 'yargs'; -import { $ } from 'bun'; -import { hideBin } from 'yargs/helpers'; -import { Keypair, PublicKey } from '@solana/web3.js'; -import * as spl from '@solana/spl-token'; -import fs from 'fs'; -import readline from 'readline'; -import { chainToPlatform, Wormhole, chains, assertChain, toUniversal, networks, isNetwork, signSendWait, canonicalAddress } from '@wormhole-foundation/sdk'; -import '@wormhole-foundation/sdk-evm-ntt'; -import { NTT, SolanaNtt } from '@wormhole-foundation/sdk-solana-ntt'; -import '@wormhole-foundation/sdk-definitions-ntt'; -import { SolanaAddress } from '@wormhole-foundation/sdk-solana'; -import { EvmPlatform } from '@wormhole-foundation/sdk-evm'; -import { Wallet, NonceManager, ethers } from 'ethers'; - -// -// when the native secp256k1 is missing, the eccrypto library decides TO PRINT A MESSAGE TO STDOUT: -// https://github.com/bitchan/eccrypto/blob/a4f4a5f85ef5aa1776dfa1b7801cad808264a19c/index.js#L23 -// -// do you use a CLI tool that depends on that library and try to pipe the output -// of the tool into another? tough luck -// -// for lack of a better way to stop this, we patch the console.info function to -// drop that particular message... -// -const info = console.info; -console.info = function (x) { - if (x !== "secp256k1 unavailable, reverting to browser version") { - info(x); - } -}; -const warn = console.warn; -globalThis.console.warn = function (x) { - if (x !== - "bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?)") { - warn(x); - } -}; -// Without this JSON.stringify() blows up -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - -var evmDeployFile = `// SPDX-License-Identifier: Apache 2 -pragma solidity >=0.8.8 <0.9.0; - -import {Script, console} from "forge-std/Script.sol"; -import {DeployWormholeNttBase} from "./helpers/DeployWormholeNttBase.sol"; -import {INttManager} from "../src/interfaces/INttManager.sol"; -import {IWormholeTransceiver} from "../src/interfaces/IWormholeTransceiver.sol"; -import "../src/interfaces/IManagerBase.sol"; -import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; -import {NttManager} from "../src/NttManager/NttManager.sol"; - -interface IWormhole { - function chainId() external view returns (uint16); -} - -contract DeployWormholeNtt is Script, DeployWormholeNttBase { - function run( - address wormhole, - address token, - address wormholeRelayer, - address specialRelayer, - uint8 decimals, - IManagerBase.Mode mode - ) public { - vm.startBroadcast(); - - console.log("Deploying Wormhole Ntt..."); - IWormhole wh = IWormhole(wormhole); - - // sanity check decimals - (bool success, bytes memory queriedDecimals) = - token.staticcall(abi.encodeWithSignature("decimals()")); - - if (success) { - uint8 queriedDecimals = abi.decode(queriedDecimals, (uint8)); - if (queriedDecimals != decimals) { - console.log("Decimals mismatch: ", queriedDecimals, " != ", decimals); - vm.stopBroadcast(); - return; - } - } else { - // NOTE: this might not be a critical error. It could just mean that - // the token contract was compiled against a different EVM version than what the forge script is running on. - // In this case, it's the responsibility of the caller to ensure that the provided decimals are correct - // and that the token contract is valid. - // The best way to ensure that is by calling this script with the queried token decimals (which is what the NTT CLI does). - console.log( - "Failed to query token decimals. Proceeding with provided decimals.", decimals - ); - // the NTT manager initialiser calls the token contract to get the - // decimals as well. We're just going to mock that call to return the provided decimals. - // This is a bit of a hack, but in the worst case (i.e. if the token contract is actually broken), the - // NTT manager initialiser will fail anyway. - vm.mockCall( - token, abi.encodeWithSelector(ERC20.decimals.selector), abi.encode(decimals) - ); - } - - uint16 chainId = wh.chainId(); - - console.log("Chain ID: ", chainId); - - uint256 scale = - decimals > TRIMMED_DECIMALS ? uint256(10 ** (decimals - TRIMMED_DECIMALS)) : 1; - - DeploymentParams memory params = DeploymentParams({ - token: token, - mode: mode, - wormholeChainId: chainId, - rateLimitDuration: 86400, - shouldSkipRatelimiter: false, - wormholeCoreBridge: wormhole, - wormholeRelayerAddr: wormholeRelayer, - specialRelayerAddr: specialRelayer, - consistencyLevel: 202, - gasLimit: 500000, - // the trimming will trim this number to uint64.max - outboundLimit: uint256(type(uint64).max) * scale - }); - - // Deploy NttManager. - address manager = deployNttManager(params); - - // Deploy Wormhole Transceiver. - address transceiver = deployWormholeTransceiver(params, manager); - - // Configure NttManager. - configureNttManager( - manager, transceiver, params.outboundLimit, params.shouldSkipRatelimiter - ); - - vm.stopBroadcast(); - } - - function upgrade( - address manager - ) public { - vm.startBroadcast(); - - NttManager nttManager = NttManager(manager); - - console.log("Upgrading manager..."); - - uint64 rateLimitDuration = nttManager.rateLimitDuration(); - bool shouldSkipRatelimiter = rateLimitDuration == 0; - - NttManager implementation = new NttManager( - nttManager.token(), - nttManager.mode(), - nttManager.chainId(), - nttManager.rateLimitDuration(), - shouldSkipRatelimiter - ); - - nttManager.upgrade(address(implementation)); - - vm.stopBroadcast(); - } -} -`; - -var evmDeployFileHelper = `// SPDX-License-Identifier: Apache 2 -pragma solidity >=0.8.8 <0.9.0; - -import {console2} from "forge-std/Script.sol"; -import {ParseNttConfig} from "./ParseNttConfig.sol"; -import "../../src/interfaces/IManagerBase.sol"; -import "../../src/interfaces/INttManager.sol"; -import "../../src/interfaces/IWormholeTransceiver.sol"; - -import {NttManager} from "../../src/NttManager/NttManager.sol"; -import {WormholeTransceiver} from - "../../src/Transceiver/WormholeTransceiver/WormholeTransceiver.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol"; - -contract DeployWormholeNttBase is ParseNttConfig { - struct DeploymentParams { - address token; - IManagerBase.Mode mode; - uint16 wormholeChainId; - uint64 rateLimitDuration; - bool shouldSkipRatelimiter; - address wormholeCoreBridge; - address wormholeRelayerAddr; - address specialRelayerAddr; - uint8 consistencyLevel; - uint256 gasLimit; - uint256 outboundLimit; - } - - // The minimum gas limit to verify a message on mainnet. If you're worried about saving - // gas on testnet, pick up the phone and start dialing! - uint256 constant MIN_WORMHOLE_GAS_LIMIT = 150000; - - function deployNttManager( - DeploymentParams memory params - ) internal returns (address) { - // Deploy the Manager Implementation. - NttManager implementation = new NttManager( - params.token, - params.mode, - params.wormholeChainId, - params.rateLimitDuration, - params.shouldSkipRatelimiter - ); - - // NttManager Proxy - NttManager nttManagerProxy = - NttManager(address(new ERC1967Proxy(address(implementation), ""))); - - nttManagerProxy.initialize(); - - console2.log("NttManager:", address(nttManagerProxy)); - - return address(nttManagerProxy); - } - - function deployWormholeTransceiver( - DeploymentParams memory params, - address nttManager - ) public returns (address) { - // Deploy the Wormhole Transceiver. - WormholeTransceiver implementation = new WormholeTransceiver( - nttManager, - params.wormholeCoreBridge, - params.wormholeRelayerAddr, - params.specialRelayerAddr, - params.consistencyLevel, - params.gasLimit - ); - - WormholeTransceiver transceiverProxy = - WormholeTransceiver(address(new ERC1967Proxy(address(implementation), ""))); - - transceiverProxy.initialize(); - - console2.log("WormholeTransceiver:", address(transceiverProxy)); - - return address(transceiverProxy); - } - - function configureNttManager( - address nttManager, - address transceiver, - uint256 outboundLimit, - bool shouldSkipRateLimiter - ) public { - IManagerBase(nttManager).setTransceiver(transceiver); - console2.log("Transceiver address set on NttManager: ", transceiver); - - if (!shouldSkipRateLimiter) { - INttManager(nttManager).setOutboundLimit(outboundLimit); - console2.log("Outbound rate limit set on NttManager: ", outboundLimit); - } - - // Hardcoded to one since these scripts handle Wormhole-only deployments. - INttManager(nttManager).setThreshold(1); - console2.log("Threshold set on NttManager: %d", uint256(1)); - } - - function _readEnvVariables() internal view returns (DeploymentParams memory params) { - // Token address. - params.token = vm.envAddress("RELEASE_TOKEN_ADDRESS"); - require(params.token != address(0), "Invalid token address"); - - // Mode. - uint8 mode = uint8(vm.envUint("RELEASE_MODE")); - if (mode == 0) { - params.mode = IManagerBase.Mode.LOCKING; - } else if (mode == 1) { - params.mode = IManagerBase.Mode.BURNING; - } else { - revert("Invalid mode"); - } - - // Chain ID. - params.wormholeChainId = uint16(vm.envUint("RELEASE_WORMHOLE_CHAIN_ID")); - require(params.wormholeChainId != 0, "Invalid chain ID"); - - // Rate limit duration. - params.rateLimitDuration = uint64(vm.envUint("RELEASE_RATE_LIMIT_DURATION")); - params.shouldSkipRatelimiter = vm.envBool("RELEASE_SKIP_RATE_LIMIT"); - - // Wormhole Core Bridge address. - params.wormholeCoreBridge = vm.envAddress("RELEASE_CORE_BRIDGE_ADDRESS"); - require(params.wormholeCoreBridge != address(0), "Invalid wormhole core bridge address"); - - // Wormhole relayer, special relayer, consistency level. - params.wormholeRelayerAddr = vm.envAddress("RELEASE_WORMHOLE_RELAYER_ADDRESS"); - params.specialRelayerAddr = vm.envAddress("RELEASE_SPECIAL_RELAYER_ADDRESS"); - params.consistencyLevel = uint8(vm.envUint("RELEASE_CONSISTENCY_LEVEL")); - - params.gasLimit = vm.envUint("RELEASE_GAS_LIMIT"); - require(params.gasLimit >= MIN_WORMHOLE_GAS_LIMIT, "Invalid gas limit"); - - // Outbound rate limiter limit. - params.outboundLimit = vm.envUint("RELEASE_OUTBOUND_LIMIT"); - } -} -`; - -function isObject(obj) { - return obj && typeof obj === 'object' && !Array.isArray(obj); -} -function diffObjects(obj1, obj2) { - const result = {}; - for (const key in obj1) { - if (obj1.hasOwnProperty(key)) { - if (obj2.hasOwnProperty(key)) { - if (isObject(obj1[key]) && isObject(obj2[key])) { - result[key] = diffObjects(obj1[key], obj2[key]); - } - else if (obj1[key] === obj2[key]) ; - else { - result[key] = { pull: obj2[key], push: obj1[key] }; - } - } - else { - result[key] = { push: obj1[key] }; - } - } - } - for (const key in obj2) { - if (obj2.hasOwnProperty(key) && !obj1.hasOwnProperty(key)) { - result[key] = { pull: obj2[key] }; - } - } - // prune empty objects - for (const key in result) { - if (isObject(result[key])) { - if (Object.keys(result[key]).length === 0) { - delete result[key]; - } - } - } - return result; -} -function colorizeDiff(diff, indent = 2) { - if (!isObject(diff)) - return JSON.stringify(diff, null, indent); - const jsonString = JSON.stringify(diff, null, indent); - let result = ''; - const lines = jsonString.split('\n'); - for (const line of lines) { - const trimmedLine = line.trim(); - if (trimmedLine.startsWith('"') && trimmedLine.endsWith(': {')) { - const key = trimmedLine.slice(1, trimmedLine.indexOf('": {')); - if (isObject(diff[key]) && ('push' in diff[key] || 'pull' in diff[key])) { - const push = diff[key].push; - const pull = diff[key].pull; - if (push !== undefined && pull !== undefined) { - result += `${line}\n`; - } - else if (push !== undefined) { - result += line.replace(trimmedLine, chalk.red(trimmedLine)) + '\n'; - } - else if (pull !== undefined) { - result += line.replace(trimmedLine, chalk.green(trimmedLine)) + '\n'; - } - } - else { - result += line + '\n'; - } - } - else if (trimmedLine.startsWith('"push"') || trimmedLine.startsWith('"pull"')) { - const color = trimmedLine.startsWith('"push"') ? chalk.green : chalk.red; - result += line.replace(trimmedLine, color(trimmedLine)) + '\n'; - } - else { - result += line + '\n'; - } - } - return result; -} - -async function getEvmSigner(rpc, key, opts) { - const signer = typeof key === 'string' ? new Wallet(key, rpc) : key; - const chain = opts?.chain ?? (await EvmPlatform.chainFromRpc(rpc))[1]; - const managedSigner = new NonceManager(signer); - if (managedSigner.provider === null) { - try { - managedSigner.connect(rpc); - } - catch (e) { - console.error('Cannot connect to network for signer', e); - } - } - return new EvmNativeSigner(chain, await signer.getAddress(), managedSigner, opts); -} -class EvmNativeSigner extends PlatformNativeSigner { - opts; - constructor(_chain, _address, _signer, opts) { - super(_chain, _address, _signer); - this.opts = opts; - } - chain() { - return this._chain; - } - address() { - return this._address; - } - async sign(tx) { - const chain = this.chain(); - const signed = []; - let gasLimit; - // Specialized for Mantle and Arbitrum Sepolia - switch (chain) { - case 'Mantle': - gasLimit = 2600000000000n; - break; - case 'ArbitrumSepolia': - gasLimit = 4000000n; - break; - default: - // default gas limit - gasLimit = this.opts?.maxGasLimit ?? 500000n; - break; - } - // TODO: DIFF STARTS HERE - let gasPrice = 200000000000n; // 200gwei - let maxFeePerGas = 6000000000n; // 6gwei - let maxPriorityFeePerGas = 1000000000n; // 1gwei - // Celo does not support this call - if (chain !== 'Celo') { - const feeData = await this._signer.provider.getFeeData(); - gasPrice = feeData.gasPrice ?? gasPrice; - maxFeePerGas = feeData.maxFeePerGas ?? maxFeePerGas; - maxPriorityFeePerGas = - feeData.maxPriorityFeePerGas ?? maxPriorityFeePerGas; - } - // Oasis throws malformed errors unless we - // set it to use legacy transaction parameters - const gasOpts = chain === 'Oasis' - ? { - gasLimit, - gasPrice: gasPrice, - // Hardcode type - type: 0, - } - : { - gasPrice, - maxFeePerGas, - maxPriorityFeePerGas, - gasLimit, - }; - // TODO: DIFF ENDS HERE - for (const txn of tx) { - const { transaction, description } = txn; - if (this.opts?.debug) - console.log(`Signing: ${description} for ${this.address()}`); - const t = { - ...transaction, - ...gasOpts, - from: this.address(), - nonce: await this._signer.getNonce(), - }; - // try { - // const estimate = await this._signer.provider!.estimateGas(t); - // t.gasLimit = estimate + estimate / 10n; // Add 10% buffer - // if (this.opts?.maxGasLimit && t.gasLimit > this.opts?.maxGasLimit) { - // throw new Error( - // `Gas limit ${t.gasLimit} exceeds maxGasLimit ${this.opts?.maxGasLimit}`, - // ); - // } - // } catch (e) { - // console.info('Failed to estimate gas for transaction: ', e); - // console.info('Using gas limit: ', t.gasLimit); - // } - signed.push(await this._signer.signTransaction(t)); - } - return signed; - } -} - -// arguments to pass to `forge` -function forgeSignerArgs(source) { - let signerArgs; - switch (source.type) { - case "privateKey": - signerArgs = `--private-key ${source.source}`; - break; - case "ledger": - signerArgs = `--ledger --mnemonic-derivation-paths "${source.source}"`; - break; - default: - throw new Error("Unsupported signer type"); - } - return signerArgs; -} -async function getSigner(chain, type, source, filePath) { - let signer; - const platform = chainToPlatform(chain.chain); - switch (platform) { - case "Solana": - switch (type) { - case "privateKey": - let privateKey; - if (filePath) { - // Read the private key from the file if filePath is provided - const keyPair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(filePath, 'utf8')))); - privateKey = encoding.b58.encode(keyPair.secretKey); - } - else { - const privateKeySource = source ?? process.env.SOLANA_PRIVATE_KEY; - if (privateKeySource === undefined) { - throw new Error("Private key not provided and SOLANA_PRIVATE_KEY env var not set"); - } - privateKey = privateKeySource; - } - signer = await solana.getSigner(await chain.getRpc(), privateKey, { debug: false }); - break; - case "ledger": - throw new Error("Ledger not yet supported on Solana"); - default: - throw new Error("Unsupported signer type"); - } - break; - case "Evm": - switch (type) { - case "privateKey": - source = source ?? process.env.ETH_PRIVATE_KEY; - if (source === undefined) { - throw new Error("ETH_PRIVATE_KEY env var not set"); - } - signer = await getEvmSigner(await chain.getRpc(), source, { debug: true }); - break; - case "ledger": - throw new Error("Ledger not yet supported on Evm"); - default: - throw new Error("Unsupported signer type"); - } - break; - default: - throw new Error("Unrecognized platform: " + platform); - } - return { - chain, - signer: signer, - address: Wormhole.chainAddress(chain.chain, signer.address()), - source: { type, source } - }; -} - -function getAvailableVersions(platform) { - const tags = execSync(`git tag --list 'v*+${platform.toLowerCase()}'`, { - stdio: ["ignore", null, null] - }).toString().trim().split("\n"); - return tags.map(tag => tag.split("+")[0].slice(1)); -} -function getGitTagName(platform, version) { - const found = execSync(`git tag --list 'v${version}+${platform.toLowerCase()}'`, { - stdio: ["ignore", null, null] - }).toString().trim(); - return found; -} - -// TODO: per-network configuration? (i.e. mainnet, testnet, etc) -const configTemplate = { - scan_api_key: "", -}; -function assertChainConfigKey(key) { - const validKeys = Object.keys(configTemplate); - if (!validKeys.includes(key)) { - throw new Error(`Invalid key: ${key}`); - } -} -const options$1 = { - chain: { - describe: "Chain", - type: "string", - choices: chains, - demandOption: true, - }, - key: { - describe: "Key", - type: "string", - choices: Object.keys(configTemplate), - demandOption: true, - }, - value: { - describe: "Value", - type: "string", - demandOption: true, - }, - local: { - describe: "Use local configuration", - type: "boolean", - default: false, - }, - global: { - describe: "Use global configuration", - type: "boolean", - default: true, - } -}; -const command = (args) => args - .command("set-chain ", "set a configuration value for a chain", (yargs) => yargs - .positional("chain", options$1.chain) - .positional("key", options$1.key) - .positional("value", options$1.value) - .option("local", options$1.local) - .option("global", options$1.global), (argv) => { - const scope = resolveScope(argv.local, argv.global); - assertChain(argv.chain); - assertChainConfigKey(argv.key); - setChainConfig(scope, argv.chain, argv.key, argv.value); -}) - .command("unset-chain ", "unset a configuration value for a chain", (yargs) => yargs - .positional("chain", options$1.chain) - .positional("key", options$1.key) - .option("local", options$1.local) - .option("global", options$1.global), (argv) => { - const scope = resolveScope(argv.local, argv.global); - assertChainConfigKey(argv.key); - assertChain(argv.chain); - setChainConfig(scope, argv.chain, argv.key, undefined); -}) - .command("get-chain ", "get a configuration value", (yargs) => yargs - .positional("chain", options$1.chain) - .positional("key", options$1.key) - .option("local", options$1.local) - .option("global", options$1.global), (argv) => { - resolveScope(argv.local, argv.global); - assertChainConfigKey(argv.key); - assertChain(argv.chain); - const val = getChainConfig(argv.scope, argv.chain, argv.key); - if (!val) { - console.error("undefined"); - } - else { - console.log(val); - } -}) - .demandCommand(); -function findOrCreateConfigFile(scope) { - // if scope is global, touch $HOME/.ntt-cli/config.json - // if scope is local, touch .ntt-cli/config.json. In the latter case, make sure we're in an ntt project (call ensureNttRoot()) - // if the file doesn't exist, write an empty object - let configDir; - switch (scope) { - case "global": - if (!process.env.HOME) { - throw new Error("Could not determine home directory"); - } - configDir = `${process.env.HOME}/.ntt-cli`; - break; - case "local": - ensureNttRoot(); - configDir = ".ntt-cli"; - break; - } - const emptyConfig = { - chains: {}, - }; - if (!fs.existsSync(configDir)) { - fs.mkdirSync(configDir); - } - const configFile = `${configDir}/config.json`; - if (!fs.existsSync(configFile)) { - fs.writeFileSync(configFile, JSON.stringify(emptyConfig, null, 2)); - } - return configFile; -} -function setChainConfig(scope, chain, key, value) { - const configFile = findOrCreateConfigFile(scope); - const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); - if (!config.chains[chain]) { - config.chains[chain] = {}; - } - config.chains[chain][key] = value; - fs.writeFileSync(configFile, JSON.stringify(config, null, 2)); -} -function getChainConfig(scope, chain, key) { - const configFile = findOrCreateConfigFile(scope); - const config = JSON.parse(fs.readFileSync(configFile, "utf-8")); - return config.chains[chain]?.[key]; -} -function envVarName(chain, key) { - return `${chain.toUpperCase()}_${key.toUpperCase()}`; -} -function get(chain, key, { reportError = false }) { - const varName = envVarName(chain, key); - const env = process.env[varName]; - if (env) { - console.info(chalk.yellow(`Using ${varName} for ${chain} ${key}`)); - return env; - } - const local = getChainConfig("local", chain, key); - if (local) { - console.info(chalk.yellow(`Using local configuration for ${chain} ${key} (in .ntt-cli/config.json)`)); - return local; - } - const global = getChainConfig("global", chain, key); - if (global) { - console.info(chalk.yellow(`Using global configuration for ${chain} ${key} (in $HOME/.ntt-cli/config.json)`)); - return global; - } - if (reportError) { - console.error(`Could not find configuration for ${chain} ${key}`); - console.error(`Please set it using 'ntt config set-chain ${chain} ${key} ' or by setting the environment variable ${varName}`); - } -} -function resolveScope(local, global) { - if (local && global) { - throw new Error("Cannot specify both --local and --global"); - } - if (local) { - return "local"; - } - if (global) { - return "global"; - } - throw new Error("Must specify either --local or --global"); -} - -// TODO: contract upgrades on solana -// TODO: set special relaying? -// TODO: currently, we just default all evm chains to standard relaying. should we not do that? what's a good way to configure this? -// TODO: check if manager can mint the token in burning mode (on solana it's -// simple. on evm we need to simulate with prank) -const overrides = (function () { - // read overrides.json file if exists - if (fs.existsSync("overrides.json")) { - console.error(chalk.yellow("Using overrides.json")); - return JSON.parse(fs.readFileSync("overrides.json").toString()); - } - else { - return {}; - } -})(); -const options = { - network: { - alias: "n", - describe: "Network", - choices: networks, - demandOption: true, - }, - deploymentPath: { - alias: "p", - describe: "Path to the deployment file", - default: "deployment.json", - type: "string", - }, - yes: { - alias: "y", - describe: "Skip confirmation", - type: "boolean", - default: false, - }, - signerType: { - alias: "s", - describe: "Signer type", - type: "string", - choices: ["privateKey", "ledger"], - default: "privateKey", - }, - verbose: { - alias: "v", - describe: "Verbose output", - type: "boolean", - default: false, - }, - chain: { - describe: "Chain", - type: "string", - choices: chains, - demandOption: true, - }, - address: { - describe: "Address", - type: "string", - demandOption: true, - }, - local: { - describe: "Use the current local version for deployment (advanced).", - type: "boolean", - default: false, - }, - version: { - describe: "Version of NTT to deploy", - type: "string", - demandOption: false, - }, - latest: { - describe: "Use the latest version", - type: "boolean", - default: false, - }, - skipVerify: { - describe: "Skip contract verification", - type: "boolean", - default: false, - }, - payer: { - describe: "Path to the payer json file (Solana)", - type: "string", - }, -}; -// TODO: this is a temporary hack to allow deploying from main (as we only need -// the changes to the evm script) -async function withCustomEvmDeployerScript(pwd, then) { - ensureNttRoot(pwd); - const overrides = [ - { path: `${pwd}/evm/script/DeployWormholeNtt.s.sol`, with: evmDeployFile }, - { path: `${pwd}/evm/script/helpers/DeployWormholeNttBase.sol`, with: evmDeployFileHelper }, - ]; - for (const { path, with: withFile } of overrides) { - const old = `${path}.old`; - if (fs.existsSync(path)) { - fs.copyFileSync(path, old); - } - fs.copyFileSync(withFile, path); - } - try { - return await then(); - } - finally { - // restore old files - for (const { path } of overrides) { - const old = `${path}.old`; - if (fs.existsSync(old)) { - fs.copyFileSync(old, path); - fs.unlinkSync(old); - } - } - } -} -const YARGSCommand = yargs(hideBin(process.argv)) - .wrap(Math.min(process.stdout.columns || 120, 160)) // Use terminal width, but no more than 160 characters - .scriptName("ntt") - .version((() => { - const ver = nttVersion(); - if (!ver) { - return "unknown"; - } - const { version, commit, path, remote } = ver; - const defaultPath = `${process.env.HOME}/.ntt-cli/.checkout`; - const remoteString = remote.includes("wormhole-foundation") ? "" : `${remote}@`; - if (path === defaultPath) { - return `ntt v${version} (${remoteString}${commit})`; - } - else { - return `ntt v${version} (${remoteString}${commit}) from ${path}`; - } -})()) - // config group of commands - .command("config", "configuration commands", command) - .command("update", "update the NTT CLI", (yargs) => yargs - .option("path", { - describe: "Path to a local NTT repo to install from. If not specified, the latest version will be installed.", - type: "string", -}) - .option("branch", { - describe: "Git branch to install from", - type: "string", -}) - .option("repo", { - describe: "Git repository to install from", - type: "string", -}) - .example("$0 update", "Update the NTT CLI to the latest version") - .example("$0 update --path /path/to/ntt", "Update the NTT CLI from a local repo") - .example("$0 update --branch cli", "Update the NTT CLI to the cli branch"), async (argv) => { - const localPath = argv["path"]; - if (localPath) { - if (argv["ref"]) { - console.error("Cannot specify both --path and --ref"); - process.exit(1); - } - if (argv["repo"]) { - console.error("Cannot specify both --path and --repo"); - process.exit(1); - } - await $ `${localPath}/cli/install.sh`; - } - else { - let branchArg = ""; - let repoArg = ""; - if (argv["branch"]) { - branchArg = `--branch ${argv["branch"]}`; - } - if (argv["repo"]) { - repoArg = `--repo ${argv["repo"]}`; - } - const installScript = "https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh"; - // save it to "$HOME/.ntt-cli/install.sh" - const nttDir = `${process.env.HOME}/.ntt-cli`; - const installer = `${nttDir}/install.sh`; - execSync(`mkdir -p ${nttDir}`); - execSync(`curl -s ${installScript} > ${installer}`); - execSync(`chmod +x ${installer}`); - execSync(`${installer} ${branchArg} ${repoArg}`, { stdio: "inherit" }); - } -}) - .command("new ", "create a new NTT project", (yargs) => yargs - .positional("path", { - describe: "Path to the project", - type: "string", - demandOption: true, -}) - .example("$0 new my-ntt-project", "Create a new NTT project in the 'my-ntt-project' directory"), async (argv) => { - const git = execSync("git rev-parse --is-inside-work-tree || echo false", { - stdio: ["inherit", null, null] - }); - if (git.toString().trim() === "true") { - console.error("Already in a git repository"); - process.exit(1); - } - const path = argv["path"]; - await $ `git clone -b main https://github.com/wormhole-foundation/example-native-token-transfers.git ${path}`; -}) - .command("add-chain ", "add a chain to the deployment file", (yargs) => yargs - .positional("chain", options.chain) - // TODO: add ability to specify manager address (then just pull the config) - // .option("manager", { - // describe: "Manager address", - // type: "string", - // }) - .option("program-key", { - describe: "Path to program key json (Solana)", - type: "string", -}) - .option("payer", { - describe: "Path to payer key json (Solana)", - type: "string", -}) - .option("binary", { - describe: "Path to program binary (.so file -- Solana)", - type: "string", -}) - .option("token", { - describe: "Token address", - type: "string", -}) - .option("mode", { - alias: "m", - describe: "Mode", - type: "string", - choices: ["locking", "burning"], -}) - .option("solana-priority-fee", { - describe: "Priority fee for Solana deployment (in microlamports)", - type: "number", - default: 50000, -}) - .option("signer-type", options.signerType) - .option("skip-verify", options.skipVerify) - .option("ver", options.version) - .option("latest", options.latest) - .option("local", options.local) - .option("path", options.deploymentPath) - .option("yes", options.yes) - .example("$0 add-chain Ethereum --token 0x1234... --mode burning --latest", "Add Ethereum chain with the latest contract version in burning mode") - .example("$0 add-chain Solana --token Sol1234... --mode locking --ver 1.0.0", "Add Solana chain with a specific contract version in locking mode") - .example("$0 add-chain Avalanche --token 0xabcd... --mode burning --local", "Add Avalanche chain using the local contract version"), async (argv) => { - const path = argv["path"]; - const deployments = loadConfig(path); - const chain = argv["chain"]; - const version = resolveVersion(argv["latest"], argv["ver"], argv["local"], chainToPlatform(chain)); - let mode = argv["mode"]; - const signerType = argv["signer-type"]; - const token = argv["token"]; - const network = deployments.network; - if (chain in deployments.chains) { - console.error(`Chain ${chain} already exists in ${path}`); - process.exit(1); - } - validateChain(network, chain); - const existsLocking = Object.values(deployments.chains).some((c) => c.mode === "locking"); - if (existsLocking) { - if (mode && mode === "locking") { - console.error("Only one locking chain is allowed"); - process.exit(1); - } - mode = "burning"; - } - if (!mode) { - console.error("Mode is required (use --mode)"); - process.exit(1); - } - if (!token) { - console.error("Token is required (use --token)"); - process.exit(1); - } - // let's deploy - // TODO: factor out to function to get chain context - const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(chain); - // TODO: make manager configurable - const deployedManager = await deploy(version, mode, ch, token, signerType, !argv["skip-verify"], argv["yes"], argv["payer"], argv["program-key"], argv["binary"], argv["solana-priority-fee"]); - const [config, _ctx, _ntt, decimals] = await pullChainConfig(network, deployedManager, overrides); - console.log("token decimals:", chalk.yellow(decimals)); - deployments.chains[chain] = config; - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Added ${chain} to ${path}`); -}) - .command("upgrade ", "upgrade the contract on a specific chain", (yargs) => yargs - .positional("chain", options.chain) - .option("ver", options.version) - .option("latest", { - describe: "Use the latest version", - type: "boolean", - default: false, -}) - .option("local", options.local) - .option("signer-type", options.signerType) - .option("skip-verify", options.skipVerify) - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("payer", { - describe: "Path to payer key json (Solana)", - type: "string", -}) - .option("program-key", { - describe: "Path to program key json (Solana)", - type: "string", -}) - .option("binary", { - describe: "Path to program binary (.so file -- Solana)", - type: "string", -}) - .example("$0 upgrade Ethereum --latest", "Upgrade the Ethereum contract to the latest version") - .example("$0 upgrade Solana --ver 1.1.0", "Upgrade the Solana contract to version 1.1.0") - .example("$0 upgrade Polygon --local --skip-verify", "Upgrade the Polygon contract using the local version, skipping explorer bytecode verification"), async (argv) => { - const path = argv["path"]; - const deployments = loadConfig(path); - const chain = argv["chain"]; - const signerType = argv["signer-type"]; - const network = deployments.network; - if (!(chain in deployments.chains)) { - console.error(`Chain ${chain} not found in ${path}`); - process.exit(1); - } - const chainConfig = deployments.chains[chain]; - const currentVersion = chainConfig.version; - const platform = chainToPlatform(chain); - const toVersion = resolveVersion(argv["latest"], argv["ver"], argv["local"], platform); - if (argv["local"]) { - await warnLocalDeployment(argv["yes"]); - } - if (toVersion === currentVersion && !argv["local"]) { - console.log(`Chain ${chain} is already at version ${currentVersion}`); - process.exit(0); - } - console.log(`Upgrading ${chain} from version ${currentVersion} to ${toVersion || 'local version'}`); - if (!argv["yes"]) { - await askForConfirmation(); - } - const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(chain); - const [_, ctx, ntt] = await pullChainConfig(network, { chain, address: toUniversal(chain, chainConfig.manager) }, overrides); - await upgrade(currentVersion, toVersion, ntt, ctx, signerType, !argv["skip-verify"], argv["payer"], argv["program-key"], argv["binary"]); - // reinit the ntt object to get the new version - // TODO: is there an easier way to do this? - const { ntt: upgraded } = await nttFromManager(ch, chainConfig.manager); - chainConfig.version = getVersion(chain, upgraded); - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Successfully upgraded ${chain} to version ${toVersion || 'local version'}`); -}) - .command("clone
", "initialize a deployment file from an existing contract", (yargs) => yargs - .positional("network", options.network) - .positional("chain", options.chain) - .positional("address", options.address) - .option("path", options.deploymentPath) - .option("verbose", options.verbose) - .example("$0 clone Testnet Ethereum 0x5678...", "Clone an existing Ethereum deployment on Testnet") - .example("$0 clone Mainnet Solana Sol5678... --path custom-clone.json", "Clone an existing Solana deployment on Mainnet to a custom file"), async (argv) => { - if (!isNetwork(argv["network"])) { - console.error("Invalid network"); - process.exit(1); - } - const path = argv["path"]; - const verbose = argv["verbose"]; - // check if the file exists - if (fs.existsSync(path)) { - console.error(`Deployment file already exists at ${path}`); - process.exit(1); - } - // step 1. grab the config - // step 2. discover registrations - // step 3. grab registered peer configs - // - // NOTE: we don't recursively grab peer configs. This means the - // discovered peers will be the ones that are directly registered with - // the starting manager (the one we're cloning). - // For example, if we're cloning manager A, and it's registered with - // B, and B is registered with C, but C is not registered with A, then - // C will not be included in the cloned deployment. - // We could do peer discovery recursively but that would be a lot - // slower, since peer discovery is already O(n) in the number of - // supported chains (50+), because there is no way to enumerate the peers, so we - // need to query all possible chains to see if they're registered. - const chain = argv["chain"]; - assertChain(chain); - const manager = argv["address"]; - const network = argv["network"]; - const universalManager = toUniversal(chain, manager); - const ntts = {}; - const [config, _ctx, ntt, _decimals] = await pullChainConfig(network, { chain, address: universalManager }, overrides); - ntts[chain] = ntt; - const configs = { - [chain]: config, - }; - // discover peers - let count = 0; - for (const c of chains) { - process.stdout.write(`[${count}/${chains.length - 1}] Fetching peer config for ${c}`); - await new Promise((resolve) => setTimeout(resolve, 100)); - count++; - const peer = await retryWithExponentialBackoff(() => ntt.getPeer(c), 5, 5000); - process.stdout.write(`\n`); - if (peer === null) { - continue; - } - const address = peer.address.address.toUniversalAddress(); - const [peerConfig, _ctx, peerNtt] = await pullChainConfig(network, { chain: c, address }, overrides); - ntts[c] = peerNtt; - configs[c] = peerConfig; - } - // sort chains by name - const sorted = Object.fromEntries(Object.entries(configs).sort(([a], [b]) => a.localeCompare(b))); - // sleep for a bit to avoid rate limiting when making the getDecimals call - // this can happen when the last we hit the rate limit just in the last iteration of the loop above. - // (happens more often than you'd think, because the rate limiter - // gets more aggressive after each hit) - await new Promise((resolve) => setTimeout(resolve, 2000)); - // now loop through the chains, and query their peer information to get the inbound limits - await pullInboundLimits(ntts, sorted, verbose); - const deployment = { - network: argv["network"], - chains: sorted, - }; - fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); -}) - .command("init ", "initialize a deployment file", (yargs) => yargs - .positional("network", options.network) - .option("path", options.deploymentPath) - .example("$0 init Testnet", "Initialize a new deployment file for the Testnet network") - .example("$0 init Mainnet --path custom.json", "Initialize a new deployment file for Mainnet with a custom file name"), async (argv) => { - if (!isNetwork(argv["network"])) { - console.error("Invalid network"); - process.exit(1); - } - const deployment = { - network: argv["network"], - chains: {}, - }; - const path = argv["path"]; - // check if the file exists - if (fs.existsSync(path)) { - console.error(`Deployment file already exists at ${path}. Specify a different path with --path`); - process.exit(1); - } - fs.writeFileSync(path, JSON.stringify(deployment, null, 2)); -}) - .command("pull", "pull the remote configuration", (yargs) => yargs - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("verbose", options.verbose) - .example("$0 pull", "Pull the latest configuration from the blockchain for all chains") - .example("$0 pull --yes", "Pull the latest configuration and apply changes without confirmation"), async (argv) => { - const deployments = loadConfig(argv["path"]); - const verbose = argv["verbose"]; - const network = deployments.network; - const path = argv["path"]; - const deps = await pullDeployments(deployments, network, verbose); - let changed = false; - for (const [chain, deployment] of Object.entries(deps)) { - assertChain(chain); - const diff = diffObjects(deployments.chains[chain], deployment.config.remote); - if (Object.keys(diff).length !== 0) { - console.error(chalk.reset(colorizeDiff({ [chain]: diff }))); - changed = true; - deployments.chains[chain] = deployment.config.remote; - } - } - if (!changed) { - console.log(`${path} is already up to date`); - process.exit(0); - } - if (!argv["yes"]) { - await askForConfirmation(); - } - fs.writeFileSync(path, JSON.stringify(deployments, null, 2)); - console.log(`Updated ${path}`); -}) - .command("push", "push the local configuration", (yargs) => yargs - .option("path", options.deploymentPath) - .option("yes", options.yes) - .option("signer-type", options.signerType) - .option("verbose", options.verbose) - .option("skip-verify", options.skipVerify) - .option("payer", options.payer) - .example("$0 push", "Push local configuration changes to the blockchain") - .example("$0 push --signer-type ledger", "Push changes using a Ledger hardware wallet for signing") - .example("$0 push --skip-verify", "Push changes without verifying contracts on EVM chains") - .example("$0 push --payer ", "Path to the payer json file (Solana), instead of setting SOLANA_PRIVATE_KEY env variable"), async (argv) => { - const deployments = loadConfig(argv["path"]); - const verbose = argv["verbose"]; - const network = deployments.network; - const deps = await pullDeployments(deployments, network, verbose); - const signerType = argv["signer-type"]; - const payerPath = argv["payer"]; - const missing = await missingConfigs(deps, verbose); - if (checkConfigErrors(deps)) { - console.error("There are errors in the config file. Please fix these before continuing."); - process.exit(1); - } - for (const [chain, missingConfig] of Object.entries(missing)) { - assertChain(chain); - const ntt = deps[chain].ntt; - const ctx = deps[chain].ctx; - const signer = await getSigner(ctx, signerType, undefined, payerPath); - for (const manager of missingConfig.managerPeers) { - const tx = ntt.setPeer(manager.address, manager.tokenDecimals, manager.inboundLimit, signer.address.address); - await signSendWait(ctx, tx, signer.signer); - } - for (const transceiver of missingConfig.transceiverPeers) { - const tx = ntt.setTransceiverPeer(0, transceiver, signer.address.address); - await signSendWait(ctx, tx, signer.signer); - } - for (const evmChain of missingConfig.evmChains) { - const tx = (await ntt.getTransceiver(0)).setIsEvmChain(evmChain, true); - await signSendWait(ctx, tx, signer.signer); - } - for (const relayingTarget of missingConfig.standardRelaying) { - const tx = (await ntt.getTransceiver(0)).setIsWormholeRelayingEnabled(relayingTarget, true); - await signSendWait(ctx, tx, signer.signer); - } - for (const relayingTarget of missingConfig.specialRelaying) { - const tx = (await ntt.getTransceiver(0)).setIsSpecialRelayingEnabled(relayingTarget, true); - await signSendWait(ctx, tx, signer.signer); - } - if (missingConfig.solanaWormholeTransceiver) { - if (chainToPlatform(chain) !== "Solana") { - console.error("Solana wormhole transceiver can only be set on Solana chains"); - continue; - } - const solanaNtt = ntt; - const tx = solanaNtt.registerWormholeTransceiver({ - payer: signer.address.address, - owner: signer.address.address, - }); - try { - await signSendWait(ctx, tx, signer.signer); - } - catch (e) { - console.error(e.logs); - } - } - if (missingConfig.solanaUpdateLUT) { - if (chainToPlatform(chain) !== "Solana") { - console.error("Solana update LUT can only be set on Solana chains"); - continue; - } - const solanaNtt = ntt; - const tx = solanaNtt.initializeOrUpdateLUT({ payer: new SolanaAddress(signer.address.address).unwrap() }); - try { - await signSendWait(ctx, tx, signer.signer); - } - catch (e) { - console.error(e.logs); - } - } - } - // pull deps again - const depsAfterRegistrations = await pullDeployments(deployments, network, verbose); - for (const [chain, deployment] of Object.entries(depsAfterRegistrations)) { - assertChain(chain); - await pushDeployment(deployment, signerType, !argv["skip-verify"], argv["yes"], payerPath); - } -}) - .command("status", "check the status of the deployment", (yargs) => yargs - .option("path", options.deploymentPath) - .option("verbose", options.verbose) - .example("$0 status", "Check the status of the deployment across all chains") - .example("$0 status --verbose", "Check the status with detailed output"), async (argv) => { - const path = argv["path"]; - const verbose = argv["verbose"]; - // TODO: I don't like the variable names here - const deployments = loadConfig(path); - const network = deployments.network; - let deps = await pullDeployments(deployments, network, verbose); - let fixable = 0; - const extraInfo = {}; - if (checkConfigErrors(deps)) { - console.error("There are errors in the config file. Please fix these before continuing."); - process.exit(1); - } - // diff remote and local configs - for (const [chain, deployment] of Object.entries(deps)) { - assertChain(chain); - const local = deployment.config.local; - const remote = deployment.config.remote; - const a = { [chain]: local }; - const b = { [chain]: remote }; - const diff = diffObjects(a, b); - if (Object.keys(diff).length !== 0) { - console.error(chalk.reset(colorizeDiff(diff))); - fixable++; - } - if (verbose) { - const immutables = await getImmutables(chain, deployment.ntt); - if (immutables) { - extraInfo[chain] = immutables; - } - const pdas = await getPdas(chain, deployment.ntt); - if (pdas) { - extraInfo[chain] = pdas; - } - } - } - if (Object.keys(extraInfo).length > 0) { - console.log(chalk.yellow(JSON.stringify(extraInfo, null, 2))); - } - // verify peers - const missing = await missingConfigs(deps, verbose); - if (Object.keys(missing).length > 0) { - fixable++; - } - for (const [chain, missingConfig] of Object.entries(missing)) { - console.error(`${chain} status:`); - for (const manager of missingConfig.managerPeers) { - console.error(` Missing manager peer: ${manager.address.chain}`); - } - for (const transceiver of missingConfig.transceiverPeers) { - console.error(` Missing transceiver peer: ${transceiver.chain}`); - } - for (const evmChain of missingConfig.evmChains) { - console.error(` ${evmChain} needs to be configured as an EVM chain`); - } - for (const relayingTarget of missingConfig.standardRelaying) { - console.warn(` No standard relaying to ${relayingTarget}`); - } - for (const relayingTarget of missingConfig.specialRelaying) { - console.warn(` No special relaying to ${relayingTarget}`); - } - if (missingConfig.solanaWormholeTransceiver) { - console.error(" Missing Solana wormhole transceiver"); - } - if (missingConfig.solanaUpdateLUT) { - console.error(" Missing or outdated LUT"); - } - } - if (fixable > 0) { - console.error("Run `ntt pull` to pull the remote configuration (overwriting the local one)"); - console.error("Run `ntt push` to push the local configuration (overwriting the remote one) by executing the necessary transactions"); - process.exit(1); - } - else { - console.log(`${path} is up to date with the on-chain configuration.`); - process.exit(0); - } -}) - .command("solana", "Solana commands", (yargs) => { - yargs - .command("key-base58 ", "print private key in base58", (yargs) => yargs - .positional("keypair", { - describe: "Path to keypair.json", - type: "string", - demandOption: true, - }), (argv) => { - const keypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(argv["keypair"]).toString()))); - console.log(encoding.b58.encode(keypair.secretKey)); - }) - .command("token-authority ", "print the token authority address for a given program ID", (yargs) => yargs - .positional("programId", { - describe: "Program ID", - type: "string", - demandOption: true, - }), (argv) => { - const programId = new PublicKey(argv["programId"]); - const tokenAuthority = NTT.pdas(programId).tokenAuthority(); - console.log(tokenAuthority.toBase58()); - }) - .command("ata ", "print the token authority address for a given program ID", (yargs) => yargs - .positional("mint", { - describe: "Mint address", - type: "string", - demandOption: true, - }) - .positional("owner", { - describe: "Owner address", - type: "string", - demandOption: true, - }) - .positional("tokenProgram", { - describe: "Token program ID", - type: "string", - choices: ["legacy", "token22"], - demandOption: true, - }), (argv) => { - const mint = new PublicKey(argv["mint"]); - const owner = new PublicKey(argv["owner"]); - const tokenProgram = argv["tokenProgram"] === "legacy" - ? spl.TOKEN_PROGRAM_ID - : spl.TOKEN_2022_PROGRAM_ID; - const ata = spl.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); - console.log(ata.toBase58()); - }) - .demandCommand(); -}) - .help() - .strict() - .demandCommand(); -function checkConfigErrors(deps) { - let fatal = 0; - for (const [chain, deployment] of Object.entries(deps)) { - assertChain(chain); - const config = deployment.config.local; - if (!checkNumberFormatting(config.limits.outbound, deployment.decimals)) { - console.error(`ERROR: ${chain} has an outbound limit (${config.limits.outbound}) with the wrong number of decimals. The number should have ${deployment.decimals} decimals.`); - fatal++; - } - if (config.limits.outbound === formatNumber(0n, deployment.decimals)) { - console.warn(chalk.yellow(`${chain} has an outbound limit of 0`)); - } - for (const [c, limit] of Object.entries(config.limits.inbound)) { - if (!checkNumberFormatting(limit, deployment.decimals)) { - console.error(`ERROR: ${chain} has an inbound limit with the wrong number of decimals for ${c} (${limit}). The number should have ${deployment.decimals} decimals.`); - fatal++; - } - if (limit === formatNumber(0n, deployment.decimals)) { - console.warn(chalk.yellow(`${chain} has an inbound limit of 0 from ${c}`)); - } - } - } - return fatal; -} -function createWorkTree(platform, version) { - const tag = getGitTagName(platform, version); - if (!tag) { - console.error(`No tag found matching ${version} for ${platform}`); - process.exit(1); - } - const worktreeName = `.deployments/${platform}-${version}`; - if (fs.existsSync(worktreeName)) { - console.log(chalk.yellow(`Worktree already exists at ${worktreeName}. Resetting to ${tag}`)); - execSync(`git -C ${worktreeName} reset --hard ${tag}`, { - stdio: "inherit" - }); - } - else { - // create worktree - execSync(`git worktree add ${worktreeName} ${tag}`, { - stdio: "inherit" - }); - } - // NOTE: we create this symlink whether or not the file exists. - // this way, if it's created later, the symlink will be correct - execSync(`ln -fs $(pwd)/overrides.json $(pwd)/${worktreeName}/overrides.json`, { - stdio: "inherit" - }); - console.log(chalk.green(`Created worktree at ${worktreeName} from tag ${tag}`)); - return worktreeName; -} -async function upgrade(_fromVersion, toVersion, ntt, ctx, signerType, evmVerify, solanaPayer, solanaProgramKeyPath, solanaBinaryPath) { - // TODO: check that fromVersion is safe to upgrade to toVersion from - const platform = chainToPlatform(ctx.chain); - const worktree = toVersion ? createWorkTree(platform, toVersion) : "."; - switch (platform) { - case "Evm": - const evmNtt = ntt; - const evmCtx = ctx; - return upgradeEvm(worktree, evmNtt, evmCtx, signerType, evmVerify); - case "Solana": - if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { - console.error("Payer not found. Specify with --payer"); - process.exit(1); - } - const solanaNtt = ntt; - const solanaCtx = ctx; - return upgradeSolana(worktree, toVersion, solanaNtt, solanaCtx, solanaPayer, solanaProgramKeyPath, solanaBinaryPath); - default: - throw new Error("Unsupported platform"); - } -} -async function upgradeEvm(pwd, ntt, ctx, signerType, evmVerify) { - ensureNttRoot(pwd); - console.log("Upgrading EVM chain", ctx.chain); - const signer = await getSigner(ctx, signerType); - const signerArgs = forgeSignerArgs(signer.source); - console.log("Installing forge dependencies..."); - execSync("forge install", { - cwd: `${pwd}/evm`, - stdio: "pipe" - }); - let verifyArgs = ""; - if (evmVerify) { - // TODO: verify etherscan api key? - const etherscanApiKey = get(ctx.chain, "scan_api_key", { reportError: true }); - if (!etherscanApiKey) { - process.exit(1); - } - verifyArgs = `--verify --etherscan-api-key ${etherscanApiKey}`; - } - console.log("Upgrading manager..."); - await withCustomEvmDeployerScript(pwd, async () => { - execSync(`forge script --via-ir script/DeployWormholeNtt.s.sol \ ---rpc-url ${ctx.config.rpc} \ ---sig "upgrade(address)" \ -${ntt.managerAddress} \ -${signerArgs} \ ---broadcast \ -${verifyArgs} | tee last-run.stdout`, { - cwd: `${pwd}/evm`, - stdio: "inherit" - }); - }); -} -async function upgradeSolana(pwd, version, ntt, ctx, payer, programKeyPath, binaryPath) { - if (version === null) { - throw new Error("Cannot upgrade Solana to local version"); // TODO: this is not hard to enabled - } - const mint = (await (ntt.getConfig())).mint; - await deploySolana(pwd, version, await ntt.getMode(), ctx, mint.toBase58(), payer, false, programKeyPath, binaryPath); - // TODO: call initializeOrUpdateLUT. currently it's done in the following 'ntt push' step. -} -async function deploy(version, mode, ch, token, signerType, evmVerify, yes, solanaPayer, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee) { - if (version === null) { - await warnLocalDeployment(yes); - } - const platform = chainToPlatform(ch.chain); - const worktree = version ? createWorkTree(platform, version) : "."; - switch (platform) { - case "Evm": - return await deployEvm(worktree, mode, ch, token, signerType, evmVerify); - case "Solana": - if (solanaPayer === undefined || !fs.existsSync(solanaPayer)) { - console.error("Payer not found. Specify with --payer"); - process.exit(1); - } - const solanaCtx = ch; - return await deploySolana(worktree, version, mode, solanaCtx, token, solanaPayer, true, solanaProgramKeyPath, solanaBinaryPath, solanaPriorityFee); - default: - throw new Error("Unsupported platform"); - } -} -async function deployEvm(pwd, mode, ch, token, signerType, verify) { - ensureNttRoot(pwd); - const wormhole = ch.config.contracts.coreBridge; - if (!wormhole) { - console.error("Core bridge not found"); - process.exit(1); - } - const relayer = ch.config.contracts.relayer; - if (!relayer) { - console.error("Relayer not found"); - process.exit(1); - } - const rpc = ch.config.rpc; - // TODO: how to make specialRelayer configurable?? - let specialRelayer; - if (ch.chain === "Avalanche") { - specialRelayer = "0x1a19d8a194630642f750376Ae72b4eDF5aDFd25F"; - } - else if (ch.chain === "Bsc") { - specialRelayer = "0x8C56eE9cd232d23541a697C0eBd3cA597DE3c88D"; - } - else { - specialRelayer = "0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74"; - } - const provider = new ethers.JsonRpcProvider(rpc); - const abi = ["function decimals() external view returns (uint8)"]; - const tokenContract = new ethers.Contract(token, abi, provider); - const decimals = await tokenContract.decimals(); - // TODO: should actually make these ENV variables. - const sig = "run(address,address,address,address,uint8,uint8)"; - const modeUint = mode === "locking" ? 0 : 1; - const signer = await getSigner(ch, signerType); - const signerArgs = forgeSignerArgs(signer.source); - // TODO: verify etherscan api key? - let verifyArgs = []; - if (verify) { - const etherscanApiKey = get(ch.chain, "scan_api_key", { reportError: true }); - if (!etherscanApiKey) { - process.exit(1); - } - verifyArgs = ["--verify", "--etherscan-api-key", etherscanApiKey]; - } - console.log("Installing forge dependencies..."); - execSync("forge install", { - cwd: `${pwd}/evm`, - stdio: "pipe" - }); - console.log("Deploying manager..."); - const deploy = async (simulate) => { - const simulateArg = simulate ? "" : "--skip-simulation"; - await withCustomEvmDeployerScript(pwd, async () => { - try { - execSync(` -forge script --via-ir script/DeployWormholeNtt.s.sol \ ---rpc-url ${rpc} \ -${simulateArg} \ ---sig "${sig}" ${wormhole} ${token} ${relayer} ${specialRelayer} ${decimals} ${modeUint} \ ---broadcast ${verifyArgs.join(' ')} ${signerArgs} 2>&1 | tee last-run.stdout`, { - cwd: `${pwd}/evm`, - encoding: 'utf8', - stdio: 'inherit' - }); - } - catch (error) { - console.error("Failed to deploy manager"); - // NOTE: we don't exit here. instead, we check if the manager was - // deployed successfully (below) and proceed if it was. - // process.exit(1); - } - }); - return fs.readFileSync(`${pwd}/evm/last-run.stdout`).toString(); - }; - // we attempt to deploy with simulation first, then without if it fails - let out = await deploy(true); - if (out.includes("Simulated execution failed")) { - if (out.includes("NotActivated")) { - console.error("Simulation failed, likely because the token contract is compiled against a different EVM version. It's probably safe to continue without simulation."); - await askForConfirmation("Do you want to proceed with the deployment without simulation?"); - } - else { - console.error("Simulation failed. Please read the error message carefully, and proceed with caution."); - await askForConfirmation("Do you want to proceed with the deployment without simulation?"); - } - out = await deploy(false); - } - if (!out) { - console.error("Failed to deploy manager"); - process.exit(1); - } - const logs = out.split("\n").map((l) => l.trim()).filter((l) => l.length > 0); - const manager = logs.find((l) => l.includes("NttManager: 0x"))?.split(" ")[1]; - if (!manager) { - console.error("Manager not found"); - process.exit(1); - } - const universalManager = toUniversal(ch.chain, manager); - return { chain: ch.chain, address: universalManager }; -} -async function deploySolana(pwd, version, mode, ch, token, payer, initialize, managerKeyPath, binaryPath, priorityFee) { - ensureNttRoot(pwd); - // TODO: if the binary is provided, we should not check addresses in the source tree. (so we should move around the control flow a bit) - // TODO: factor out some of this into separate functions to help readability of this function (maybe even move to a different file) - const wormhole = ch.config.contracts.coreBridge; - if (!wormhole) { - console.error("Core bridge not found"); - process.exit(1); - } - // grep example_native_token_transfers = ".*" - // in solana/Anchor.toml - // TODO: what if they rename the program? - const existingProgramId = fs.readFileSync(`${pwd}/solana/Anchor.toml`).toString().match(/example_native_token_transfers = "(.*)"/)?.[1]; - if (!existingProgramId) { - console.error("Program ID not found in Anchor.toml (looked for example_native_token_transfers = \"(.*)\")"); - process.exit(1); - } - let programKeypairPath; - let programKeypair; - if (managerKeyPath) { - if (!fs.existsSync(managerKeyPath)) { - console.error(`Program keypair not found: ${managerKeyPath}`); - process.exit(1); - } - programKeypairPath = managerKeyPath; - programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(managerKeyPath).toString()))); - } - else { - const programKeyJson = `${existingProgramId}.json`; - if (!fs.existsSync(programKeyJson)) { - console.error(`Program keypair not found: ${programKeyJson}`); - console.error("Run `solana-keygen` to create a new keypair (either with 'new', or with 'grind'), and pass it to this command with --program-key"); - console.error("For example: solana-keygen grind --starts-with ntt:1 --ignore-case"); - process.exit(1); - } - programKeypairPath = programKeyJson; - programKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(programKeyJson).toString()))); - if (existingProgramId !== programKeypair.publicKey.toBase58()) { - console.error(`The private key in ${programKeyJson} does not match the existing program ID: ${existingProgramId}`); - process.exit(1); - } - } - // see if the program key matches the existing program ID. if not, we need - // to update the latter in the Anchor.toml file and the lib.rs file(s) - const providedProgramId = programKeypair.publicKey.toBase58(); - if (providedProgramId !== existingProgramId) { - // only ask for confirmation if the current directory is ".". if it's - // something else (a worktree) then it's a fresh checkout and we just - // override the address anyway. - if (pwd === ".") { - console.error(`Program keypair does not match the existing program ID: ${existingProgramId}`); - await askForConfirmation(`Do you want to update the program ID in the Anchor.toml file and the lib.rs file to ${providedProgramId}?`); - } - const anchorTomlPath = `${pwd}/solana/Anchor.toml`; - const libRsPath = `${pwd}/solana/programs/example-native-token-transfers/src/lib.rs`; - const anchorToml = fs.readFileSync(anchorTomlPath).toString(); - const newAnchorToml = anchorToml.replace(existingProgramId, providedProgramId); - fs.writeFileSync(anchorTomlPath, newAnchorToml); - const libRs = fs.readFileSync(libRsPath).toString(); - const newLibRs = libRs.replace(existingProgramId, providedProgramId); - fs.writeFileSync(libRsPath, newLibRs); - } - // First we check that the provided mint's mint authority is the program's token authority PDA when in burning mode. - // This is checked in the program initialiser anyway, but we can save some - // time by checking it here and failing early (not to mention better - // diagnostics). - const emitter = NTT.transceiverPdas(providedProgramId).emitterAccount().toBase58(); - const payerKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(payer).toString()))); - // this is not super pretty... I want to initialise the 'ntt' object, but - // because it's not deployed yet, fetching the version will fail, and thus default to whatever the default version is. - // We want to use the correct version (because the sdk's behaviour depends on it), so we first create a dummy ntt instance, - // let that fill in all the necessary fields, and then create a new instance with the correct version. - // It should be possible to avoid this dummy object and just instantiate 'SolanaNtt' directly, but I wasn't - // sure where the various pieces are plugged together and this seemed easier. - // TODO: refactor this to avoid the dummy object - const dummy = await ch.getProtocol("Ntt", { - ntt: { - manager: providedProgramId, - token: token, - transceiver: { wormhole: emitter }, - } - }); - const ntt = new SolanaNtt(dummy.network, dummy.chain, dummy.connection, dummy.contracts, version ?? undefined); - // get the mint authority of 'token' - const tokenMint = new PublicKey(token); - // const tokenInfo = await ch.connection.getTokenInfo(tokenMint); - const connection = await ch.getRpc(); - const mintInfo = await connection.getAccountInfo(tokenMint); - if (!mintInfo) { - console.error(`Mint ${token} not found on ${ch.chain} ${ch.network}`); - process.exit(1); - } - const mint = spl.unpackMint(tokenMint, mintInfo, mintInfo.owner); - if (mode === "burning") { - const expectedMintAuthority = ntt.pdas.tokenAuthority().toBase58(); - const actualMintAuthority = mint.mintAuthority?.toBase58() ?? null; - if (actualMintAuthority !== expectedMintAuthority) { - console.error(`Mint authority mismatch for ${token}`); - console.error(`Expected: ${expectedMintAuthority}`); - console.error(`Actual: ${actualMintAuthority}`); - console.error(`Set the mint authority to the program's token authority PDA with e.g.:`); - console.error(`spl-token authorize ${token} mint ${expectedMintAuthority}`); - process.exit(1); - } - } - let binary; - { - if (binaryPath) { - binary = binaryPath; - } - else { - // build the program - // TODO: build with docker - checkAnchorVersion(); - const proc = Bun.spawn(["anchor", - "build", - "-p", "example_native_token_transfers", - "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) - ], { - cwd: `${pwd}/solana` - }); - // const _out = await new Response(proc.stdout).text(); - await proc.exited; - if (proc.exitCode !== 0) { - process.exit(proc.exitCode ?? 1); - } - binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; - } - await checkSolanaBinary(binary, wormhole, providedProgramId, version ?? undefined); - // if buffer.json doesn't exist, create it - if (!fs.existsSync(`buffer.json`)) { - execSync(`solana-keygen new -o buffer.json --no-bip39-passphrase`); - } - else { - console.info("buffer.json already exists."); - askForConfirmation("Do you want continue an exiting deployment? If not, delete the buffer.json file and run the command again."); - } - const deployCommand = [ - "solana", - "program", - "deploy", - "--program-id", programKeypairPath, - "--buffer", `buffer.json`, - binary, - "--keypair", payer, - "-u", ch.config.rpc, - "--commitment", "finalized" - ]; - if (priorityFee !== undefined) { - deployCommand.push("--with-compute-unit-price", priorityFee.toString()); - } - const deployProc = Bun.spawn(deployCommand); - const out = await new Response(deployProc.stdout).text(); - await deployProc.exited; - if (deployProc.exitCode !== 0) { - process.exit(deployProc.exitCode ?? 1); - } - // success. remove buffer.json - fs.unlinkSync("buffer.json"); - console.log(out); - } - if (initialize) { - // wait 3 seconds - await new Promise((resolve) => setTimeout(resolve, 3000)); - const tx = ntt.initialize(toUniversal(ch.chain, payerKeypair.publicKey.toBase58()), { - mint: new PublicKey(token), - mode, - outboundLimit: 100000000n, - }); - const signer = await getSigner(ch, "privateKey", encoding.b58.encode(payerKeypair.secretKey)); - try { - await signSendWait(ch, tx, signer.signer); - } - catch (e) { - console.error(e.logs); - } - } - return { chain: ch.chain, address: toUniversal(ch.chain, providedProgramId) }; -} -async function missingConfigs(deps, verbose) { - const missingConfigs = {}; - for (const [fromChain, from] of Object.entries(deps)) { - let count = 0; - assertChain(fromChain); - let missing = { - managerPeers: [], - transceiverPeers: [], - evmChains: [], - standardRelaying: [], - specialRelaying: [], - solanaWormholeTransceiver: false, - solanaUpdateLUT: false, - }; - if (chainToPlatform(fromChain) === "Solana") { - const solanaNtt = from.ntt; - const selfWormholeTransceiver = solanaNtt.pdas.registeredTransceiver(new PublicKey(solanaNtt.contracts.ntt.manager)).toBase58(); - const registeredSelfTransceiver = await retryWithExponentialBackoff(() => solanaNtt.connection.getAccountInfo(new PublicKey(selfWormholeTransceiver)), 5, 5000); - if (registeredSelfTransceiver === null) { - count++; - missing.solanaWormholeTransceiver = true; - } - // here we just check if the LUT update function returns an instruction. - // if it does, it means the LUT is missing or outdated. notice that - // we're not actually updating the LUT here, just checking if it's - // missing, so it's ok to use the 0 pubkey as the payer. - const updateLUT = solanaNtt.initializeOrUpdateLUT({ payer: new PublicKey(0) }); - // check if async generator is non-empty - if (!(await updateLUT.next()).done) { - count++; - missing.solanaUpdateLUT = true; - } - } - for (const [toChain, to] of Object.entries(deps)) { - assertChain(toChain); - if (fromChain === toChain) { - continue; - } - if (verbose) { - process.stdout.write(`Verifying registration for ${fromChain} -> ${toChain}......\n`); - } - const peer = await retryWithExponentialBackoff(() => from.ntt.getPeer(toChain), 5, 5000); - if (peer === null) { - const configLimit = from.config.local?.limits?.inbound?.[toChain]?.replace(".", ""); - count++; - missing.managerPeers.push({ - address: to.manager, - tokenDecimals: to.decimals, - inboundLimit: BigInt(configLimit ?? 0), - }); - } - else { - // @ts-ignore TODO - if (!Buffer.from(peer.address.address.address).equals(Buffer.from(to.manager.address.address))) { - console.error(`Peer address mismatch for ${fromChain} -> ${toChain}`); - } - if (peer.tokenDecimals !== to.decimals) { - console.error(`Peer decimals mismatch for ${fromChain} -> ${toChain}`); - } - } - if (chainToPlatform(fromChain) === "Evm") { - const toIsEvm = chainToPlatform(toChain) === "Evm"; - const toIsSolana = chainToPlatform(toChain) === "Solana"; - const whTransceiver = await from.ntt.getTransceiver(0); - if (toIsEvm) { - const remoteToEvm = await whTransceiver.isEvmChain(toChain); - if (!remoteToEvm) { - count++; - missing.evmChains.push(toChain); - } - const standardRelaying = await whTransceiver.isWormholeRelayingEnabled(toChain); - if (!standardRelaying) { - count++; - missing.standardRelaying.push(toChain); - } - } - else if (toIsSolana) { - const specialRelaying = await whTransceiver.isSpecialRelayingEnabled(toChain); - if (!specialRelaying) { - count++; - missing.specialRelaying.push(toChain); - } - } - } - const transceiverPeer = await retryWithExponentialBackoff(() => from.whTransceiver.getPeer(toChain), 5, 5000); - if (transceiverPeer === null) { - count++; - missing.transceiverPeers.push(to.whTransceiver.getAddress()); - } - else { - // @ts-ignore TODO - if (!Buffer.from(transceiverPeer.address.address).equals(Buffer.from(to.whTransceiver.getAddress().address.address))) { - console.error(`Transceiver peer address mismatch for ${fromChain} -> ${toChain}`); - } - } - } - if (count > 0) { - missingConfigs[fromChain] = missing; - } - } - return missingConfigs; -} -async function pushDeployment(deployment, signerType, evmVerify, yes, filePath) { - const diff = diffObjects(deployment.config.local, deployment.config.remote); - if (Object.keys(diff).length === 0) { - return; - } - const canonical = canonicalAddress(deployment.manager); - console.log(`Pushing changes to ${deployment.manager.chain} (${canonical})`); - console.log(chalk.reset(colorizeDiff(diff))); - if (!yes) { - await askForConfirmation(); - } - const ctx = deployment.ctx; - const signer = await getSigner(ctx, signerType, undefined, filePath); - let txs = []; - // we perform this last to make sure we don't accidentally lock ourselves out - let updateOwner = undefined; - let managerUpgrade; - for (const k of Object.keys(diff)) { - if (k === "version") { - // TODO: check against existing version, and make sure no major version changes - managerUpgrade = { from: diff[k].pull, to: diff[k].push }; - } - else if (k === "owner") { - const address = toUniversal(deployment.manager.chain, diff[k]?.push); - updateOwner = deployment.ntt.setOwner(address, signer.address.address); - } - else if (k === "pauser") { - const address = toUniversal(deployment.manager.chain, diff[k]?.push); - txs.push(deployment.ntt.setPauser(address, signer.address.address)); - } - else if (k === "paused") { - if (diff[k]?.push === true) { - txs.push(deployment.ntt.pause(signer.address.address)); - } - else { - txs.push(deployment.ntt.unpause(signer.address.address)); - } - } - else if (k === "limits") { - const newOutbound = diff[k]?.outbound?.push; - if (newOutbound) { - // TODO: verify amount has correct number of decimals? - // remove "." from string and convert to bigint - const newOutboundBigint = BigInt(newOutbound.replace(".", "")); - txs.push(deployment.ntt.setOutboundLimit(newOutboundBigint, signer.address.address)); - } - const inbound = diff[k]?.inbound; - if (inbound) { - for (const chain of Object.keys(inbound)) { - assertChain(chain); - const newInbound = inbound[chain]?.push; - if (newInbound) { - // TODO: verify amount has correct number of decimals? - const newInboundBigint = BigInt(newInbound.replace(".", "")); - txs.push(deployment.ntt.setInboundLimit(chain, newInboundBigint, signer.address.address)); - } - } - } - } - else if (k === "transceivers") { - // TODO: refactor this nested loop stuff into separate functions at least - // alternatively we could first recursively collect all the things - // to do into a flattened list (with entries like - // transceivers.wormhole.pauser), and have a top-level mapping of - // these entries to how they should be handled - for (const j of Object.keys(diff[k])) { - if (j === "wormhole") { - for (const l of Object.keys(diff[k][j])) { - if (l === "pauser") { - const newTransceiverPauser = toUniversal(deployment.manager.chain, diff[k][j][l].push); - txs.push(deployment.whTransceiver.setPauser(newTransceiverPauser, signer.address.address)); - } - else { - console.error(`Unsupported field: ${k}.${j}.${l}`); - process.exit(1); - } - } - } - else { - console.error(`Unsupported field: ${k}.${j}`); - process.exit(1); - } - } - } - else { - console.error(`Unsupported field: ${k}`); - process.exit(1); - } - } - if (managerUpgrade) { - await upgrade(managerUpgrade.from, managerUpgrade.to, deployment.ntt, ctx, signerType, evmVerify); - } - for (const tx of txs) { - await signSendWait(ctx, tx, signer.signer); - } - if (updateOwner) { - await signSendWait(ctx, updateOwner, signer.signer); - } -} -async function pullDeployments(deployments, network, verbose) { - let deps = {}; - for (const [chain, deployment] of Object.entries(deployments.chains)) { - if (verbose) { - process.stdout.write(`Fetching config for ${chain}......\n`); - } - assertChain(chain); - const managerAddress = deployment.manager; - if (managerAddress === undefined) { - console.error(`manager field not found for chain ${chain}`); - // process.exit(1); - continue; - } - const [remote, ctx, ntt, decimals] = await pullChainConfig(network, { chain, address: toUniversal(chain, managerAddress) }, overrides); - const local = deployments.chains[chain]; - // TODO: what if it's not index 0... - // we should check that the address of this transceiver matches the - // address in the config. currently we just assume that ix 0 is the wormhole one - const whTransceiver = await ntt.getTransceiver(0); - if (whTransceiver === null) { - console.error(`Wormhole transceiver not found for ${chain}`); - process.exit(1); - } - deps[chain] = { - ctx, - ntt, - decimals, - manager: { chain, address: toUniversal(chain, managerAddress) }, - whTransceiver, - config: { - remote, - local, - } - }; - } - const config = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.config.remote])); - const ntts = Object.fromEntries(Object.entries(deps).map(([k, v]) => [k, v.ntt])); - await pullInboundLimits(ntts, config, verbose); - return deps; -} -async function pullChainConfig(network, manager, overrides) { - const wh = new Wormhole(network, [solana.Platform, evm.Platform], overrides); - const ch = wh.getChain(manager.chain); - const nativeManagerAddress = canonicalAddress(manager); - const { ntt, addresses } = await nttFromManager(ch, nativeManagerAddress); - const mode = await ntt.getMode(); - const outboundLimit = await ntt.getOutboundLimit(); - const threshold = await ntt.getThreshold(); - const decimals = await ntt.getTokenDecimals(); - // insert decimal point into number - const outboundLimitDecimals = formatNumber(outboundLimit, decimals); - const paused = await ntt.isPaused(); - const owner = await ntt.getOwner(); - const pauser = await ntt.getPauser(); - const version = getVersion(manager.chain, ntt); - const transceiverPauser = await ntt.getTransceiver(0).then((t) => t?.getPauser() ?? null); - const config = { - version, - mode, - paused, - owner: owner.toString(), - manager: nativeManagerAddress, - token: addresses.token, - transceivers: { - threshold, - wormhole: { address: addresses.transceiver.wormhole }, - }, - limits: { - outbound: outboundLimitDecimals, - inbound: {}, - }, - }; - if (transceiverPauser) { - config.transceivers.wormhole.pauser = transceiverPauser.toString(); - } - if (pauser) { - config.pauser = pauser.toString(); - } - return [config, ch, ntt, decimals]; -} -async function getImmutables(chain, ntt) { - const platform = chainToPlatform(chain); - if (platform !== "Evm") { - return null; - } - const evmNtt = ntt; - const transceiver = await evmNtt.getTransceiver(0); - const consistencyLevel = await transceiver.transceiver.consistencyLevel(); - const wormholeRelayer = await transceiver.transceiver.wormholeRelayer(); - const specialRelayer = await transceiver.transceiver.specialRelayer(); - const gasLimit = await transceiver.transceiver.gasLimit(); - const token = await evmNtt.manager.token(); - const tokenDecimals = await evmNtt.manager.tokenDecimals(); - const whTransceiverImmutables = { - consistencyLevel, - wormholeRelayer, - specialRelayer, - gasLimit, - }; - return { - manager: { - token, - tokenDecimals, - }, - wormholeTransceiver: whTransceiverImmutables, - }; -} -async function getPdas(chain, ntt) { - const platform = chainToPlatform(chain); - if (platform !== "Solana") { - return null; - } - const solanaNtt = ntt; - const config = solanaNtt.pdas.configAccount(); - const emitter = NTT.transceiverPdas(solanaNtt.program.programId).emitterAccount(); - const outboxRateLimit = solanaNtt.pdas.outboxRateLimitAccount(); - const tokenAuthority = solanaNtt.pdas.tokenAuthority(); - const lutAccount = solanaNtt.pdas.lutAccount(); - const lutAuthority = solanaNtt.pdas.lutAuthority(); - return { - config, - emitter, - outboxRateLimit, - tokenAuthority, - lutAccount, - lutAuthority, - }; -} -function getVersion(chain, ntt) { - const platform = chainToPlatform(chain); - switch (platform) { - case "Evm": - return ntt.version; - case "Solana": - return ntt.version; - default: - throw new Error("Unsupported platform"); - } -} -// TODO: there should be a more elegant way to do this, than creating a -// "dummy" NTT, then calling verifyAddresses to get the contract diff, then -// finally reconstructing the "real" NTT object from that -async function nttFromManager(ch, nativeManagerAddress) { - const onlyManager = await ch.getProtocol("Ntt", { - ntt: { - manager: nativeManagerAddress, - token: null, - transceiver: {}, - } - }); - const diff = await onlyManager.verifyAddresses(); - const addresses = { manager: nativeManagerAddress, ...diff }; - const ntt = await ch.getProtocol("Ntt", { - ntt: addresses - }); - return { ntt, addresses }; -} -function formatNumber(num, decimals) { - if (num === 0n) { - return "0." + "0".repeat(decimals); - } - const str = num.toString(); - const formatted = str.slice(0, -decimals) + "." + str.slice(-decimals); - if (formatted.startsWith(".")) { - return "0" + formatted; - } - return formatted; -} -function checkNumberFormatting(formatted, decimals) { - // check that the string has the correct number of decimals - const parts = formatted.split("."); - if (parts.length !== 2) { - return false; - } - if (parts[1].length !== decimals) { - return false; - } - return true; -} -function cargoNetworkFeature(network) { - switch (network) { - case "Mainnet": - return "mainnet"; - case "Testnet": - return "solana-devnet"; - case "Devnet": - return "tilt-devnet"; - default: - throw new Error("Unsupported network"); - } -} -async function askForConfirmation(prompt = "Do you want to continue?") { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - const answer = await new Promise((resolve) => { - rl.question(`${prompt} [y/n]`, resolve); - }); - rl.close(); - if (answer !== "y") { - console.log("Aborting"); - process.exit(0); - } -} -// NOTE: modifies the config object in place -// TODO: maybe introduce typestate for having pulled inbound limits? -async function pullInboundLimits(ntts, config, verbose) { - for (const [c1, ntt1] of Object.entries(ntts)) { - assertChain(c1); - const chainConf = config[c1]; - if (!chainConf) { - console.error(`Chain ${c1} not found in deployment`); - process.exit(1); - } - const decimals = await ntt1.getTokenDecimals(); - for (const [c2, ntt2] of Object.entries(ntts)) { - assertChain(c2); - if (ntt1 === ntt2) { - continue; - } - if (verbose) { - process.stdout.write(`Fetching inbound limit for ${c1} -> ${c2}.......\n`); - } - const peer = await retryWithExponentialBackoff(() => ntt1.getPeer(c2), 5, 5000); - if (chainConf.limits?.inbound === undefined) { - chainConf.limits.inbound = {}; - } - const limit = peer?.inboundLimit ?? 0n; - chainConf.limits.inbound[c2] = formatNumber(limit, decimals); - } - } -} -async function checkSolanaBinary(binary, wormhole, providedProgramId, version) { - // ensure binary path exists - if (!fs.existsSync(binary)) { - console.error(`.so file not found: ${binary}`); - process.exit(1); - } - // console.log(`Checking binary ${binary} for wormhole and provided program ID`); - // convert wormhole and providedProgramId from base58 to hex - const wormholeHex = new PublicKey(wormhole).toBuffer().toString("hex"); - const providedProgramIdHex = new PublicKey(providedProgramId).toBuffer().toString("hex"); - const versionHex = version ? Buffer.from(version).toString("hex") : undefined; - if (!searchHexInBinary(binary, wormholeHex)) { - console.error(`Wormhole address not found in binary: ${wormhole}`); - process.exit(1); - } - if (!searchHexInBinary(binary, providedProgramIdHex)) { - console.error(`Provided program ID not found in binary: ${providedProgramId}`); - process.exit(1); - } - if (versionHex && !searchHexInBinary(binary, versionHex)) ; -} -// not the most efficient, but at least it's definitely portable -function searchHexInBinary(binaryPath, searchHex) { - const buffer = fs.readFileSync(binaryPath); - const hexString = buffer.toString('hex'); - const found = hexString.includes(searchHex); - return found; -} -function ensureNttRoot(pwd = ".") { - if (!fs.existsSync(`${pwd}/evm/foundry.toml`) || !fs.existsSync(`${pwd}/solana/Anchor.toml`)) { - console.error("Run this command from the root of an NTT project."); - process.exit(1); - } -} -function checkAnchorVersion() { - const expected = "0.29.0"; - try { - execSync("which anchor"); - } - catch { - console.error("Anchor CLI is not installed.\nSee https://www.anchor-lang.com/docs/installation"); - process.exit(1); - } - const version = execSync("anchor --version").toString().trim(); - // version looks like "anchor-cli 0.14.0" - const [_, v] = version.split(" "); - if (v !== expected) { - console.error(`Anchor CLI version must be ${expected} but is ${v}`); - process.exit(1); - } -} -function loadConfig(path) { - if (!fs.existsSync(path)) { - console.error(`File not found: ${path}`); - console.error(`Create with 'ntt init' or specify another file with --path`); - process.exit(1); - } - const deployments = JSON.parse(fs.readFileSync(path).toString()); - return deployments; -} -function resolveVersion(latest, ver, local, platform) { - if ((latest ? 1 : 0) + (ver ? 1 : 0) + (local ? 1 : 0) !== 1) { - console.error("Specify exactly one of --latest, --ver, or --local"); - const available = getAvailableVersions(platform); - console.error(`Available versions for ${platform}:\n${available.join("\n")}`); - process.exit(1); - } - if (latest) { - const available = getAvailableVersions(platform); - return available.sort().reverse()[0]; - } - else if (ver) { - return ver; - } - else { - // local version - return null; - } -} -function warnLocalDeployment(yes) { - if (!yes) { - console.warn(chalk.yellow("WARNING: You are deploying from your local working directory.")); - console.warn(chalk.yellow("This bypasses version control and may deploy untested changes.")); - console.warn(chalk.yellow("Ensure your local changes are thoroughly tested and compatible.")); - return askForConfirmation("Are you sure you want to continue with the local deployment?"); - } - return Promise.resolve(); -} -function validateChain(network, chain) { - if (network === "Testnet") { - if (chain === "Ethereum") { - console.error("Ethereum is deprecated on Testnet. Use EthereumSepolia instead."); - process.exit(1); - } - // if on testnet, and the chain has a *Sepolia counterpart, use that instead - if (chains.find((c) => c === `${c}Sepolia`)) { - console.error(`Chain ${chain} is deprecated. Use ${chain}Sepolia instead.`); - process.exit(1); - } - } -} -function retryWithExponentialBackoff(fn, maxRetries, delay) { - const backoff = (retry) => Math.min(2 ** retry * delay, 10000) + Math.random() * 1000; - const attempt = async (retry) => { - try { - return await fn(); - } - catch (e) { - if (retry >= maxRetries) { - throw e; - } - const time = backoff(retry); - await new Promise((resolve) => setTimeout(resolve, backoff(time))); - return await attempt(retry + 1); - } - }; - return attempt(0); -} -function nttVersion() { - const nttDir = `${process.env.HOME}/.ntt-cli`; - try { - const versionFile = fs.readFileSync(`${nttDir}/version`).toString().trim(); - const [commit, installPath, version, remote] = versionFile.split("\n"); - return { version, commit, path: installPath, remote }; - } - catch { - return null; - } -} - -export { YARGSCommand, ensureNttRoot }; diff --git a/cli-core/dist/side-effects.d.ts b/cli-core/dist/side-effects.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/cli-core/dist/side-effects.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/cli-core/dist/tag.d.ts b/cli-core/dist/tag.d.ts deleted file mode 100644 index d6cbf1bcd..000000000 --- a/cli-core/dist/tag.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Platform } from "@wormhole-foundation/sdk"; -export declare function getAvailableVersions

(platform: P): string[]; -export declare function getGitTagName

(platform: P, version: string): string | undefined; From aad0749d7f7bd3ca575758026908596a04da5a69 Mon Sep 17 00:00:00 2001 From: a Date: Mon, 17 Mar 2025 14:51:21 -0500 Subject: [PATCH 4/6] switch Bun.spawn to child_process spawn --- cli-core/src/index.ts | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/cli-core/src/index.ts b/cli-core/src/index.ts index d64e35c32..041a675d8 100755 --- a/cli-core/src/index.ts +++ b/cli-core/src/index.ts @@ -2,7 +2,7 @@ import "./side-effects"; // doesn't quite work for silencing the bigint error me import evm from "@wormhole-foundation/sdk/platforms/evm"; import solana from "@wormhole-foundation/sdk/platforms/solana"; import { encoding } from '@wormhole-foundation/sdk-connect'; -import { execSync } from "child_process"; +import { execSync, spawn } from "child_process"; import evmDeployFile from "../../evm/script/DeployWormholeNtt.s.sol" with { type: "file" }; import evmDeployFileHelper from "../../evm/script/helpers/DeployWormholeNttBase.sol" with { type: "file" }; @@ -1349,20 +1349,26 @@ async function deploySolana( // build the program // TODO: build with docker checkAnchorVersion(); - const proc = Bun.spawn( + const proc = spawn( ["anchor", "build", "-p", "example_native_token_transfers", "--", "--no-default-features", "--features", cargoNetworkFeature(ch.network) - ], { + ].join(" "), { cwd: `${pwd}/solana` }); // const _out = await new Response(proc.stdout).text(); - - await proc.exited; - if (proc.exitCode !== 0) { - process.exit(proc.exitCode ?? 1); + const buildProcExitCode = await new Promise( (resolve) => { + proc.on('exit', (code) => { + resolve(code); + }) + proc.on('close', (code) => { + resolve(code); + }) + }) + if (buildProcExitCode !== 0) { + process.exit(buildProcExitCode?? 1); } binary = `${pwd}/solana/target/deploy/example_native_token_transfers.so`; @@ -1395,14 +1401,20 @@ async function deploySolana( deployCommand.push("--with-compute-unit-price", priorityFee.toString()); } - const deployProc = Bun.spawn(deployCommand); + const deployProc = spawn(deployCommand.join(" ")); const out = await new Response(deployProc.stdout).text(); + const deployProcExitCode = await new Promise( (resolve) => { + deployProc.on('exit', (code) => { + resolve(code); + }) + deployProc.on('close', (code) => { + resolve(code); + }) + }) - await deployProc.exited; - - if (deployProc.exitCode !== 0) { - process.exit(deployProc.exitCode ?? 1); + if (deployProcExitCode !== 0) { + process.exit(deployProcExitCode ?? 1); } // success. remove buffer.json @@ -1705,7 +1717,7 @@ async function pullChainConfig( const nativeManagerAddress = canonicalAddress(manager); const { ntt, addresses }: { ntt: Ntt; addresses: Partial; } = - await nttFromManager(ch, nativeManagerAddress); + await nttFromManager(ch, nativeManagerAddress); const mode = await ntt.getMode(); const outboundLimit = await ntt.getOutboundLimit(); From 4a4a833b86c874ce8869f69fc499873e46bfabda Mon Sep 17 00:00:00 2001 From: a Date: Mon, 17 Mar 2025 14:56:01 -0500 Subject: [PATCH 5/6] noot --- cli/deployment.json | 4 ++++ cli/package.json | 1 + package-lock.json | 7 ++++++- package.json | 5 ++++- 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 cli/deployment.json diff --git a/cli/deployment.json b/cli/deployment.json new file mode 100644 index 000000000..f34830d1e --- /dev/null +++ b/cli/deployment.json @@ -0,0 +1,4 @@ +{ + "network": "Testnet", + "chains": {} +} \ No newline at end of file diff --git a/cli/package.json b/cli/package.json index f25fc3594..d7c49a276 100644 --- a/cli/package.json +++ b/cli/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@wormhole-foundation/ntt-cli-core": "*", + "bigint-buffer": "^1.1.5", "bun": "^1.2.5", "chalk": "^5.3.0", "yargs": "^17.7.2" diff --git a/package-lock.json b/package-lock.json index bb28295d1..3f03f8790 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,9 @@ "cli", "cli-core" ], + "dependencies": { + "bigint-buffer": "^1.1.5" + }, "devDependencies": { "@solana/spl-token": "0.3.9", "@solana/web3.js": "^1.95.8", @@ -35,12 +38,13 @@ "version": "1.1.0", "dependencies": { "@wormhole-foundation/ntt-cli-core": "*", + "bigint-buffer": "^1.1.5", "bun": "^1.2.5", "chalk": "^5.3.0", "yargs": "^17.7.2" }, "bin": { - "ntt": "src/bin.ts" + "ntt": "src/index.ts" }, "devDependencies": { "@types/bun": "latest", @@ -6912,6 +6916,7 @@ "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "bindings": "^1.3.0" }, diff --git a/package.json b/package.json index 6e54d1306..2008edd04 100644 --- a/package.json +++ b/package.json @@ -37,5 +37,8 @@ "sdk/examples", "cli", "cli-core" - ] + ], + "dependencies": { + "bigint-buffer": "^1.1.5" + } } From 60c8899eac8bf6131c19e942e84c8c553df872eb Mon Sep 17 00:00:00 2001 From: a Date: Mon, 17 Mar 2025 15:03:13 -0500 Subject: [PATCH 6/6] noot --- cli-core/README.md | 37 ------ cli-core/test/sepolia-bsc.sh | 90 --------------- cli-core/test/solana.sh | 218 ----------------------------------- cli/deployment.json | 4 - 4 files changed, 349 deletions(-) delete mode 100644 cli-core/README.md delete mode 100755 cli-core/test/sepolia-bsc.sh delete mode 100755 cli-core/test/solana.sh delete mode 100644 cli/deployment.json diff --git a/cli-core/README.md b/cli-core/README.md deleted file mode 100644 index 6fa454d9e..000000000 --- a/cli-core/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# NTT cli - -## Prerequisites - -- [bun](https://bun.sh/docs/installation) - -Depending on the platforms you will deploy on: -- [foundry](https://book.getfoundry.sh/) (evm) -- [anchor](https://book.anchor-lang.com/getting_started/installation.html) (solana) - -## Installation - -Run - -``` bash -curl -fsSL https://raw.githubusercontent.com/wormhole-foundation/example-native-token-transfers/main/cli/install.sh | bash -``` - -The installer will put the `ntt` binary in `$HOME/.bun/bin`, so make sure that directory is included in your `$PATH`. Once `ntt` is installed, it can be updated to the latest release any time by running - -``` bash -ntt update -``` - -Or to a specific branch by running - -``` bash -ntt update --branch foo -``` - -## Development - -The easiest way to work on the CLI is to first install using the script above, then clone the repo, and run - -``` bash -ntt update --path path/to/ntt/repo -``` diff --git a/cli-core/test/sepolia-bsc.sh b/cli-core/test/sepolia-bsc.sh deleted file mode 100755 index 3bbc8a144..000000000 --- a/cli-core/test/sepolia-bsc.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env bash -# This script creates two forks (Bsc and Sepolia) and creates an NTT deployment -# on both of them. -# It's safe to run these tests outside of docker, as we create an isolated temporary -# directory for the tests. - -set -euox pipefail - -BSC_PORT=8545 -SEPOLIA_PORT=8546 - -anvil --silent --rpc-url https://bsc-testnet-rpc.publicnode.com -p "$BSC_PORT" & -pid1=$! -anvil --silent --rpc-url wss://ethereum-sepolia-rpc.publicnode.com -p "$SEPOLIA_PORT" & -pid2=$! - -# check both processes are running -if ! kill -0 $pid1 || ! kill -0 $pid2; then - echo "Failed to start the servers" - exit 1 -fi - -# create tmp directory -dir=$(mktemp -d) - -cleanup() { - kill $pid1 $pid2 - rm -rf $dir -} - -trap "cleanup" INT TERM EXIT - -# devnet private key -export ETH_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - -echo "Running tests..." -cd $dir -ntt new test-ntt -cd test-ntt -ntt init Testnet - -# write overrides.json -cat < overrides.json -{ - "chains": { - "Bsc": { - "rpc": "http://127.0.0.1:$BSC_PORT" - }, - "Sepolia": { - "rpc": "http://127.0.0.1:$SEPOLIA_PORT" - } - } -} -EOF - -ntt add-chain Bsc --token 0x0B15635FCF5316EdFD2a9A0b0dC3700aeA4D09E6 --mode locking --skip-verify --latest -ntt add-chain Sepolia --token 0xB82381A3fBD3FaFA77B3a7bE693342618240067b --skip-verify --ver 1.0.0 - -ntt pull --yes -ntt push --yes - -# ugprade Sepolia to 1.1.0 -ntt upgrade Sepolia --ver 1.1.0 --skip-verify --yes -# now upgrade to the local version. -ntt upgrade Sepolia --local --skip-verify --yes - -ntt pull --yes - -# transfer ownership to -NEW_OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 -NEW_OWNER_SECRET=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d - -jq '.chains.Bsc.owner = "'$NEW_OWNER'"' deployment.json > deployment.json.tmp && mv deployment.json.tmp deployment.json -jq '.chains.Sepolia.owner = "'$NEW_OWNER'"' deployment.json > deployment.json.tmp && mv deployment.json.tmp deployment.json -ntt push --yes - -# check the owner has been updated -jq '.chains.Bsc.owner == "'$NEW_OWNER'"' deployment.json -jq '.chains.Sepolia.owner == "'$NEW_OWNER'"' deployment.json - -export ETH_PRIVATE_KEY=$NEW_OWNER_SECRET - -jq '.chains.Bsc.paused = true' deployment.json > deployment.json.tmp && mv deployment.json.tmp deployment.json - -ntt push --yes -jq '.chains.Bsc.paused == true' deployment.json - -ntt status - -cat deployment.json diff --git a/cli-core/test/solana.sh b/cli-core/test/solana.sh deleted file mode 100755 index 01f06602d..000000000 --- a/cli-core/test/solana.sh +++ /dev/null @@ -1,218 +0,0 @@ -#!/usr/bin/env bash - -# This script deploys the NTT program to a local Solana test validator and -# upgrades it. -# -# TODO: this script should be separated into -# 1) a general purpose validator startup script -# 2) the actual test script that sets up the NTT program and runs the tests -# -# We could then write multiple tests easily. For now, this will do. -# TODO: add better test coverage (registrations, pausing, etc) - -set -euo pipefail - -# Default values -PORT=6000 -FAUCET_PORT=6100 -NETWORK="http://127.0.0.1:$PORT" -KEYS_DIR="keys" -OVERRIDES_FILE="overrides.json" -DEPLOYMENT_FILE="deployment.json" -KEEP_ALIVE=false -USE_TMP_DIR=false - -# Function to display usage information -usage() { - cat << EOF -Usage: $0 [options] - -Options: - -h, --help Show this help message - -p, --port PORT Set the RPC port (default: 6000) - -f, --faucet-port PORT Set the faucet port (default: 6100) - -k, --keys-dir DIR Set the keys directory (default: keys) - -o, --overrides FILE Set the overrides file (default: overrides.json) - -d, --deployment FILE Set the deployment file (default: deployment.json) - --keep-alive Keep the validator running after the script finishes - --use-tmp-dir Use a temporary directory for deployment (useful for testing) -EOF - exit 1 -} - -# Parse command-line options -while [[ $# -gt 0 ]]; do - case $1 in - -h|--help) - usage - ;; - -p|--port) - PORT="$2" - shift 2 - ;; - -f|--faucet-port) - FAUCET_PORT="$2" - shift 2 - ;; - -k|--keys-dir) - KEYS_DIR="$2" - shift 2 - ;; - -o|--overrides) - OVERRIDES_FILE="$2" - shift 2 - ;; - -d|--deployment) - DEPLOYMENT_FILE="$2" - shift 2 - ;; - --keep-alive) - KEEP_ALIVE=true - shift - ;; - --use-tmp-dir) - USE_TMP_DIR=true - shift - ;; - *) - echo "Unknown option: $1" - usage - ;; - esac -done - -# Update NETWORK variable based on potentially changed PORT -NETWORK="http://127.0.0.1:$PORT" - -validator_dir=$(mktemp -d) - -if [ "$USE_TMP_DIR" = true ]; then - tmp_dir=$(mktemp -d) - cd "$tmp_dir" || exit - ntt new test-ntt - cd test-ntt || exit -fi - -# Function to clean up resources -cleanup() { - echo "Cleaning up..." - kill "$pid" 2>/dev/null || true - rm -rf "$validator_dir" - if [ "$USE_TMP_DIR" = true ]; then - rm -rf "$tmp_dir" - fi - if [ -f "${OVERRIDES_FILE}.bak" ]; then - mv "${OVERRIDES_FILE}.bak" "$OVERRIDES_FILE" - else - rm -f "$OVERRIDES_FILE" - fi - solana config set --keypair "$old_default_keypair" > /dev/null -} - -# Set up trap for cleanup -trap cleanup EXIT - -# Prepare directories and files -rm -rf "$KEYS_DIR" -mkdir -p "$KEYS_DIR" - -# Backup and create overrides file -cp "$OVERRIDES_FILE" "${OVERRIDES_FILE}.bak" 2>/dev/null || true -cat << EOF > "$OVERRIDES_FILE" -{ - "chains": { - "Solana": { - "rpc": "$NETWORK" - } - } -} -EOF - -# Start Solana test validator -pushd "$validator_dir" || exit -# TODO: the deployment doesn't fully work, because we need to load in the wormhole program and its associated -# accounts. This is a bit tedious, but would be great to do. -# NOTE: this will not run in an emulated x86 docker environment (on an arm mac -# host), because the binary needs AVX instructions which the emulator doesn't -# support. -solana-test-validator --rpc-port "$PORT" --faucet-port "$FAUCET_PORT" > /dev/null 2>&1 & -pid=$! -popd || exit - -old_default_keypair=$(solana config get keypair | awk '{print $3}') - -# Wait for validator to start -echo "Waiting for Solana test validator to start..." -for _ in {1..30}; do - if solana cluster-version -u "$NETWORK" &>/dev/null; then - echo "Solana test validator started successfully." - break - fi - sleep 1 -done - -# Check if validator started successfully -if ! kill -0 "$pid" 2>/dev/null; then - echo "Failed to start solana-test-validator" - exit 1 -fi - -# Initialize NTT -rm -rf "$DEPLOYMENT_FILE" -ntt init Mainnet - -# Generate and configure keypairs -pushd "$KEYS_DIR" || exit -keypair=$(solana-keygen grind --starts-with w:1 --ignore-case | grep 'Wrote keypair' | awk '{print $4}') -keypair=$(realpath "$keypair") -solana config set --keypair "$keypair" - -# Airdrop SOL -solana airdrop 50 -u "$NETWORK" --keypair "$keypair" -# This steps is a bit voodoo -- we airdrop to this special address, which is -# needed for querying the program version. For more info, grep for these pubkeys in the ntt repo. -solana airdrop 1 Hk3SdYTJFpawrvRz4qRztuEt2SqoCG7BGj2yJfDJSFbJ -u "$NETWORK" --keypair "$keypair" > /dev/null -solana airdrop 1 98evdAiWr7ey9MAQzoQQMwFQkTsSR6KkWQuFqKrgwNwb -u "$NETWORK" --keypair "$keypair" > /dev/null - -# Create and configure token -token=$(spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb -u "$NETWORK" | grep "Address:" | awk '{print $2}') -echo "Token: $token" - -ntt_keypair=$(solana-keygen grind --starts-with ntt:1 --ignore-case | grep 'Wrote keypair' | awk '{print $4}') -ntt_keypair_without_json=${ntt_keypair%.json} -ntt_keypair=$(realpath "$ntt_keypair") -popd || exit - -# Set token authority -authority=$(ntt solana token-authority "$ntt_keypair_without_json") -echo "Authority: $authority" -spl-token authorize "$token" mint "$authority" -u "$NETWORK" - -# Add chain and upgrade -ntt add-chain Solana --ver 1.0.0 --mode burning --token "$token" --payer "$keypair" --program-key "$ntt_keypair" - -echo "Getting status" -ntt status || true - -solana program extend "$ntt_keypair_without_json" 100000 -u "$NETWORK" -ntt upgrade Solana --ver 2.0.0 --payer "$keypair" --program-key "$ntt_keypair" --yes -ntt status || true - -ntt push --payer "$keypair" --yes - -cat "$DEPLOYMENT_FILE" - -if [ "$KEEP_ALIVE" = true ]; then - # wait for C-c to kill the validator - # print information about the running validator - echo "===============================" - echo "Validator is running on port $PORT" - echo "Faucet is running on port $FAUCET_PORT" - echo "Keys are stored in $KEYS_DIR" - echo "Overrides are stored in $OVERRIDES_FILE" - - echo "Press Ctrl-C to stop the validator..." - while true; do - sleep 1 - done -fi diff --git a/cli/deployment.json b/cli/deployment.json deleted file mode 100644 index f34830d1e..000000000 --- a/cli/deployment.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "network": "Testnet", - "chains": {} -} \ No newline at end of file