diff --git a/.eslintrc b/.eslintrc index 0b44142f..69a50a21 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,10 +1,11 @@ { - "extends": "richardpringle", + "extends": ["richardpringle", "plugin:@typescript-eslint/recommended"], "env": { "es2020": true, "mocha": true }, "rules": { - "no-unused-expressions": "off" + "no-unused-expressions": "off", + "@typescript-eslint/no-var-requires": "off", } } diff --git a/.github/workflows/test-js.yaml b/.github/workflows/test-js.yaml new file mode 100644 index 00000000..4456d49c --- /dev/null +++ b/.github/workflows/test-js.yaml @@ -0,0 +1,82 @@ +name: Javascript Tests + +on: + pull_request: + push: + branches: + - main + - releases/** + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + SUI_VERSION: mainnet-v1.25.3 + +jobs: + test-js: + runs-on: ubuntu-latest + + steps: + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install -y libpq-dev + + - name: Cache Sui binaries + id: cache-sui + uses: actions/cache/restore@v4 + with: + path: sui-binaries-skip/ + key: sui-${{ env.SUI_VERSION }} + + - name: Download and Install Sui + if: steps.cache-sui.outputs.cache-hit != 'true' + run: | + curl -L -o sui-${SUI_VERSION}-ubuntu-x86_64.tgz https://github.com/MystenLabs/sui/releases/download/${SUI_VERSION}/sui-${SUI_VERSION}-ubuntu-x86_64.tgz + tar -xvf sui-${SUI_VERSION}-ubuntu-x86_64.tgz + mkdir -p sui-binaries + mv ./sui ./sui-binaries/ + mv ./sui-debug ./sui-binaries/ + mv ./sui-test-validator ./sui-binaries/ + rm -rf sui-${SUI_VERSION}-ubuntu-x86_64.tgz + + - name: Save Sui binaries + if: steps.cache-sui.outputs.cache-hit != 'true' + id: cache-sui-save + uses: actions/cache/save@v4 + with: + path: sui-binaries/ + key: ${{ steps.cache-sui.outputs.cache-primary-key }} + + - name: Add Sui binaries to PATH + run: | + sudo cp ./sui-binaries/sui /usr/local/bin/sui + sudo cp ./sui-binaries/sui-debug /usr/local/bin/sui-debug + sudo cp ./sui-binaries/sui-test-validator /usr/local/bin/sui-test-validator + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Run Localnet + run: nohup sh -c "sui-test-validator" > nohup.out 2> nohup.err < /dev/null & + + - name: Sleep for 30 seconds + run: sleep 30s + shell: bash + + - name: Test + run: npm run test-js diff --git a/.github/workflows/test.yaml b/.github/workflows/test-move.yaml similarity index 89% rename from .github/workflows/test.yaml rename to .github/workflows/test-move.yaml index 80e0558b..bbce99e2 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test-move.yaml @@ -1,4 +1,4 @@ -name: Tests +name: Move Tests on: pull_request: @@ -15,7 +15,7 @@ env: SUI_VERSION: mainnet-v1.25.3 jobs: - test: + test-move: runs-on: ubuntu-latest steps: - name: Checkout code @@ -30,4 +30,4 @@ jobs: run: npm run build - name: Test - run: npm run test + run: npm run test-move diff --git a/.gitignore b/.gitignore index 0ce51629..f01e2714 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,6 @@ target/ # MSVC Windows builds of rustc generate these, which store debugging information *.pdb +# dist and move_compile +dist +move_comile diff --git a/.mocharc.yaml b/.mocharc.yaml new file mode 100644 index 00000000..0dacec69 --- /dev/null +++ b/.mocharc.yaml @@ -0,0 +1,3 @@ +exit: true +spec: test/**/*.js +timeout: 300000 diff --git a/.prettierrc b/.prettierrc index ee79893b..70ea16e0 100644 --- a/.prettierrc +++ b/.prettierrc @@ -11,6 +11,12 @@ "trailingComma": "all" } }, + { + "files": "*.ts", + "options": { + "trailingComma": "all" + } + }, { "files": "*.json", "options": { diff --git a/move/abi/Move.lock b/move/abi/Move.lock index 285c6b4a..9ac7913a 100644 --- a/move/abi/Move.lock +++ b/move/abi/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "7DED727D47EB51E5059409B19CC373C6D9AF249D837E9153E7368F3898025E41" +manifest_digest = "134C22A16B63D227C88D4E1F5D02607C8E7C2D0FA5D3BAD6136E0041F441654D" deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" dependencies = [ { name = "Sui" }, @@ -21,6 +21,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/abi/Move.toml b/move/abi/Move.toml index 7eb23213..6d7ecf1e 100644 --- a/move/abi/Move.toml +++ b/move/abi/Move.toml @@ -1,10 +1,11 @@ [package] name = "Abi" version = "0.1.0" +published-at = "0x41fb7e9c9d8851ecbfd4b89c910c0465de0cd0cf757c4bb261a8a6019ea33390" edition = "2024.beta" [dependencies] Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.25.3" } [addresses] -abi = "0x103" +abi = "0x0" diff --git a/move/abi/info.json b/move/abi/info.json deleted file mode 100644 index 171fda61..00000000 --- a/move/abi/info.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singletons": [ - ] -} \ No newline at end of file diff --git a/move/axelar_gateway/Move.lock b/move/axelar_gateway/Move.lock index 4c88b1b8..370d6384 100644 --- a/move/axelar_gateway/Move.lock +++ b/move/axelar_gateway/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "11FAF5CFE0A4A2EBCD5E370FAD144FFF14243A85492B718A2B26A15CF7F0B571" +manifest_digest = "1EB54C26C3FA638760DAA54E631C0B13A09FFC472C1CAA730C9A7879E463B455" deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" dependencies = [ { name = "Sui" }, @@ -21,6 +21,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/axelar_gateway/Move.toml b/move/axelar_gateway/Move.toml index 59b0a66f..c18a9029 100644 --- a/move/axelar_gateway/Move.toml +++ b/move/axelar_gateway/Move.toml @@ -1,11 +1,12 @@ [package] name = "AxelarGateway" version = "0.1.0" +published-at = "0xe44f3fb828db14a0dd991de2aed9c987ee49faf7c31bf819b986a058a38e9935" edition = "2024.beta" [dependencies] Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.25.3" } [addresses] -axelar_gateway = "0x100" +axelar_gateway = "0xcd391ade5ab55a218f8988df8f3aa38ec019651c217244f7f689616c87d8c289" clock = "0x6" diff --git a/move/axelar_gateway/info.json b/move/axelar_gateway/info.json deleted file mode 100644 index 9cb0d05d..00000000 --- a/move/axelar_gateway/info.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "singletons": [ - "gateway::Gateway", - "discovery::RelayerDiscovery" - ] -} \ No newline at end of file diff --git a/move/axelar_gateway/sources/channel.move b/move/axelar_gateway/sources/channel.move index 72e4f83f..29a23430 100644 --- a/move/axelar_gateway/sources/channel.move +++ b/move/axelar_gateway/sources/channel.move @@ -136,6 +136,23 @@ module axelar_gateway::channel { // Tests // ----- + #[test_only] + public fun new_approved_message( + source_chain: String, + message_id: String, + source_address: String, + destination_id: address, + payload: vector, + ): ApprovedMessage { + ApprovedMessage { + source_chain, + message_id, + source_address, + destination_id, + payload + } + } + #[test] fun test_new_and_destroy() { let ctx = &mut sui::tx_context::dummy(); diff --git a/move/gas_service/Move.lock b/move/gas_service/Move.lock index 3b8e9178..5cc24c5f 100644 --- a/move/gas_service/Move.lock +++ b/move/gas_service/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "C1DEC087FF16954984395BB68E2E81D4A38E64A7F0BAB88AAF73A121C563E2D4" +manifest_digest = "A020C8D244BDE64D6F5F3107506F682AEA99E933953DE1FB01352999724E43EB" deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" dependencies = [ { name = "Sui" }, @@ -21,6 +21,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/gas_service/Move.toml b/move/gas_service/Move.toml index 49ee70fc..2d976108 100644 --- a/move/gas_service/Move.toml +++ b/move/gas_service/Move.toml @@ -1,10 +1,11 @@ [package] name = "GasService" version = "0.1.0" +published-at = "0x9249adc3fac09edb21a0848af2ccf4901ffb3689124bc91d67bc613903ca643c" edition = "2024.beta" [dependencies] Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.25.3" } [addresses] -gas_service = "0x105" +gas_service = "0x9249adc3fac09edb21a0848af2ccf4901ffb3689124bc91d67bc613903ca643c" diff --git a/move/gas_service/info.json b/move/gas_service/info.json deleted file mode 100644 index 9c69bda1..00000000 --- a/move/gas_service/info.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singletons": [ - "gas_service::GasService" - ] -} \ No newline at end of file diff --git a/move/governance/Move.lock b/move/governance/Move.lock index 92609743..a4cb0602 100644 --- a/move/governance/Move.lock +++ b/move/governance/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "4F26118CD341A5D382F6D63184C33AE0DEFBC380DA34B844908B98C7C2B228D9" +manifest_digest = "9DC4C192CAEBB80F2FBB1DC3CCEC7F9714E98AF18EBC9396F08BDB826A59E4F3" deps_digest = "060AD7E57DFB13104F21BE5F5C3759D03F0553FC3229247D9A7A6B45F50D03A3" dependencies = [ { name = "Abi" }, @@ -39,6 +39,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/governance/Move.toml b/move/governance/Move.toml index f45f85da..ac50d7ee 100644 --- a/move/governance/Move.toml +++ b/move/governance/Move.toml @@ -1,6 +1,7 @@ [package] name = "Governance" version = "0.1.0" +published-at = "0x0cba440261d721bde9c85eafe18aae673ee72702fa95da567675b34224f5ad77" edition = "2024.beta" [dependencies] @@ -9,4 +10,4 @@ AxelarGateway = { local = "../axelar_gateway" } Abi = { local = "../abi" } [addresses] -governance = "0x101" +governance = "0x0cba440261d721bde9c85eafe18aae673ee72702fa95da567675b34224f5ad77" diff --git a/move/governance/info.json b/move/governance/info.json deleted file mode 100644 index 171fda61..00000000 --- a/move/governance/info.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singletons": [ - ] -} \ No newline at end of file diff --git a/move/governance/sources/governance/governance.move b/move/governance/sources/governance/governance.move index bdec1198..29fb4d71 100644 --- a/move/governance/sources/governance/governance.move +++ b/move/governance/sources/governance/governance.move @@ -107,4 +107,321 @@ module governance::governance { fun is_cap_new(cap: &UpgradeCap) { assert!(package::version(cap) == 1, ENotNewPackage); } + + // ----- + // Tests + // ----- + + #[test_only] + use std::ascii; + #[test_only] + use sui::test_scenario; + #[test_only] + use sui::test_utils; + + #[test] + fun test_new() { + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut ctx = tx_context::dummy(); + let package_id = object::id_from_bytes( + hex::decode( + type_name::get().get_address().into_bytes() + ) + ); + let upgrade_cap = package::test_publish(package_id, &mut ctx); + let initial_owner = @0x1; + let mut scenario = test_scenario::begin(initial_owner); + { + test_scenario::sender(&scenario); + new(trusted_source_chain, trusted_source_address, message_type, upgrade_cap, &mut ctx); + }; + + test_scenario::next_tx(&mut scenario, initial_owner); + { + let governance = test_scenario::take_shared(&scenario); + test_scenario::return_shared(governance); + }; + + test_scenario::end(scenario); + } + + #[test] + #[expected_failure(abort_code = ENotSelfUpgradeCap)] + fun test_new_incorrect_upgrade_cap() { + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut ctx = tx_context::dummy(); + let uid = object::new(&mut ctx); + let upgrade_cap = package::test_publish(object::uid_to_inner(&uid), &mut ctx); + new(trusted_source_chain, trusted_source_address, message_type, upgrade_cap, &mut ctx); + + test_utils::destroy(uid); + } + + #[test] + #[expected_failure(abort_code = test_scenario::EEmptyInventory)] + fun test_new_immutable_upgrade() { + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut ctx = tx_context::dummy(); + let package_id = object::id_from_bytes( + hex::decode( + type_name::get().get_address().into_bytes() + ) + ); + let upgrade_cap = package::test_publish(package_id, &mut ctx); + let initial_owner = @0x1; + let mut scenario = test_scenario::begin(initial_owner); + { + test_scenario::sender(&scenario); + new(trusted_source_chain, trusted_source_address, message_type, upgrade_cap, &mut ctx); + }; + + test_scenario::next_tx(&mut scenario, initial_owner); + { + let upgrade_cap = test_scenario::take_shared(&scenario); + test_scenario::return_shared(upgrade_cap); + }; + + test_scenario::end(scenario); + } + + #[test] + fun test_is_governance() { + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut ctx = tx_context::dummy(); + + let governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type, + channel: channel::new(&mut ctx), + caps: table::new(&mut ctx), + }; + + assert!(governance.is_governance(trusted_source_chain, trusted_source_address), 1); + + test_utils::destroy(governance); + } + + #[test] + fun test_is_governance_false_argument() { + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut ctx = tx_context::dummy(); + + let governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type, + channel: channel::new(&mut ctx), + caps: table::new(&mut ctx), + }; + + assert!(!governance.is_governance(ascii::string(b"sui"), trusted_source_address), 1); + + test_utils::destroy(governance); + } + + #[test] + fun test_is_cap_new() { + let mut ctx = tx_context::dummy(); + let uid = object::new(&mut ctx); + let upgrade_cap = package::test_publish(object::uid_to_inner(&uid), &mut ctx); + is_cap_new(&upgrade_cap); + + test_utils::destroy(uid); + test_utils::destroy(upgrade_cap); + } + + #[test] + #[expected_failure(abort_code = ENotNewPackage)] + fun test_is_cap_new_upgrade_version() { + let mut ctx = tx_context::dummy(); + let uid = object::new(&mut ctx); + let mut upgrade_cap = package::test_publish(object::uid_to_inner(&uid), &mut ctx); + let upgrade_ticket = package::authorize_upgrade(&mut upgrade_cap, 2, b""); + let upgrade_reciept = package::test_upgrade(upgrade_ticket); + package::commit_upgrade(&mut upgrade_cap, upgrade_reciept); + is_cap_new(&upgrade_cap); + + test_utils::destroy(uid); + test_utils::destroy(upgrade_cap); + } + + #[test] + fun test_take_upgrade_cap() { + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut ctx = tx_context::dummy(); + let package_id = object::id_from_bytes( + hex::decode( + type_name::get().get_address().into_bytes() + ) + ); + let upgrade_cap = package::test_publish(package_id, &mut ctx); + let initial_owner = @0x1; + let mut scenario = test_scenario::begin(initial_owner); + { + test_scenario::sender(&scenario); + new(trusted_source_chain, trusted_source_address, message_type, upgrade_cap, &mut ctx); + }; + + test_scenario::next_tx(&mut scenario, initial_owner); + { + let mut governance = test_scenario::take_shared(&scenario); + let upgrade_cap = package::test_publish(package_id, &mut ctx); + let upgrade_id = object::id(&upgrade_cap); + take_upgrade_cap(&mut governance, upgrade_cap); + let recieved_upgrade_cap = table::borrow_mut(&mut governance.caps, upgrade_id); + assert!(object::id(recieved_upgrade_cap) == upgrade_id, 1); + test_scenario::return_shared(governance); + }; + + test_scenario::end(scenario); + } + + #[test] + fun test_commit_upgrade() { + let mut ctx = tx_context::dummy(); + let uid = object::new(&mut ctx); + let mut upgrade_cap = package::test_publish(object::uid_to_inner(&uid), &mut ctx); + let upgrade_ticket = package::authorize_upgrade(&mut upgrade_cap, 2, b""); + let upgrade_reciept = package::test_upgrade(upgrade_ticket); + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let message_type = 2; + let mut governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type, + channel: channel::new(&mut ctx), + caps: table::new(&mut ctx), + }; + let upgrade_id = object::id(&upgrade_cap); + take_upgrade_cap(&mut governance, upgrade_cap); + commit_upgrade(&mut governance, upgrade_reciept); + let upgrade_cap_return = table::borrow( + &governance.caps, + upgrade_id, + ); + assert!(upgrade_id == object::id(upgrade_cap_return), 1); + assert!(package::version(upgrade_cap_return) == 2, 2); + test_utils::destroy(uid); + test_utils::destroy(governance); + } + + #[test] + fun test_authorize_upgrade() { + let mut ctx = tx_context::dummy(); + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let channale_object = channel::new(&mut ctx); + let payload = x"0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000000"; + let mut abi = abi::new_reader(payload); + let message_type = abi.read_u256(); + let uid = object::new(&mut ctx); + let upgrade_cap = package::test_publish(object::uid_to_inner(&uid), &mut ctx); + let cap_id = object::id_from_address(address::from_u256(abi.read_u256())); + let approved_message = channel::new_approved_message(trusted_source_chain, ascii::string(b"1"), trusted_source_address, object::id_address(&channale_object) , payload); + let mut governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type: message_type, + channel: channale_object, + caps: table::new(&mut ctx), + }; + + governance.caps.add( + cap_id, + upgrade_cap, + ); + let upgrade_ticket = authorize_upgrade(&mut governance, approved_message); + assert!(package::ticket_package(&upgrade_ticket) == object::uid_to_inner(&uid), 1); + let policy = abi.read_u8(); + assert!(package::ticket_policy(&upgrade_ticket) == policy, 2); + let digest = abi.read_bytes(); + assert!(package::ticket_digest(&upgrade_ticket) == digest, 3); + test_utils::destroy(upgrade_ticket); + test_utils::destroy(uid); + test_utils::destroy(governance); + } + + #[test] + #[expected_failure(abort_code = EInvalidMessageType)] + fun test_authorize_upgrade_invalid_message_type() { + let mut ctx = tx_context::dummy(); + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let channale_object = channel::new(&mut ctx); + let payload = x"0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0"; + let approved_message = channel::new_approved_message(trusted_source_chain, ascii::string(b"1"), trusted_source_address, object::id_address(&channale_object) , payload); + let mut governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type: 2, + channel: channale_object, + caps: table::new(&mut ctx), + }; + let upgrade_ticket = authorize_upgrade(&mut governance, approved_message); + test_utils::destroy(upgrade_ticket); + test_utils::destroy(governance); + } + + #[test] + #[expected_failure(abort_code = EUntrustedAddress)] + fun test_authorize_upgrade_trusted_address() { + let mut ctx = tx_context::dummy(); + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let channale_object = channel::new(&mut ctx); + let payload = x"0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0"; + let approved_message = channel::new_approved_message(ascii::string(b"sui"), ascii::string(b"1"), ascii::string(b"0x1"), object::id_address(&channale_object) , payload); + let mut governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type: 2, + channel: channale_object, + caps: table::new(&mut ctx), + }; + let upgrade_ticket = authorize_upgrade(&mut governance, approved_message); + test_utils::destroy(upgrade_ticket); + test_utils::destroy(governance); + } + + #[test] + #[expected_failure(abort_code = channel::EInvalidDestination)] + fun test_authorize_invalid_destination_address() { + let mut ctx = tx_context::dummy(); + let trusted_source_chain = ascii::string(b"Axelar"); + let trusted_source_address = ascii::string(b"0x0"); + let channale_object = channel::new(&mut ctx); + let payload = x"01"; + let approved_message = channel::new_approved_message(ascii::string(b"sui"), ascii::string(b"1"), ascii::string(b"0x1"), address::from_u256(2) , payload); + let mut governance = Governance{ + id: object::new(&mut ctx), + trusted_source_chain, + trusted_source_address, + message_type: 2, + channel: channale_object, + caps: table::new(&mut ctx), + }; + let upgrade_ticket = authorize_upgrade(&mut governance, approved_message); + test_utils::destroy(upgrade_ticket); + test_utils::destroy(governance); + } } diff --git a/move/interchain_token/Move.lock b/move/interchain_token/Move.lock index e724791e..8b658462 100644 --- a/move/interchain_token/Move.lock +++ b/move/interchain_token/Move.lock @@ -21,6 +21,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/its/Move.lock b/move/its/Move.lock index 06cc4987..c52c3519 100644 --- a/move/its/Move.lock +++ b/move/its/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "8EB070D5A26ADEEBB191384EDCD8FE28EE8539D051B47C110ACB2E1BC0675B6A" +manifest_digest = "C47498B72EFC749BF4D0D66D86BC3702ADBFBD16CF406FA05127DAD55FBE28C4" deps_digest = "060AD7E57DFB13104F21BE5F5C3759D03F0553FC3229247D9A7A6B45F50D03A3" dependencies = [ { name = "AxelarGateway" }, @@ -49,6 +49,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/its/Move.toml b/move/its/Move.toml index cc9d85d2..ab5ee59d 100644 --- a/move/its/Move.toml +++ b/move/its/Move.toml @@ -1,6 +1,7 @@ [package] name = "ITS" version = "0.1.0" +published-at = "0x89967fea5cc3bdf2d44cabe901aca920aa2a0485ca9a479f9932814c55d5f9b3" edition = "2024.beta" [dependencies] @@ -9,4 +10,4 @@ AxelarGateway = { local = "../axelar_gateway" } Governance = { local = "../governance" } [addresses] -its = "0x102" +its = "0x89967fea5cc3bdf2d44cabe901aca920aa2a0485ca9a479f9932814c55d5f9b3" diff --git a/move/its/info.json b/move/its/info.json deleted file mode 100644 index f102daaf..00000000 --- a/move/its/info.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singletons": [ - "its::ITS" - ] -} \ No newline at end of file diff --git a/move/squid/Move.lock b/move/squid/Move.lock index d9e2d31f..f6bf9855 100644 --- a/move/squid/Move.lock +++ b/move/squid/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "9568F12CBDAE1FD019A32A5F77C0B7CF8038887E8FAFE61D45CD75757251E932" +manifest_digest = "384A3D94552582FBDD012034F0BE9AC30A837A35416FCCFBA340F7C3597FB0D3" deps_digest = "F9B494B64F0615AED0E98FC12A85B85ECD2BC5185C22D30E7F67786BB52E507C" dependencies = [ { name = "AxelarGateway" }, @@ -69,6 +69,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/squid/Move.toml b/move/squid/Move.toml index 5501ade5..6f3d465d 100644 --- a/move/squid/Move.toml +++ b/move/squid/Move.toml @@ -1,6 +1,7 @@ [package] name = "Squid" version = "0.1.0" +published-at = "0x742acc52f94b86d3a2a4fdc39b1e0d75812f05253f88443754326c1e31cae873" edition = "2024.beta" [dependencies] @@ -10,4 +11,4 @@ AxelarGateway = { local = "../axelar_gateway" } ITS = { local = "../its" } [addresses] -squid = "0x104" +squid = "0x742acc52f94b86d3a2a4fdc39b1e0d75812f05253f88443754326c1e31cae873" diff --git a/move/squid/info.json b/move/squid/info.json deleted file mode 100644 index aad271fc..00000000 --- a/move/squid/info.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singletons": [ - "squid::Squid" - ] -} \ No newline at end of file diff --git a/move/squid/sources/squid/deepbook_v2.move b/move/squid/sources/squid/deepbook_v2.move index 99604f14..71488b1e 100644 --- a/move/squid/sources/squid/deepbook_v2.move +++ b/move/squid/sources/squid/deepbook_v2.move @@ -1,6 +1,6 @@ module squid::deepbook_v2 { use std::type_name; - use std::ascii; + use std::ascii::{Self, String}; use sui::coin::{Self, Coin}; use sui::clock::Clock; @@ -25,7 +25,32 @@ module squid::deepbook_v2 { const EWrongCoinType: u64 = 2; const ENotEnoughOutput: u64 = 3; - public fun swap_base(pool: &mut Pool, coin: Coin, clock: &Clock, ctx: &mut TxContext): (Coin, Coin) { + public struct DeepbookV2SwapData has drop{ + swap_type: u8, + pool_id: address, + has_base: bool, + min_output: u64, + base_type: String, + quote_type: String, + lot_size: u64, + should_sweep: bool, + } + + fun peel_swap_data(data: vector): DeepbookV2SwapData { + let mut bcs = bcs::new(data); + DeepbookV2SwapData { + swap_type: bcs.peel_u8(), + pool_id: bcs.peel_address(), + has_base: bcs.peel_bool(), + min_output: bcs.peel_u64(), + base_type: ascii::string(bcs.peel_vec_u8()), + quote_type: ascii::string(bcs.peel_vec_u8()), + lot_size: bcs.peel_u64(), + should_sweep: bcs.peel_bool(), + } + } + + fun swap_base(pool: &mut Pool, coin: Coin, clock: &Clock, ctx: &mut TxContext): (Coin, Coin) { let account = clob::create_account(ctx); let (base_coin, quote_coin, _) = pool.swap_exact_base_for_quote( 0, @@ -40,7 +65,7 @@ module squid::deepbook_v2 { (base_coin, quote_coin) } - public fun swap_quote(pool: &mut Pool, coin: Coin, clock: &Clock, ctx: &mut TxContext): (Coin, Coin) { + fun swap_quote(pool: &mut Pool, coin: Coin, clock: &Clock, ctx: &mut TxContext): (Coin, Coin) { let account = clob::create_account(ctx); let (base_coin, quote_coin, _) = pool.swap_exact_quote_for_base( 0, @@ -149,7 +174,7 @@ module squid::deepbook_v2 { (filled_quote_quantity, filled_base_quantity) } - public fun predict_base_for_quote(pool: &Pool, amount: u64, lot_size: u64, clock: &Clock): (u64, u64) { + fun predict_base_for_quote(pool: &Pool, amount: u64, lot_size: u64, clock: &Clock): (u64, u64) { let max_price = (1u128 << 64 - 1 as u64); let (prices, depths) = clob::get_level2_book_status_bid_side(pool, 0, max_price, clock); let mut amount_left = amount; @@ -171,7 +196,7 @@ module squid::deepbook_v2 { } - public fun predict_quote_for_base(pool: &Pool, amount: u64, lot_size: u64, clock: &Clock): (u64, u64) { + fun predict_quote_for_base(pool: &Pool, amount: u64, lot_size: u64, clock: &Clock): (u64, u64) { let max_price = (1u128 << 64 - 1 as u64); let (prices, depths) = clob::get_level2_book_status_ask_side(pool, 0, max_price, clock); @@ -257,32 +282,27 @@ module squid::deepbook_v2 { public fun swap(self: &mut SwapInfo, pool: &mut Pool, squid: &mut Squid, clock: &Clock, ctx: &mut TxContext) { let data = self.get_data_swapping(); if(data.length() == 0) return; - let mut bcs = bcs::new(data); + let swap_data = peel_swap_data(data); - assert!(bcs.peel_u8() == SWAP_TYPE, EWrongSwapType); + assert!(swap_data.swap_type == SWAP_TYPE, EWrongSwapType); - assert!(bcs.peel_address() == object::id_address(pool), EWrongPool); - - let has_base = bcs.peel_bool(); - let min_output = bcs.peel_u64(); + assert!(swap_data.pool_id == object::id_address(pool), EWrongPool); assert!( - &bcs.peel_vec_u8() == &type_name::get().into_string().into_bytes(), + &swap_data.base_type == &type_name::get().into_string(), EWrongCoinType, ); assert!( - &bcs.peel_vec_u8() == &type_name::get().into_string().into_bytes(), + &swap_data.quote_type == &type_name::get().into_string(), EWrongCoinType, ); - let lot_size = bcs.peel_u64(); - let should_sweep = bcs.peel_bool(); - if(has_base) { + if(swap_data.has_base) { let mut base_balance = self.coin_bag().get_balance().destroy_some(); - let leftover = base_balance.value() % lot_size; + let leftover = base_balance.value() % swap_data.lot_size; if(leftover > 0) { - if(should_sweep) { + if(swap_data.should_sweep) { squid.coin_bag().store_balance( base_balance.split(leftover) ); @@ -298,7 +318,7 @@ module squid::deepbook_v2 { clock, ctx, ); - assert!(min_output <= quote_coin.value(), ENotEnoughOutput); + assert!(swap_data.min_output <= quote_coin.value(), ENotEnoughOutput); base_coin.destroy_zero(); self.coin_bag().store_balance(quote_coin.into_balance()); } else { @@ -309,9 +329,9 @@ module squid::deepbook_v2 { clock, ctx, ); - assert!(min_output <= base_coin.value(), ENotEnoughOutput); + assert!(swap_data.min_output <= base_coin.value(), ENotEnoughOutput); self.coin_bag().store_balance(base_coin.into_balance()); - if(should_sweep) { + if(swap_data.should_sweep) { squid.coin_bag().store_balance(quote_coin.into_balance()); } else { self.coin_bag().store_balance(quote_coin.into_balance()); diff --git a/move/squid/sources/squid/transfers.move b/move/squid/sources/squid/transfers.move index a362d38b..27d2f00d 100644 --- a/move/squid/sources/squid/transfers.move +++ b/move/squid/sources/squid/transfers.move @@ -1,6 +1,6 @@ module squid::transfers { use std::type_name; - use std::ascii; + use std::ascii::{Self, String}; use sui::bcs::{Self, BCS}; use sui::coin; @@ -9,7 +9,7 @@ module squid::transfers { use its::service; use its::its::ITS; - use its::token_id; + use its::token_id::{Self, TokenId}; use squid::swap_info::{SwapInfo}; @@ -19,15 +19,51 @@ module squid::transfers { const EWrongSwapType: u64 = 0; const EWrongCoinType: u64 = 1; + public struct SuiTransferSwapData has drop { + swap_type: u8, + coin_type: String, + recipient: address, + } + + public struct ITSTransferSwapData has drop { + swap_type: u8, + coin_type: String, + token_id: TokenId, + destination_chain: String, + destination_address: vector, + metadata: vector, + } + + fun new_sui_transfer_swap_data(data: vector): SuiTransferSwapData { + let mut bcs = bcs::new(data); + SuiTransferSwapData { + swap_type: bcs.peel_u8(), + coin_type: ascii::string(bcs.peel_vec_u8()), + recipient: bcs.peel_address(), + } + } + + fun new_its_transfer_swap_data(data: vector): ITSTransferSwapData { + let mut bcs = bcs::new(data); + ITSTransferSwapData { + swap_type: bcs.peel_u8(), + coin_type: ascii::string(bcs.peel_vec_u8()), + token_id: token_id::from_address(bcs.peel_address()), + destination_chain: ascii::string(bcs.peel_vec_u8()), + destination_address: bcs.peel_vec_u8(), + metadata: bcs.peel_vec_u8(), + } + } + public fun sui_estimate(swap_info: &mut SwapInfo) { let data = swap_info.get_data_estimating(); if (data.length() == 0) return; - let mut bcs = bcs::new(data); + let swap_data = new_sui_transfer_swap_data(data); - assert!(bcs.peel_u8() == SWAP_TYPE_SUI_TRANSFER, EWrongSwapType); + assert!(swap_data.swap_type == SWAP_TYPE_SUI_TRANSFER, EWrongSwapType); assert!( - &bcs.peel_vec_u8() == &type_name::get().into_string().into_bytes(), + &swap_data.coin_type == &type_name::get().into_string(), EWrongCoinType, ); @@ -37,12 +73,12 @@ module squid::transfers { public fun its_estimate(swap_info: &mut SwapInfo) { let data = swap_info.get_data_estimating(); if (data.length() == 0) return; - let mut bcs = bcs::new(data); + let swap_data = new_its_transfer_swap_data(data); - assert!(bcs.peel_u8() == SWAP_TYPE_ITS_TRANSFER, EWrongSwapType); + assert!(swap_data.swap_type == SWAP_TYPE_ITS_TRANSFER, EWrongSwapType); assert!( - &bcs.peel_vec_u8() == &type_name::get().into_string().into_bytes(), + &swap_data.coin_type == &type_name::get().into_string(), EWrongCoinType, ); @@ -52,12 +88,12 @@ module squid::transfers { public fun sui_transfer(swap_info: &mut SwapInfo, ctx: &mut TxContext) { let data = swap_info.get_data_swapping(); if (data.length() == 0) return; - let mut bcs = bcs::new(data); + let swap_data = new_sui_transfer_swap_data(data); - assert!(bcs.peel_u8() == SWAP_TYPE_SUI_TRANSFER, EWrongSwapType); + assert!(swap_data.swap_type == SWAP_TYPE_SUI_TRANSFER, EWrongSwapType); assert!( - &bcs.peel_vec_u8() == &type_name::get().into_string().into_bytes(), + &swap_data.coin_type == &type_name::get().into_string(), EWrongCoinType, ); @@ -66,19 +102,19 @@ module squid::transfers { option.destroy_none(); return }; - let address = bcs.peel_address(); - transfer::public_transfer(coin::from_balance(option.destroy_some(), ctx), address); + + transfer::public_transfer(coin::from_balance(option.destroy_some(), ctx), swap_data.recipient); } public fun its_transfer(swap_info: &mut SwapInfo, its: &mut ITS, ctx: &mut TxContext) { let data = swap_info.get_data_swapping(); if (data.length() == 0) return; - let mut bcs = bcs::new(data); + let swap_data = new_its_transfer_swap_data(data); - assert!(bcs.peel_u8() == SWAP_TYPE_SUI_TRANSFER, EWrongSwapType); + assert!(swap_data.swap_type == SWAP_TYPE_ITS_TRANSFER, EWrongSwapType); assert!( - &bcs.peel_vec_u8() == &type_name::get().into_string().into_bytes(), + &swap_data.coin_type == &type_name::get().into_string(), EWrongCoinType, ); @@ -87,17 +123,14 @@ module squid::transfers { option.destroy_none(); return }; - let token_id = token_id::from_address(bcs.peel_address()); - let destination_chain = ascii::string(bcs.peel_vec_u8()); - let destination_address = bcs.peel_vec_u8(); - let metadata = bcs.peel_vec_u8(); + service::interchain_transfer( its, - token_id, + swap_data.token_id, coin::from_balance(option.destroy_some(), ctx), - destination_chain, - destination_address, - metadata, + swap_data.destination_chain, + swap_data.destination_address, + swap_data.metadata, ctx, ); } diff --git a/move/test/Move.lock b/move/test/Move.lock index 5afaa68d..ed1e8c31 100644 --- a/move/test/Move.lock +++ b/move/test/Move.lock @@ -2,7 +2,7 @@ [move] version = 2 -manifest_digest = "CF736E0717CB61683E6D638E781AA77454AE00BCA196A7FD23E4ACDBD78C0A5A" +manifest_digest = "E39FD071E9EFD0729A4D15C389E9E5EF831FB1E0DB9B2A6E35AFD0DC302863A1" deps_digest = "3C4103934B1E040BB6B23F1D610B4EF9F2F1166A50A104EADCF77467C004C600" dependencies = [ { name = "AxelarGateway" }, @@ -30,6 +30,6 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.25.1" +compiler-version = "1.26.1" edition = "2024.beta" flavor = "sui" diff --git a/move/test/Move.toml b/move/test/Move.toml index a1b50014..cfe2b83d 100644 --- a/move/test/Move.toml +++ b/move/test/Move.toml @@ -1,6 +1,7 @@ [package] name = "Test" version = "0.1.0" +published-at = "0x5de4d52cd17c6e0483598bebb3243a886edefeb216e5ecc7c578edfeb8a7b4a9" edition = "2024.beta" [dependencies] @@ -8,4 +9,4 @@ Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-fram AxelarGateway = { local = "../axelar_gateway" } [addresses] -test = "0x200" +test = "0x5de4d52cd17c6e0483598bebb3243a886edefeb216e5ecc7c578edfeb8a7b4a9" diff --git a/package-lock.json b/package-lock.json index 7dadd6b0..5fe43f07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "@axelar-network/axelar-cgp-sui", "version": "0.1.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.2", @@ -15,14 +16,20 @@ "ethers": "^5.0.0", "fs": "^0.0.1-security", "secp256k1": "^5.0.0", - "tmp": "^0.2.1" + "tmp": "^0.2.1", + "typescript": "^5.3.3" }, "devDependencies": { "@changesets/cli": "^2.27.6", "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "@types/tmp": "^0.2.6", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", + "chai": "^4.3.7", "dotenv": "^16.3.1", "eslint": "^8.57.0", "eslint-config-richardpringle": "^2.0.0", + "mocha": "^10.4.0", "prettier": "^2.8.7", "prettier-plugin-sort-imports": "^1.8.5" }, @@ -44,9 +51,9 @@ } }, "node_modules/@0no-co/graphqlsp": { - "version": "1.12.5", - "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.5.tgz", - "integrity": "sha512-YS9s8sf3XLaVdBt33u1mbUdfUSLiarQW1SFd3ITh2CLWz1nVnVTN0oCrpepuFHUJ7rt+b6Gk14sgjP4ONdeZfQ==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.11.tgz", + "integrity": "sha512-vLja9r7L6BBXwxW86Wyi5z5hjTHscH7qoQooy+MXHkM9srBB6ZuesYZq5DQ/+SErQrFyaxeY+hwv2qBAksxriw==", "dependencies": { "@gql.tada/internal": "^1.0.0", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" @@ -69,12 +76,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", - "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.6", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -82,30 +89,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", - "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", - "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helpers": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/traverse": "^7.24.6", - "@babel/types": "^7.24.6", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -120,25 +127,22 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", - "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.6", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -148,13 +152,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", - "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -163,63 +167,76 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", - "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", - "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", - "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", - "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", - "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -229,76 +246,77 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", - "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", - "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", - "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", - "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", - "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", - "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", - "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -307,86 +325,15 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", - "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { - "parser": "bin/babel-parser.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, "node_modules/@babel/runtime": { @@ -402,71 +349,62 @@ } }, "node_modules/@babel/template": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", - "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, "node_modules/@babel/traverse": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", - "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", - "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.8.0" } }, "node_modules/@changesets/apply-release-plan": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.3.tgz", - "integrity": "sha512-klL6LCdmfbEe9oyfLxnidIf/stFXmrbFO/3gT5LU5pcyoZytzJe4gWpTBx3BPmyNPl16dZ1xrkcW7b98e3tYkA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.4.tgz", + "integrity": "sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", - "@changesets/config": "^3.0.1", + "@changesets/config": "^3.0.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.0", "@changesets/should-skip-package": "^0.1.0", @@ -490,45 +428,21 @@ "node": ">=8" } }, - "node_modules/@changesets/apply-release-plan/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.2.tgz", - "integrity": "sha512-n9/Tdq+ze+iUtjmq0mZO3pEhJTKkku9hUxtUadW30jlN7kONqJG3O6ALeXrmc6gsi/nvoCuKjqEJ68Hk8RbMTQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.3.tgz", + "integrity": "sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.0", + "@changesets/get-dependents-graph": "^2.1.1", "@changesets/should-skip-package": "^0.1.0", "@changesets/types": "^6.0.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, - "node_modules/@changesets/assemble-release-plan/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@changesets/changelog-git": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", @@ -539,19 +453,19 @@ } }, "node_modules/@changesets/cli": { - "version": "2.27.6", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.6.tgz", - "integrity": "sha512-PB7KS5JkCQ4WSXlnfThn8CXAHVwYxFdZvYTimhi12fls/tzj9iimUhKsYwkrKSbw1AiVlGCZtihj5Wkt6siIjA==", + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.7.tgz", + "integrity": "sha512-6lr8JltiiXPIjDeYg4iM2MeePP6VN/JkmqBsVA5XRiy01hGS3y629LtSDvKcycj/w/5Eur1rEwby/MjcYS+e2A==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^7.0.3", - "@changesets/assemble-release-plan": "^6.0.2", + "@changesets/apply-release-plan": "^7.0.4", + "@changesets/assemble-release-plan": "^6.0.3", "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.1", + "@changesets/config": "^3.0.2", "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.0", - "@changesets/get-release-plan": "^4.0.2", + "@changesets/get-dependents-graph": "^2.1.1", + "@changesets/get-release-plan": "^4.0.3", "@changesets/git": "^3.0.0", "@changesets/logger": "^0.1.0", "@changesets/pre": "^2.0.0", @@ -581,65 +495,6 @@ "changeset": "bin.js" } }, - "node_modules/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -664,38 +519,14 @@ "node": ">=8" } }, - "node_modules/@changesets/cli/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/cli/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/@changesets/config": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.1.tgz", - "integrity": "sha512-nCr8pOemUjvGJ8aUu8TYVjqnUL+++bFOQHBVmtNbLvKzIDkN/uiP/Z4RKmr7NNaiujIURHySDEGFPftR4GbTUA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.2.tgz", + "integrity": "sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==", "dev": true, "dependencies": { "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.0", + "@changesets/get-dependents-graph": "^2.1.1", "@changesets/logger": "^0.1.0", "@changesets/types": "^6.0.0", "@manypkg/get-packages": "^1.1.3", @@ -713,9 +544,9 @@ } }, "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.0.tgz", - "integrity": "sha512-QOt6pQq9RVXKGHPVvyKimJDYJumx7p4DO5MO9AhRJYgAPgv0emhNqAqqysSVKHBm4sxKlGN4S1zXOIb5yCFuhQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.1.tgz", + "integrity": "sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==", "dev": true, "dependencies": { "@changesets/types": "^6.0.0", @@ -725,98 +556,15 @@ "semver": "^7.5.3" } }, - "node_modules/@changesets/get-dependents-graph/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/@changesets/get-dependents-graph/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/@changesets/get-dependents-graph/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/@changesets/get-dependents-graph/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/@changesets/get-dependents-graph/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/@changesets/get-dependents-graph/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/@changesets/get-dependents-graph/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/get-dependents-graph/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/@changesets/get-release-plan": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.2.tgz", - "integrity": "sha512-rOalz7nMuMV2vyeP7KBeAhqEB7FM2GFPO5RQSoOoUKKH9L6wW3QyPA2K+/rG9kBrWl2HckPVES73/AuwPvbH3w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.3.tgz", + "integrity": "sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^6.0.2", - "@changesets/config": "^3.0.1", + "@changesets/assemble-release-plan": "^6.0.3", + "@changesets/config": "^3.0.2", "@changesets/pre": "^2.0.0", "@changesets/read": "^0.6.0", "@changesets/types": "^6.0.0", @@ -853,77 +601,6 @@ "chalk": "^2.1.0" } }, - "node_modules/@changesets/logger/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/@changesets/logger/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/@changesets/logger/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/@changesets/logger/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/@changesets/logger/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/@changesets/logger/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/@changesets/logger/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/@changesets/parse": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", @@ -1096,41 +773,41 @@ } }, "node_modules/@cosmjs/amino": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.2.tgz", - "integrity": "sha512-lcK5RCVm4OfdAooxKcF2+NwaDVVpghOq6o/A40c2mHXDUzUoRZ33VAHjVJ9Me6vOFxshrw/XEFn1f4KObntjYA==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.4.tgz", + "integrity": "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==", "dependencies": { - "@cosmjs/crypto": "^0.32.2", - "@cosmjs/encoding": "^0.32.2", - "@cosmjs/math": "^0.32.2", - "@cosmjs/utils": "^0.32.2" + "@cosmjs/crypto": "^0.32.4", + "@cosmjs/encoding": "^0.32.4", + "@cosmjs/math": "^0.32.4", + "@cosmjs/utils": "^0.32.4" } }, "node_modules/@cosmjs/cosmwasm-stargate": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.2.tgz", - "integrity": "sha512-OwJHzIx2CoJS6AULxOpNR6m+CI0GXxy8z9svHA1ZawzNM3ZGlL0GvHdhmF0WkpX4E7UdrYlJSLpKcgg5Fo6i7Q==", - "dependencies": { - "@cosmjs/amino": "^0.32.2", - "@cosmjs/crypto": "^0.32.2", - "@cosmjs/encoding": "^0.32.2", - "@cosmjs/math": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stargate": "^0.32.2", - "@cosmjs/tendermint-rpc": "^0.32.2", - "@cosmjs/utils": "^0.32.2", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.4.tgz", + "integrity": "sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA==", + "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" } }, "node_modules/@cosmjs/crypto": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.2.tgz", - "integrity": "sha512-RuxrYKzhrPF9g6NmU7VEq++Hn1vZJjqqJpZ9Tmw9lOYOV8BUsv+j/0BE86kmWi7xVJ7EwxiuxYsKuM8IR18CIA==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.4.tgz", + "integrity": "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==", "dependencies": { - "@cosmjs/encoding": "^0.32.2", - "@cosmjs/math": "^0.32.2", - "@cosmjs/utils": "^0.32.2", + "@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", @@ -1138,9 +815,9 @@ } }, "node_modules/@cosmjs/encoding": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.2.tgz", - "integrity": "sha512-WX7m1wLpA9V/zH0zRcz4EmgZdAv1F44g4dbXOgNj1eXZw1PIGR12p58OEkLN51Ha3S4DKRtCv5CkhK1KHEvQtg==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.4.tgz", + "integrity": "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==", "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", @@ -1148,92 +825,92 @@ } }, "node_modules/@cosmjs/json-rpc": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.2.tgz", - "integrity": "sha512-lan2lOgmz4yVE/HR8eCOSiII/1OudIulk8836koyIDCsPEpt6eKBuctnAD168vABGArKccLAo7Mr2gy9nrKrOQ==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.4.tgz", + "integrity": "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==", "dependencies": { - "@cosmjs/stream": "^0.32.2", + "@cosmjs/stream": "^0.32.4", "xstream": "^11.14.0" } }, "node_modules/@cosmjs/math": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.2.tgz", - "integrity": "sha512-b8+ruAAY8aKtVKWSft2IvtCVCUH1LigIlf9ALIiY8n9jtM4kMASiaRbQ/27etnSAInV88IaezKK9rQZrtxTjcw==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.4.tgz", + "integrity": "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==", "dependencies": { "bn.js": "^5.2.0" } }, "node_modules/@cosmjs/proto-signing": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.2.tgz", - "integrity": "sha512-UV4WwkE3W3G3s7wwU9rizNcUEz2g0W8jQZS5J6/3fiN0mRPwtPKQ6EinPN9ASqcAJ7/VQH4/9EPOw7d6XQGnqw==", - "dependencies": { - "@cosmjs/amino": "^0.32.2", - "@cosmjs/crypto": "^0.32.2", - "@cosmjs/encoding": "^0.32.2", - "@cosmjs/math": "^0.32.2", - "@cosmjs/utils": "^0.32.2", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz", + "integrity": "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==", + "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" } }, "node_modules/@cosmjs/socket": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.2.tgz", - "integrity": "sha512-Qc8jaw4uSBJm09UwPgkqe3g9TBFx4ZR9HkXpwT6Z9I+6kbLerXPR0Gy3NSJFSUgxIfTpO8O1yqoWAyf0Ay17Mw==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.4.tgz", + "integrity": "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==", "dependencies": { - "@cosmjs/stream": "^0.32.2", + "@cosmjs/stream": "^0.32.4", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "node_modules/@cosmjs/stargate": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.2.tgz", - "integrity": "sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.4.tgz", + "integrity": "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==", "dependencies": { "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.2", - "@cosmjs/encoding": "^0.32.2", - "@cosmjs/math": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stream": "^0.32.2", - "@cosmjs/tendermint-rpc": "^0.32.2", - "@cosmjs/utils": "^0.32.2", + "@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" } }, "node_modules/@cosmjs/stream": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.2.tgz", - "integrity": "sha512-gpCufLfHAD8Zp1ZKge7AHbDf4RA0TZp66wZY6JaQR5bSiEF2Drjtp4mwXZPGejtaUMnaAgff3LrUzPJfKYdQwg==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.4.tgz", + "integrity": "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==", "dependencies": { "xstream": "^11.14.0" } }, "node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.2.tgz", - "integrity": "sha512-DXyJHDmcAfCix4H/7/dKR0UMdshP01KxJOXHdHxBCbLIpck94BsWD3B2ZTXwfA6sv98so9wOzhp7qGQa5malxg==", - "dependencies": { - "@cosmjs/crypto": "^0.32.2", - "@cosmjs/encoding": "^0.32.2", - "@cosmjs/json-rpc": "^0.32.2", - "@cosmjs/math": "^0.32.2", - "@cosmjs/socket": "^0.32.2", - "@cosmjs/stream": "^0.32.2", - "@cosmjs/utils": "^0.32.2", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.4.tgz", + "integrity": "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==", + "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" } }, "node_modules/@cosmjs/utils": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.2.tgz", - "integrity": "sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q==" + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.4.tgz", + "integrity": "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -1251,9 +928,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1282,6 +959,43 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", @@ -1817,6 +1531,25 @@ "hash.js": "1.1.7" } }, + "node_modules/@ethersproject/signing-key/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/@ethersproject/signing-key/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", @@ -1983,26 +1716,27 @@ } }, "node_modules/@gql.tada/cli-utils": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.3.9.tgz", - "integrity": "sha512-oRb7SG/+csx9CiypSJTI21KaLfulOUnhX1vxg4FXi2snub9XShkGR2XnnlJVTAOZXY9Vcxti1NutAElxdDkycA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.5.0.tgz", + "integrity": "sha512-BqbrcpKmE2FyM3tQgK3vzTIn1ghCOf+lH9MThPow7NbtS9K2+bH4u/1fPAhZMR1Zg5GExKsDvij+zLP64Ge6Ig==", "dependencies": { - "@0no-co/graphqlsp": "^1.12.1", - "@gql.tada/internal": "1.0.0", + "@0no-co/graphqlsp": "^1.12.9", + "@gql.tada/internal": "1.0.3", "@vue/compiler-dom": "^3.4.23", "@vue/language-core": "^2.0.17", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", "svelte2tsx": "^0.7.6" }, "peerDependencies": { + "@0no-co/graphqlsp": "^1.12.9", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", "typescript": "^5.0.0" } }, "node_modules/@gql.tada/internal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.0.tgz", - "integrity": "sha512-B55aIYyZn5ewdgMqoJciPAwF5DKYX6HBabTU+ap/dpNH3EgJrLomc8Y8w+MCxCyOx+dXL9OduT6eWnVr7J7Eyg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.3.tgz", + "integrity": "sha512-n52/OjAkoPsX4ZyEufFBnncjnv0UrbXKs4OUG66db8gxtV5437EkLjI4MTAI1M6dsaj+VLi0unpraPPPbFR59A==", "dependencies": { "@0no-co/graphql.web": "^1.0.5" }, @@ -2023,6 +1757,7 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -2033,6 +1768,28 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2050,12 +1807,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@ianvs/prettier-plugin-sort-imports": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.2.1.tgz", - "integrity": "sha512-NKN1LVFWUDGDGr3vt+6Ey3qPeN/163uR1pOPAlkWpgvAqgxQ6kSdUf1F0it8aHUtKRUzEGcK38Wxd07O61d7+Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", + "integrity": "sha512-OOMtUcO4J3LoL63dOKAe7bn+lSRRPeit2DqNHpx+wvBp3Grejo2PMaK4Mp1mwy8pnat64ccSgk/lBZbsAdLErw==", "dev": true, "dependencies": { "@babel/core": "^7.24.0", @@ -2075,18 +1833,6 @@ } } }, - "node_modules/@ianvs/prettier-plugin-sort-imports/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -2284,20 +2030,20 @@ "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dependencies": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "engines": { "node": ">= 16" }, @@ -2394,75 +2140,266 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, - "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "node_modules/@scure/base": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", + "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@suchipi/femver": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz", + "integrity": "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "peer": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", + "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/type-utils": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", + "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", + "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", + "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", + "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", + "dev": true, "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" }, "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "node_modules/@typescript-eslint/utils": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", + "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", + "dev": true, "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" }, "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, - "node_modules/@suchipi/femver": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz", - "integrity": "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==" - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "peer": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", + "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", + "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "@typescript-eslint/types": "7.16.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -2470,52 +2407,50 @@ "dev": true }, "node_modules/@volar/language-core": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.5.tgz", - "integrity": "sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==", + "version": "2.4.0-alpha.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.15.tgz", + "integrity": "sha512-mt8z4Fm2WxfQYoQHPcKVjLQV6PgPqyKLbkCVY2cr5RSaamqCHjhKEpsFX66aL4D/7oYguuaUw9Bx03Vt0TpIIA==", "dependencies": { - "@volar/source-map": "2.2.5" + "@volar/source-map": "2.4.0-alpha.15" } }, "node_modules/@volar/source-map": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.5.tgz", - "integrity": "sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==", - "dependencies": { - "muggle-string": "^0.4.0" - } + "version": "2.4.0-alpha.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.15.tgz", + "integrity": "sha512-8Htngw5TmBY4L3ClDqBGyfLhsB8EmoEXUH1xydyEtEoK0O6NX5ur4Jw8jgvscTlwzizyl/wsN1vn0cQXVbbXYg==" }, "node_modules/@vue/compiler-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.27", + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.31", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", "dependencies": { - "@vue/compiler-core": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/language-core": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz", - "integrity": "sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.26.tgz", + "integrity": "sha512-/lt6SfQ3O1yDAhPsnLv9iSUgXd1dMHqUm/t3RctfqjuwQf1LnftZ414X3UBn6aXT4MiwXWtbNJ4Z0NZWwDWgJQ==", "dependencies": { - "@volar/language-core": "~2.2.4", + "@volar/language-core": "~2.4.0-alpha.15", "@vue/compiler-dom": "^3.4.0", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "vue-template-compiler": "^2.7.14" }, @@ -2528,37 +2463,15 @@ } } }, - "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@vue/shared": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -2615,18 +2528,28 @@ } }, "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==", + "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": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">= 8" } }, "node_modules/argparse": { @@ -2767,6 +2690,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2788,11 +2720,11 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2840,16 +2772,16 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "dependencies": { - "is-windows": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bn.js": { @@ -2858,12 +2790,11 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2883,10 +2814,16 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "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.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { @@ -2903,10 +2840,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -2951,10 +2888,22 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001625", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz", - "integrity": "sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "dev": true, "funding": [ { @@ -2971,33 +2920,91 @@ } ] }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "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" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } }, "node_modules/child_process": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -3013,6 +3020,17 @@ "node": ">=8" } }, + "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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/code-red": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", @@ -3036,21 +3054,18 @@ } }, "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==", + "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.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "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==", + "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/combined-stream": { @@ -3072,7 +3087,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -3169,9 +3185,9 @@ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3185,11 +3201,35 @@ } } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent-js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3254,6 +3294,15 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3279,27 +3328,27 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/electron-to-chromium": { - "version": "1.4.786", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.786.tgz", - "integrity": "sha512-i/A2UB0sxYViMN0M2zIotQFRIOt1jLuVXudACHBDiJ5gGuAUzf/crZxwlBTdA0O52Hy4CNtTzS7AKRAacs/08Q==", + "version": "1.4.820", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.820.tgz", + "integrity": "sha512-kK/4O/YunacfboFEk/BDf7VO1HoPmDudLTJAU9NmXIOSjsV7qVIX3OrI4REZo0VmdqhcpUcncQc6N8Q3aEXlHg==", "dev": true }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3315,6 +3364,12 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -3480,15 +3535,12 @@ } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/eslint": { @@ -3685,6 +3737,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -3706,6 +3768,27 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-mocha": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", @@ -3742,6 +3825,37 @@ "eslint": ">=5.16.0" } }, + "node_modules/eslint-plugin-node/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-node/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-promise": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", @@ -3826,6 +3940,125 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -3857,9 +4090,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -4077,14 +4310,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" + "bin": { + "flat": "cli.js" } }, "node_modules/flat-cache": { @@ -4170,7 +4402,22 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", @@ -4216,6 +4463,24 @@ "node": ">=6.9.0" } }, + "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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -4261,19 +4526,20 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4291,27 +4557,34 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4352,13 +4625,14 @@ } }, "node_modules/gql.tada": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.7.5.tgz", - "integrity": "sha512-GepPTee+FWSVVZQ7GiJHzsGNo7gOb59kcn4mUPYLlkbpeJfOUwpuoB05ZNaXG0W4qZVPd1I7R2UgMHBjY1lGlQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.8.1.tgz", + "integrity": "sha512-SKiWid+21JP1rCqXsWJr+A+fPcEUY2kz4XcQ6marzbMaFyXaf8LSLdYQPaZAFfqQ6tP2ZabG6Al7RFYByAsZwg==", "dependencies": { "@0no-co/graphql.web": "^1.0.5", - "@gql.tada/cli-utils": "1.3.9", - "@gql.tada/internal": "1.0.0" + "@0no-co/graphqlsp": "^1.12.9", + "@gql.tada/cli-utils": "1.5.0", + "@gql.tada/internal": "1.0.3" }, "bin": { "gql-tada": "bin/cli.js", @@ -4381,9 +4655,9 @@ "dev": true }, "node_modules/graphql": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", - "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -4398,12 +4672,12 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -4548,6 +4822,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4600,6 +4876,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -4629,12 +4917,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4676,7 +4967,16 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/is-glob": { @@ -4736,6 +5036,15 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-reference": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", @@ -4833,6 +5142,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4845,15 +5166,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -4928,24 +5240,15 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + }, + "engines": { + "node": ">=6" } }, "node_modules/keyv": { @@ -4971,9 +5274,9 @@ } }, "node_modules/libsodium-sumo": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.13.tgz", - "integrity": "sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ==" + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.14.tgz", + "integrity": "sha512-2nDge6qlAjcwyslAhWfVumlkeSNK5+WCfKa2/VEq9prvlT5vP2FR0m0o5hmKaYqfsZ4TQVj5czQsimZvXDB1CQ==" }, "node_modules/libsodium-wrappers-sumo": { "version": "0.7.13", @@ -5053,11 +5356,106 @@ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -5142,14 +5540,17 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -5161,6 +5562,95 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mocha": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", + "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -5202,9 +5692,9 @@ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -5217,11 +5707,23 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5305,6 +5807,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -5445,6 +5948,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5473,6 +5977,15 @@ "node": ">=8" } }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", @@ -5487,101 +6000,28 @@ "node_modules/periscopic/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "peer": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/possible-typed-array-names": { @@ -5645,9 +6085,9 @@ } }, "node_modules/prettier-plugin-sort-imports/node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5730,41 +6170,25 @@ "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", "dev": true }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "safe-buffer": "^5.1.0" } }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "picomatch": "^2.2.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.10.0" } }, "node_modules/readonly-date": { @@ -5808,6 +6232,15 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -5848,6 +6281,8 @@ "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, "dependencies": { "glob": "^7.1.3" }, @@ -5858,6 +6293,49 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5899,6 +6377,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -5942,12 +6440,24 @@ } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" } }, "node_modules/set-function-length": { @@ -6114,11 +6624,19 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/string.prototype.trim": { "version": "1.2.9", @@ -6203,23 +6721,23 @@ } }, "node_modules/superstruct": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.3.tgz", - "integrity": "sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", "engines": { "node": ">=14.0.0" } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "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": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -6235,9 +6753,9 @@ } }, "node_modules/svelte": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.17.tgz", - "integrity": "sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==", + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.18.tgz", + "integrity": "sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==", "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -6269,9 +6787,9 @@ } }, "node_modules/svelte2tsx": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.8.tgz", - "integrity": "sha512-ABK3RDFcy59AqAiU1N5Kxu1RnKrb1GDMrQjLgNgJfE8Q+coCKpjCAPtUVKQM2HnmuqeNWcT3NqfXbE+ZmN5Pow==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.13.tgz", + "integrity": "sha512-aObZ93/kGAiLXA/I/kP+x9FriZM+GboB/ReOIGmLNbVGEd2xC+aTCppm3mk1cc9I/z60VQf7b2QDxC3jOXu3yw==", "dependencies": { "dedent-js": "^1.0.1", "pascal-case": "^3.1.1" @@ -6308,14 +6826,11 @@ "dev": true }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/to-fast-properties": { @@ -6339,6 +6854,18 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6351,10 +6878,22 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tweetnacl": { "version": "1.0.3", @@ -6373,6 +6912,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -6459,10 +7007,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "peer": true, + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6501,9 +7048,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -6620,15 +7167,72 @@ "node": ">=0.10.0" } }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "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==", + "dev": true, + "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/wrap-ansi/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "engines": { "node": ">=8.3.0" }, @@ -6654,12 +7258,63 @@ "symbol-observable": "^2.0.3" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": 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/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, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 49f2b0e1..d9263174 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,18 @@ "move", "!move/**/build" ], - "main": "index.js", + "main": "dist/index.js", "scripts": { "build": "./scripts/run.sh build", - "test": "./scripts/run.sh test", + "test-move": "./scripts/run.sh test", + "test-js": "npx mocha", + "test": "npm run test-move && npm run test-js", "coverage": "./scripts/coverage.sh", - "lint": "eslint --fix './scripts/*.js'", - "prettier": "prettier --write './scripts/*.js'", - "cs": "changeset" + "cs": "changeset", + "lint": "eslint --fix './src/*.ts' './test/*.js'", + "prettier": "prettier --write './src/*.ts' './test/*.js'", + "compile": "npx tsc", + "postinstall": "npm run compile" }, "keywords": [ "axelar", @@ -35,16 +39,22 @@ "ethers": "^5.0.0", "fs": "^0.0.1-security", "secp256k1": "^5.0.0", - "tmp": "^0.2.1" + "tmp": "^0.2.1", + "typescript": "^5.3.3" }, "devDependencies": { "@changesets/cli": "^2.27.6", "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "@types/tmp": "^0.2.6", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", "dotenv": "^16.3.1", "eslint": "^8.57.0", "eslint-config-richardpringle": "^2.0.0", + "mocha": "^10.4.0", "prettier": "^2.8.7", - "prettier-plugin-sort-imports": "^1.8.5" + "prettier-plugin-sort-imports": "^1.8.5", + "chai": "^4.3.7" }, "description": "Axelar Sui Move contracts" } diff --git a/scripts/bcs.js b/scripts/bcs.js new file mode 100644 index 00000000..a3148e5a --- /dev/null +++ b/scripts/bcs.js @@ -0,0 +1,122 @@ +const { bcs } = require('@mysten/sui.js/bcs'); + +function getAxelarStructs() { + const Bytes32 = bcs.struct('Bytes32', { + bytes: bcs.Address, + }); + + const Message = bcs.struct('Message', { + source_chain: bcs.String, + message_id: bcs.String, + source_address: bcs.String, + destination_id: bcs.Address, + payload_hash: Bytes32, + }); + + const WeightedSigner = bcs.struct('WeightedSigner', { + pubkey: bcs.vector(bcs.U8), + weight: bcs.U128, + }); + + const WeightedSigners = bcs.struct('WeightedSigners', { + signers: bcs.vector(WeightedSigner), + threshold: bcs.U128, + nonce: Bytes32, + }); + + const Signature = bcs.struct('Signature', { + bytes: bcs.vector(bcs.U8), + }); + + const Proof = bcs.struct('Proof', { + signers: WeightedSigners, + signatures: bcs.vector(Signature), + }); + + const MessageToSign = bcs.struct('MessageToSign', { + domain_separator: Bytes32, + signers_hash: Bytes32, + data_hash: Bytes32, + }); + + const Function = bcs.struct('Function', { + package_id: bcs.Address, + module_name: bcs.String, + name: bcs.String, + }); + + /// Arguments are prefixed with: + /// - 0 for objects followed by exactly 32 bytes that cointain the object id + /// - 1 for pures followed by the bcs encoded form of the pure + /// - 2 for the call contract object, followed by nothing (to be passed into the target function) + /// - 3 for the payload of the contract call (to be passed into the intermediate function) + /// - 4 for an argument returned from a previous move call, followed by a u8 specified which call to get the return of (0 for the first transaction AFTER the one that gets ApprovedMessage out), and then another u8 specifying which argument to input. + const MoveCall = bcs.struct('MoveCall', { + function: Function, + arguments: bcs.vector(bcs.vector(bcs.U8)), + type_arguments: bcs.vector(bcs.String), + }); + + const Transaction = bcs.struct('Transaction', { + is_final: bcs.Bool, + move_calls: bcs.vector(MoveCall), + }); + + const EncodedMessage = bcs.struct('EncodedMessage', { + message_type: bcs.U8, + data: bcs.vector(bcs.U8), + }); + + return { + Bytes32, + Message, + WeightedSigner, + WeightedSigners, + Signature, + Proof, + MessageToSign, + Function, + MoveCall, + Transaction, + EncodedMessage, + }; +} + +function getSquidStructs() { + const DeepbookV2SwapData = bcs.struct('DeepbookV2SwapData', { + swap_type: bcs.U8, + pool_id: bcs.Address, + has_base: bcs.Bool, + min_output: bcs.U64, + base_type: bcs.String, + quote_type: bcs.String, + lot_size: bcs.U64, + should_sweep: bcs.Bool, + }); + + const SuiTransferSwapData = bcs.struct('SuiTransferSwapData', { + swap_type: bcs.U8, + coin_type: bcs.String, + recipient: bcs.Address, + }); + + const ItsTransferSwapData = bcs.struct('ItsTransferSwapData', { + swap_type: bcs.U8, + coin_type: bcs.String, + token_id: bcs.Address, + destination_chain: bcs.String, + destination_address: bcs.vector(bcs.U8), + metadata: bcs.vector(bcs.U8), + }); + + return { + DeepbookV2SwapData, + SuiTransferSwapData, + ItsTransferSwapData, + }; +} + +module.exports = { + axelarStructs: getAxelarStructs(), + squidStructs: getSquidStructs(), +}; diff --git a/scripts/gateway.js b/scripts/gateway.js deleted file mode 100644 index ae54fd74..00000000 --- a/scripts/gateway.js +++ /dev/null @@ -1,257 +0,0 @@ -require('dotenv').config(); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { BCS, fromHEX, getSuiMoveConfig } = require('@mysten/bcs'); -const { CosmWasmClient } = require('@cosmjs/cosmwasm-stargate'); -const { - utils: { keccak256 }, -} = require('ethers'); -const secp256k1 = require('secp256k1'); - -function hashMessage(data) { - // sorry for putting it here... - const messagePrefix = new Uint8Array(Buffer.from('\x19Sui Signed Message:\n', 'ascii')); - const hashed = new Uint8Array(messagePrefix.length + data.length); - hashed.set(messagePrefix); - hashed.set(data, messagePrefix.length); - - return keccak256(hashed); -} - -function getBcsForGateway() { - const bcs = new BCS(getSuiMoveConfig()); - - // input argument for the tx - bcs.registerStructType('Input', { - data: 'vector', - proof: 'vector', - }); - - bcs.registerStructType('Proof', { - // operators is a 33 byte / for now at least - operators: 'vector>', - weights: 'vector', - threshold: 'u128', - signatures: 'vector>', - }); - - // internals of the message - bcs.registerStructType('AxelarMessage', { - chain_id: 'u64', - command_ids: 'vector
', - commands: 'vector', - params: 'vector>', - }); - - // internals of the message - bcs.registerStructType('TransferOperatorshipMessage', { - operators: 'vector>', - weights: 'vector', - threshold: 'u128', - }); - bcs.registerStructType('GenericMessage', { - source_chain: 'string', - source_address: 'string', - target_id: 'address', - payload_hash: 'address', - }); - - return bcs; -} - -function getOperators(axelarInfo) { - if (!axelarInfo.activeOperators) { - return { - privKeys: [], - weights: [], - threshold: 0, - }; - } - - return axelarInfo.activeOperators; -} - -function getRandomOperators(n = 5) { - let privKeys = []; - - for (let i = 0; i < n; i++) { - privKeys.push(keccak256(Math.floor(Math.random() * 10000000)).slice(2)); - } - - let pubKeys = privKeys.map((privKey) => secp256k1.publicKeyCreate(Buffer.from(privKey, 'hex'))); - const indices = Array.from(pubKeys.keys()); - const pubKeyLength = 33; - - indices.sort((a, b) => { - for (let i = 0; i < pubKeyLength; i++) { - const aByte = pubKeys[a][i]; - const bByte = pubKeys[b][i]; - if (aByte !== bByte) return aByte - bByte; - } - - return 0; - }); - pubKeys = indices.map((i) => pubKeys[i]); - privKeys = indices.map((i) => privKeys[i]); - const weights = privKeys.map((privKey) => 3); - const threshold = privKeys.length * 2; - - return { - privKeys, - pubKeys, - weights, - threshold, - }; -} - -function getInputForMessage(info, message) { - const operators = getOperators(info); - // get the public key in a compressed format - const pubKeys = operators.privKeys.map((privKey) => secp256k1.publicKeyCreate(Buffer.from(privKey, 'hex'))); - - const hashed = fromHEX(hashMessage(message)); - const signatures = operators.privKeys.map((privKey) => { - const { signature, recid } = secp256k1.ecdsaSign(hashed, Buffer.from(privKey, 'hex')); - return new Uint8Array([...signature, recid]); - }); - - const bcs = getBcsForGateway(); - const proof = bcs - .ser('Proof', { - operators: pubKeys, - weights: operators.weights, - threshold: operators.threshold, - signatures, - }) - .toBytes(); - - const input = bcs - .ser('Input', { - data: message, - proof, - }) - .toBytes(); - return input; -} - -function approveContractCallInput( - axelarInfo, - sourceChain, - sourceAddress, - destinationAddress, - payloadHash, - commandId = keccak256(new Date().getTime()), -) { - const bcs = getBcsForGateway(); - - const message = bcs - .ser('AxelarMessage', { - chain_id: 1, - command_ids: [commandId], - commands: ['approveContractCall'], - params: [ - bcs - .ser('GenericMessage', { - source_chain: sourceChain, - source_address: sourceAddress, - payload_hash: payloadHash, - target_id: destinationAddress, - }) - .toBytes(), - ], - }) - .toBytes(); - - return getInputForMessage(axelarInfo, message); -} - -function TransferOperatorshipInput(info, newOperators, newWeights, newThreshold, commandId = keccak256(new Date().getTime())) { - const bcs = getBcsForGateway(); - const message = bcs - .ser('AxelarMessage', { - chain_id: 1, - command_ids: [commandId], - commands: ['transferOperatorship'], - params: [ - bcs - .ser('TransferOperatorshipMessage', { - operators: newOperators, - weights: newWeights, - threshold: newThreshold, - }) - .toBytes(), - ], - }) - .toBytes(); - - return getInputForMessage(info, message); -} - -async function approveContractCall(client, keypair, axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash) { - const commandId = keccak256(new Date().getTime()); - const input = approveContractCallInput(axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash, commandId); - const packageId = axelarInfo.packageId; - const validators = axelarInfo['gateway::Gateway']; - - const tx = new TransactionBlock(); - tx.moveCall({ - target: `${packageId}::gateway::process_commands`, - arguments: [tx.object(validators.objectId), tx.pure(String.fromCharCode(...input))], - typeArguments: [], - }); - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - return commandId; -} - -async function getAmplifierWorkers(rpc, proverAddr) { - const client = await CosmWasmClient.connect(rpc); - const workerSet = await client.queryContractSmart(proverAddr, 'get_worker_set'); - const signers = Object.values(workerSet.signers).sort((a, b) => - a.pub_key.ecdsa.toLowerCase().localeCompare(b.pub_key.ecdsa.toLowerCase()), - ); - - const pubKeys = signers.map((signer) => Buffer.from(signer.pub_key.ecdsa, 'hex')); - const weights = signers.map((signer) => Number(signer.weight)); - const threshold = Number(workerSet.threshold); - - return { pubKeys, weights, threshold }; -} - -async function transferOperatorship(info, client, keypair, newOperators, newWeights, newThreshold) { - const input = TransferOperatorshipInput(info, newOperators, newWeights, newThreshold); - const packageId = info.packageId; - const gateway = info['gateway::Gateway']; - - const tx = new TransactionBlock(); - tx.moveCall({ - target: `${packageId}::gateway::process_commands`, - arguments: [tx.object(gateway.objectId), tx.pure(String.fromCharCode(...input))], - typeArguments: [], - }); - const approveTxn = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - console.log(approveTxn.effects.status); -} - -module.exports = { - approveContractCall, - transferOperatorship, - getRandomOperators, - getAmplifierWorkers, - getBcsForGateway, - hashMessage, -}; diff --git a/scripts/governance.js b/scripts/governance.js deleted file mode 100644 index f52c162d..00000000 --- a/scripts/governance.js +++ /dev/null @@ -1,66 +0,0 @@ -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { setConfig, getConfig, getFullObject } = require('./utils'); - -async function initializeGovernance(upgradeCap, client, keypair, env) { - const governanceConfig = getConfig('governance', env.alias); - const packageId = governanceConfig.packageId; - - const tx = new TransactionBlock(); - tx.moveCall({ - target: `${packageId}::governance::new`, - arguments: [ - tx.pure.string('Axelar'), - tx.pure.string('the governance source addresss'), - tx.pure.u256(0), - tx.object(upgradeCap.objectId), - ], - typeArguments: [], - }); - const publishTxn = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); - - const governance = publishTxn.objectChanges.find((obj) => obj.objectType === `${packageId}::governance::Governance`); - - governanceConfig['governance::Governance'] = await getFullObject(governance, client); - setConfig('governance', env.alias, governanceConfig); - - return governance; -} - -async function takeUpgradeCaps(upgradeCaps, client, keypair, env) { - const governanceConfig = getConfig('governance', env.alias); - const packageId = governanceConfig.packageId; - const tx = new TransactionBlock(); - - for (const upgradeCap of upgradeCaps) { - tx.moveCall({ - target: `${packageId}::governance::take_upgrade_cap`, - arguments: [tx.object(governanceConfig['governance::Governance'].objectId), tx.object(upgradeCap.objectId)], - typeArguments: [], - }); - } - - return await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -module.exports = { - initializeGovernance, - takeUpgradeCaps, -}; diff --git a/scripts/its/discovery.js b/scripts/its/discovery.js deleted file mode 100644 index 823aece2..00000000 --- a/scripts/its/discovery.js +++ /dev/null @@ -1,65 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); - -const { getConfig } = require('../utils'); - -async function setItsDiscovery(client, keypair, envAlias) { - const axelarInfo = getConfig('axelar', envAlias); - const itsInfo = getConfig('its', envAlias); - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - const relayerDecovery = axelarInfo['discovery::RelayerDiscovery'].objectId; - - let tx = new TransactionBlock(); - - tx.moveCall({ - target: `${itsPackageId}::discovery::register_transaction`, - arguments: [tx.object(itsObjectId), tx.object(relayerDecovery)], - typeArguments: [], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -module.exports = { - setItsDiscovery, -}; - -if (require.main === module) { - const env = process.argv[2] || 'localnet'; - const chainName = process.argv[3] || 'Ethereum'; - const trustedAddress = process.argv[4] || '0x1234'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - - await setItsDiscovery(client, keypair, env); - })(); -} diff --git a/scripts/its/interchain_token.move b/scripts/its/interchain_token.move deleted file mode 100644 index 6fbd6a47..00000000 --- a/scripts/its/interchain_token.move +++ /dev/null @@ -1,20 +0,0 @@ -module interchain_token::$module_name { - use sui::coin::{Self}; - use sui::url::{Url}; - - public struct $witness has drop {} - - fun init(witness: $witness, ctx: &mut TxContext) { - let (treasury, metadata) = coin::create_currency<$witness>( - witness, - $decimals, - b"$symbol", - b"$name", - b"", - option::none(), - ctx - ); - transfer::public_transfer(treasury, tx_context::sender(ctx)); - transfer::public_transfer(metadata, tx_context::sender(ctx)); - } -} \ No newline at end of file diff --git a/scripts/its/publish-interchain-token.js b/scripts/its/publish-interchain-token.js deleted file mode 100644 index 99f06c29..00000000 --- a/scripts/its/publish-interchain-token.js +++ /dev/null @@ -1,99 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const fs = require('fs'); - -const { getModuleNameFromSymbol, getConfig } = require('../utils'); -const { publishPackage } = require('../publish-package'); - -const packagePath = 'interchain_token'; - -async function publishInterchainToken(client, keypair, itsInfo, name, symbol, decimals, skipRegister = false) { - let file = fs.readFileSync(`scripts/its/interchain_token.move`, 'utf8'); - let moduleName = getModuleNameFromSymbol(symbol); - let witness = moduleName.toUpperCase(); - file = file.replaceAll('$module_name', moduleName); - file = file.replaceAll('$witness', witness); - file = file.replaceAll('$name', name); - file = file.replaceAll('$symbol', symbol); - file = file.replaceAll('$decimals', decimals); - fs.writeFileSync(`move/${packagePath}/sources/interchain_token.move`, file); - - const { packageId, publishTxn } = await publishPackage(`../move/${packagePath}`, client, keypair); - - const treasuryCap = publishTxn.objectChanges.find((object) => { - return object.objectType && object.objectType.startsWith('0x2::coin::TreasuryCap'); - }); - const coinMetadata = publishTxn.objectChanges.find((object) => { - return object.objectType && object.objectType.startsWith('0x2::coin::CoinMetadata'); - }); - - coinType = `${packageId}::${moduleName}::${witness}`; - - if (skipRegister) { - return { - coinType, - treasuryCap, - coinMetadata, - }; - } - - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - - const tx = new TransactionBlock(); - - tx.moveCall({ - target: `${itsPackageId}::service::give_unregistered_coin`, - arguments: [tx.object(itsObjectId), tx.object(treasuryCap.objectId), tx.object(coinMetadata.objectId)], - typeArguments: [`${packageId}::${moduleName}::${witness}`], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); - - return { - coinType, - }; -} - -module.exports = { - publishInterchainToken, -}; - -if (require.main === module) { - const symbol = process.argv[2] || 'TT'; - const decimals = process.argv[3] || 6; - const skipRegister = process.argv[4] ? process.argv[4] != 'false' : false; - const env = process.argv[5] || 'localnet'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - await publishInterchainToken(client, keypair, getConfig('its', env), '', symbol, decimals, skipRegister); - })(); -} diff --git a/scripts/its/receive-token.js b/scripts/its/receive-token.js deleted file mode 100644 index 4f530284..00000000 --- a/scripts/its/receive-token.js +++ /dev/null @@ -1,103 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); - -const { arrayify, defaultAbiCoder } = require('ethers/lib/utils'); -const { registerInterchainToken } = require('./register-token'); -const { receiveCall } = require('../test-receive-call'); -const { getConfig } = require('../utils'); - -async function receiveInterchainToken( - client, - keypair, - axelarInfo, - itsInfo, - tokenId, - sourceChain, - sourceAddress, - destinationAddress, - amount, -) { - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - const channelId = itsInfo['its::ITS'].channel; - - const selector = 0; - const payload = defaultAbiCoder.encode( - ['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], - [selector, tokenId, sourceAddress, destinationAddress, amount, '0x'], - ); - - const tx = new TransactionBlock(); - - tx.moveCall({ - target: `${itsPackageId}::its::get_trusted_address`, - arguments: [tx.object(itsObjectId), tx.pure.string(sourceChain)], - }); - - const resp = await client.devInspectTransactionBlock({ - sender: keypair.getPublicKey().toSuiAddress(), - transactionBlock: tx, - }); - - const bcs = new BCS(getSuiMoveConfig()); - - const trustedAddress = bcs.de('string', new Uint8Array(resp.results[0].returnValues[0][0])); - await receiveCall(client, keypair, axelarInfo, sourceChain, trustedAddress, channelId, payload); -} - -if (require.main === module) { - const env = process.argv[2] || 'localnet'; - - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - const sourceChain = process.argv[3] || 'Ethereum'; - const sourceAddress = process.argv[4] || '0x1234'; - const destinationAddress = process.argv[5] || address; - const amount = process.argv[6] || 123467; - const name = process.argv[7] || 'Test Token'; - const symbol = process.argv[8] || 'TT'; - const decimals = process.argv[9] || 6; - - (async () => { - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - - const [tokenId, coinType] = await registerInterchainToken(client, keypair, getConfig('its', env), name, symbol, decimals); - - await receiveInterchainToken( - client, - keypair, - getConfig('axelar', env), - getConfig('its', env), - tokenId, - sourceChain, - sourceAddress, - destinationAddress, - amount, - ); - - const coins = await client.getCoins({ - owner: address, - coinType: coinType, - }); - const balance = coins.data[0].balance; - - console.log(balance); - })(); -} diff --git a/scripts/its/register-token.js b/scripts/its/register-token.js deleted file mode 100644 index 7065ca50..00000000 --- a/scripts/its/register-token.js +++ /dev/null @@ -1,140 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { publishInterchainToken } = require('./publish-interchain-token'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); -const { getConfig } = require('../utils'); - -async function registerInterchainToken(client, keypair, itsInfo, name, symbol, decimals, mintAmount = false) { - const { coinType, coinMetadata, treasuryCap } = await publishInterchainToken(client, keypair, itsInfo, name, symbol, decimals, true); - - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - let tx = new TransactionBlock(); - - if (mintAmount) { - tx.moveCall({ - target: `0x2::coin::mint_and_transfer`, - arguments: [tx.object(treasuryCap.objectId), tx.pure(mintAmount), tx.pure.address(keypair.getPublicKey().toSuiAddress())], - typeArguments: [coinType], - }); - } - - const coinInfo = tx.moveCall({ - target: `${itsPackageId}::coin_info::from_metadata`, - arguments: [tx.object(coinMetadata.objectId)], - typeArguments: [coinType], - }); - - const coinManagement = tx.moveCall({ - target: `${itsPackageId}::coin_management::new_with_cap`, - arguments: [tx.object(treasuryCap.objectId)], - typeArguments: [coinType], - }); - - tx.moveCall({ - target: `${itsPackageId}::service::register_coin`, - arguments: [tx.object(itsObjectId), coinInfo, coinManagement], - typeArguments: [coinType], - }); - - const result = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); - const coinObjectId = mintAmount - ? result.objectChanges.find((object) => object.objectType === `0x2::coin::Coin<${coinType}>`).objectId - : null; - - const eventData = await client.queryEvents({ - query: { - MoveEventType: `${itsPackageId}::service::CoinRegistered<${coinType}>`, - }, - }); - const tokenId = eventData.data[0].parsedJson.token_id.id; - - return [tokenId, coinType, coinObjectId]; -} - -module.exports = { - registerInterchainToken, -}; - -if (require.main === module) { - const name = process.argv[2] || 'Test Token'; - const symbol = process.argv[3] || 'TT'; - const decimals = process.argv[4] || 6; - const env = process.argv[5] || 'localnet'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - const itsInfo = getConfig('its', env); - const [tokenId, coinType] = await registerInterchainToken(client, keypair, itsInfo, name, symbol, decimals); - - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - - tx = new TransactionBlock(); - - const tokenIdObj = tx.moveCall({ - target: `${itsPackageId}::token_id::from_address`, - arguments: [tx.pure.address(tokenId)], - typeArguments: [], - }); - - tx.moveCall({ - target: `${itsPackageId}::its::token_name`, - arguments: [tx.object(itsObjectId), tokenIdObj], - typeArguments: [coinType], - }); - - tx.moveCall({ - target: `${itsPackageId}::its::token_symbol`, - arguments: [tx.object(itsObjectId), tokenIdObj], - typeArguments: [coinType], - }); - - tx.moveCall({ - target: `${itsPackageId}::its::token_decimals`, - arguments: [tx.object(itsObjectId), tokenIdObj], - typeArguments: [coinType], - }); - - let resp = await client.devInspectTransactionBlock({ - sender: keypair.getPublicKey().toSuiAddress(), - transactionBlock: tx, - }); - - const bcs = new BCS(getSuiMoveConfig()); - - { - const name = bcs.de('string', new Uint8Array(resp.results[1].returnValues[0][0])); - const symbol = bcs.de('string', new Uint8Array(resp.results[2].returnValues[0][0])); - const decimals = bcs.de('u8', new Uint8Array(resp.results[3].returnValues[0][0])); - console.log(name, symbol, decimals); - } - })(); -} diff --git a/scripts/its/send-token.js b/scripts/its/send-token.js deleted file mode 100644 index dcdbc85a..00000000 --- a/scripts/its/send-token.js +++ /dev/null @@ -1,125 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); - -const { arrayify, defaultAbiCoder } = require('ethers/lib/utils'); -const { registerInterchainToken } = require('./register-token'); -const { getConfig } = require('../utils'); - -async function sendInterchainToken(client, keypair, itsInfo, tokenId, coin, destinationChain, destiantionAddress) { - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - - let tx = new TransactionBlock(); - - let tokenIdObj = tx.moveCall({ - target: `${itsPackageId}::token_id::from_address`, - arguments: [tx.pure(tokenId)], - typeArguments: [], - }); - - tx.moveCall({ - target: `${itsPackageId}::its::get_registered_coin_type`, - arguments: [tx.object(itsObjectId), tokenIdObj], - typeArguments: [], - }); - - let resp = await client.devInspectTransactionBlock({ - sender: keypair.getPublicKey().toSuiAddress(), - transactionBlock: tx, - }); - - const bcs = new BCS(getSuiMoveConfig()); - - const coinType = bcs.de('string', new Uint8Array(resp.results[1].returnValues[0][0])); - - tx = new TransactionBlock(); - - tokenIdObj = tx.moveCall({ - target: `${itsPackageId}::token_id::from_address`, - arguments: [tx.pure(tokenId)], - typeArguments: [], - }); - - tx.moveCall({ - target: `${itsPackageId}::service::interchain_transfer`, - arguments: [ - tx.object(itsObjectId), - tokenIdObj, - tx.object(coin), - tx.pure.string(destinationChain), - tx.pure(String.fromCharCode(...arrayify(destiantionAddress))), - tx.pure(''), - ], - typeArguments: [coinType], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -if (require.main === module) { - const env = process.argv[2] || 'localnet'; - const destinationChain = process.argv[3] || 'Ethereum'; - const destiantionAddress = process.argv[4] || '0x1234'; - const amount = process.argv[5] || 1234; - const name = process.argv[6] || 'Test Token'; - const symbol = process.argv[7] || 'TT'; - const decimals = process.argv[8] || 6; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - const itsInfo = getConfig('its', env); - const axelarInfo = getConfig('axelar', env); - - const [tokenId, coinType] = await registerInterchainToken(client, keypair, itsInfo, name, symbol, decimals, amount); - - let resp = await client.getCoins({ - owner: keypair.getPublicKey().toSuiAddress(), - coinType: coinType, - }); - coin = resp.data[0].coinObjectId; - - await sendInterchainToken(client, keypair, itsInfo, tokenId, coin, destinationChain, destiantionAddress); - - const eventData = await client.queryEvents({ - query: { - MoveEventType: `${axelarInfo.packageId}::gateway::ContractCall`, - }, - }); - const payload = eventData.data[0].parsedJson.payload; - { - const [, tokenId, sourceAddress, destinationAddress, amount, data] = defaultAbiCoder.decode( - ['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], - payload, - ); - console.log([tokenId, sourceAddress, destinationAddress, Number(amount), data]); - } - })(); -} diff --git a/scripts/its/set-trusted-address.js b/scripts/its/set-trusted-address.js deleted file mode 100644 index 2dadfafb..00000000 --- a/scripts/its/set-trusted-address.js +++ /dev/null @@ -1,110 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { defaultAbiCoder, keccak256, arrayify } = require('ethers/lib/utils'); -const { getBcsForGateway, approveContractCall } = require('../gateway'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { BCS, getSuiMoveConfig } = require('@mysten/bcs'); -const { getConfig } = require('../utils'); - -async function setTrustedAddresses(client, keypair, envAlias, chainNames, trustedAddresses) { - const itsInfo = getConfig('its', envAlias); - const itsPackageId = itsInfo.packageId; - const itsObjectId = itsInfo['its::ITS'].objectId; - - const axelarInfo = getConfig('axelar', envAlias); - const axelarPackageId = axelarInfo.packageId; - - const governance = getConfig('governance', envAlias)['governance::Governance']; - - const bcs = new BCS(getSuiMoveConfig()); - bcs.registerStructType('TrustedAddressInfo', { - chainNames: 'vector', - trustedAddresses: 'vector', - }); - - const trustedAddressInfo = bcs - .ser('TrustedAddressInfo', { - chainNames: chainNames, - trustedAddresses: trustedAddresses, - }) - .toBytes(); - const payload = defaultAbiCoder.encode( - ['bytes32', 'bytes'], - ['0x2af37a0d5d48850a855b1aaaf57f726c107eb99b40eabf4cc1ba30410cfa2f68', trustedAddressInfo], - ); - - const payloadHash = keccak256(payload); - - const commandId = await approveContractCall( - client, - keypair, - axelarInfo, - governance.trusted_source_chain, - governance.trusted_source_address, - itsInfo['its::ITS'].channel, - payloadHash, - ); - - let tx = new TransactionBlock(); - - const ApprovedMessage = tx.moveCall({ - target: `${axelarPackageId}::gateway::take_approved_message`, - arguments: [ - tx.object(axelarInfo['gateway::Gateway'].objectId), - tx.pure.address(commandId), - tx.pure.string(governance.trusted_source_chain), - tx.pure.string(governance.trusted_source_address), - tx.pure.address(itsInfo['its::ITS'].channel), - tx.pure(bcs.ser('vector', arrayify(payload)).toBytes()), - ], - typeArguments: [], - }); - tx.moveCall({ - target: `${itsPackageId}::service::set_trusted_addresses`, - arguments: [tx.object(itsObjectId), tx.object(governance.objectId), ApprovedMessage], - typeArguments: [], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -module.exports = { - setTrustedAddresses, -}; - -if (require.main === module) { - const env = process.argv[2] || 'localnet'; - const chainName = process.argv[3] || 'Ethereum'; - const trustedAddress = process.argv[4] || '0x1234'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - - await setTrustedAddresses(client, keypair, env, [chainName], [trustedAddress]); - })(); -} diff --git a/scripts/publish-all.js b/scripts/publish-all.js deleted file mode 100644 index 1dcc047f..00000000 --- a/scripts/publish-all.js +++ /dev/null @@ -1,73 +0,0 @@ -require('dotenv').config(); -const { initializeGovernance, takeUpgradeCaps } = require('./governance'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { setSquidDiscovery } = require('./squid/discovery.js'); -const { publishPackageFull } = require('./publish-package'); -const { setItsDiscovery } = require('./its/discovery.js'); -const { requestSuiFromFaucet } = require('./utils'); - -async function publishAll(client, keypair, env) { - const upgradeCaps = {}; - const packageIds = {}; - - for (const packagePath of ['abi', 'axelar', 'governance', 'gas_service', 'its', 'squid']) { - console.log(packagePath); - - while (true) - try { - const { packageId, publishTxn } = await publishPackageFull(packagePath, client, keypair, env); - upgradeCaps[packagePath] = publishTxn.objectChanges.find((obj) => obj.objectType === '0x2::package::UpgradeCap'); - packageIds[packagePath] = packageId; - break; - } catch (e) { - console.log(e); - console.log(`Retrying for ${packagePath}`); - } - } - - await initializeGovernance(upgradeCaps.governance, client, keypair, env); - - await takeUpgradeCaps( - ['abi', 'axelar', 'gas_service', 'its'].map((packagePath) => upgradeCaps[packagePath]), - client, - keypair, - env, - ); - - await setItsDiscovery(client, keypair, env.alias); - await setSquidDiscovery(client, keypair, env.alias); -} - -module.exports = { - publishAll, -}; - -if (require.main === module) { - const env = ((arg) => { - switch (arg?.toLowerCase()) { - case 'localnet': - case 'devnet': - case 'testnet': - case 'mainnet': - return { alias: arg, url: getFullnodeUrl(arg) }; - default: - return JSON.parse(arg); - } - })(process.argv[2] || 'localnet'); - const faucet = process.argv[3]?.toLowerCase?.() === 'true'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: env.url }); - - if (faucet) { - requestSuiFromFaucet(env, address); - } - - await publishAll(client, keypair, env); - })(); -} diff --git a/scripts/publish-package.js b/scripts/publish-package.js deleted file mode 100644 index 78a3210c..00000000 --- a/scripts/publish-package.js +++ /dev/null @@ -1,139 +0,0 @@ -require('dotenv').config(); -const { setConfig, getFullObject, requestSuiFromFaucet } = require('./utils'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { SuiClient } = require('@mysten/sui.js/client'); -const { execSync } = require('child_process'); -const { parseEnv } = require('./utils'); -const tmp = require('tmp'); -const fs = require('fs'); -const path = require('path'); - -async function publishPackage(packageName, client, keypair) { - const toml = fs.readFileSync(`${__dirname}/../move/${packageName}/Move.toml`, 'utf8'); - fs.writeFileSync(`${__dirname}/../move/${packageName}/Move.toml`, fillAddresses(toml, '0x0', packageName)); - - // remove all controlled temporary objects on process exit - const address = keypair.getPublicKey().toSuiAddress(); - tmp.setGracefulCleanup(); - - const tmpobj = tmp.dirSync({ unsafeCleanup: true }); - - const { modules, dependencies } = JSON.parse( - execSync( - `sui move build --dump-bytecode-as-base64 --path ${path.join(__dirname, '/../move/', packageName)} --install-dir ${ - tmpobj.name - }`, - { - encoding: 'utf-8', - stdio: 'pipe', // silent the output - }, - ), - ); - - const tx = new TransactionBlock(); - const cap = tx.publish({ - modules, - dependencies, - }); - - // Transfer the upgrade capability to the sender so they can upgrade the package later if they want. - tx.transferObjects([cap], tx.pure(address)); - - const publishTxn = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - showContent: true, - }, - requestType: 'WaitForLocalExecution', - }); - if (publishTxn.effects?.status.status !== 'success') throw new Error('Publish Tx failed'); - - const packageId = (publishTxn.objectChanges?.filter((a) => a.type === 'published') ?? [])[0].packageId; - - console.info(`Published package ${packageId} from address ${address}}`); - - return { packageId, publishTxn }; -} - -function updateMoveToml(packageName, packageId) { - const path = `${__dirname}/../move/${packageName}/Move.toml`; - const toml = fs.readFileSync(path, 'utf8'); - fs.writeFileSync(path, fillAddresses(insertPublishedAt(toml, packageId), packageId, packageName)); -} - -function insertPublishedAt(toml, packageId) { - const lines = toml.split('\n'); - const versionLineIndex = lines.findIndex((line) => line.slice(0, 7) === 'version'); - - if (!(lines[versionLineIndex + 1].slice(0, 12) === 'published-at')) { - lines.splice(versionLineIndex + 1, 0, ''); - } - - lines[versionLineIndex + 1] = `published-at = "${packageId}"`; - return lines.join('\n'); -} - -function fillAddresses(toml, address, packageName) { - const lines = toml.split('\n'); - const addressesIndex = lines.findIndex((line) => line.slice(0, 11) === '[addresses]'); - - for (let i = addressesIndex + 1; i < lines.length; i++) { - const line = lines[i]; - const eqIndex = line.indexOf('='); - - if (eqIndex < 0 || line.slice(0, eqIndex - 1) !== packageName) { - continue; - } - - lines[i] = line.slice(0, eqIndex + 1) + ` "${address}"`; - } - - return lines.join('\n'); -} - -async function publishPackageFull(packageName, client, keypair, env) { - const { packageId, publishTxn } = await publishPackage(packageName, client, keypair); - const info = require(`${__dirname}/../move/${packageName}/info.json`); - const config = {}; - config.packageId = packageId; - - for (const singleton of info.singletons) { - const object = publishTxn.objectChanges.find((object) => object.objectType === `${packageId}::${singleton}`); - config[singleton] = await getFullObject(object, client); - } - - setConfig(packageName, env.alias, config); - updateMoveToml(packageName, packageId); - - return { packageId, publishTxn }; -} - -module.exports = { - publishPackage, - updateMoveToml, - publishPackageFull, -}; - -if (require.main === module) { - const packageName = process.argv[2] || 'axelar'; - const env = parseEnv(process.argv[3] || 'localnet'); - const faucet = process.argv[4]?.toLowerCase?.() === 'true'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: env.url }); - - if (faucet) { - await requestSuiFromFaucet(env, address); - } - - await publishPackageFull(packageName, client, keypair, env); - })(); -} diff --git a/scripts/squid/discovery.js b/scripts/squid/discovery.js deleted file mode 100644 index 9386d668..00000000 --- a/scripts/squid/discovery.js +++ /dev/null @@ -1,57 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { SuiClient } = require('@mysten/sui.js/client'); -const { getConfig } = require('../utils'); -async function setSquidDiscovery(client, keypair, env) { - const squid_info = getConfig('squid', env.alias); - const itsId = getConfig('its', env.alias)['its::ITS'].objectId; - const relayerDiscoveryId = getConfig('axelar', env.alias)['discovery::RelayerDiscovery'].objectId; - const tx = new TransactionBlock(); - console.log(squid_info['squid::Squid'].objectId, itsId, relayerDiscoveryId); - tx.moveCall({ - target: `${squid_info.packageId}::discovery::register_transaction`, - arguments: [tx.object(squid_info['squid::Squid'].objectId), tx.object(itsId), tx.object(relayerDiscoveryId)], - type_arguments: [], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -module.exports = { - setSquidDiscovery, -}; - -if (require.main === module) { - const env = process.argv[2] || 'localnet'; - - (async () => { - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - const keypair = Ed25519Keypair.fromSecretKey(privKey); - const address = keypair.getPublicKey().toSuiAddress(); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env), - recipient: address, - }); - } catch (e) { - console.log(e); - } - - await setSquidDiscovery(client, keypair, env); - })(); -} diff --git a/scripts/squid/squid.js b/scripts/squid/squid.js deleted file mode 100644 index b1ba1b4a..00000000 --- a/scripts/squid/squid.js +++ /dev/null @@ -1,586 +0,0 @@ -require('dotenv').config(); -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { publishInterchainToken } = require('../its/publish-interchain-token'); -const { publishPackageFull, publishPackage } = require('../publish-package'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { setTrustedAddresses } = require('../its/set-trusted-address'); -const { registerInterchainToken } = require('../its/register-token'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { hexlify, defaultAbiCoder } = require('ethers/lib/utils'); -const { parseEnv, setConfig, getConfig } = require('../utils'); -const { receiveCall } = require('../test-receive-call'); -const { setItsDiscovery } = require('../its/discovery'); -const { SuiClient } = require('@mysten/sui.js/client'); -const { - utils: { arrayify }, -} = require('ethers'); -const { bcs } = require('@mysten/bcs'); - -const deepbook = '0xdee9'; - -const tickSize = 1e6; -const lotSize = 1e3; -const amountBase = 1e6 * 1e9; -const amountQuote = amountBase; -const amount = lotSize * 1000000; -const sourceChain = 'sourceAddress'; -const sourceAddress = 'trustedITsAddress'; - -const SWEEP_DUST_SWAP_TYPE = 0; -const DEEPBOOK_SWAP_TYPE = 1; -const SUI_TRANSFER_SWAP_TYPE = 2; -const ITS_TRANSFER_SWAP_TYPE = 3; - -const MESSAGE_TYPE_INTERCHAIN_TRANSFER = 0; - -async function sleep(ms = 100) { - await new Promise((resolve) => { - setTimeout(resolve, ms); - }); -} - -async function placeLimitOrder(client, keypair, env, isBid, price, amount) { - const { pool, accountCap, base, quote } = getConfig('trading', env.alias); - - const tx = new TransactionBlock(); - if (isBid) { - const coin = tx.moveCall({ - target: `0x2::coin::split`, - arguments: [tx.object(quote.objectId), tx.pure(Math.floor((amount * price) / 1e9))], - typeArguments: [quote.type], - }); - - tx.moveCall({ - target: `0xdee9::clob_v2::deposit_quote`, - arguments: [tx.object(pool), coin, tx.object(accountCap)], - typeArguments: [base.type, quote.type], - }); - } else { - const coin = tx.moveCall({ - target: `0x2::coin::split`, - arguments: [tx.object(base.objectId), tx.pure(amount)], - typeArguments: [base.type], - }); - - tx.moveCall({ - target: `0xdee9::clob_v2::deposit_base`, - arguments: [tx.object(pool), coin, tx.object(accountCap)], - typeArguments: [base.type, quote.type], - }); - } - - tx.moveCall({ - target: `0xdee9::clob_v2::place_limit_order`, - arguments: [ - tx.object(pool), - tx.pure(0), - tx.pure(price), - tx.pure(amount), - tx.pure(0), - tx.pure(isBid), - tx.pure(10000000000000000000), - tx.pure(3), - tx.object('0x6'), - tx.object(accountCap), - ], - typeArguments: [base.type, quote.type], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -async function prepare(client, keypair, env) { - const address = keypair.getPublicKey().toSuiAddress(); - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env.alias), - recipient: address, - }); - } catch (e) { - console.log(e); - } - - //await publishPackageFull('trading', client, keypair, env); - - //const config = getConfig('trading', env.alias); - - const [baseId, baseType, baseCoin] = await registerInterchainToken( - client, - keypair, - getConfig('its', env.alias), - 'Base', - 'B', - 9, - amountBase, - ); - - const [quoteId, quoteType, quoteCoin] = await registerInterchainToken( - client, - keypair, - getConfig('its', env.alias), - 'Quote', - 'Q', - 9, - amountQuote, - ); - - let tx = new TransactionBlock(); - - const creationFee = tx.splitCoins(tx.gas, [tx.pure(100 * 1e9)]); - - tx.moveCall({ - target: `${deepbook}::clob_v2::create_pool`, - arguments: [tx.pure(tickSize), tx.pure(lotSize), creationFee], - typeArguments: [baseType, quoteType], - }); - - let account = tx.moveCall({ - target: `${deepbook}::clob_v2::create_account`, - arguments: [], - typeArguments: [], - }); - - tx.moveCall({ - target: `0x2::transfer::public_transfer`, - arguments: [account, tx.pure(keypair.toSuiAddress())], - typeArguments: ['0xdee9::custodian_v2::AccountCap'], - }); - - let result = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - - const pool = result.objectChanges.find((object) => object.objectType.startsWith('0xdee9::clob_v2::Pool<')).objectId; - const poolCap = result.objectChanges.find((object) => object.objectType.startsWith('0xdee9::clob_v2::PoolOwnerCap')).objectId; - const accountCap = result.objectChanges.find((object) => object.objectType.startsWith('0xdee9::custodian_v2::AccountCap')).objectId; - const suiCoin = result.objectChanges.find((object) => object.objectType.startsWith('0x2::coin::Coin<')).objectId; - - setConfig('trading', env.alias, { - pool, - accountCap, - base: { - type: baseType, - tokenId: baseId, - objectId: baseCoin, - }, - quote: { - type: quoteType, - tokenId: quoteId, - objectId: quoteCoin, - }, - suiCoin, - }); - - await sleep(500); - await placeLimitOrder(client, keypair, env, false, 1100e6, amountQuote); - await sleep(500); - await placeLimitOrder(client, keypair, env, true, 990e6, amountBase); - - console.log(`Prepare Done`); -} - -async function postpare(client, keypair, env) { - await setItsDiscovery(client, keypair, env.alias); - await sleep(300); - await setTrustedAddresses(client, keypair, env.alias, [sourceChain], [sourceAddress]); - - console.log(`Postpare Done`); -} - -async function placeLimitOrders(client, keypair, env, isBid, n = 10) { - if (isBid) { - for (let i = 0; i < n; i++) { - console.log(i); - const price = 1e9 - tickSize * Math.floor(1 + Math.random() * 10); - const amount = 1e9 * Math.floor(100 + Math.random() * 100); - try { - await placeLimitOrder(client, keypair, env, true, price, amount); - } catch (e) { - console.log(e); - i--; - } - } - } else { - for (let i = 0; i < n; i++) { - console.log(i); - const price = 1e9 + tickSize * Math.floor(1 + Math.random() * 10); - const amount = 1e9 * Math.floor(100 + Math.random() * 100); - try { - await placeLimitOrder(client, keypair, env, false, price, amount); - } catch (e) { - console.log(e); - i--; - } - } - } -} - -async function testBaseForQuote(client, keypair, env) { - //await placeLimitOrders(client, keypair, env, true, 10); - - const { pool, base, quote } = getConfig('trading', env.alias); - - const { packageId } = await publishPackage('trading', client, keypair); - const tx = new TransactionBlock(); - - tx.moveCall({ - target: `${packageId}::trading::predict_base_for_quote`, - arguments: [tx.object(pool), tx.pure(amount), tx.pure(lotSize), tx.object('0x6')], - typeArguments: [base.type, quote.type], - }); - - const coin = tx.moveCall({ - target: `0x2::coin::split`, - arguments: [tx.object(base.objectId), tx.pure(amount)], - typeArguments: [base.type], - }); - - const accountCap = tx.moveCall({ - target: `${deepbook}::clob_v2::create_account`, - arguments: [], - typeArguments: [], - }); - - const [leftover_base, leftover_quote] = tx.moveCall({ - target: `${deepbook}::clob_v2::swap_exact_base_for_quote`, - arguments: [ - tx.object(pool), - tx.pure(0), - accountCap, - tx.pure(amount), - coin, - tx.moveCall({ target: '0x2::coin::zero', typeArguments: [quote.type] }), - tx.object('0x6'), - ], - typeArguments: [base.type, quote.type], - }); - - tx.moveCall({ - target: `${deepbook}::custodian_v2::delete_account_cap`, - arguments: [accountCap], - typeArguments: [], - }); - - tx.moveCall({ - target: `0x2::transfer::public_transfer`, - arguments: [leftover_base, tx.pure(keypair.toSuiAddress())], - typeArguments: [`0x2::coin::Coin<${base.type}>`], - }); - tx.moveCall({ - target: `0x2::transfer::public_transfer`, - arguments: [leftover_quote, tx.pure(keypair.toSuiAddress())], - typeArguments: [`0x2::coin::Coin<${quote.type}>`], - }); - - const result = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - - const response = await client.queryEvents({ - query: { - MoveEventType: `${packageId}::trading::Event`, - }, - }); - console.log(response.data.map((event) => event.parsedJson)); - - const quoteCoinId = result.objectChanges.find((change) => change.objectType == `0x2::coin::Coin<${quote.type}>`).objectId; - const quoteCoin = await client.getObject({ - id: quoteCoinId, - options: { - showContent: true, - }, - }); - - const baseCoinId = result.objectChanges.find( - (change) => change.objectType == `0x2::coin::Coin<${base.type}>` && change.type === 'created', - ).objectId; - const baseCoin = await client.getObject({ - id: baseCoinId, - options: { - showContent: true, - }, - }); - - console.log({ - amount_left: baseCoin.data.content.fields.balance, - output: quoteCoin.data.content.fields.balance, - }); -} - -async function testQuoteForBase(client, keypair, env) { - await placeLimitOrders(client, keypair, env, false, 10); - - const { pool, base, quote } = getConfig('trading', env.alias); - - const { packageId } = await publishPackage('trading', client, keypair); - const tx = new TransactionBlock(); - - tx.moveCall({ - target: `${packageId}::trading::predict_quote_for_base`, - arguments: [tx.object(pool), tx.pure(amount), tx.pure(lotSize), tx.object('0x6')], - typeArguments: [base.type, quote.type], - }); - - const coin = tx.moveCall({ - target: `0x2::coin::split`, - arguments: [tx.object(quote.objectId), tx.pure(amount)], - typeArguments: [quote.type], - }); - - const accountCap = tx.moveCall({ - target: `${deepbook}::clob_v2::create_account`, - arguments: [], - typeArguments: [], - }); - - const [leftover_base, leftover_quote] = tx.moveCall({ - target: `${deepbook}::clob_v2::swap_exact_quote_for_base`, - arguments: [tx.object(pool), tx.pure(0), accountCap, tx.pure(amount), tx.object('0x6'), coin], - typeArguments: [base.type, quote.type], - }); - - tx.moveCall({ - target: `${deepbook}::custodian_v2::delete_account_cap`, - arguments: [accountCap], - typeArguments: [], - }); - - tx.moveCall({ - target: `0x2::transfer::public_transfer`, - arguments: [leftover_base, tx.pure(keypair.toSuiAddress())], - typeArguments: [`0x2::coin::Coin<${base.type}>`], - }); - tx.moveCall({ - target: `0x2::transfer::public_transfer`, - arguments: [leftover_quote, tx.pure(keypair.toSuiAddress())], - typeArguments: [`0x2::coin::Coin<${quote.type}>`], - }); - - const result = await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - - const response = await client.queryEvents({ - query: { - MoveEventType: `${packageId}::trading::Event`, - }, - }); - console.log(response.data.map((event) => event.parsedJson)); - - const quoteCoinId = result.objectChanges.find( - (change) => change.objectType == `0x2::coin::Coin<${quote.type}>` && change.type === 'created', - ).objectId; - const quoteCoin = await client.getObject({ - id: quoteCoinId, - options: { - showContent: true, - }, - }); - - const baseCoinId = result.objectChanges.find( - (change) => change.objectType == `0x2::coin::Coin<${base.type}>` && change.type === 'created', - ).objectId; - const baseCoin = await client.getObject({ - id: baseCoinId, - options: { - showContent: true, - }, - }); - - console.log({ - amount_left: quoteCoin.data.content.fields.balance, - output: baseCoin.data.content.fields.balance, - }); -} - -async function test(client, keypair, env) { - const address = bcs.fixedArray(32, bcs.u8()).transform({ - input: (id) => arrayify(id), - output: (id) => hexlify(id), - }); - - const squid_info = getConfig('squid', env.alias); - const { pool, base, quote } = getConfig('trading', env.alias); - const its_info = getConfig('its', env.alias); - - const swapInfoStruct = bcs.struct('SwapInfo', { - swap_data: bcs.vector(bcs.vector(bcs.u8())), - }); - - const deepbookSwapStruct = bcs.struct('DeepbookSwap', { - swap_type: bcs.u8(), - pool_id: address, - has_base: bcs.bool(), - min_out: bcs.u64(), - base_type: bcs.string(), - quote_type: bcs.string(), - lot_size: bcs.u64(), - should_sweep: bcs.bool(), - }); - - const sweepDust = bcs.struct('SweepDust', { - swap_type: bcs.u8(), - type: bcs.string(), - }); - - const suiTransfer = bcs.struct('SuiTransfer', { - swap_type: bcs.u8(), - type: bcs.string(), - destination: address, - }); - - const itsTransfer = bcs.struct('ItsTransfer', { - swap_type: bcs.u8(), - type: bcs.string(), - token_id: address, - destination_chain: bcs.string(), - destination_address: bcs.string(), - metadata: bcs.vector(bcs.u8()), - }); - - const swapInfoData = swapInfoStruct - .serialize({ - swap_data: [ - deepbookSwapStruct - .serialize({ - swap_type: DEEPBOOK_SWAP_TYPE, - pool_id: pool, - has_base: true, - min_out: 0, - base_type: base.type.substring(2), - quote_type: quote.type.substring(2), - lot_size: lotSize, - should_sweep: true, - }) - .toBytes(), - deepbookSwapStruct - .serialize({ - swap_type: DEEPBOOK_SWAP_TYPE, - pool_id: pool, - has_base: false, - min_out: 0, - base_type: base.type.substring(2), - quote_type: quote.type.substring(2), - lot_size: lotSize, - should_sweep: true, - }) - .toBytes(), - deepbookSwapStruct - .serialize({ - swap_type: DEEPBOOK_SWAP_TYPE, - pool_id: pool, - has_base: true, - min_out: 0, - base_type: base.type.substring(2), - quote_type: quote.type.substring(2), - lot_size: lotSize, - should_sweep: true, - }) - .toBytes(), - suiTransfer - .serialize({ - swap_type: SUI_TRANSFER_SWAP_TYPE, - type: quote.type.substring(2), - destination: keypair.toSuiAddress(), - }) - .toBytes(), - ], - }) - .toBytes(); - - const payload = defaultAbiCoder.encode( - ['uint256', 'bytes32', 'bytes', 'bytes', 'uint256', 'bytes'], - [MESSAGE_TYPE_INTERCHAIN_TRANSFER, base.tokenId, '0x', squid_info['squid::Squid'].channel, amount, swapInfoData], - ); - const receipt = await receiveCall( - client, - keypair, - getConfig('axelar', env.alias), - sourceChain, - sourceAddress, - its_info['its::ITS'].channel, - payload, - ); - - const quoteCoinId = receipt.objectChanges.find( - (change) => change.type === 'created' && change.objectType === `0x2::coin::Coin<${quote.type}>`, - ).objectId; - - const quoteCoin = await client.getObject({ - id: quoteCoinId, - options: { - showContent: true, - }, - }); - - console.log({ - output: quoteCoin.data.content.fields.balance, - }); -} - -async function registerTransaction(client, keypair, env) { - const squid_info = getConfig('squid', env.alias); - const itsId = getConfig('its', env.alias)['its::ITS'].objectId; - const relayerDiscoveryId = getConfig('axelar', env.alias)['discovery::RelayerDiscovery'].objectId; - const tx = new TransactionBlock(); - console.log(squid_info['squid::Squid'].objectId, itsId, relayerDiscoveryId); - tx.moveCall({ - target: `${squid_info.packageId}::discovery::register_transaction`, - arguments: [tx.object(squid_info['squid::Squid'].objectId), tx.object(itsId), tx.object(relayerDiscoveryId)], - type_arguments: [], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -(async () => { - const env = parseEnv(process.argv[2] || 'localnet'); - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - - // get the public key in a compressed format - const keypair = Ed25519Keypair.fromSecretKey(privKey); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: env.url }); - - await prepare(client, keypair, env); - await postpare(client, keypair, env); - await publishPackageFull('squid', client, keypair, env); - await registerTransaction(client, keypair, env); - await test(client, keypair, env); -})(); diff --git a/scripts/test-receive-call.js b/scripts/test-receive-call.js deleted file mode 100644 index c805c583..00000000 --- a/scripts/test-receive-call.js +++ /dev/null @@ -1,190 +0,0 @@ -require('dotenv').config(); - -const { BCS, getSuiMoveConfig, bcs: bcsEncoder } = require('@mysten/bcs'); -const { - utils: { keccak256, arrayify, hexlify }, -} = require('ethers'); -const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { approveContractCall } = require('./gateway'); - -async function receiveCall(client, keypair, axelarInfo, sourceChain, sourceAddress, destinationAddress, payload) { - const axelarPackageId = axelarInfo.packageId; - const gateway = axelarInfo['gateway::Gateway']; - const discovery = axelarInfo['discovery::RelayerDiscovery']; - const payloadHash = keccak256(payload); - - await approveContractCall(client, keypair, axelarInfo, sourceChain, sourceAddress, destinationAddress, payloadHash); - - const eventData = await client.queryEvents({ - query: { - MoveEventType: `${axelarPackageId}::gateway::ContractCallApproved`, - }, - }); - const event = eventData.data[0].parsedJson; - - const discoveryArg = [0]; - discoveryArg.push(...arrayify(discovery.objectId)); - const targetIdArg = [1]; - targetIdArg.push(...arrayify(event.target_id)); - let moveCalls = [ - { - function: { - package_id: axelarPackageId, - module_name: 'discovery', - name: 'get_transaction', - }, - arguments: [discoveryArg, targetIdArg], - type_arguments: [], - }, - ]; - let isFinal = false; - - while (!isFinal) { - const tx = new TransactionBlock(); - makeCalls(tx, moveCalls, payload); - const resp = await client.devInspectTransactionBlock({ - sender: keypair.getPublicKey().toSuiAddress(), - transactionBlock: tx, - }); - - const txData = resp.results[0].returnValues[0][0]; - const nextTx = getTransactionBcs().de('Transaction', new Uint8Array(txData)); - isFinal = nextTx.isFinal; - moveCalls = nextTx.move_calls; - } - - const tx = new TransactionBlock(); - const ApprovedMessage = tx.moveCall({ - target: `${axelarPackageId}::gateway::take_approved_message`, - arguments: [ - tx.object(gateway.objectId), - tx.pure(event.cmd_id), - tx.pure(event.source_chain), - tx.pure(event.source_address), - tx.pure(event.target_id), - tx.pure(String.fromCharCode(...arrayify(payload))), - ], - typeArguments: [], - }); - makeCalls(tx, moveCalls, payload, ApprovedMessage); - return await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); -} - -function makeCalls(tx, moveCalls, payload, ApprovedMessage) { - const returns = []; - - for (const call of moveCalls) { - let result = tx.moveCall(buildMoveCall(tx, call, payload, ApprovedMessage, returns)); - if (!Array.isArray(result)) result = [result]; - returns.push(result); - } -} - -function getTransactionBcs() { - const bcs = new BCS(getSuiMoveConfig()); - - // input argument for the tx - bcs.registerStructType('Function', { - package_id: 'address', - module_name: 'string', - name: 'string', - }); - bcs.registerStructType('MoveCall', { - function: 'Function', - arguments: 'vector>', - type_arguments: 'vector', - }); - bcs.registerStructType('Transaction', { - isFinal: 'bool', - move_calls: 'vector', - }); - return bcs; -} - -function buildMoveCall(tx, moveCallInfo, payload, callContractObj, previousReturns) { - const decodeArgs = (args, tx) => - args.map((arg) => { - if (arg[0] === 0) { - return tx.object(hexlify(arg.slice(1))); - } else if (arg[0] === 1) { - return tx.pure(new Uint8Array(arg.slice(1))); - } else if (arg[0] === 2) { - return callContractObj; - } else if (arg[0] === 3) { - return tx.pure(bcsEncoder.vector(bcsEncoder.u8()).serialize(arrayify(payload))); - } else if (arg[0] === 4) { - return previousReturns[arg[1]][arg[2]]; - } - - throw new Error(`Invalid argument prefix: ${arg[0]}`); - }); - const decodeDescription = (description) => `${description.package_id}::${description.module_name}::${description.name}`; - return { - target: decodeDescription(moveCallInfo.function), - arguments: decodeArgs(moveCallInfo.arguments, tx), - typeArguments: moveCallInfo.type_arguments, - }; -} - -module.exports = { - receiveCall, - getTransactionBcs, -}; - -if (require.main === module) { - (async () => { - const env = process.argv[2] || 'localnet'; - const axelarInfo = require('../info/axelar.json')[env]; - const testInfo = require('../info/test.json')[env]; - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - - const discovery = axelarInfo['discovery::RelayerDiscovery']; - - // get the public key in a compressed format - const keypair = Ed25519Keypair.fromSecretKey(privKey); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: getFullnodeUrl(env) }); - - const testPackageId = testInfo.packageId; - const test = testInfo['test::Singleton']; - - const payload = '0x1234'; - - const tx = new TransactionBlock(); - tx.moveCall({ - target: `${testPackageId}::test::register_transaction`, - arguments: [tx.object(discovery.objectId), tx.object(test.objectId)], - }); - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - - await receiveCall(client, keypair, axelarInfo, 'Ethereum', '0x0', test.channel, payload); - - const event = ( - await client.queryEvents({ - query: { - MoveEventType: `${testPackageId}::test::Executed`, - }, - }) - ).data[0].parsedJson; - - if (hexlify(event.data) !== payload) throw new Error(`Emmited payload missmatch: ${hexlify(event.data)} != ${payload}`); - })(); -} diff --git a/scripts/test-send-call.js b/scripts/test-send-call.js deleted file mode 100644 index 46849a35..00000000 --- a/scripts/test-send-call.js +++ /dev/null @@ -1,60 +0,0 @@ -require('dotenv').config(); - -const { SuiClient } = require('@mysten/sui.js/client'); - -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { TransactionBlock } = require('@mysten/sui.js/transactions'); -const { - utils: { hexlify }, -} = require('ethers'); - -const { toPure, parseEnv } = require('./utils'); - -(async () => { - const env = parseEnv(process.argv[2] || 'localnet'); - const destinationChain = process.argv[3] || 'ethereum'; - const destinationAddress = process.argv[4] || '0x68B93045fe7D8794a7cAF327e7f855CD6Cd03BB8'; - const payload = '0x' + Buffer.from(process.argv[5] || 'hello world', 'utf8').toString('hex'); - const axelarInfo = require('../info/axelar.json')[env.alias]; - const testInfo = require('../info/test.json')[env.alias]; - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - - // get the public key in a compressed format - const keypair = Ed25519Keypair.fromSecretKey(privKey); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: env.url }); - - const axlearPackageId = axelarInfo.packageId; - const testPackageId = testInfo.packageId; - const test = testInfo['test::Singleton']; - - const tx = new TransactionBlock(); - - tx.moveCall({ - target: `${testPackageId}::test::send_call`, - arguments: [tx.object(test.objectId), tx.pure(destinationChain), tx.pure(destinationAddress), tx.pure(toPure(payload))], - typeArguments: [], - }); - - await client.signAndExecuteTransactionBlock({ - transactionBlock: tx, - signer: keypair, - options: { - showEffects: true, - showObjectChanges: true, - }, - requestType: 'WaitForLocalExecution', - }); - - const event = ( - await client.queryEvents({ - query: { - MoveEventType: `${axlearPackageId}::gateway::ContractCall`, - }, - }) - ).data[0].parsedJson; - console.log(event); - - if (hexlify(event.source_id) !== test.channel) - throw new Error(`Emmited payload missmatch: ${hexlify(event.source)} != ${test.channel}`); -})(); diff --git a/scripts/test-transfer-operatorship.js b/scripts/test-transfer-operatorship.js deleted file mode 100644 index 31773801..00000000 --- a/scripts/test-transfer-operatorship.js +++ /dev/null @@ -1,25 +0,0 @@ -require('dotenv').config(); -const { transferOperatorship, getRandomOperators } = require('./gateway'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { SuiClient } = require('@mysten/sui.js/client'); -const { parseEnv } = require('./utils'); -const fs = require('fs'); - -(async () => { - const env = parseEnv(process.argv[2] || 'localnet'); - const allInfo = require(`../info/axelar.json`); - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - - // get the public key in a compressed format - const keypair = Ed25519Keypair.fromSecretKey(privKey); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: env.url }); - - const operators = getRandomOperators(5); - - await transferOperatorship(allInfo[env.alias], client, keypair, operators.pubKeys, operators.weights, operators.threshold); - - allInfo[env.alias].activeOperators = operators; - - fs.writeFileSync(`info/axelar.json`, JSON.stringify(allInfo, null, 4)); -})(); diff --git a/scripts/transfer-genesis-operatorship.js b/scripts/transfer-genesis-operatorship.js deleted file mode 100644 index 368b818c..00000000 --- a/scripts/transfer-genesis-operatorship.js +++ /dev/null @@ -1,27 +0,0 @@ -require('dotenv').config(); -const { transferOperatorship, getAmplifierWorkers } = require('./gateway'); -const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); -const { SuiClient } = require('@mysten/sui.js/client'); -const { parseEnv } = require('./utils'); -const fs = require('fs'); - -(async () => { - const env = parseEnv(process.argv[2] || 'localnet'); - const rpc = process.argv[3] || 'http://localhost:26657'; - const proverAddr = process.argv[4]; - const allInfo = require(`../info/axelar.json`); - const privKey = Buffer.from(process.env.SUI_PRIVATE_KEY, 'hex'); - - // get the public key in a compressed format - const keypair = Ed25519Keypair.fromSecretKey(privKey); - // create a new SuiClient object pointing to the network you want to use - const client = new SuiClient({ url: env.url }); - - const operators = await getAmplifierWorkers(rpc, proverAddr); - - await transferOperatorship(allInfo[env.alias], client, keypair, operators.pubKeys, operators.weights, operators.threshold); - - allInfo[env.alias].activeOperators = operators; - - fs.writeFileSync(`info/axelar.json`, JSON.stringify(allInfo, null, 4)); -})(); diff --git a/scripts/tx-builder.js b/scripts/tx-builder.js new file mode 100644 index 00000000..6ecac2b3 --- /dev/null +++ b/scripts/tx-builder.js @@ -0,0 +1,213 @@ +const { TransactionBlock } = require('@mysten/sui.js/transactions'); +const { bcs } = require('@mysten/bcs'); +const { + utils: { arrayify, hexlify }, +} = require('ethers'); + +function getObject(tx, object) { + if (Array.isArray(object)) { + object = hexlify(object); + } + + if (typeof object === 'string') { + return tx.object(object); + } + + return object; +} + +function getTypeName(type) { + function get(type) { + let name = `${type.address}::${type.module}::${type.name}`; + + if (type.typeArguments.length > 0) { + name += type.typeArguments.join(','); + } + + return name; + } + + if (type.Struct) { + return get(type.Struct); + } else if (type.Reference) { + return getTypeName(type.Reference); + } else if (type.MutableReference) { + return getTypeName(type.MutableReference); + } else if (type.Vector) { + return `vector<${getTypeName(type.Vector)}>`; + } + + return type.toLowerCase(); +} + +function getNestedStruct(tx, type, arg) { + let inside = type; + + while (inside.Vector) { + inside = inside.Vector; + } + + if (!inside.Struct && !inside.Reference && !inside.MutableReference) { + return null; + } + + if (isString(inside)) { + return null; + } + + if (type.Struct || type.Reference || type.MutableReference) { + return getObject(tx, arg); + } + + if (!type.Vector) return null; + const nested = arg.map((arg) => getNestedStruct(tx, type.Vector, arg)); + const typeName = getTypeName(type.Vector); + return tx.makeMoveVec({ + type: typeName, + objects: nested, + }); +} + +function serialize(tx, type, arg) { + const struct = getNestedStruct(tx, type, arg); + + if (struct) { + return struct; + } + + bcs.address = () => + bcs.fixedArray(32, bcs.u8()).transform({ + input: (id) => arrayify(id), + output: (id) => hexlify(id), + }); + + const vectorU8 = () => + bcs.vector(bcs.u8()).transform({ + input(input) { + if (typeof input === 'string') input = arrayify(input); + return input; + }, + }); + + const serializer = (type) => { + if (isString(type)) { + return bcs.string(); + } + + if (typeof type === 'string') { + return bcs[type.toLowerCase()](); + } else if (type.Vector) { + if (type.Vector === 'U8') { + return vectorU8(); + } + + return bcs.vector(serializer(type.Vector)); + } + + return null; + }; + + return tx.pure(serializer(type).serialize(arg).toBytes()); +} + +function isTxContext(parameter) { + parameter = parameter.MutableReference; + if (!parameter) return false; + parameter = parameter.Struct; + if (!parameter) return false; + return parameter.address === '0x2' && parameter.module === 'tx_context' && parameter.name === 'TxContext'; +} + +function isString(parameter) { + if (parameter.MutableReference) parameter = parameter.MutableReference; + + if (parameter.Reference) parameter = parameter.Reference; + + parameter = parameter.Struct; + + if (!parameter) return false; + + const isAsciiString = parameter.address === '0x1' && parameter.module === 'ascii' && parameter.name === 'String'; + const isStringString = parameter.address === '0x1' && parameter.module === 'string' && parameter.name === 'String'; + + return isAsciiString || isStringString; +} + +class TxBuilder { + constructor(client) { + this.client = client; + this.tx = new TransactionBlock(); + } + + async moveCall(target, args, typeArguments = []) { + // If target is string, convert to object that `getNormalizedMoveFunction` accepts. + if (typeof target === 'string') { + const first = target.indexOf(':'); + const last = target.indexOf(':', first + 2); + const packageId = target.slice(0, first); + const module = target.slice(first + 2, last); + const functionName = target.slice(last + 2); + target = { + package: packageId, + module, + function: functionName, + }; + } + + const moveFn = await this.client.getNormalizedMoveFunction(target); + + let length = moveFn.parameters.length; + + if (isTxContext(moveFn.parameters[length - 1])) { + length = length - 1; + } + + if (length !== args.length) { + throw new Error( + `Function ${target.package}::${target.module}::${target.function} takes ${moveFn.parameters.length} arguments but given ${args.length}`, + ); + } + + const convertedArgs = args.map((arg, index) => serialize(this.tx, moveFn.parameters[index], arg)); + + return this.tx.moveCall({ + target: `${target.package}::${target.module}::${target.function}`, + arguments: convertedArgs, + typeArguments, + }); + } + + async signAndExecute(keypair, options) { + const result = await this.client.signAndExecuteTransactionBlock({ + transactionBlock: this.tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + ...options, + }, + }); + + return result; + } + + async devInspect(sender, options) { + const result = await this.client.devInspectTransactionBlock({ + transactionBlock: this.tx, + sender, + + options: { + showEffects: true, + showObjectChanges: true, + showContent: true, + ...options, + }, + }); + return result; + } +} + +module.exports = { + TxBuilder, +}; diff --git a/scripts/utils.js b/scripts/utils.js deleted file mode 100644 index b722b17b..00000000 --- a/scripts/utils.js +++ /dev/null @@ -1,158 +0,0 @@ -const { arrayify } = require('ethers/lib/utils'); -const fs = require('fs'); - -const configs = {}; -const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); -const { getFullnodeUrl } = require('@mysten/sui.js/client'); - -function toPure(hexString) { - return String.fromCharCode(...arrayify(hexString)); -} - -function getModuleNameFromSymbol(symbol) { - function isNumber(char) { - return char >= '0' && char <= '9'; - } - - function isLowercase(char) { - return char >= 'a' && char <= 'z'; - } - - function isUppercase(char) { - return char >= 'A' && char <= 'Z'; - } - - let i = 0; - const length = symbol.length; - let moduleName = ''; - - while (isNumber(symbol[i])) { - i++; - } - - while (i < length) { - const char = symbol[i]; - - if (isLowercase(char) || isNumber(char)) { - moduleName += char; - } else if (isUppercase(char)) { - moduleName += char.toLowerCase(); - } else if (char === '_' || char === ' ') { - moduleName += '_'; - } - - i++; - } - - return moduleName; -} - -function getConfig(packagePath, envAlias) { - if (!configs[packagePath]) { - configs[packagePath] = fs.existsSync(`${__dirname}/../info/${packagePath}.json`) - ? JSON.parse(fs.readFileSync(`${__dirname}/../info/${packagePath}.json`)) - : {}; - } - - return configs[packagePath][envAlias]; -} - -function setConfig(packagePath, envAlias, config) { - if (!configs[packagePath]) { - try { - configs[packagePath] = require(`${__dirname}/../info/${packagePath}.json`); - } catch (e) { - switch (e.code) { - case 'MODULE_NOT_FOUND': - case undefined: - configs[packagePath] = {}; - break; - default: - throw e; - } - } - } - - configs[packagePath][envAlias] = config; - - if (!fs.existsSync(`${__dirname}/../info`)) { - fs.mkdirSync(`${__dirname}/../info`); - } - - fs.writeFileSync(`${__dirname}/../info/${packagePath}.json`, JSON.stringify(configs[packagePath], null, 4)); -} - -async function requestSuiFromFaucet(env, address) { - try { - await requestSuiFromFaucetV0({ - // use getFaucetHost to make sure you're using correct faucet address - // you can also just use the address (see Sui Typescript SDK Quick Start for values) - host: getFaucetHost(env.alias), - recipient: address, - }); - } catch (e) { - console.log(e); - } -} - -async function getFullObject(object, client) { - for (const field of ['type', 'sender', 'owner']) { - if (object[field]) { - delete object[field]; - } - } - - const objectResponce = await client.getObject({ - id: object.objectId, - options: { - showContent: true, - }, - }); - const fields = objectResponce.data.content.fields; - - function decodeFields(fields, object) { - for (const key in fields) { - if (key === 'id') continue; - - if (fields[key].fields) { - if (!fields[key].fields.id) { - object[key] = {}; - decodeFields(fields[key].fields, object[key]); - } else { - object[key] = fields[key].fields.id.id || fields[key].fields.id; - } - } else if (fields[key].id) { - object[key] = fields[key].id; - } else { - object[key] = fields[key]; - } - } - - return object; - } - - decodeFields(fields, object); - return object; -} - -function parseEnv(arg) { - switch (arg?.toLowerCase()) { - case 'localnet': - case 'devnet': - case 'testnet': - case 'mainnet': - return { alias: arg, url: getFullnodeUrl(arg) }; - default: - return JSON.parse(arg); - } -} - -module.exports = { - toPure, - getModuleNameFromSymbol, - getConfig, - setConfig, - getFullObject, - parseEnv, - requestSuiFromFaucet, -}; diff --git a/src/bcs.ts b/src/bcs.ts new file mode 100644 index 00000000..16f1d206 --- /dev/null +++ b/src/bcs.ts @@ -0,0 +1,118 @@ +import { bcs } from '@mysten/sui.js/bcs'; + +function getAxelarStructs() { + const Bytes32 = bcs.Address; + + const Message = bcs.struct('Message', { + source_chain: bcs.String, + message_id: bcs.String, + source_address: bcs.String, + destination_id: bcs.Address, + payload_hash: Bytes32, + }); + + const WeightedSigner = bcs.struct('WeightedSigner', { + pubkey: bcs.vector(bcs.U8), + weight: bcs.U128, + }); + + const WeightedSigners = bcs.struct('WeightedSigners', { + signers: bcs.vector(WeightedSigner), + threshold: bcs.U128, + nonce: Bytes32, + }); + + const Signature = bcs.vector(bcs.U8); + + const Proof = bcs.struct('Proof', { + signers: WeightedSigners, + signatures: bcs.vector(Signature), + }); + + const MessageToSign = bcs.struct('MessageToSign', { + domain_separator: Bytes32, + signers_hash: Bytes32, + data_hash: Bytes32, + }); + + const Function = bcs.struct('Function', { + package_id: bcs.Address, + module_name: bcs.String, + name: bcs.String, + }); + + /// Arguments are prefixed with: + /// - 0 for objects followed by exactly 32 bytes that cointain the object id + /// - 1 for pures followed by the bcs encoded form of the pure + /// - 2 for the call contract object, followed by nothing (to be passed into the target function) + /// - 3 for the payload of the contract call (to be passed into the intermediate function) + /// - 4 for an argument returned from a previous move call, followed by a u8 specified which call to get the return of (0 for the first transaction AFTER the one that gets ApprovedMessage out), and then another u8 specifying which argument to input. + const MoveCall = bcs.struct('MoveCall', { + function: Function, + arguments: bcs.vector(bcs.vector(bcs.U8)), + type_arguments: bcs.vector(bcs.String), + }); + + const Transaction = bcs.struct('Transaction', { + is_final: bcs.Bool, + move_calls: bcs.vector(MoveCall), + }); + + const EncodedMessage = bcs.struct('EncodedMessage', { + message_type: bcs.U8, + data: bcs.vector(bcs.U8), + }); + + return { + Bytes32, + Message, + WeightedSigner, + WeightedSigners, + Signature, + Proof, + MessageToSign, + Function, + MoveCall, + Transaction, + EncodedMessage, + }; +} + +function getSquidStructs() { + const DeepbookV2SwapData = bcs.struct('DeepbookV2SwapData', { + swap_type: bcs.U8, + pool_id: bcs.Address, + has_base: bcs.Bool, + min_output: bcs.U64, + base_type: bcs.String, + quote_type: bcs.String, + lot_size: bcs.U64, + should_sweep: bcs.Bool, + }); + + const SuiTransferSwapData = bcs.struct('SuiTransferSwapData', { + swap_type: bcs.U8, + coin_type: bcs.String, + recipient: bcs.Address, + }); + + const ItsTransferSwapData = bcs.struct('ItsTransferSwapData', { + swap_type: bcs.U8, + coin_type: bcs.String, + token_id: bcs.Address, + destination_chain: bcs.String, + destination_address: bcs.vector(bcs.U8), + metadata: bcs.vector(bcs.U8), + }); + + return { + DeepbookV2SwapData, + SuiTransferSwapData, + ItsTransferSwapData, + }; +} + +export const bcsStructs = { + gateway: getAxelarStructs(), + squid: getSquidStructs(), +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..32d7443f --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export * from './bcs'; +export * from './tx-builder'; +export * from './utils'; diff --git a/src/tx-builder.ts b/src/tx-builder.ts new file mode 100644 index 00000000..36bcf3aa --- /dev/null +++ b/src/tx-builder.ts @@ -0,0 +1,317 @@ +import { execSync } from 'child_process'; +import path from 'path'; +import { bcs, BcsType } from '@mysten/bcs'; +import { + DevInspectResults, + SuiClient, + SuiMoveNormalizedType, + SuiObjectChange, + SuiTransactionBlockResponse, + SuiTransactionBlockResponseOptions, +} from '@mysten/sui.js/client'; +import { Keypair } from '@mysten/sui.js/dist/cjs/cryptography'; +import { TransactionBlock, TransactionObjectInput, TransactionResult } from '@mysten/sui.js/transactions'; +import { utils as ethersUtils } from 'ethers'; +import tmp from 'tmp'; +import { updateMoveToml } from './utils'; + +const { arrayify, hexlify } = ethersUtils; + +const objectCache = {} as { [id in string]: SuiObjectChange }; + +function updateCache(objectChanges: SuiObjectChange[]) { + for (const change of objectChanges) { + if (change.type === 'published') { + continue; + } + + objectCache[change.objectId] = change; + } +} + +function getObject(tx: TransactionBlock, object: TransactionObjectInput): TransactionObjectInput { + if (Array.isArray(object)) { + object = hexlify(object); + } + + if (typeof object === 'string') { + const cached = objectCache[object]; + + if (cached) { + // TODO: figure out how to load the object version/digest into the TransactionBlock because it seems impossible for non gas payment objects + const txObject = tx.object(object); + return txObject; + } + + return tx.object(object); + } + + return object; +} + +function getTypeName(type: SuiMoveNormalizedType): string { + type Type = { address: string; module: string; name: string; typeArguments: string[] }; + + function get(type: Type) { + let name = `${type.address}::${type.module}::${type.name}`; + + if (type.typeArguments.length > 0) { + name += `<${type.typeArguments.join(',')}>`; + } + + return name; + } + + if ('Struct' in (type as object)) { + return get((type as { Struct: Type }).Struct); + } else if ('Reference' in (type as object)) { + return getTypeName((type as { Reference: SuiMoveNormalizedType }).Reference); + } else if ('MutableReference' in (type as object)) { + return getTypeName((type as { MutableReference: SuiMoveNormalizedType }).MutableReference); + } else if ('Vector' in (type as object)) { + return `vector<${getTypeName((type as { Vector: SuiMoveNormalizedType }).Vector)}>`; + } + + return (type as string).toLowerCase(); +} + +function getNestedStruct(tx: TransactionBlock, type: SuiMoveNormalizedType, arg: TransactionObjectInput): null | TransactionObjectInput { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let inside = type as any; + + while ((inside as { Vector: SuiMoveNormalizedType }).Vector) { + inside = inside.Vector; + } + + if (!inside.Struct && !inside.Reference && !inside.MutableReference) { + return null; + } + + if (isString(inside)) { + return null; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if ((type as any).Struct || (type as any).Reference || (type as any).MutableReference) { + return getObject(tx, arg); + } + + if (!(type as { Vector: SuiMoveNormalizedType }).Vector) return null; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const nested = (arg as any).map((arg: any) => getNestedStruct(tx, (type as any).Vector, arg)); + const typeName = getTypeName((type as { Vector: SuiMoveNormalizedType }).Vector); + return tx.makeMoveVec({ + type: typeName, + objects: nested, + }); +} + +function serialize( + tx: TransactionBlock, + type: SuiMoveNormalizedType, + arg: TransactionObjectInput, +): + | TransactionObjectInput + | { + index: number; + kind: 'Input'; + type: 'pure'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value?: any; + } { + const struct = getNestedStruct(tx, type, arg); + + if (struct) { + return struct; + } + + const vectorU8 = () => + bcs.vector(bcs.u8()).transform({ + input(val: unknown) { + if (typeof val === 'string') val = arrayify(val); + return val as Iterable & { length: number }; + }, + output(value: number[]) { + return hexlify(value); + }, + }); + + const serializer = (type: SuiMoveNormalizedType): BcsType => { + if (isString(type)) { + return bcs.string() as BcsType; + } + + if (typeof type === 'string') { + if (type === 'Address') { + return bcs.fixedArray(32, bcs.u8()).transform({ + input: (id) => arrayify(id as number), + output: (id) => hexlify(id), + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (bcs as any)[(type as string).toLowerCase()](); + } else if ((type as { Vector: SuiMoveNormalizedType }).Vector) { + if ((type as { Vector: SuiMoveNormalizedType }).Vector === 'U8') { + return vectorU8() as BcsType; + } + + return bcs.vector(serializer((type as { Vector: SuiMoveNormalizedType }).Vector)) as BcsType; + } + + throw new Error(`Type ${JSON.stringify(type)} cannot be serialized`); + }; + + return tx.pure(serializer(type).serialize(arg).toBytes()); +} + +function isTxContext(parameter: SuiMoveNormalizedType): boolean { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let inside = parameter as any; + + if (inside.MutableReference) { + inside = inside.MutableReference.Struct; + if (!inside) return false; + } else if (inside.Reference) { + inside = inside.Reference.Struct; + if (!inside) return false; + } else { + return false; + } + + return inside.address === '0x2' && inside.module === 'tx_context' && inside.name === 'TxContext'; +} + +function isString(parameter: SuiMoveNormalizedType): boolean { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let asAny = parameter as any; + if (asAny.MutableReference) parameter = asAny.MutableReference; + if (asAny.Reference) asAny = asAny.Reference; + asAny = asAny.Struct; + if (!asAny) return false; + const isAsciiString = asAny.address === '0x1' && asAny.module === 'ascii' && asAny.name === 'String'; + const isStringString = asAny.address === '0x1' && asAny.module === 'string' && asAny.name === 'String'; + return isAsciiString || isStringString; +} + +class TxBuilder { + client: SuiClient; + tx: TransactionBlock; + constructor(client: SuiClient) { + this.client = client; + this.tx = new TransactionBlock(); + } + + async moveCall(moveCallInfo: { + arguments?: TransactionObjectInput[]; + typeArguments?: string[]; + target: `${string}::${string}::${string}` | { package: string; module: string; function: string }; + }): Promise { + let target = moveCallInfo.target; + + // If target is string, convert to object that `getNormalizedMoveFunction` accepts. + if (typeof target === 'string') { + const first = target.indexOf(':'); + const last = target.indexOf(':', first + 2); + const packageId = target.slice(0, first); + const module = target.slice(first + 2, last); + const functionName = target.slice(last + 2); + target = { + package: packageId, + module, + function: functionName, + }; + } + + const moveFn = await this.client.getNormalizedMoveFunction(target); + + let length = moveFn.parameters.length; + if (isTxContext(moveFn.parameters[length - 1])) length = length - 1; + if (!moveCallInfo.arguments) moveCallInfo.arguments = []; + if (length !== moveCallInfo.arguments.length) + throw new Error( + `Function ${target.package}::${target.module}::${target.function} takes ${moveFn.parameters.length} arguments but given ${moveCallInfo.arguments.length}`, + ); + + const convertedArgs = moveCallInfo.arguments.map((arg, index) => serialize(this.tx, moveFn.parameters[index], arg)); + + return this.tx.moveCall({ + target: `${target.package}::${target.module}::${target.function}`, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + arguments: convertedArgs as any, + typeArguments: moveCallInfo.typeArguments, + }); + } + + async publishPackage(packageName: string, moveDir: string = `${__dirname}/../move`): Promise { + updateMoveToml(packageName, '0x0', moveDir); + + tmp.setGracefulCleanup(); + + const tmpobj = tmp.dirSync({ unsafeCleanup: true }); + + const { modules, dependencies } = JSON.parse( + execSync(`sui move build --dump-bytecode-as-base64 --path ${path.join(moveDir, packageName)} --install-dir ${tmpobj.name}`, { + encoding: 'utf-8', + stdio: 'pipe', // silent the output + }), + ); + + return this.tx.publish({ + modules, + dependencies, + }); + } + + async publishPackageAndTransferCap(packageName: string, to: string, moveDir = `${__dirname}/../move`) { + const cap = await this.publishPackage(packageName, moveDir); + + this.tx.transferObjects([cap], to); + } + + async signAndExecute(keypair: Keypair, options: SuiTransactionBlockResponseOptions): Promise { + let result = await this.client.signAndExecuteTransactionBlock({ + transactionBlock: this.tx, + signer: keypair, + options: { + showEffects: true, + showObjectChanges: true, + ...options, + }, + }); + + if (!result.confirmedLocalExecution) { + while (true) { + try { + result = await this.client.getTransactionBlock({ + digest: result.digest, + options: { + showEffects: true, + showObjectChanges: true, + ...options, + }, + }); + break; + } catch (e) { + console.log(e); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + } + + updateCache(result.objectChanges as SuiObjectChange[]); + return result; + } + + async devInspect(sender: string): Promise { + const result = await this.client.devInspectTransactionBlock({ + transactionBlock: this.tx, + sender, + }); + return result; + } +} + +module.exports = { + TxBuilder, +}; diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..69bec017 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,89 @@ +import fs from 'fs'; +import { getFullnodeUrl } from '@mysten/sui.js/client'; + +export function getModuleNameFromSymbol(symbol: string) { + function isNumber(char: string) { + return char >= '0' && char <= '9'; + } + + function isLowercase(char: string) { + return char >= 'a' && char <= 'z'; + } + + function isUppercase(char: string) { + return char >= 'A' && char <= 'Z'; + } + + let i = 0; + const length = symbol.length; + let moduleName = ''; + + while (isNumber(symbol[i])) { + i++; + } + + while (i < length) { + const char = symbol[i]; + + if (isLowercase(char) || isNumber(char)) { + moduleName += char; + } else if (isUppercase(char)) { + moduleName += char.toLowerCase(); + } else if (char === '_' || char === ' ') { + moduleName += '_'; + } + + i++; + } + + return moduleName; +} + +export function updateMoveToml(packageName: string, packageId: string, moveDir: string = `${__dirname}/../move`) { + const path = `${moveDir}/${packageName}/Move.toml`; + + let toml = fs.readFileSync(path, 'utf8'); + + const lines = toml.split('\n'); + + const versionLineIndex = lines.findIndex((line: string) => line.slice(0, 7) === 'version'); + + if (!(lines[versionLineIndex + 1].slice(0, 12) === 'published-at')) { + lines.splice(versionLineIndex + 1, 0, ''); + } + + lines[versionLineIndex + 1] = `published-at = "${packageId}"`; + + const addressesIndex = lines.findIndex((line: string) => line.slice(0, 11) === '[addresses]'); + + for (let i = addressesIndex + 1; i < lines.length; i++) { + const line = lines[i]; + const eqIndex = line.indexOf('='); + + if ( + eqIndex < 0 || + line.slice(0, packageName.length) !== packageName || + line.slice(packageName.length, eqIndex) !== Array(eqIndex - packageName.length + 1).join(' ') + ) { + continue; + } + + lines[i] = line.slice(0, eqIndex + 1) + ` "${packageId}"`; + } + + toml = lines.join('\n'); + + fs.writeFileSync(path, toml); +} + +export function parseEnv(arg: string) { + switch (arg?.toLowerCase()) { + case 'localnet': + case 'devnet': + case 'testnet': + case 'mainnet': + return { alias: arg, url: getFullnodeUrl(arg as 'localnet' | 'devnet' | 'testnet' | 'mainnet') }; + default: + return JSON.parse(arg); + } +} diff --git a/test/axelar-gateway.js b/test/axelar-gateway.js new file mode 100644 index 00000000..ac3048df --- /dev/null +++ b/test/axelar-gateway.js @@ -0,0 +1,230 @@ +const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client'); +const { Ed25519Keypair } = require('@mysten/sui.js/keypairs/ed25519'); +const { Secp256k1Keypair } = require('@mysten/sui.js/keypairs/secp256k1'); +const { requestSuiFromFaucetV0, getFaucetHost } = require('@mysten/sui.js/faucet'); +const { publishPackage, getRandomBytes32, expectRevert, expectEvent } = require('./utils'); +const { TxBuilder } = require('../dist/tx-builder'); +const { + bcsStructs: { axelarStructs }, +} = require('../dist/bcs'); +const { arrayify, hexlify, keccak256 } = require('ethers/lib/utils'); +const secp256k1 = require('secp256k1'); + +const COMMAND_TYPE_ROTATE_SIGNERS = 1; + +describe('Axelar Gateway', () => { + let client; + const operator = Ed25519Keypair.fromSecretKey(arrayify(getRandomBytes32())); + const deployer = Ed25519Keypair.fromSecretKey(arrayify(getRandomBytes32())); + const keypair = Ed25519Keypair.fromSecretKey(arrayify(getRandomBytes32())); + const domainSeparator = getRandomBytes32(); + let operatorKeys; + let signers; + let nonce = 0; + let packageId; + let gateway; + + function calculateNextSigners() { + operatorKeys = [getRandomBytes32(), getRandomBytes32(), getRandomBytes32()]; + const pubkeys = operatorKeys.map((key) => Secp256k1Keypair.fromSecretKey(arrayify(key)).getPublicKey().toRawBytes()); + const keys = operatorKeys.map((key, index) => { + return { privkey: key, pubkey: pubkeys[index] }; + }); + keys.sort((key1, key2) => { + for (let i = 0; i < 33; i++) { + if (key1.pubkey[i] < key2.pubkey[i]) return -1; + if (key1.pubkey[i] > key2.pubkey[i]) return 1; + } + + return 0; + }); + operatorKeys = keys.map((key) => key.privkey); + signers = { + signers: keys.map((key) => { + return { pubkey: key.pubkey, weight: 1 }; + }), + threshold: 2, + nonce: hexlify([++nonce]), + }; + } + + function hashMessage(data) { + const toHash = new Uint8Array(data.length + 1); + toHash[0] = COMMAND_TYPE_ROTATE_SIGNERS; + toHash.set(data, 1); + + return keccak256(toHash); + } + + function sign(privKeys, messageToSign) { + const signatures = []; + + for (const privKey of privKeys) { + const { signature, recid } = secp256k1.ecdsaSign(arrayify(keccak256(messageToSign)), arrayify(privKey)); + signatures.push(new Uint8Array([...signature, recid])); + } + + return signatures; + } + + async function sleep(ms = 1000) { + await new Promise((resolve) => setTimeout(resolve, ms)); + } + + const minimumRotationDelay = 1000; + + before(async () => { + client = new SuiClient({ url: getFullnodeUrl('localnet') }); + + await Promise.all( + [operator, deployer, keypair].map((keypair) => + requestSuiFromFaucetV0({ + host: getFaucetHost('localnet'), + recipient: keypair.toSuiAddress(), + }), + ), + ); + + let result = await publishPackage(client, deployer, 'axelar_gateway'); + packageId = result.packageId; + const creatorCap = result.publishTxn.objectChanges.find( + (change) => change.objectType === `${packageId}::gateway::CreatorCap`, + ).objectId; + + calculateNextSigners(); + + const encodedSigners = axelarStructs.WeightedSigners.serialize(signers).toBytes(); + const builder = new TxBuilder(client); + + const separator = await builder.moveCall({ + target: `${packageId}::bytes32::new`, + arguments: [domainSeparator], + }); + + await builder.moveCall({ + target: `${packageId}::gateway::setup`, + arguments: [creatorCap, operator.toSuiAddress(), separator, minimumRotationDelay, encodedSigners, '0x6'], + }); + + result = await builder.signAndExecute(deployer); + + gateway = result.objectChanges.find((change) => change.objectType === `${packageId}::gateway::Gateway`).objectId; + }); + + describe('Signer Rotation', () => { + it('Should rotate signers', async () => { + await sleep(2000); + const proofSigners = signers; + const proofKeys = operatorKeys; + calculateNextSigners(); + + const encodedSigners = axelarStructs.WeightedSigners.serialize(signers).toBytes(); + + const hashed = hashMessage(encodedSigners); + + const message = axelarStructs.MessageToSign.serialize({ + domain_separator: domainSeparator, + signers_hash: keccak256(axelarStructs.WeightedSigners.serialize(proofSigners).toBytes()), + data_hash: hashed, + }).toBytes(); + + const signatures = sign(proofKeys, message); + const encodedProof = axelarStructs.Proof.serialize({ + signers: proofSigners, + signatures, + }).toBytes(); + + const builder = new TxBuilder(client); + + await builder.moveCall({ + target: `${packageId}::gateway::rotate_signers`, + arguments: [gateway, '0x6', encodedSigners, encodedProof], + }); + + await builder.signAndExecute(keypair); + }); + + it('Should not rotate to empty signers', async () => { + await sleep(2000); + const proofSigners = signers; + const proofKeys = operatorKeys; + + const encodedSigners = axelarStructs.WeightedSigners.serialize({ + signers: [], + threshold: 2, + nonce: hexlify([nonce + 1]), + }).toBytes(); + + const hashed = hashMessage(encodedSigners); + + const message = axelarStructs.MessageToSign.serialize({ + domain_separator: domainSeparator, + signers_hash: keccak256(axelarStructs.WeightedSigners.serialize(proofSigners).toBytes()), + data_hash: hashed, + }).toBytes(); + + const signatures = sign(proofKeys, message); + const encodedProof = axelarStructs.Proof.serialize({ + signers: proofSigners, + signatures, + }).toBytes(); + + const builder = new TxBuilder(client); + + await builder.moveCall({ + target: `${packageId}::gateway::rotate_signers`, + arguments: [gateway, '0x6', encodedSigners, encodedProof], + }); + + await expectRevert(builder, keypair, { + packageId, + module: 'weighted_signers', + function: 'peel', + code: 0, + }); + }); + }); + + describe('Contract Call', () => { + let channel; + before(async () => { + const builder = new TxBuilder(client); + + channel = await builder.moveCall({ + target: `${packageId}::channel::new`, + arguments: [], + typeArguments: [], + }); + + builder.tx.transferObjects([channel], keypair.toSuiAddress()); + + const response = await builder.signAndExecute(keypair); + + channel = response.objectChanges.find((change) => change.objectType === `${packageId}::channel::Channel`).objectId; + }); + + it('Make Contract Call', async () => { + const destinationChain = 'Destination Chain'; + const destinationAddress = 'Destination Address'; + const payload = '0x1234'; + const builder = new TxBuilder(client); + + await builder.moveCall({ + target: `${packageId}::gateway::call_contract`, + arguments: [channel, destinationChain, destinationAddress, payload], + typeArguments: [], + }); + + await expectEvent(builder, keypair, { + type: `${packageId}::gateway::ContractCall`, + arguments: { + destination_address: destinationAddress, + destination_chain: destinationChain, + payload: arrayify(payload), + payload_hash: keccak256(payload), + source_id: channel, + }, + }); + }); + }); +}); diff --git a/test/utils.js b/test/utils.js new file mode 100644 index 00000000..a7721d3e --- /dev/null +++ b/test/utils.js @@ -0,0 +1,87 @@ +const { keccak256, defaultAbiCoder } = require('ethers/lib/utils'); +const { TxBuilder } = require('../dist/tx-builder'); +const { updateMoveToml } = require('../dist/utils'); +const chai = require('chai'); +const { expect } = chai; + +async function publishPackage(client, keypair, packageName) { + const builder = new TxBuilder(client); + await builder.publishPackageAndTransferCap(packageName, keypair.toSuiAddress()); + const publishTxn = await builder.signAndExecute(keypair); + + const packageId = (publishTxn.objectChanges?.find((a) => a.type === 'published') ?? []).packageId; + + updateMoveToml(packageName, packageId); + return { packageId, publishTxn }; +} + +function getRandomBytes32() { + return keccak256(defaultAbiCoder.encode(['string'], [Math.random().toString()])); +} + +async function expectRevert(builder, keypair, error = {}) { + try { + await builder.signAndExecute(keypair); + throw new Error(`Expected revert with ${error} but exeuted successfully instead`); + } catch (e) { + const errorMessage = e.cause.effects.status.error; + let regexp = /address: (.*?),/; + const packageId = `0x${regexp.exec(errorMessage)[1]}`; + + regexp = /Identifier\("(.*?)"\)/; + const module = regexp.exec(errorMessage)[1]; + + regexp = /Some\("(.*?)"\)/; + const functionName = regexp.exec(errorMessage)[1]; + + regexp = /Some\(".*?"\) \}, (.*?)\)/; + const errorCode = parseInt(regexp.exec(errorMessage)[1]); + + if (error.packageId && error.packageId !== packageId) { + throw new Error(`Expected ${errorMessage} to match ${error}} but it didn't, ${error.packageId} !== ${packageId}`); + } + + if (error.module && error.module !== module) { + throw new Error(`Expected ${errorMessage} to match ${error}} but it didn't, ${error.module} !== ${module}`); + } + + if (error.function && error.function !== functionName) { + throw new Error(`Expected ${errorMessage} to match ${error}} but it didn't, ${error.function} !== ${functionName}`); + } + + if (error.code && error.code !== errorCode) { + throw new Error(`Expected ${errorMessage} to match ${error}} but it didn't, ${error.code} !== ${errorCode}`); + } + } +} + +async function expectEvent(builder, keypair, eventData = {}) { + const response = await builder.signAndExecute(keypair, { showEvents: true }); + + const event = response.events.find((event) => event.type === eventData.type); + + function compare(a, b) { + if (Array.isArray(a)) { + expect(a.length).to.equal(b.length); + + for (let i = 0; i < a.length; i++) { + compare(a[i], b[i]); + } + + return; + } + + expect(a).to.equal(b); + } + + for (const key of Object.keys(eventData.arguments)) { + compare(event.parsedJson[key], eventData.arguments[key]); + } +} + +module.exports = { + publishPackage, + getRandomBytes32, + expectRevert, + expectEvent, +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..4545c07e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + /* Language and Environment */ + "target": "es6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": ["es2020", "dom"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + + /* Modules */ + "module": "CommonJS" /* Specify what module code is generated. */, + + "resolveJsonModule": true, + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "declarationMap": true /* Create sourcemaps for d.ts files. */, + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + "rootDirs": ["./src", "src/__test__"] /* Specify the root folder within your source files. */, + "outDir": "dist" /* Specify an output folder for all emitted files. */, + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "strictNullChecks": true /* When type checking, take into account `null` and `undefined`. */, + + /* Completeness */ + "skipDefaultLibCheck": true /* Skip type checking .d.ts files that are included with TypeScript. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "src/__tests__/"] +}