From f6720a52f130c9b20bff39472ca476105542a7dc Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 14:42:12 +0500 Subject: [PATCH 01/31] chore: remove unused scripts from package.json --- contract/package.json | 11 ----------- package.json | 15 +-------------- ui/package.json | 4 +--- 3 files changed, 2 insertions(+), 28 deletions(-) diff --git a/contract/package.json b/contract/package.json index 7b1857a9..eedc9234 100644 --- a/contract/package.json +++ b/contract/package.json @@ -5,17 +5,6 @@ "description": "Agoric Orchestration Contract", "type": "module", "scripts": { - "start:docker": "docker compose up -d", - "docker:logs": "docker compose logs --tail 200 -f", - "docker:bash": "docker compose exec agd bash", - "docker:make": "docker compose exec agd make -C /workspace/contract", - "make:help": "make list", - "start": "make clean start", - "start2": "make clean start2", - "build2": "yarn build:deployer2", - "build:deployer": "rollup -c rollup.config.mjs", - "build:deployer2": "echo \"deployer2\"; agoric run scripts/build-contract-deployer.js", - "deploy": "make dev-working", "test": "ava", "lint": "tsc && eslint '**/*.js'", "lint:fix": "eslint --fix '**/*.js'" diff --git a/package.json b/package.json index a257b680..ae79769e 100644 --- a/package.json +++ b/package.json @@ -39,22 +39,9 @@ "protobufjs@npm:^7.2.5": "patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch" }, "scripts": { - "start:docker": "cd contract && docker compose up -d", - "stop:docker": "cd contract && docker compose down", - "docker:logs": "cd contract; docker compose logs --tail 200 -f", - "docker:bash": "cd contract; docker compose exec agd bash", - "docker:make": "cd contract; docker compose exec agd make -C /workspace/contract", - "make:help": "make -C contract list", - "start:contract": "cd contract && yarn start", - "integration-test": "cd contract && yarn ava ./test/orca-multichain.test.js", "start:ui": "cd ui && yarn dev", "format": "yarn prettier --write .github contract ui", - "lint:format": "yarn prettier --check .github contract ui", - "lint": "yarn lint:format && yarn workspaces foreach --all run lint", - "lint:fix": "yarn format && yarn workspaces foreach --all run lint:fix", - "test": "yarn workspaces foreach --all run test", - "build": "yarn workspaces foreach --all run build", - "postinstall": "npx patch-package" + "lint:format": "yarn prettier --check .github contract ui" }, "devDependencies": { "@types/node": "npm:20.16.8", diff --git a/ui/package.json b/ui/package.json index 41303c51..ff267980 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,9 +9,7 @@ "build": "tsc && NODE_OPTIONS=--max-old-space-size=4096 vite build", "lint": "yarn tsc && eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "lint:fix": "yarn lint --fix", - "preview": "vite preview", - "test": "exit 0", - "test:e2e": "exit 0" + "preview": "vite preview" }, "dependencies": { "@agoric/react-components": "0.2.1-dev-e6f79e0.0", From 4388e6914666a0161602d9ff5db6eae689467d8d Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 14:50:11 +0500 Subject: [PATCH 02/31] chore: remove unused startup files --- Makefile | 24 ------------ README-local-chain.md | 21 ----------- contract/scripts/run-chain.sh | 69 ----------------------------------- docker-compose.yml | 18 --------- 4 files changed, 132 deletions(-) delete mode 100644 Makefile delete mode 100644 README-local-chain.md delete mode 100755 contract/scripts/run-chain.sh delete mode 100644 docker-compose.yml diff --git a/Makefile b/Makefile deleted file mode 100644 index 147c1aa0..00000000 --- a/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -EXEC_OSMO = kubectl exec -i hermes-agoric-osmosis-0 -c relayer -- - -e2e: build build - yarn workspace dapp-agoric-orca-contract test; yarn workspace dapp-agoric-orca-contract build; yarn workspace dapp-agoric-orca-contract e2e -build: - yarn workspace dapp-agoric-orca-contract test; yarn workspace dapp-agoric-orca-contract build; -redeploy: - yarn workspace dapp-agoric-orca-contract deployc -test-orca: - yarn workspace dapp-agoric-orca-contract test -fund: - yarn workspace dapp-agoric-orca-contract fund -add-address: - yarn workspace dapp-agoric-orca-contract add:address -lint: - yarn workspace dapp-agoric-orca-contract lint -hermes-update: - $(EXEC_OSMO) hermes update client --host-chain agoriclocal --client 07-tendermint-1 || { \ - echo "'07-tendermint-1' failed, trying '07-tendermint-0'..."; \ - $(EXEC_OSMO) hermes update client --host-chain agoriclocal --client 07-tendermint-0; \ - } - - sleep 60 - make hermes-update \ No newline at end of file diff --git a/README-local-chain.md b/README-local-chain.md deleted file mode 100644 index 2cdc2a62..00000000 --- a/README-local-chain.md +++ /dev/null @@ -1,21 +0,0 @@ -# Agoric Local Chain with docker-compose - -To start a local agoric blockchain: - -```sh -docker compose up -d -``` - -**NOTE**: The image, which is several Gb, has to be pulled -and extracted the first time you start the docker application -services. - -Then use `docker-compose logs` etc. as usual. - -Some useful recipies are included in `Makefile`. -Use `yarn make:help` to list them. -For example: `yarn docker:make mint4k`. - -See also https://github.com/Agoric/documentation/pull/881 - -See also the [Agoric Gov Proposal Builder](https://cosgov.org/). diff --git a/contract/scripts/run-chain.sh b/contract/scripts/run-chain.sh deleted file mode 100755 index e6435bd4..00000000 --- a/contract/scripts/run-chain.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -wait_for_bootstrap() { - endpoint="localhost" - while true; do - if json=$(curl -s --fail -m 15 "$endpoint:26657/status"); then - if [[ "$(echo "$json" | jq -r .jsonrpc)" == "2.0" ]]; then - if last_height=$(echo "$json" | jq -r .result.sync_info.latest_block_height); then - if [[ "$last_height" != "1" ]]; then - echo "$last_height" - return - else - echo "$last_height" - fi - fi - fi - fi - echo "waiting for next block..." - sleep 5 - done - echo "done" -} - -waitForBlock() ( - echo "waiting for block..." - times=${1:-1} - echo "$times" - for ((i = 1; i <= times; i++)); do - b1=$(wait_for_bootstrap) - while true; do - b2=$(wait_for_bootstrap) - if [[ "$b1" != "$b2" ]]; then - echo "block produced" - break - fi - sleep 5 - done - done - echo "done" -) - -approveProposals() { - while true; do - proposals=$(make -s -C /workspace/contract gov-voting-q 2>/dev/null) - exit_status=$? - if [ $exit_status -eq 0 ]; then - echo "Approving proposals: $proposals" - printf $proposals | xargs -I {} make -s -C /workspace/contract vote PROPOSAL={} - else - echo "No proposals to approve, continuing..." - fi - - sleep 10 - done -} - -# Start the chain in the background -/usr/src/upgrade-test-scripts/start_agd.sh & - -# wait for blocks to start being produced -waitForBlock 2 - -# Approve any proposals forever in the background. -approveProposals & - -make -C /workspace/contract mint100 - -# bring back chain process to foreground -wait diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 9b110c69..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -# TODO, consider removing in favor of e2e-testing (starship) -version: '3.5' - -services: - agd: - # cf. https://github.com/Agoric/agoric-3-proposals - image: ghcr.io/agoric/agoric-3-proposals:latest - platform: linux/amd64 - ports: - - 26656:26656 - - 26657:26657 - - 1317:1317 - environment: - DEST: 1 - DEBUG: 'SwingSet:ls,SwingSet:vat' - volumes: - - .:/workspace - entrypoint: /workspace/contract/scripts/run-chain.sh From eecdb197a22b0515d78a517ed616bc5029e1f302 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 14:51:53 +0500 Subject: [PATCH 03/31] chore: clean contract/Makefile --- contract/Makefile | 230 +++------------------------------------------- 1 file changed, 13 insertions(+), 217 deletions(-) diff --git a/contract/Makefile b/contract/Makefile index 0340cb49..03a984b5 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -10,12 +10,20 @@ ATOM=000000$(ATOM_DENOM) # your deployer address made from make add-address # ADDR=agoric1k78s7qz7rxy8afyjrqk3dntg8m83zaw3upe60p -ADDR=agoric125d8s0tamx50gpqdd3m7f5gtkzkcnjs0ehsujr +USERNAME ?= user1 -PROVISION_POOL_ADDR=agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346 +ADDR := $(shell kubectl exec -i agoriclocal-genesis-0 -c validator -- sh -c '\ + if ! agd keys show $(USERNAME) >/dev/null 2>&1; then \ + agd keys add $(USERNAME) --output json; \ + else \ + agd keys show $(USERNAME) --output json; \ + fi' | jq -r ".address" \ +) + +$(info USERNAME is $(USERNAME)) +$(info ADDR is $(ADDR)) -PROPOSAL=1 -VOTE_OPTION=yes +PROVISION_POOL_ADDR=agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346 # `CLIENTADDR` is your address from your browser wallet that you will use to interact with the orchestration dapp. #`CLIENT_OSMO_ADDR` is the same, but your osmosis account. @@ -24,127 +32,6 @@ CLIENT_OSMO_ADDR=osmo1rhvgsqq96n3qyv3u0zlwleyaunpmal6uhnam4z DEPLOY=npx --no-install tsx ../e2e-testing/scripts/deploy-cli.ts -.PHONY: list -# https://stackoverflow.com/a/73159833/7963 -list: - @make -npq : 2> /dev/null | grep -v PHONY |\ - awk -v RS= -F: '$$1 ~ /^[^#%]+$$/ { print $$1 }' - -balance-q: - agd keys show alice -a --keyring-backend="test" - agd query bank balances $(ACCT_ADDR) - -GAS_ADJUSTMENT=1.2 -SIGN_BROADCAST_OPTS=--keyring-backend=test --chain-id=$(CHAINID) \ - --gas=auto --gas-adjustment=$(GAS_ADJUSTMENT) \ - --yes -b block - -mint100: - make FUNDS=1000$(ATOM) fund-acct - cd /usr/src/agoric-sdk && \ - yarn --silent agops vaults open --wantMinted 100 --giveCollateral 100 >/tmp/want-ist.json && \ - yarn --silent agops perf satisfaction --executeOffer /tmp/want-ist.json --from alice --keyring-backend=test - -# Keep mint4k around a while for compatibility -mint4k: - make FUNDS=1000$(ATOM) fund-acct - cd /usr/src/agoric-sdk && \ - yarn --silent agops vaults open --wantMinted 4000 --giveCollateral 1000 >/tmp/want4k.json && \ - yarn --silent agops perf satisfaction --executeOffer /tmp/want4k.json --from alice --keyring-backend=test - -FUNDS=321$(BLD) -fund-acct: - agd tx bank send alice $(ACCT_ADDR) $(FUNDS) \ - $(SIGN_BROADCAST_OPTS) \ - -o json >,tx.json - jq '{code: .code, height: .height}' ,tx.json - -gov-q: - agd query gov proposals --output json | \ - jq -c '.proposals[] | [.proposal_id,.voting_end_time,.status]' - -gov-voting-q: - agd query gov proposals --status=voting_period --output json | \ - jq -c '.proposals[].proposal_id' - -vote: -# agd tx gov vote $(PROPOSAL) $(VOTE_OPTION) --from=validator - agd tx gov vote $(PROPOSAL) $(VOTE_OPTION) --from=alice \ - $(SIGN_BROADCAST_OPTS) \ - -o json >,tx.json - jq '{code: .code, height: .height}' ,tx.json - -instance-q: - agd query vstorage data published.agoricNames.instance -o json - -start: start-contract-orca - - - -# bundle-X.json.installed show that bundle-X.json was installed -# see also e2e-tools.js -%.json.installed: %.json - @echo '{"up-to-date": false}' - -# X.js.done shows that X.js core eval ran -%.js.done: %.js - @echo '{"up-to-date": false}' - -# Dependencies to re-run core eval when source changes -# NOTE: manually updated -bundles/deploy-send.js: src/start-postalSvc.js - @echo '{"up-to-date": false}' - -bundles/deploy-swaparoo.js: src/swaparoo.proposal.js - @echo '{"up-to-date": false}' - -clean: - @rm -rf bundles/ - - - -######################################## -######################################## -################ Dapp dev -######################################## -######################################## - -# HARD CODED -cpfiles: - kubectl cp bundles/deploy-board-aux-permit.json default/agoriclocal-genesis-0:/root/bundles/deploy-board-aux-permit.json - kubectl cp bundles/deploy-board-aux.js default/agoriclocal-genesis-0:/root/bundles/deploy-board-aux.js - kubectl cp bundles/deploy-orca-permit.json default/agoriclocal-genesis-0:/root/bundles/deploy-orca-permit.json - kubectl cp bundles/deploy-orca.js default/agoriclocal-genesis-0:/root/bundles/deploy-orca.js - kubectl cp bundles/bundle-orca.js default/agoriclocal-genesis-0:/root/bundles/bundle-orca.js - kubectl cp bundles/bundle-list-ship default/agoriclocal-genesis-0:/root/bundles/bundle-list-ship - - kubectl cp scripts/build-proposal.sh default/agoriclocal-genesis-0:/root/scripts/build-proposal.sh - kubectl cp scripts/install-bundles.sh default/agoriclocal-genesis-0:/root/scripts/install-bundles.sh - kubectl cp scripts/propose-start-contract.sh default/agoriclocal-genesis-0:/root/scripts/propose-start-contract.sh - kubectl cp ./src/platform-goals/start-contract.js default/agoriclocal-genesis-0:/root/scripts/start-contract.js - kubectl cp scripts/build-contract-deployer.js default/agoriclocal-genesis-0:/root/scripts/build-contract-deployer.js - - - kubectl cp ./Makefile default/agoriclocal-genesis-0:/root/Makefile -rmfiles: - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/bundle-orca.json - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/deploy-board-aux-permit.json - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/deploy-board-aux.js - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/deploy-orca-permit.json - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/deploy-orca.js - - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./scripts/build-proposal.sh - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./scripts/install-bundles.sh - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./scripts/propose-start-contract.sh - - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/bundle-list-ship - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./Makefile - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/*.json - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./bundles/*.js - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf ./scripts/*.js - - - # 1 fund-provision-pool: kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(PROVISION_POOL_ADDR) 1000000000uist -y -b block; @@ -163,12 +50,9 @@ fund: fund-provision-pool check-balance fund-osmo: kubectl exec -i osmosislocal-genesis-0 -c validator -- osmosisd tx bank send faucet ${CLIENT_OSMO_ADDR} 9870000000uosmo --fees 1000uosmo -y; -fund-osmo-ibc: - kubectl exec -i osmosislocal-genesis-0 -c validator -- osmosisd tx ibc-transfer transfer transfer channel-0 ${CLIENTADDR} 1000000uosmo --from faucet --chain-id osmosislocal --node http://127.0.0.1:26657 --fees 5000uosmo -y; - kubectl exec -i osmosislocal-genesis-0 -c validator -- osmosisd tx ibc-transfer transfer transfer channel-1 ${CLIENTADDR} 1000000uosmo --from faucet --chain-id osmosislocal --node http://127.0.0.1:26657 --fees 5000uosmo -y; - check-balance: kubectl exec -i agoriclocal-genesis-0 -c validator -- agd q bank balances $(ADDR) + fund-wallet: kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(ADDR) 10000000000000uist -y -b block kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(ADDR) 10000000000000ubld -y -b block @@ -177,93 +61,5 @@ provision-smart-wallet: kubectl exec -i agoriclocal-genesis-0 -c validator -- agd keys list kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx swingset provision-one wallet $(ADDR) SMART_WALLET --from ${ADDR} -y -b block -local-provision-smart-wallet: - agd tx swingset provision-one wallet $(ADDR) SMART_WALLET --from $(ADDR) -y -b block --chain-id agoriclocal - -fund-dev: - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send alice agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk 100000000ubld -y - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send alice agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk 100000000uist -y -local-fund: - agd tx bank send faucet $(ADDR) 999999999ubld -y - agd tx bank send faucet $(ADDR) 999999999uist -y -# add address -add-address: - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd keys add alice || true - - -exec: - kubectl exec -it agoriclocal-genesis-0 -c validator -- bash - -# 1 -install-bundles: - bash scripts/install-bundles.sh - -# copy bundle to container -cpb: - bash scripts/copy-bundles-to-container.sh - - -copy-project: - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -rf -v ./* - kubectl exec -i agoriclocal-genesis-0 -c validator -- mkdir -p /root/ - kubectl cp . default/agoriclocal-genesis-0:/root/ - -PROPOSAL_ID=3 -propose-start-v2: - make make-proposal-start; - sleep 3; - make proposal-start-vote; - make sleep 3; - make gov-q; - -make-proposal-start: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "make propose-start"; - sleep 3; make gov-q - -proposal-start-vote: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "agd tx gov vote ${PROPOSAL_ID} $(VOTE_OPTION) --from=genesis $(SIGN_BROADCAST_OPTS) -o json >,tx.json ; jq '{code: .code, height: .height}' ,tx.json" - -# debug bundle -bundle-debug: - bash scripts/bundle-debug.sh - -# patch -copy-bn-js: - kubectl exec -i agoriclocal-genesis-0 -c validator -- rm -f -v /root/node_modules/bn.js/lib/bn.js - cp ./PATCH-bn.js ../node_modules/bn.js/lib/bn.js - kubectl cp ../node_modules/bn.js/lib/bn.js default/agoriclocal-genesis-0:/root/node_modules/bn.js/lib/bn.js - -copy-vow-js: - cp ./PATCH-vat.js ../node_modules/@agoric/vow/vat.js - kubectl cp ../node_modules/@agoric/vow/vat.js default/agoriclocal-genesis-0:/root/node_modules/@agoric/vow/vat.js - -# debug -# kubectl cp ../node_modules/@agoric/vow/vat.js default/agoriclocal-genesis-0:/root/node_modules/@agoric/orchestration/node_modules/@agoric/vow/vat.js -# kubectl cp ../node_modules/@agoric/vow/vat.js default/agoriclocal-genesis-0:/root/node_modules/@agoric/async-flow/node_modules/@agoric/vow/vat.js - - -# kubectl exec -i agoriclocal-genesis-0 -c validator -- cat /root/node_modules/bn.js/lib/bn.js | grep "PATCH" -patch: - patch ../node_modules/bn.js/lib/bn.js < ../xxpatches/bn.js+5.2.1.patch - -cleanc: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "rm -rf -v ./*" - -build: - yarn build:deployer -buildc: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn build:deployer" -deployc: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn node scripts/deploy-contract.js --install src/orca.contract.js --eval src/orca.proposal.js" -deploy: - yarn node scripts/deploy-contract.js --install src/orca.contract.js --eval src/orca.proposal.js -test-orca: - yarn test ./test/orca-contract.test.js - - -# todo remove clean install steps after debugging e2e: $(DEPLOY) src/builder/init-orca.js -lint: - yarn lint --fix-dry-run --ignore-pattern "*patch*" - From 15ff112a9aa7bcad23752a03b7d39e1eac6d3dd8 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 15:55:40 +0500 Subject: [PATCH 04/31] chore: relocate unused utility script --- contract/{ => tools}/explode-bundle.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contract/{ => tools}/explode-bundle.sh (100%) diff --git a/contract/explode-bundle.sh b/contract/tools/explode-bundle.sh similarity index 100% rename from contract/explode-bundle.sh rename to contract/tools/explode-bundle.sh From 6411fe347bdcf4fca20d743da705c53f8a1f25ed Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 15:56:28 +0500 Subject: [PATCH 05/31] chore: update gitignore, delete duplicate copies of scripts --- .gitignore | 3 +- contract/,tx.json | 182 ------------------------------------ contract/.gitignore | 4 - contract/src/tools/debug.js | 41 -------- 4 files changed, 1 insertion(+), 229 deletions(-) delete mode 100644 contract/,tx.json delete mode 100644 contract/.gitignore delete mode 100644 contract/src/tools/debug.js diff --git a/.gitignore b/.gitignore index 1ba9337b..3d2393e7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,7 @@ contract/startOrcaContract-permit.json contract/startOrcaContract-plan.json contract/startOrcaContract.js - - +contract/bundles # Logs logs *.log diff --git a/contract/,tx.json b/contract/,tx.json deleted file mode 100644 index 3614dd03..00000000 --- a/contract/,tx.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "height": "1007", - "txhash": "13E7554F159251539A014512706124416E5A14781CB4C64497F0BB137372CF96", - "codespace": "", - "code": 0, - "data": "12260A242F636F736D6F732E62616E6B2E763162657461312E4D736753656E64526573706F6E7365", - "raw_log": "[{\"msg_index\":0,\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk\"},{\"key\":\"amount\",\"value\":\"1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl\"},{\"key\":\"amount\",\"value\":\"1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/cosmos.bank.v1beta1.MsgSend\"},{\"key\":\"sender\",\"value\":\"agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk\"},{\"key\":\"sender\",\"value\":\"agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl\"},{\"key\":\"amount\",\"value\":\"1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA\"}]}]}]", - "logs": [ - { - "msg_index": 0, - "log": "", - "events": [ - { - "type": "coin_received", - "attributes": [ - { - "key": "receiver", - "value": "agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk" - }, - { - "key": "amount", - "value": "1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA" - } - ] - }, - { - "type": "coin_spent", - "attributes": [ - { - "key": "spender", - "value": "agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl" - }, - { - "key": "amount", - "value": "1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA" - } - ] - }, - { - "type": "message", - "attributes": [ - { "key": "action", "value": "/cosmos.bank.v1beta1.MsgSend" }, - { - "key": "sender", - "value": "agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl" - }, - { "key": "module", "value": "bank" } - ] - }, - { - "type": "transfer", - "attributes": [ - { - "key": "recipient", - "value": "agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk" - }, - { - "key": "sender", - "value": "agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl" - }, - { - "key": "amount", - "value": "1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA" - } - ] - } - ] - } - ], - "info": "", - "gas_wanted": "93980", - "gas_used": "75297", - "tx": null, - "timestamp": "", - "events": [ - { - "type": "tx", - "attributes": [ - { "key": "ZmVl", "value": "", "index": true }, - { - "key": "ZmVlX3BheWVy", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - } - ] - }, - { - "type": "tx", - "attributes": [ - { - "key": "YWNjX3NlcQ==", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRsLzU3", - "index": true - } - ] - }, - { - "type": "tx", - "attributes": [ - { - "key": "c2lnbmF0dXJl", - "value": "Vks3cTlTN09BSUt3eEhnNnhyR2p6WEwvcGNiWUZQTlBITmd0Z0draVBnZzZSaDY2bXljVFA3M2traERmTzhuMVFkajB4TEh2WnhWekpjWTRZcTRaekE9PQ==", - "index": true - } - ] - }, - { - "type": "message", - "attributes": [ - { - "key": "YWN0aW9u", - "value": "L2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZA==", - "index": true - } - ] - }, - { - "type": "coin_spent", - "attributes": [ - { - "key": "c3BlbmRlcg==", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - }, - { - "key": "YW1vdW50", - "value": "MTAwMDAwMDAwMGliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZB", - "index": true - } - ] - }, - { - "type": "coin_received", - "attributes": [ - { - "key": "cmVjZWl2ZXI=", - "value": "YWdvcmljMXJ3d2xleTU1MGs5bW1rNnVxNm1tNno0dWRyZzhreXV5dmZzempr", - "index": true - }, - { - "key": "YW1vdW50", - "value": "MTAwMDAwMDAwMGliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZB", - "index": true - } - ] - }, - { - "type": "transfer", - "attributes": [ - { - "key": "cmVjaXBpZW50", - "value": "YWdvcmljMXJ3d2xleTU1MGs5bW1rNnVxNm1tNno0dWRyZzhreXV5dmZzempr", - "index": true - }, - { - "key": "c2VuZGVy", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - }, - { - "key": "YW1vdW50", - "value": "MTAwMDAwMDAwMGliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZB", - "index": true - } - ] - }, - { - "type": "message", - "attributes": [ - { - "key": "c2VuZGVy", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - } - ] - }, - { - "type": "message", - "attributes": [{ "key": "bW9kdWxl", "value": "YmFuaw==", "index": true }] - } - ] -} diff --git a/contract/.gitignore b/contract/.gitignore deleted file mode 100644 index eec51f02..00000000 --- a/contract/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -start-sell-concert-tickets-permit.json -start-sell-concert-tickets.js -bundles/ -startOrcaContract* diff --git a/contract/src/tools/debug.js b/contract/src/tools/debug.js deleted file mode 100644 index 43c7a0a7..00000000 --- a/contract/src/tools/debug.js +++ /dev/null @@ -1,41 +0,0 @@ -// @jessie-check - -let debugInstance = 1; - -/** - * @param {string} name - * @param {boolean | 'verbose'} enable - */ -export const makeTracer = (name, enable = true) => { - debugInstance += 1; - let debugCount = 1; - const key = `----- ${name}.${debugInstance} `; - // the cases below define a named variable to provide better debug info - switch (enable) { - case false: { - const logDisabled = (..._args) => {}; - return logDisabled; - } - case 'verbose': { - const infoTick = (optLog, ...args) => { - if (optLog.log) { - console.info(key, (debugCount += 1), ...args); - } else { - console.info(key, (debugCount += 1), optLog, ...args); - } - }; - return infoTick; - } - default: { - const debugTick = (optLog, ...args) => { - if (typeof optLog.log === 'function') { - optLog.log(key, (debugCount += 1), ...args); - } else { - console.info(key, (debugCount += 1), optLog, ...args); - } - }; - return debugTick; - } - } -}; -harden(makeTracer); From 7d2a6c9d5b74ef0f9f4331bf6999e9d6b048c85d Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 15:57:27 +0500 Subject: [PATCH 06/31] chore: relocate init script - update paths --- contract/package.json | 1 + contract/{src/builder => scripts}/init-orca.js | 8 ++++---- contract/src/orca.proposal.js | 3 +-- contract/tools/startOrch.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename contract/{src/builder => scripts}/init-orca.js (95%) diff --git a/contract/package.json b/contract/package.json index eedc9234..bc842477 100644 --- a/contract/package.json +++ b/contract/package.json @@ -6,6 +6,7 @@ "type": "module", "scripts": { "test": "ava", + "build:deployer": "rollup -c rollup.config.mjs", "lint": "tsc && eslint '**/*.js'", "lint:fix": "eslint --fix '**/*.js'" }, diff --git a/contract/src/builder/init-orca.js b/contract/scripts/init-orca.js similarity index 95% rename from contract/src/builder/init-orca.js rename to contract/scripts/init-orca.js index 7d701a95..cb753c12 100644 --- a/contract/src/builder/init-orca.js +++ b/contract/scripts/init-orca.js @@ -21,8 +21,8 @@ import { parseArgs } from 'node:util'; import { getManifestForOrca, startOrcaContract, -} from '../../src/orca.proposal.js'; -import { makeAgd } from '../../tools/agd-lib.js'; +} from '../src/orca.proposal.js'; +import { makeAgd } from '../tools/agd-lib.js'; /** * @import {CoreEvalBuilder} from '@agoric/deploy-script-support/src/externalTypes.js' @@ -43,12 +43,12 @@ export const defaultProposalBuilder = async ( { chainDetails }, ) => { return harden({ - sourceSpec: '../../src/orca.proposal.js', + sourceSpec: '../src/orca.proposal.js', getManifestCall: [ getManifestForOrca.name, { installKeys: { - orca: publishRef(install('../../src/orca.contract.js')), + orca: publishRef(install('../src/orca.contract.js')), }, chainDetails, }, diff --git a/contract/src/orca.proposal.js b/contract/src/orca.proposal.js index 445dc0f8..c5db7943 100644 --- a/contract/src/orca.proposal.js +++ b/contract/src/orca.proposal.js @@ -1,6 +1,5 @@ import { E } from '@endo/far'; -import { installContract } from './platform-goals/start-contract.js'; -import { makeTracer } from './tools/debug.js'; +import { makeTracer } from './debug.js'; /// /// diff --git a/contract/tools/startOrch.js b/contract/tools/startOrch.js index a6a0e675..73c293e3 100644 --- a/contract/tools/startOrch.js +++ b/contract/tools/startOrch.js @@ -1,7 +1,7 @@ // @ts-check import { Far } from '@endo/far'; -import { makeTracer } from '../src/tools/debug.js'; +import { makeTracer } from '../src/debug.js'; const trace = makeTracer('startOrch'); From 1fcb5e0b79418a50886d7476abb24c2f8b8ee66d Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 16:03:17 +0500 Subject: [PATCH 07/31] chore: deleting (PROBABLY) unused files --- contract/Makefile | 3 +- contract/src/collectFees.js | 28 ------------------ contract/src/platform-goals/README.md | 5 ---- contract/src/platform-goals/endo1.core.js | 36 ----------------------- contract/src/platform-goals/types.js | 4 --- 5 files changed, 1 insertion(+), 75 deletions(-) delete mode 100644 contract/src/collectFees.js delete mode 100644 contract/src/platform-goals/README.md delete mode 100644 contract/src/platform-goals/endo1.core.js delete mode 100644 contract/src/platform-goals/types.js diff --git a/contract/Makefile b/contract/Makefile index 03a984b5..c98a4660 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -8,7 +8,6 @@ BLD=000000ubld ATOM_DENOM=ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA ATOM=000000$(ATOM_DENOM) -# your deployer address made from make add-address # ADDR=agoric1k78s7qz7rxy8afyjrqk3dntg8m83zaw3upe60p USERNAME ?= user1 @@ -62,4 +61,4 @@ provision-smart-wallet: kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx swingset provision-one wallet $(ADDR) SMART_WALLET --from ${ADDR} -y -b block e2e: - $(DEPLOY) src/builder/init-orca.js + $(DEPLOY) scripts/init-orca.js diff --git a/contract/src/collectFees.js b/contract/src/collectFees.js deleted file mode 100644 index ff8581cc..00000000 --- a/contract/src/collectFees.js +++ /dev/null @@ -1,28 +0,0 @@ -// @jessie-check - -import { atomicTransfer } from '@agoric/zoe/src/contractSupport/index.js'; - -/** - * @import {Brand, Issuer, Purse} from '@agoric/ertp/src/types.js'; - */ - -/** - * Provide shared support for providing access to fees from a service contract. - * - * @param {ZCF} zcf - * @param {ZCFSeat} feeSeat - * @param {Brand} feeBrand - * @param {string} keyword - * @returns {Promise>} - */ -export const makeCollectFeesInvitation = (zcf, feeSeat, feeBrand, keyword) => { - const collectFees = seat => { - const amount = feeSeat.getAmountAllocated(keyword, feeBrand); - atomicTransfer(zcf, feeSeat, seat, { [keyword]: amount }, { Fee: amount }); - - seat.exit(); - return `paid out ${amount.value}`; - }; - - return zcf.makeInvitation(collectFees, 'collect fees'); -}; diff --git a/contract/src/platform-goals/README.md b/contract/src/platform-goals/README.md deleted file mode 100644 index 8ae7a08a..00000000 --- a/contract/src/platform-goals/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Platform Goals - -Work on this dapp shows some ways that the platform could be improved. - -The code in this directory shows some possible platform refinements. diff --git a/contract/src/platform-goals/endo1.core.js b/contract/src/platform-goals/endo1.core.js deleted file mode 100644 index 88ac5ef2..00000000 --- a/contract/src/platform-goals/endo1.core.js +++ /dev/null @@ -1,36 +0,0 @@ -// @ts-check -import * as marshal from '@endo/marshal'; -import * as patterns from '@endo/patterns'; - -/** - * @import {BootstrapManifestPermit} from '@agoric/vats/src/core/lib-boot.js'; - */ - -/** - * @typedef {{ - * endo1: { - * marshal: typeof import('@endo/marshal'); - * patterns: typeof import('@endo/patterns'); - * } - * }} Endo1Modules - * @typedef {PromiseSpaceOf} Endo1Space - */ - -/** - * Make @endo/marshal, @endo/patterns available to CoreEval scripts. - * - * @param {BootstrapPowers & Endo1Space} permittedPowers - */ -export const produceEndoModules = permittedPowers => { - const { produce } = permittedPowers; - const endo = { marshal, patterns }; - produce.endo1.resolve(endo); -}; - -/** @type {BootstrapManifestPermit} */ -export const permit = { - /** @type {Record} */ - produce: { endo1: true }, -}; - -export const main = produceEndoModules; diff --git a/contract/src/platform-goals/types.js b/contract/src/platform-goals/types.js deleted file mode 100644 index 293e5124..00000000 --- a/contract/src/platform-goals/types.js +++ /dev/null @@ -1,4 +0,0 @@ -import '@agoric/governance/src/types-ambient'; -import '@agoric/vats/src/core/types'; -import '@agoric/ertp/exported'; -import '@agoric/zoe/exported'; From 35e7d93bebd54d3ccda632f0b8e180722de34340 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 12 Nov 2024 16:44:42 +0500 Subject: [PATCH 08/31] chore: remove unused scripts --- .github/workflows/pr.yml | 2 +- contract/Makefile | 2 +- contract/package.json | 1 + contract/scripts/deploy-cli.ts | 44 +++++ contract/scripts/init-orca.js | 5 +- contract/test/market-actors.js | 2 +- contract/tools/README.md | 7 - contract/tools/e2e-tools.js | 3 +- contract/tools/explode-bundle.sh | 26 --- contract/tools/ui-kit-goals/README.md | 5 - contract/tools/ui-kit-goals/batchQuery.js | 179 ------------------ contract/tools/ui-kit-goals/makeHttpClient.js | 100 ---------- contract/tools/ui-kit-goals/marshalTables.js | 86 --------- contract/tools/ui-kit-goals/queryKit.js | 157 --------------- contract/tools/ui-kit-goals/test-nameProxy.js | 28 --- contract/tools/wallet.js | 15 -- e2e-testing/.gitignore | 2 - e2e-testing/scripts/dev-setup.sh | 65 ------- e2e-testing/scripts/install.sh | 127 ------------- e2e-testing/scripts/pod-readiness.ts | 36 ---- e2e-testing/scripts/port-forward.sh | 127 ------------- e2e-testing/tools/sleep.ts | 77 -------- package.json | 6 +- ui/package.json | 4 +- 24 files changed, 58 insertions(+), 1048 deletions(-) create mode 100644 contract/scripts/deploy-cli.ts delete mode 100644 contract/tools/README.md delete mode 100755 contract/tools/explode-bundle.sh delete mode 100644 contract/tools/ui-kit-goals/README.md delete mode 100644 contract/tools/ui-kit-goals/batchQuery.js delete mode 100644 contract/tools/ui-kit-goals/makeHttpClient.js delete mode 100644 contract/tools/ui-kit-goals/marshalTables.js delete mode 100644 contract/tools/ui-kit-goals/queryKit.js delete mode 100644 contract/tools/ui-kit-goals/test-nameProxy.js delete mode 100644 contract/tools/wallet.js delete mode 100644 e2e-testing/.gitignore delete mode 100644 e2e-testing/scripts/dev-setup.sh delete mode 100644 e2e-testing/scripts/install.sh delete mode 100644 e2e-testing/scripts/pod-readiness.ts delete mode 100644 e2e-testing/scripts/port-forward.sh delete mode 100644 e2e-testing/tools/sleep.ts diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7e62e4fc..799bd47f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -43,7 +43,7 @@ jobs: yarn link-cli echo "$HOME/bin" >> $GITHUB_PATH - - name: Build dapp-agoric-basics + - name: Build dapp-orchestration-basics run: yarn build - name: Setup Starship Infrastructure diff --git a/contract/Makefile b/contract/Makefile index c98a4660..8a268a15 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -29,7 +29,7 @@ PROVISION_POOL_ADDR=agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346 CLIENTADDR=agoric12j5kzvrwunqvrga5vm4zpy3mkeh3lvyld0amz5 CLIENT_OSMO_ADDR=osmo1rhvgsqq96n3qyv3u0zlwleyaunpmal6uhnam4z -DEPLOY=npx --no-install tsx ../e2e-testing/scripts/deploy-cli.ts +DEPLOY=npx --no-install tsx scripts/deploy-cli.ts # 1 fund-provision-pool: diff --git a/contract/package.json b/contract/package.json index bc842477..dc76fc97 100644 --- a/contract/package.json +++ b/contract/package.json @@ -6,6 +6,7 @@ "type": "module", "scripts": { "test": "ava", + "build": "yarn build:deployer", "build:deployer": "rollup -c rollup.config.mjs", "lint": "tsc && eslint '**/*.js'", "lint:fix": "eslint --fix '**/*.js'" diff --git a/contract/scripts/deploy-cli.ts b/contract/scripts/deploy-cli.ts new file mode 100644 index 00000000..2d32aaf4 --- /dev/null +++ b/contract/scripts/deploy-cli.ts @@ -0,0 +1,44 @@ +#!/usr/bin/env tsx +import '@endo/init/debug.js'; + +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; +import childProcess from 'node:child_process'; +import fsp from 'node:fs/promises'; +import { promisify } from 'node:util'; +import { makeContainer } from '../../contract/tools/agd-lib.js'; +import { makeDeployBuilder } from '../../contract/tools/deploy.js'; +import { makeE2ETools } from '../../contract/tools/e2e-tools.js'; + +async function main() { + const builder = process.argv[2]; + + if (!builder) { + console.error('USAGE: deploy-cli.ts '); + process.exit(1); + } + + const container = makeContainer({ execFileSync: childProcess.execFileSync }); + + const bundleCache = await makeNodeBundleCache('bundles', {}, s => import(s)); + const tools = makeE2ETools(console.log, bundleCache, { + execFileSync: container.execFileSync, + copyFiles: container.copyFiles, + fetch, + setTimeout, + }); + + const readJSON = (path: string) => + fsp.readFile(path, 'utf-8').then(x => JSON.parse(x)); + const execFileP = promisify(childProcess.execFile); + const npx = (file: string, args: string[]) => + execFileP('npx', ['--no-install', file, ...args]); + const deployBuilder = makeDeployBuilder(tools, readJSON, npx); + try { + await deployBuilder(builder); + } catch (err) { + console.error(err); + process.exit(1); + } +} + +main(); diff --git a/contract/scripts/init-orca.js b/contract/scripts/init-orca.js index cb753c12..bac2ab71 100644 --- a/contract/scripts/init-orca.js +++ b/contract/scripts/init-orca.js @@ -18,10 +18,7 @@ import { import { M, mustMatch } from '@endo/patterns'; import { execFileSync } from 'node:child_process'; import { parseArgs } from 'node:util'; -import { - getManifestForOrca, - startOrcaContract, -} from '../src/orca.proposal.js'; +import { getManifestForOrca, startOrcaContract } from '../src/orca.proposal.js'; import { makeAgd } from '../tools/agd-lib.js'; /** diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index 0f8e6a95..97e4ecc1 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -33,7 +33,7 @@ const { entries, fromEntries, keys } = Object; * @param {import('ava').ExecutionContext} t * @param {{ * wallet: import('./wallet-tools.js').MockWallet; - * queryTool: Pick; + * queryTool: Pick; * }} mine * @param {{ * rxAddr: string, diff --git a/contract/tools/README.md b/contract/tools/README.md deleted file mode 100644 index 5d8bf932..00000000 --- a/contract/tools/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Contract deployment and end-to-end testing tools - -These tools are an attempt to mix testing in the style of the [makeWalletFactoryDriver][1] API in ava with experience from testing on live blockchains in [a3p](https://github.com/Agoric/agoric-3-proposals). _See also [testing API to extend ava functional tests to end-to-end context #8963](https://github.com/Agoric/agoric-sdk/issues/8963)._ - -`deploy-contract.js` in the `contract/scripts` directory makes them available as a CLI tool. - -[1]: https://github.com/Agoric/agoric-sdk/blob/b13743a2cccf0cb63a412b54384435596d4e81ea/packages/boot/tools/drivers.ts#L28 diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index c6d5ffcb..7f4ecd44 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -3,7 +3,7 @@ import { assert } from '@endo/errors'; import { E, Far } from '@endo/far'; import { Nat } from '@endo/nat'; import { makePromiseKit } from '@endo/promise-kit'; -import { flags, makeAgd, makeContainer } from './agd-lib.js'; +import { flags, makeAgd } from './agd-lib.js'; import { makeHttpClient, makeAPI } from './makeHttpClient.js'; import { dedup, makeQueryKit, poll } from './queryKit.js'; import { makeVStorage } from './batchQuery.js'; @@ -14,7 +14,6 @@ import { getBundleId } from './bundle-tools.js'; import { exec } from 'child_process'; import path from 'path'; import fs from 'fs'; -import { makeDeployBuilder } from '../tools/deploy.js'; import fse from 'fs-extra'; import { execa } from 'execa'; import os from 'os'; diff --git a/contract/tools/explode-bundle.sh b/contract/tools/explode-bundle.sh deleted file mode 100755 index 142f1652..00000000 --- a/contract/tools/explode-bundle.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Explode the content of an .js bundle into a directory. -# NB: Overwrites the existing directory. -# -# Usage: explode-bundle.sh - -JS_PATH=$1 -# verify that the file exists -if [ ! -f "$JS_PATH" ]; then - echo "File not found: $JS_PATH" - exit 1 -fi -JSON_PATH="$1on" -BUNDLE_NAME=$(basename "$JS_PATH" .js) -DIR=$(dirname "$JS_PATH") - -echo "Exploding $BUNDLE_NAME in $DIR" - -sed -n 's/^export default \(.*\);$/\1/p' "$JS_PATH" | jq '.' >"$JSON_PATH" - -EXPLODED="$DIR/$BUNDLE_NAME" -rm -rf "$EXPLODED" -mkdir "$EXPLODED" -jq -r .endoZipBase64 <"$JSON_PATH" | base64 -d | tar xC "$EXPLODED" -find "$EXPLODED" -type f -exec du -h {} + | sort -hr >"$EXPLODED"/files.txt -open "$EXPLODED"/files.txt diff --git a/contract/tools/ui-kit-goals/README.md b/contract/tools/ui-kit-goals/README.md deleted file mode 100644 index d1249f9f..00000000 --- a/contract/tools/ui-kit-goals/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Goals for ui-kit - -Work on this dapp suggests some ways that ui-kit could be improved. For example, [#79 pass network access explicitly](https://github.com/Agoric/ui-kit/issues/79). - -The code in this directory shows some possible platform refinements. diff --git a/contract/tools/ui-kit-goals/batchQuery.js b/contract/tools/ui-kit-goals/batchQuery.js deleted file mode 100644 index 7af8ab15..00000000 --- a/contract/tools/ui-kit-goals/batchQuery.js +++ /dev/null @@ -1,179 +0,0 @@ -// @ts-check -import { E } from '@endo/far'; - -/** - * @import {ERef} from '@endo/far'; - * @import {FromCapData} from '@endo/marshal'; - */ - -/** @typedef {'children' | 'data'} AgoricChainStoragePathKind */ - -/** - * @param {[kind: AgoricChainStoragePathKind, item: string]} path - */ -export const pathToKey = path => path.join('.'); - -/** @param {string} key */ -export const keyToPath = key => { - const [kind, ...rest] = key.split('.'); - assert(kind === 'children' || kind === 'data'); - /** @type {[kind: 'children' | 'data', item: string]} */ - const out = [kind, rest.join('.')]; - return out; -}; - -/** - * @template T - * @param {(value: string) => T} f - * @param {AsyncGenerator} chunks - */ -async function* mapHistory(f, chunks) { - for await (const chunk of chunks) { - if (chunk === undefined) continue; - for (const value of chunk.reverse()) { - yield f(value); - } - } -} - -/** - * @param {ERef} lcd - */ -export const makeVStorage = lcd => { - const getJSON = (href, options) => E(lcd).getJSON(href, options); - - // height=0 is the same as omitting height and implies the highest block - const href = (path = 'published', { kind = 'data' } = {}) => - `/agoric/vstorage/${kind}/${path}`; - const headers = height => - height ? { 'x-cosmos-block-height': `${height}` } : undefined; - - const readStorage = ( - path = 'published', - { kind = 'data', height = 0 } = {}, - ) => - getJSON(href(path, { kind }), { headers: headers(height) }).catch(err => { - throw Error(`cannot read ${kind} of ${path}: ${err.message}`); - }); - const readCell = (path, opts) => - readStorage(path, opts) - .then(data => data.value) - .then(s => (s === '' ? {} : JSON.parse(s))); - - /** - * Read values going back as far as available - * - * @param {string} path - * @param {number | string} [minHeight] - */ - async function* readHistory(path, minHeight = undefined) { - // undefined the first iteration, to query at the highest - let blockHeight; - await null; - do { - // console.debug('READING', { blockHeight }); - /** @type {string[]} */ - let values = []; - try { - ({ blockHeight, values } = await readCell(path, { - kind: 'data', - height: blockHeight && Number(blockHeight) - 1, - })); - // console.debug('readAt returned', { blockHeight }); - } catch (err) { - if (err.message.match(/unknown request/)) { - // XXX FIXME - // console.error(err); - break; - } - throw err; - } - yield values; - // console.debug('PUSHED', values); - // console.debug('NEW', { blockHeight, minHeight }); - if (minHeight && Number(blockHeight) <= Number(minHeight)) break; - } while (blockHeight > 0); - } - - /** - * @template T - * @param {(value: string) => T} f - * @param {string} path - * @param {number | string} [minHeight] - */ - const readHistoryBy = (f, path, minHeight) => - mapHistory(f, readHistory(path, minHeight)); - - return { - lcd, - readStorage, - readCell, - readHistory, - readHistoryBy, - }; -}; - -/** @typedef {ReturnType} VStorage */ - -/** @param {string | unknown} d */ -const parseIfJSON = d => { - if (typeof d !== 'string') return d; - try { - return JSON.parse(d); - } catch { - return d; - } -}; - -/** - * @param {ReturnType} vstorage - * @param {FromCapData} unmarshal - * @param {[AgoricChainStoragePathKind, string][]} paths - */ -export const batchVstorageQuery = async (vstorage, unmarshal, paths) => { - const requests = paths.map(([kind, path]) => - vstorage.readStorage(path, { kind }), - ); - - return Promise.all(requests).then(responses => - responses.map((res, index) => { - if (paths[index][0] === 'children') { - return [ - pathToKey(paths[index]), - { value: res.children, blockHeight: undefined }, - ]; - } - - if (!res.value) { - return [ - pathToKey(paths[index]), - { - error: `Cannot parse value of response for path [${ - paths[index] - }]: ${JSON.stringify(res)}`, - }, - ]; - } - - const data = parseIfJSON(res.value); - - const latestValue = - typeof data.values !== 'undefined' - ? parseIfJSON(data.values[data.values.length - 1]) - : parseIfJSON(data.value); - - const unserialized = - typeof latestValue.slots !== 'undefined' - ? unmarshal(latestValue) - : latestValue; - - return [ - pathToKey(paths[index]), - { - blockHeight: data.blockHeight, - value: unserialized, - }, - ]; - }), - ); -}; diff --git a/contract/tools/ui-kit-goals/makeHttpClient.js b/contract/tools/ui-kit-goals/makeHttpClient.js deleted file mode 100644 index 7033d83c..00000000 --- a/contract/tools/ui-kit-goals/makeHttpClient.js +++ /dev/null @@ -1,100 +0,0 @@ -// @ts-check -import { Far } from '@endo/far'; - -const { freeze } = Object; - -const jsonType = { 'Content-Type': 'application/json' }; - -const filterBadStatus = res => { - if (res.status >= 400) { - throw new Error(`Bad status on response: ${res.status}`); - } - return res; -}; - -/** - * Make an RpcClient using explicit access to the network. - * - * The RpcClient implementations included in cosmjs - * such as {@link https://cosmos.github.io/cosmjs/latest/tendermint-rpc/classes/HttpClient.html HttpClient} - * use ambient authority (fetch or axios) for network access. - * - * To facilitate cooperation without vulnerability, - * as well as unit testing, etc. this RpcClient maker takes - * network access as a parameter, following - * {@link https://github.com/Agoric/agoric-sdk/wiki/OCap-Discipline|OCap Discipline}. - * - * @param {string} url - * @param {typeof window.fetch} fetch - * @returns {import('@cosmjs/tendermint-rpc').RpcClient} - */ -export const makeHttpClient = (url, fetch) => { - const headers = {}; // XXX needed? - - // based on cosmjs 0.30.1: - // https://github.com/cosmos/cosmjs/blob/33271bc51cdc865cadb647a1b7ab55d873637f39/packages/tendermint-rpc/src/rpcclients/http.ts#L37 - // https://github.com/cosmos/cosmjs/blob/33271bc51cdc865cadb647a1b7ab55d873637f39/packages/tendermint-rpc/src/rpcclients/httpclient.ts#L25 - return freeze({ - disconnect: () => { - // nothing to be done - }, - - /** - * @param {import('@cosmjs/json-rpc').JsonRpcRequest} request - */ - execute: async request => { - const settings = { - method: 'POST', - body: request ? JSON.stringify(request) : undefined, - headers: { ...jsonType, ...headers }, - }; - return fetch(url, settings) - .then(filterBadStatus) - .then(res => res.json()); - }, - }); -}; - -/** - * gRPC-gateway REST API access - * - * @see {@link https://docs.cosmos.network/v0.45/core/grpc_rest.html#rest-server Cosmos SDK REST Server} - * - * Note: avoid Legacy REST routes, per - * {@link https://docs.cosmos.network/v0.45/migrations/rest.html Cosmos SDK REST Endpoints Migration}. - * - * @param {string} apiAddress nodes default to port 1317 - * @param {object} io - * @param {typeof fetch} io.fetch - */ -export const makeAPI = (apiAddress, { fetch }) => { - assert.typeof(apiAddress, 'string'); - - /** - * @param {string} href - * @param {object} [options] - * @param {Record} [options.headers] - */ - const getJSON = (href, options = {}) => { - const opts = { - keepalive: true, - headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }; - const url = `${apiAddress}${href}`; - return fetch(url, opts).then(r => { - if (!r.ok) throw Error(r.statusText); - return r.json().then(data => { - return data; - }); - }); - }; - - return Far('LCD', { - getJSON, - latestBlock: () => getJSON(`/cosmos/base/tendermint/v1beta1/blocks/latest`), - }); -}; -/** @typedef {ReturnType} LCD */ diff --git a/contract/tools/ui-kit-goals/marshalTables.js b/contract/tools/ui-kit-goals/marshalTables.js deleted file mode 100644 index c365ee0e..00000000 --- a/contract/tools/ui-kit-goals/marshalTables.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file marshal tools for vstorage clients - * - * TODO: integrate back into @agoric/rpc - * - fixes: calls to makeClientMarshaller share static mutable state - * https://github.com/Agoric/ui-kit/issues/73 - * - fits in this plain .js project - */ -// @ts-check -import { Far, makeMarshal } from '@endo/marshal'; - -/** - * The null slot indicates that identity is not intended to be preserved. - * - * @typedef { string | null } WildSlot - */ - -/** - * Implement conventional parts of convertValToSlot, convertSlotToVal functions - * for use with makeMarshal based on a slot <-> value translation table, - * indexed in both directions. Caller supplies functions for making - * slots, values when not present in the table. - * - * @template Val - * @param {(val: Val, size: number) => string} makeSlot - * @param {(slot: WildSlot, iface: string | undefined) => Val} makeVal - */ -const makeTranslationTable = (makeSlot, makeVal) => { - /** @type {Map} */ - const valToSlot = new Map(); - /** @type {Map} */ - const slotToVal = new Map(); - - /** @type {(val: Val) => string} */ - const convertValToSlot = val => { - if (valToSlot.has(val)) { - // @ts-ignore https://github.com/microsoft/TypeScript/issues/13086 - return valToSlot.get(val); - } - const slot = makeSlot(val, valToSlot.size); - valToSlot.set(val, slot); - slotToVal.set(slot, val); - return slot; - }; - - /** @type {(slot: WildSlot, iface: string | undefined) => Val} */ - const convertSlotToVal = (slot, iface) => { - if (slot === null) return makeVal(slot, iface); - if (slotToVal.has(slot)) { - // @ts-ignore https://github.com/microsoft/TypeScript/issues/13086 - return slotToVal.get(slot); - } - const val = makeVal(slot, iface); - valToSlot.set(val, slot); - slotToVal.set(slot, val); - return val; - }; - - return harden({ convertValToSlot, convertSlotToVal }); -}; - -/** @type {(slot: string, iface: string | undefined) => any} */ -const synthesizeRemotable = (slot, iface) => - Far(`${(iface ?? '').replace(/^Alleged: /, '')}#${slot}`, {}); - -/** - * Make a marshaller that synthesizes a remotable the first - * time it sees a slot identifier, allowing clients to recognize - * object identity for brands, instances, etc. - * - * @param {(v: unknown) => string} [valToSlot] - */ -export const makeClientMarshaller = valToSlot => { - const noNewSlots = val => { - throw new Error(`unknown value: ${val}`); - }; - const { convertValToSlot, convertSlotToVal } = makeTranslationTable( - valToSlot || noNewSlots, - // @ts-expect-error null slots - synthesizeRemotable, - ); - - return makeMarshal(convertValToSlot, convertSlotToVal, { - serializeBodyFormat: 'smallcaps', - }); -}; diff --git a/contract/tools/ui-kit-goals/queryKit.js b/contract/tools/ui-kit-goals/queryKit.js deleted file mode 100644 index d97aa228..00000000 --- a/contract/tools/ui-kit-goals/queryKit.js +++ /dev/null @@ -1,157 +0,0 @@ -// @ts-check - -import { E, Far } from '@endo/far'; -import { batchVstorageQuery } from './batchQuery.js'; -import { makeClientMarshaller } from './marshalTables.js'; - -/** - * @import {ERef} from '@endo/far'; - * @import {UpdateRecord} from '@agoric/smart-wallet/src/smartWallet.js'; - */ - -/** - * Iter tools... - * - * @template {Promise} PT - * @param {() => PT} fn - * @param {{ delay: (ms: number) => Promise, period?: number }} opts - */ -export async function* poll(fn, { delay, period = 1000 }) { - await null; - for (;;) { - const x = await fn(); - yield x; - await delay(period); - } -} - -/** - * @template {Promise} PT - * @param {AsyncGenerator>} src - * @param {(a: unknown, b: unknown) => boolean} [equal] - */ -export async function* dedup(src, equal = (x, y) => x === y) { - let last; - for await (const x of src) { - if (!equal(x, last)) { - yield x; - last = x; - } - } -} - -/** - * @template {Promise} PT - * @template {Promise} PU - * @param {AsyncGenerator>} src - * @param {(x: Awaited) => PU} fn - */ -export async function* mapIter(src, fn) { - for await (const item of src) { - yield fn(item); - } -} - -/** - * @param {string} key - * @param {object} io - * @param {import('./batchQuery.js').VStorage} io.vstorage - * @param {(ms: number, opts?: unknown) => Promise} io.delay - */ -export async function* eachVstorageUpdate(key, { vstorage, delay }) { - const { stringify: q } = JSON; - const updates = dedup( - poll(() => vstorage.readCell(key, { kind: 'data' }), { - delay, - period: 2000, - }), - (a, b) => q(a) === q(b), - ); - - for await (const cell of updates) { - // use blockHeight? - const { values } = cell; - for (const value of values) { - yield value; - } - } -} - -/** - * @param {string} addr - * @param {object} powers - * @param {QueryTool} powers.query - * @param {import('./batchQuery.js').VStorage} powers.vstorage - */ -export const makeWalletView = (addr, { query, vstorage }) => { - return Far('WalletQuery', { - current: () => query.queryData(`published.wallet.${addr}.current`), - /** - * TODO: visit in chunks by block - * @param {ERef<{visit: (r: UpdateRecord) => void}>} visitor - * @param {number} [minHeight] - */ - history: async (visitor, minHeight) => { - const history = vstorage.readHistoryBy( - s => query.fromCapData(JSON.parse(s)), - `published.wallet.${addr}`, - minHeight, - ); - for await (const record of history) { - await E(visitor).visit(record); - } - }, - }); -}; -/** @typedef {ReturnType} WalletView } */ - -/** - * @param {import('./batchQuery.js').VStorage} vstorage - * @param {import('@endo/marshal').Marshal} [m] - */ -export const makeQueryKit = ( - vstorage, - // @ts-expect-error null slots - m = makeClientMarshaller(), -) => { - /** @param {['children' | 'data', string][]} paths */ - const batchQuery = async paths => - batchVstorageQuery(vstorage, m.fromCapData, paths); - - /** @param {string} path */ - const queryData = async path => { - const [[_p, answer]] = await batchQuery([['data', path]]); - if (typeof answer === 'string') return answer; - if (answer.error) throw Error(answer.error); - return answer.value; - }; - - /** @param {string} path */ - const queryChildren = async path => { - const [[_p, answer]] = await batchQuery([['children', path]]); - if (typeof answer === 'string') return answer; - if (answer.error) throw Error(answer.error); - return answer.value; - }; - - async function* follow(path, { delay }) { - for await (const txt of eachVstorageUpdate(path, { vstorage, delay })) { - const value = m.fromCapData(JSON.parse(txt)); - yield value; - } - } - - const query = Far('QueryTool', { - batchQuery, - queryData, - follow, - queryChildren, - fromCapData: m.fromCapData, - toCapData: m.toCapData, - // XXX wrong layer? add makeWalletView(query) helper function instead? - walletView: addr => makeWalletView(addr, { query, vstorage }), - }); - - return { vstorage, query }; -}; -/** @typedef {Awaited>['query']} QueryTool */ diff --git a/contract/tools/ui-kit-goals/test-nameProxy.js b/contract/tools/ui-kit-goals/test-nameProxy.js deleted file mode 100644 index 7b5a04f1..00000000 --- a/contract/tools/ui-kit-goals/test-nameProxy.js +++ /dev/null @@ -1,28 +0,0 @@ -import '@endo/init/debug.js'; -import test from 'ava'; - -import { Far } from '@endo/far'; -import { makeNameHubKit } from '@agoric/vats'; -import { makeNameProxy } from './name-service-client.js'; - -test('makeNameProxy makes NameHub lookup convenient', async t => { - const k0 = makeNameHubKit(); - const kb = makeNameHubKit(); - k0.nameAdmin.update('brand', kb.nameHub, kb.nameAdmin); - const atomBrand = Far('Atom Brand', {}); - kb.nameAdmin.update('Atom', atomBrand); - - const agoricNames = k0.nameHub; - - const A = makeNameProxy(agoricNames); - - // const ab = await A.brand.Atom; - const ab = await /** @type {any} */ (A).brand.Atom; - t.log('brand', ab); - t.is(ab, atomBrand); - - // const b = await A.brand; - const b = await /** @type {any} */ (A).brand; - t.log('hub', b); - t.is(b, kb.nameHub); -}); diff --git a/contract/tools/wallet.js b/contract/tools/wallet.js deleted file mode 100644 index 028d6eb3..00000000 --- a/contract/tools/wallet.js +++ /dev/null @@ -1,15 +0,0 @@ -import { Bip39, Random } from '@cosmjs/crypto'; -import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; - -export function generateMnemonic() { - return Bip39.encode(Random.getBytes(16)).toString(); -} - -export const createWallet = async ( - bech32Prefix, - mnemonic = generateMnemonic(), -) => { - return DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { - prefix: bech32Prefix, - }); -}; diff --git a/e2e-testing/.gitignore b/e2e-testing/.gitignore deleted file mode 100644 index 9f659921..00000000 --- a/e2e-testing/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -revise-chain-info* -starship-chain-info.js diff --git a/e2e-testing/scripts/dev-setup.sh b/e2e-testing/scripts/dev-setup.sh deleted file mode 100644 index 63cdebfa..00000000 --- a/e2e-testing/scripts/dev-setup.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -## see https://github.com/cosmology-tech/starship/blob/b7dc499ee0114a0d5035708d7a92ca37fbdaf257/examples/getting-started/scripts/dev-setup.sh - -set -euo pipefail - -function color() { - local color=$1 - shift - local black=30 red=31 green=32 yellow=33 blue=34 magenta=35 cyan=36 white=37 - local color_code=${!color:-$green} - printf "\033[%sm%s\033[0m\n" "$color_code" "$*" -} - -# Define a function to install a binary on macOS -install_macos() { - case $1 in - kubectl) brew install kubectl ;; - helm) brew install helm ;; - yq) brew install yq ;; - kind) brew install kind ;; - esac -} - -# Define a function to install a binary on Linux -install_linux() { - color green "Installing $1 at ~/.local/bin, please add it to PATH" - mkdir -p ~/.local/bin - case $1 in - kubectl) curl -Lks "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" > ~/.local/bin/kubectl && chmod +x ~/.local/bin/kubectl ;; - helm) curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash ;; - yq) curl -Lks "https://github.com/mikefarah/yq/releases/download/v4.33.3/yq_linux_amd64" > ~/.local/bin/yq && chmod +x ~/.local/bin/yq ;; - kind) curl -Lks https://kind.sigs.k8s.io/dl/v0.18.1/kind-linux-amd64 > ~/.local/bin/kind && chmod +x ~/.local/bin/kind ;; - esac -} - -# Define a function to install a binary -install_binary() { - if [[ $(uname -s) == "Darwin" ]]; then - install_macos $1 - else - install_linux $1 - fi -} - -# Define a function to check for the presence of a binary -check_binary() { - if ! command -v $1 &> /dev/null; then - echo "$1 is not installed" - install_binary $1 - if ! command -v $1 &> /dev/null; then - color red "Installation of $1 failed, exiting..." - color red "Please install $1 manually, then run me again to verify the installation" - exit 1 - fi - fi -} - -# Check the binaries -check_binary kubectl -check_binary helm -check_binary yq -check_binary kind - -color green "All binaries are installed" diff --git a/e2e-testing/scripts/install.sh b/e2e-testing/scripts/install.sh deleted file mode 100644 index 930212af..00000000 --- a/e2e-testing/scripts/install.sh +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/bash - -## see https://github.com/cosmology-tech/starship/blob/7d63c4678a345789d8331dde7654f67953c5cc2b/examples/getting-started/scripts/install.sh - -## Script used to install the helm chart for the devnet from a config file -## Usage: -## ./scripts/install.sh --coinfig -## Options: -## -c|--config: config file to use (default: config.yaml) -## -v|--version: helm chart version (default: 0.1.43) - -set -euo pipefail - -# read config file from args into variable -CONFIGFILE="config.yaml" - -SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) -echo "Script dir: ${SCRIPT_DIR}" - -# default values -DRY_RUN="" -TIMEOUT="" -NAMESPACE="" -HELM_REPO="starship" -HELM_CHART="starship/devnet" -HELM_REPO_URL="https://cosmology-tech.github.io/starship/" -HELM_CHART_VERSION="0.2.8" -HELM_NAME="agoric-multichain-testing" - -# check_helm function verifies the helm binary is installed -function check_helm() { - if ! command -v helm &> /dev/null; then - echo "helm could not be found; please install it first!!!" - exit - fi -} - -# setup_helm function adds the helm repo and updates it -function setup_helm() { - if [ -d "$HELM_CHART" ]; then - echo "using local helm chart" - return - fi - helm repo add ${HELM_REPO} ${HELM_REPO_URL} - helm repo update - helm search repo ${HELM_CHART} --version ${HELM_CHART_VERSION} -} - -function set_helm_args() { - if [[ $TIMEOUT ]]; then - args="$args --timeout $TIMEOUT --wait --debug" - fi - if [[ $NAMESPACE ]]; then - args="$args --namespace $NAMESPACE --create-namespace" - fi - if [[ $DRY_RUN ]]; then - args="$args --dry-run --debug" - fi - num_chains=$(yq -r ".chains | length - 1" ${CONFIGFILE}) - if [[ $num_chains -lt 0 ]]; then - echo "No chains to parse: num: $num_chains" - return 0 - fi - for i in $(seq 0 $num_chains); do - scripts=$(yq -r ".chains[$i].scripts" ${CONFIGFILE}) - if [[ "$scripts" == "null" ]]; then - return 0 - fi - datadir="$( - cd "$(dirname -- "${CONFIGFILE}")" > /dev/null - pwd -P - )" - for script in $(yq -r ".chains[$i].scripts | keys | .[]" ${CONFIGFILE}); do - args="$args --set-file chains[$i].scripts.$script.data=$datadir/$(yq -r ".chains[$i].scripts.$script.file" ${CONFIGFILE})" - done - done -} - -function install_chart() { - args="" - set_helm_args - echo "name: ${HELM_NAME}, args: $args, chart: ${HELM_CHART}, version: ${HELM_CHART_VERSION}" - helm install ${HELM_NAME} ${HELM_CHART} --version ${HELM_CHART_VERSION} -f ${CONFIGFILE} $args -} - -while [ $# -gt 0 ]; do - case "$1" in - -c | --config) - CONFIGFILE="$2" - shift 2 # past argument=value - ;; - -v | --version) - HELM_CHART_VERSION="$2" - shift 2 # past argument - ;; - -t | --timeout) - TIMEOUT="$2" - shift 2 # past argument - ;; - -n | --name) - HELM_NAME="$2" - shift 2 # past argument - ;; - --namespace) - NAMESPACE="$2" - shift 2 # past argument - ;; - --chart) - HELM_CHART="$2" - shift 2 # past argument - ;; - --dry-run) - DRY_RUN=1 - shift # past argument - ;; - -) - echo "Unknown option $1" - exit 1 - ;; - *) ;; - - esac -done - -check_helm -setup_helm -install_chart diff --git a/e2e-testing/scripts/pod-readiness.ts b/e2e-testing/scripts/pod-readiness.ts deleted file mode 100644 index a5a583d6..00000000 --- a/e2e-testing/scripts/pod-readiness.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { execa } from 'execa'; -import { sleep } from '../tools/sleep.ts'; - -const checkPodsReadiness = async (): Promise => { - const { stdout } = await execa('kubectl', ['get', 'pods']); - console.clear(); - console.log('Current pod status:'); - console.log(stdout); - - const lines = stdout.split('\n').slice(1); // Skip the header line - return ( - lines.length > 0 && - lines.every(line => { - const [, ready] = line.split(/\s+/); - const [readyCount, totalCount] = ready.split('/'); - return readyCount === totalCount; - }) - ); -}; - -const main = async () => { - console.log('Starting pod readiness check...'); - for (;;) { - const allReady = await checkPodsReadiness(); - if (allReady) { - console.log('All pods are ready!'); - process.exit(0); - } - await sleep(2 * 1_000); - } -}; - -main().catch(error => { - console.error('An error occurred:', error); - process.exit(1); -}); diff --git a/e2e-testing/scripts/port-forward.sh b/e2e-testing/scripts/port-forward.sh deleted file mode 100644 index 3ad80c8d..00000000 --- a/e2e-testing/scripts/port-forward.sh +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/bash - -## see https://github.com/cosmology-tech/starship/blob/cb14bbc345c0a91a02feb9204ce8abef8d7b0a49/starship/scripts/port-forward.sh - -set -euo pipefail - -function color() { - local color=$1 - shift - local black=30 red=31 green=32 yellow=33 blue=34 magenta=35 cyan=36 white=37 - local color_code=${!color:-$green} - printf "\033[%sm%s\033[0m\n" "$color_code" "$*" -} - -function stop_port_forward() { - color green "Trying to stop all port-forward, if any...." - PIDS=$(ps -ef | grep -i -e 'kubectl port-forward' | grep -v 'grep' | cat | awk '{print $2}') || true - for p in $PIDS; do - kill -15 $p - done - sleep 2 -} - -# Default values -CHAIN_RPC_PORT=26657 -CHAIN_COMETMOCK_PORT=22331 -CHAIN_GRPC_PORT=9090 -CHAIN_LCD_PORT=1317 -CHAIN_EXPOSER_PORT=8081 -CHAIN_FAUCET_PORT=8000 -RELAYER_REST_PORT=3000 -RELAYER_EXPOSER_PORT=8081 -EXPLORER_LCD_PORT=8080 -REGISTRY_LCD_PORT=8080 -REGISTRY_GRPC_PORT=9090 -MONITORING_PROMETHEUS_PORT=8080 -MONITORING_GRAFANA_PORT=8080 - -for i in "$@"; do - case $i in - -c=* | --config=*) - CONFIGFILE="${i#*=}" - shift # past argument=value - ;; - -* | --*) - echo "Unknown option $i" - exit 1 - ;; - *) ;; - - esac -done - -stop_port_forward - -echo "Port forwarding for config ${CONFIGFILE}" -echo "Port forwarding all chains" -num_chains=$(yq -r ".chains | length - 1" ${CONFIGFILE}) -if [[ $num_chains -gt -1 ]]; then - for i in $(seq 0 $num_chains); do - # derive chain pod name from chain id - # https://github.com/cosmology-tech/starship/blob/main/charts/devnet/templates/_helpers.tpl#L56 - chain=$(yq -r ".chains[$i].id" ${CONFIGFILE}) - chain=${chain/_/"-"} - localrpc=$(yq -r ".chains[$i].ports.rpc" ${CONFIGFILE}) - localgrpc=$(yq -r ".chains[$i].ports.grpc" ${CONFIGFILE}) - locallcd=$(yq -r ".chains[$i].ports.rest" ${CONFIGFILE}) - localexp=$(yq -r ".chains[$i].ports.exposer" ${CONFIGFILE}) - localfaucet=$(yq -r ".chains[$i].ports.faucet" ${CONFIGFILE}) - color yellow "chains: forwarded $chain" - if [[ $(yq -r ".chains[$i].cometmock.enabled" $CONFIGFILE) == "true" ]]; then - [[ "$localrpc" != "null" ]] && color yellow " cometmock rpc to http://localhost:$localrpc" && kubectl port-forward pods/$chain-cometmock-0 $localrpc:$CHAIN_COMETMOCK_PORT > /dev/null 2>&1 & - else - [[ "$localrpc" != "null" ]] && color yellow " rpc to http://localhost:$localrpc" && kubectl port-forward pods/$chain-genesis-0 $localrpc:$CHAIN_RPC_PORT > /dev/null 2>&1 & - fi - [[ "$localgrpc" != "null" ]] && color yellow " grpc to http://localhost:$localgrpc" && kubectl port-forward pods/$chain-genesis-0 $localgrpc:$CHAIN_GRPC_PORT > /dev/null 2>&1 & - [[ "$locallcd" != "null" ]] && color yellow " lcd to http://localhost:$locallcd" && kubectl port-forward pods/$chain-genesis-0 $locallcd:$CHAIN_LCD_PORT > /dev/null 2>&1 & - [[ "$localexp" != "null" ]] && color yellow " exposer to http://localhost:$localexp" && kubectl port-forward pods/$chain-genesis-0 $localexp:$CHAIN_EXPOSER_PORT > /dev/null 2>&1 & - [[ "$localfaucet" != "null" ]] && color yellow " faucet to http://localhost:$localfaucet" && kubectl port-forward pods/$chain-genesis-0 $localfaucet:$CHAIN_FAUCET_PORT > /dev/null 2>&1 & - sleep 1 - done -else - echo "No chains to port-forward: num: $num_chains" -fi - -echo "Port forward relayers" -num_relayers=$(yq -r ".relayers | length - 1" ${CONFIGFILE}) -if [[ $num_relayers -gt -1 ]]; then - for i in $(seq 0 $num_relayers); do - # derive chain pod name from chain id - # https://github.com/cosmology-tech/starship/blob/main/charts/devnet/templates/_helpers.tpl#L56 - relayer=$(yq -r ".relayers[$i].name" ${CONFIGFILE}) - relayer=$(yq -r ".relayers[$i].type" ${CONFIGFILE})-${relayer/_/"-"} - localrest=$(yq -r ".relayers[$i].ports.rest" ${CONFIGFILE}) - localexposer=$(yq -r ".relayers[$i].ports.exposer" ${CONFIGFILE}) - color yellow "relayers: forwarded $relayer" - [[ "$localrest" != "null" ]] && color yellow " rpc to http://localhost:$localrest" && kubectl port-forward pods/$relayer-0 $localrest:$RELAYER_REST_PORT > /dev/null 2>&1 & - [[ "$localexposer" != "null" ]] && color yellow " rpc to http://localhost:$localexposer" && kubectl port-forward pods/$relayer-0 $localexposer:$RELAYER_EXPOSER_PORT > /dev/null 2>&1 & - sleep 1 - done -else - echo "No relayer to port-forward: num: $num_relayers" -fi - -echo "Port forward services" - -if [[ $(yq -r ".registry.enabled" $CONFIGFILE) == "true" ]]; then - kubectl port-forward service/registry 8081:$REGISTRY_LCD_PORT > /dev/null 2>&1 & - kubectl port-forward service/registry 9091:$REGISTRY_GRPC_PORT > /dev/null 2>&1 & - sleep 1 - color yellow "registry: forwarded registry lcd to grpc http://localhost:8081, to http://localhost:9091" -fi - -if [[ $(yq -r ".explorer.enabled" $CONFIGFILE) == "true" ]]; then - kubectl port-forward service/explorer 8080:$EXPLORER_LCD_PORT > /dev/null 2>&1 & - sleep 1 - color green "Open the explorer to get started.... http://localhost:8080" -fi - -if [[ $(yq -r ".monitoring.enabled" $CONFIGFILE) == "true" ]]; then - color yellow "monitoring port forward:" - localgrafana=$(yq -r ".monitoring.ports.grafana" ${CONFIGFILE}) - localprometheus=$(yq -r ".monitoring.ports.prometheus" ${CONFIGFILE}) - [[ "$localgrafana" != "null" ]] && color yellow " grafana to http://localhost:$localgrafana" && kubectl port-forward service/grafana $localgrafana:$MONITORING_GRAFANA_PORT > /dev/null 2>&1 & - [[ "$localprometheus" != "null" ]] && color yellow " prometheus to http://localhost:$localprometheus" && kubectl port-forward service/prometheus-service $localprometheus:$MONITORING_PROMETHEUS_PORT > /dev/null 2>&1 & - sleep 1 -fi diff --git a/e2e-testing/tools/sleep.ts b/e2e-testing/tools/sleep.ts deleted file mode 100644 index 66251a87..00000000 --- a/e2e-testing/tools/sleep.ts +++ /dev/null @@ -1,77 +0,0 @@ -const ambientSetTimeout = globalThis.setTimeout; - -type Log = (...values: unknown[]) => void; - -type SleepOptions = { - log?: Log; - setTimeout?: typeof ambientSetTimeout; -}; - -export const sleep = ( - ms: number, - { log = () => {}, setTimeout = ambientSetTimeout }: SleepOptions = {}, -) => - new Promise(resolve => { - log(`Sleeping for ${ms}ms...`); - setTimeout(resolve, ms); - }); - -export type RetryOptions = { - maxRetries?: number; - retryIntervalMs?: number; -} & SleepOptions; - -const retryUntilCondition = async ( - operation: () => Promise, - condition: (result: T) => boolean, - message: string, - { - maxRetries = 6, - retryIntervalMs = 3500, - log = () => {}, - setTimeout = ambientSetTimeout, - }: RetryOptions = {}, -): Promise => { - console.log({ maxRetries, retryIntervalMs, message }); - let retries = 0; - - while (retries < maxRetries) { - try { - const result = await operation(); - if (condition(result)) { - return result; - } - } catch (error: unknown) { - if (error instanceof Error) { - log(`Error: ${error.message}`); - } else { - log(`Unknown error: ${String(error)}`); - } - } - - retries++; - console.log( - `Retry ${retries}/${maxRetries} - Waiting for ${retryIntervalMs}ms for ${message}...`, - ); - await sleep(retryIntervalMs, { log, setTimeout }); - } - - throw Error(`${message} condition failed after ${maxRetries} retries.`); -}; - -export const makeRetryUntilCondition = (defaultOptions: RetryOptions = {}) => { - /** - * Retry an asynchronous operation until a condition is met. - * Defaults to maxRetries = 6, retryIntervalMs = 3500 - */ - return ( - operation: () => Promise, - condition: (result: T) => boolean, - message: string, - options?: RetryOptions, - ) => - retryUntilCondition(operation, condition, message, { - ...defaultOptions, - ...options, - }); -}; diff --git a/package.json b/package.json index ae79769e..c76acaf9 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,11 @@ "scripts": { "start:ui": "cd ui && yarn dev", "format": "yarn prettier --write .github contract ui", - "lint:format": "yarn prettier --check .github contract ui" + "lint:format": "yarn prettier --check .github contract ui", + "lint": "yarn lint:format && yarn workspaces foreach --all run lint", + "test": "yarn workspaces foreach --all run test", + "integration-test": "cd contract && yarn ava ./test/orca-multichain.test.js", + "build": "yarn workspaces foreach --all run build" }, "devDependencies": { "@types/node": "npm:20.16.8", diff --git a/ui/package.json b/ui/package.json index ff267980..41303c51 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,7 +9,9 @@ "build": "tsc && NODE_OPTIONS=--max-old-space-size=4096 vite build", "lint": "yarn tsc && eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "lint:fix": "yarn lint --fix", - "preview": "vite preview" + "preview": "vite preview", + "test": "exit 0", + "test:e2e": "exit 0" }, "dependencies": { "@agoric/react-components": "0.2.1-dev-e6f79e0.0", From f2e6eaf5fe8d3ecdfed98245bf81ec889741c654 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 13 Nov 2024 10:53:32 +0500 Subject: [PATCH 09/31] chore: files needed for integration --- .github/workflows/pr.yml | 4 +-- .gitignore | 6 +++++ README.md | 35 ++++++++++++++++++++------- contract/test/orca-multichain.test.js | 2 +- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 799bd47f..1b055c88 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -86,10 +86,10 @@ jobs: if: always() run: kubectl logs hermes-agoric-osmosis-0 --container=relayer || true - - name: Capture and print agoric-cosmos relayer logs + - name: Capture and print agoric-gaia relayer logs if: always() run: kubectl logs hermes-agoric-gaia-0 --container=relayer || true - - name: verify contracts started onchain + - name: verify contract(s) started onchain run: | curl http://localhost:1317/agoric/vstorage/data/published.agoricNames.instance | grep orca diff --git a/.gitignore b/.gitignore index 3d2393e7..39600f82 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ contract/startOrcaContract-permit.json contract/startOrcaContract-plan.json contract/startOrcaContract.js contract/bundles + # Logs logs *.log @@ -36,3 +37,8 @@ dist-ssr !.yarn/releases !.yarn/sdks !.yarn/versions + +e2e-testing/revise-chain-info-permit.json +e2e-testing/revise-chain-info-plan.json +e2e-testing/revise-chain-info.js +e2e-testing/starship-chain-info.js diff --git a/README.md b/README.md index 61ccfd5b..888beddb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ The Orchestration Basics dApp showcases various features of the orchestration API running inside of an end-to-end environment, and a user interface: - ## Set up the local environment - Follow the instructions in `agoric-sdk/multichain-testing/README.md` to setup local multi-chain environment needed to run and test dApp. You can run `agd status` to check if this was successful. @@ -14,75 +13,95 @@ The Orchestration Basics dApp showcases various features of the orchestration AP - Run the following in the top level directory of `dapp-orchestration-basics` to run `hermes update` in the background: ```sh -make hermes-update & +make hermes-update & ``` ## Fund the account + - Run the following in the `contract/` directory of `dapp-orchestration-basics`: + ``` make fund ``` + This will fund `ADDR`, `CLIENTADDR`, and `CLIENT_OSMO_ADDR` as defined in `contract/Makefile`. ## Build & Deploy the dapp + - From the `contract/` directory of `dapp-orchestration-basics`, run: + ``` make e2e ``` + Wait for this step to complete (this could take a while!) before you start UI in the next. + ## Start UI + - Run the following inside of the `ui/` directory of `dapp-orchestration-basics`: + ```sh yarn dev ``` ---- +--- # Tests + From top-level directory: + ``` make test-orca ``` # tests from root directory + ``` yarn cache clean; yarn; yarn workspace dapp-agoric-orca-contract test ; rm -rf -v yarn.lock package-lock.json node_modules contract/node_modules; yarn; yarn workspace dapp-agoric-orca-contract test ``` without clean: + ``` yarn workspace dapp-agoric-orca-contract deploy ``` -# deploy from root directory +# deploy from root directory + ``` yarn cache clean; yarn; yarn workspace dapp-agoric-orca-contract test ; rm -rf -v yarn.lock package-lock.json node_modules contract/node_modules; yarn; yarn workspace dapp-agoric-orca contract:deploy ``` without clean: + ``` yarn workspace dapp-agoric-orca-contract deploy ``` # e2e build/deploy + ``` yarn workspace dapp-agoric-orca-contract deployc ``` # e2e environment using `multichain-testing` + using starship + ``` make teardown ; make stop; make stop-forward; make clean; make; make port-forward ``` # e2e workspaces + ``` yarn workspace dapp-agoric-orca-contract build; yarn workspace dapp-agoric-orca-contract e2e ``` # note + Troubleshooting remote calls If an ordinary synchronous call (obj.method()) fails because the method doesn't exist, the obj may be remote, in which case E(obj).method() might work. @@ -95,21 +114,19 @@ make override-chain-registry ``` # funding on osmosis + ```console osmosisd tx bank send faucet osmo1dw3nep8yqy5szzxn6hmma6j2z77vp4wz8tkh0w3gyrruwny0w03s070kaa 299999999uosmo --chain-id osmosislocal --gas-adjustment 2 --gas auto --from faucet --gas-prices 0.0025uosmo ``` example rpc for balances: + ``` http://127.0.0.1:26657/abci_query?path=%22/cosmos.bank.v1beta1.Query/AllBalances%22&data=%22%5Cn-agoric12j5kzvrwunqvrga5vm4zpy3mkeh3lvyld0amz5%22 ``` # tmp fund ica + ```console agd tx bank send keplr1 agoric15ch7da0d8nvqc8hk6dguq4ext0lvskpjcwm3patf8sygm63chmpqjlzt74 1000uist -y --chain-id agoriclocal ``` - -# Interface -you can run `yarn dev` inside of the `ui` folder. - - \ No newline at end of file diff --git a/contract/test/orca-multichain.test.js b/contract/test/orca-multichain.test.js index b0ea9f67..de435c0c 100644 --- a/contract/test/orca-multichain.test.js +++ b/contract/test/orca-multichain.test.js @@ -21,7 +21,7 @@ const configFile = nodeRequire.resolve('../../e2e-testing/config.yaml'); const test = anyTest; const contractName = 'orca'; -const contractBuilder = './src/builder/init-orca.js'; +const contractBuilder = './scripts/init-orca.js'; const makeTestContext = async t => { t.log('configure starship regisry', configFile); From 0443e6bd12b9ce3e4035780a2e18b3b9d1410245 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Fri, 15 Nov 2024 08:56:53 +0500 Subject: [PATCH 10/31] fixup! addition to package scripts --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c76acaf9..3c23b744 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,9 @@ "lint": "yarn lint:format && yarn workspaces foreach --all run lint", "test": "yarn workspaces foreach --all run test", "integration-test": "cd contract && yarn ava ./test/orca-multichain.test.js", - "build": "yarn workspaces foreach --all run build" + "build": "yarn workspaces foreach --all run build", + "lint:fix": "yarn format && yarn workspaces foreach --all run lint:fix", + "postinstall": "npx patch-package" }, "devDependencies": { "@types/node": "npm:20.16.8", From 47fd183a27a85e8c15c27c5046bc509755c90054 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Mon, 18 Nov 2024 12:54:47 +0500 Subject: [PATCH 11/31] chore: convert contract/flows js to ts --- contract/Makefile | 4 +- contract/package.json | 2 +- contract/rollup.config.mjs | 2 +- contract/src/builder/init-orca.js | 2 +- .../{orca.contract.js => orca.contract.ts} | 48 ++--- contract/src/{orca.flows.js => orca.flows.ts} | 41 ++-- contract/src/orca.proposal.js | 2 +- contract/test/bundle-source.test.js | 2 +- contract/test/orca-contract.test.js | 4 +- contract/tsconfig.json | 6 +- yarn.lock | 181 +++++++++++++++++- 11 files changed, 227 insertions(+), 67 deletions(-) rename contract/src/{orca.contract.js => orca.contract.ts} (77%) rename contract/src/{orca.flows.js => orca.flows.ts} (69%) diff --git a/contract/Makefile b/contract/Makefile index 0340cb49..02f3c517 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -254,9 +254,9 @@ build: buildc: kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn build:deployer" deployc: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn node scripts/deploy-contract.js --install src/orca.contract.js --eval src/orca.proposal.js" + kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn node scripts/deploy-contract.js --install src/orca.contract.ts --eval src/orca.proposal.js" deploy: - yarn node scripts/deploy-contract.js --install src/orca.contract.js --eval src/orca.proposal.js + yarn node scripts/deploy-contract.js --install src/orca.contract.ts --eval src/orca.proposal.js test-orca: yarn test ./test/orca-contract.test.js diff --git a/contract/package.json b/contract/package.json index 7b1857a9..36e6468b 100644 --- a/contract/package.json +++ b/contract/package.json @@ -77,7 +77,7 @@ "@agoric/store": "^0.9.3-u17.1", "@agoric/vats": "^0.16.0-u17.1", "@agoric/zoe": "^0.26.3-u17.1", - "@endo/bundle-source": "^3.4.0", + "@endo/bundle-source": "^3.5.0", "@endo/errors": "^1.2.4", "@endo/far": "^1.1.4", "@endo/init": "^1.1.3", diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index 7c5f8836..bffb741a 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -38,7 +38,7 @@ import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js const config1 = ({ name, coreEntry = `./src/${name}.proposal.js`, - contractEntry = `./src/${name}.contract.js`, + contractEntry = `./src/${name}.contract.ts`, coreScript = `bundles/deploy-${name}.js`, coreScriptOptions = undefined, permitFile = `deploy-${name}-permit.json`, diff --git a/contract/src/builder/init-orca.js b/contract/src/builder/init-orca.js index 7d701a95..2aed4f23 100644 --- a/contract/src/builder/init-orca.js +++ b/contract/src/builder/init-orca.js @@ -48,7 +48,7 @@ export const defaultProposalBuilder = async ( getManifestForOrca.name, { installKeys: { - orca: publishRef(install('../../src/orca.contract.js')), + orca: publishRef(install('../../src/orca.contract.ts')), }, chainDetails, }, diff --git a/contract/src/orca.contract.js b/contract/src/orca.contract.ts similarity index 77% rename from contract/src/orca.contract.js rename to contract/src/orca.contract.ts index 22b93311..f9a194e4 100644 --- a/contract/src/orca.contract.js +++ b/contract/src/orca.contract.ts @@ -1,20 +1,20 @@ +/// +/// + import { AmountShape } from '@agoric/ertp'; import { makeTracer } from '@agoric/internal'; import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { ChainInfoShape } from '@agoric/orchestration/src/typeGuards.js'; import { InvitationShape } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; -import * as flows from './orca.flows.js'; +import * as flows from './orca.flows.ts'; + +import type { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; +import type { CosmosChainInfo } from '@agoric/orchestration'; +import type { OrchestrationPowers, OrchestrationTools } from '@agoric/orchestration/src/utils/start-helper.js'; +import type { Zone } from '@agoric/zone'; -/** - * @import {Marshaller} from '@agoric/internal/src/lib-chainStorage.js'; - * @import {CosmosChainInfo} from '@agoric/orchestration'; - * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; - * @import {Zone} from '@agoric/zone'; - */ -/// -/// const { entries, keys } = Object; const trace = makeTracer('OrchDev1'); @@ -34,8 +34,8 @@ const OrchestrationPowersShape = M.splitRecord({ agoricNames: M.remotable('agoricNames'), }); -/** @type {ContractMeta} */ -export const meta = { + +export const meta: ContractMeta = { privateArgsShape: M.and( OrchestrationPowersShape, M.splitRecord({ @@ -48,23 +48,15 @@ export const meta = { }; harden(meta); -/** - * @typedef {{ - * chainDetails: Record - * }} OrcaTerms - * - * @param {ZCF} zcf - * @param {OrchestrationPowers & { - * marshaller: Marshaller; - * }} privateArgs - * @param {Zone} zone - * @param {OrchestrationTools} tools - */ +type OrcaTerms = { + chainDetails: Record +} + const contract = async ( - zcf, - privateArgs, - zone, - { orchestrateAll, zoeTools, chainHub }, + zcf: ZCF, + privateArgs: OrchestrationPowers & {marshaller: Marshaller}, + zone: Zone, + { orchestrateAll, zoeTools, chainHub }: OrchestrationTools, ) => { trace('orca start contract'); @@ -113,4 +105,4 @@ const contract = async ( export const start = withOrchestration(contract); harden(start); -/** @typedef {typeof start} OrcaSF */ +export type OrcaSF = typeof start; \ No newline at end of file diff --git a/contract/src/orca.flows.js b/contract/src/orca.flows.ts similarity index 69% rename from contract/src/orca.flows.js rename to contract/src/orca.flows.ts index 8349a29d..f27fbe8f 100644 --- a/contract/src/orca.flows.js +++ b/contract/src/orca.flows.ts @@ -1,13 +1,6 @@ -/** - * @import {GuestOf} from '@agoric/async-flow'; - * @import {Amount} from '@agoric/ertp/src/types.js'; - * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js'; - * @import {ChainAddress, Orchestrator} from '@agoric/orchestration'; - * @import {ZoeTools} from '@agoric/orchestration/src/utils/zoe-tools.js'; - * @import {Transfer} from './orca.contract.js'; - * @import {DenomArg} from '@agoric/orchestration'; - - */ +import type { Orchestrator } from '@agoric/orchestration'; +import type { ZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; +import type { DenomArg } from '@agoric/orchestration'; import { M, mustMatch } from '@endo/patterns'; import { makeTracer } from './debug.js'; @@ -17,13 +10,13 @@ const trace = makeTracer('OrchFlows'); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. - * - * @param {Orchestrator} orch - * @param {unknown} _ctx - * @param {ZCFSeat} seat - * @param {{ chainName: string, denom: string }} offerArgs */ -export const makeAccount = async (orch, _ctx, seat, offerArgs) => { +export const makeAccount = async ( + orch: Orchestrator, + _ctx: unknown, + seat: ZCFSeat, + offerArgs: { chainName: string; denom: string }, +) => { trace('makeAccount'); mustMatch(offerArgs, M.splitRecord({ chainName: M.string() })); const { chainName } = offerArgs; @@ -39,18 +32,12 @@ harden(makeAccount); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. - * - * @param {Orchestrator} orch - * @param {object} ctx - * @param {ZoeTools['localTransfer']} ctx.localTransfer - * @param {ZCFSeat} seat - * @param {{ chainName: string, denom: DenomArg }} offerArgs */ export const makeCreateAndFund = async ( - orch, - { localTransfer }, - seat, - { chainName, denom }, + orch: Orchestrator, + { localTransfer }: { localTransfer: ZoeTools['localTransfer'] }, + seat: ZCFSeat, + { chainName, denom }: { chainName: string; denom: DenomArg }, ) => { trace( `invoked makeCreateAndFund with chain ${chainName}, and denom ${denom}`, @@ -100,4 +87,4 @@ export const makeCreateAndFund = async ( return remoteAccount.asContinuingOffer(); }; -harden(makeCreateAndFund); +harden(makeCreateAndFund); \ No newline at end of file diff --git a/contract/src/orca.proposal.js b/contract/src/orca.proposal.js index 445dc0f8..e3413599 100644 --- a/contract/src/orca.proposal.js +++ b/contract/src/orca.proposal.js @@ -9,7 +9,7 @@ import { makeTracer } from './tools/debug.js'; * @import {ERef} from '@endo/far'; * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; * @import {ChainInfo, IBCConnectionInfo,} from '@agoric/orchestration'; - * @import {OrcaSF} from './orca.contract.js'; + * @import {OrcaSF} from './orca.contract.ts'; * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; */ diff --git a/contract/test/bundle-source.test.js b/contract/test/bundle-source.test.js index 4e958445..0beed6ce 100644 --- a/contract/test/bundle-source.test.js +++ b/contract/test/bundle-source.test.js @@ -11,7 +11,7 @@ import { E, passStyleOf } from '@endo/far'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; const myRequire = createRequire(import.meta.url); -const contractPath = myRequire.resolve(`../src/orca.contract.js`); +const contractPath = myRequire.resolve(`../src/orca.contract.ts`); test('bundleSource() bundles the contract for use with zoe', async t => { const bundle = await bundleSource(contractPath); diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index 7a670a59..271c1885 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -19,12 +19,12 @@ import { installContract } from '../src/platform-goals/start-contract.js'; * @import {IcaAccount, MakeCosmosInterchainService} from '@agoric/orchestration'; * @import {LocalChain,LocalChainAccount} from '@agoric/vats/src/localchain.js'; * @import {TargetRegistration} from '@agoric/vats/src/bridge-target.js'; - * @import {OrcaSF} from '../src/orca.contract.js'; + * @import {OrcaSF} from '../src/orca.contract.ts'; */ const nodeRequire = createRequire(import.meta.url); -const contractPath = nodeRequire.resolve(`../src/orca.contract.js`); +const contractPath = nodeRequire.resolve(`../src/orca.contract.ts`); const scriptRoot = { orca: nodeRequire.resolve('../src/orca.proposal.js'), }; diff --git a/contract/tsconfig.json b/contract/tsconfig.json index 4646fe56..08a01a83 100644 --- a/contract/tsconfig.json +++ b/contract/tsconfig.json @@ -12,8 +12,10 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "outDir": "./dist" + "outDir": "./dist", + "allowImportingTsExtensions": true, + "noEmit": true }, "include": ["tools", "test"], "exclude": ["node_modules"] -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0094f4c6..cfc49b6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2953,6 +2953,13 @@ __metadata: languageName: node linkType: hard +"@endo/base64@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/base64@npm:1.0.9" + checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 + languageName: node + linkType: hard + "@endo/bundle-source@npm:2.5.2-upstream-rollup": version: 2.5.2-upstream-rollup resolution: "@endo/bundle-source@npm:2.5.2-upstream-rollup" @@ -3021,6 +3028,28 @@ __metadata: languageName: node linkType: hard +"@endo/bundle-source@npm:^3.5.0": + version: 3.5.0 + resolution: "@endo/bundle-source@npm:3.5.0" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/evasive-transform": "npm:^1.3.3" + "@endo/init": "npm:^1.1.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/where": "npm:^1.0.9" + "@rollup/plugin-commonjs": "npm:^19.0.0" + "@rollup/plugin-json": "npm:^6.1.0" + "@rollup/plugin-node-resolve": "npm:^13.0.0" + acorn: "npm:^8.2.4" + rollup: "npm:^2.79.1" + ts-blank-space: "npm:^0.4.1" + bin: + bundle-source: ./src/tool.js + checksum: 10c0/7f97194c97eb28abbde6655f7de4410d5aae5d6a2a3d712e1418b9b4fd20823333b7fe8956401c2f201280340731e51e28d9c4fbe3b5a787b0abd00e3ac13b52 + languageName: node + linkType: hard + "@endo/captp@npm:3.1.1, @endo/captp@npm:^3.1.1": version: 3.1.1 resolution: "@endo/captp@npm:3.1.1" @@ -3081,6 +3110,13 @@ __metadata: languageName: node linkType: hard +"@endo/cjs-module-analyzer@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/cjs-module-analyzer@npm:1.0.9" + checksum: 10c0/cb8c56d108b175f2f211c8292bac6cda35c44b9c16fb2763ab9a32b545895e1721633938b440bfe7a06f69e1f168e9b248ef103631a1d4c63fda8cbe580ca185 + languageName: node + linkType: hard + "@endo/common@npm:^1.2.5": version: 1.2.5 resolution: "@endo/common@npm:1.2.5" @@ -3128,6 +3164,19 @@ __metadata: languageName: node linkType: hard +"@endo/compartment-mapper@npm:^1.4.0": + version: 1.4.0 + resolution: "@endo/compartment-mapper@npm:1.4.0" + dependencies: + "@endo/cjs-module-analyzer": "npm:^1.0.9" + "@endo/module-source": "npm:^1.1.2" + "@endo/trampoline": "npm:^1.0.3" + "@endo/zip": "npm:^1.0.9" + ses: "npm:^1.10.0" + checksum: 10c0/2c4999962016f57c0f3a40ce1445a064b826eb101a972d26ba56d9dba6d3d8f66744912e3f7e24754018bd2c633663a00ea5ab0d7658c4907c9372ddd3e56464 + languageName: node + linkType: hard + "@endo/env-options@npm:^0.1.4": version: 0.1.4 resolution: "@endo/env-options@npm:0.1.4" @@ -3142,6 +3191,13 @@ __metadata: languageName: node linkType: hard +"@endo/env-options@npm:^1.1.8": + version: 1.1.8 + resolution: "@endo/env-options@npm:1.1.8" + checksum: 10c0/2f519f48a5b966dbd9e66134d4abc89ff02b9791d21146b49031ceb694584f3f41c6119125b6bb4eb0d347f5bcd846473b5f3c4ae6bae3dac19402fcaf522520 + languageName: node + linkType: hard + "@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5": version: 1.2.5 resolution: "@endo/errors@npm:1.2.5" @@ -3176,6 +3232,18 @@ __metadata: languageName: node linkType: hard +"@endo/evasive-transform@npm:^1.3.3": + version: 1.3.3 + resolution: "@endo/evasive-transform@npm:1.3.3" + dependencies: + "@agoric/babel-generator": "npm:^7.17.6" + "@babel/parser": "npm:^7.23.6" + "@babel/traverse": "npm:^7.23.6" + source-map-js: "npm:^1.2.0" + checksum: 10c0/34fae4789ab3142ab73a5c94a46954908737bbc72f1e302c338941ca2556ab2127505ecee57a1c0d11e0b9c7070b4a579ce4e7e60585990161cec64ce0955211 + languageName: node + linkType: hard + "@endo/eventual-send@npm:0.17.2": version: 0.17.2 resolution: "@endo/eventual-send@npm:0.17.2" @@ -3201,6 +3269,15 @@ __metadata: languageName: node linkType: hard +"@endo/eventual-send@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/eventual-send@npm:1.2.8" + dependencies: + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/d7c16c935441b67d029fcb6785f425a1194fb7f936e4b20dde21eb393266cb7366edf7a95d3fdfa96cd4a3246a3659a06d0dbb3c1217045e1718e1cf34c7a3bd + languageName: node + linkType: hard + "@endo/exo@npm:^0.2.2": version: 0.2.2 resolution: "@endo/exo@npm:0.2.2" @@ -3306,6 +3383,18 @@ __metadata: languageName: node linkType: hard +"@endo/init@npm:^1.1.7": + version: 1.1.7 + resolution: "@endo/init@npm:1.1.7" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/lockdown": "npm:^1.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/6cfcc244f02da9883f65a8f34da9483a628d5350192983c53d5116b12403dc5693145c6349b6c3ca381b6b8d9590cee16f90440dc0e2da5f525e13079d6c9a2f + languageName: node + linkType: hard + "@endo/lockdown@npm:^0.1.28": version: 0.1.28 resolution: "@endo/lockdown@npm:0.1.28" @@ -3333,6 +3422,15 @@ __metadata: languageName: node linkType: hard +"@endo/lockdown@npm:^1.0.13": + version: 1.0.13 + resolution: "@endo/lockdown@npm:1.0.13" + dependencies: + ses: "npm:^1.10.0" + checksum: 10c0/9df04cc477595b368088a1d445f2241d8a152cb4dcf6a79d39d4804594dd8ff472380ab2bdf262adeb5b4b7cfc73effb6cc716c5a3aeca282801d57fe8a018a0 + languageName: node + linkType: hard + "@endo/marshal@npm:0.8.5": version: 0.8.5 resolution: "@endo/marshal@npm:0.8.5" @@ -3384,6 +3482,19 @@ __metadata: languageName: node linkType: hard +"@endo/module-source@npm:^1.1.2": + version: 1.1.2 + resolution: "@endo/module-source@npm:1.1.2" + dependencies: + "@agoric/babel-generator": "npm:^7.17.6" + "@babel/parser": "npm:^7.23.6" + "@babel/traverse": "npm:^7.23.6" + "@babel/types": "npm:^7.24.0" + ses: "npm:^1.10.0" + checksum: 10c0/3d64ff5430f288531a00e124ae0620e137dab0fdaba00f2d41066b8307eb2da30e3987d84fe450d55d844e0f96feafa36a825cecc615c05d96224a209832c95c + languageName: node + linkType: hard + "@endo/nat@npm:4.1.27, @endo/nat@npm:^4.1.27": version: 4.1.27 resolution: "@endo/nat@npm:4.1.27" @@ -3512,6 +3623,15 @@ __metadata: languageName: node linkType: hard +"@endo/promise-kit@npm:^1.1.8": + version: 1.1.8 + resolution: "@endo/promise-kit@npm:1.1.8" + dependencies: + ses: "npm:^1.10.0" + checksum: 10c0/3a51755822bd4112474bec584005b81f9ffe6a6b590faa16cff7a4994010d001d6d190f58a1e890d85b0feb0eb052d79ed2c5ed88977afb0e47ca53b6b199196 + languageName: node + linkType: hard + "@endo/ses-ava@npm:0.2.40": version: 0.2.40 resolution: "@endo/ses-ava@npm:0.2.40" @@ -3616,6 +3736,13 @@ __metadata: languageName: node linkType: hard +"@endo/trampoline@npm:^1.0.3": + version: 1.0.3 + resolution: "@endo/trampoline@npm:1.0.3" + checksum: 10c0/be0c3784b17f422ae04e28a6722e2abd193a5585a82acf5eb388476094c026aa5e76a383db887bdf6a032ccf0a12c38a967f5f1e71cef44a4659606be789b548 + languageName: node + linkType: hard + "@endo/where@npm:^0.3.5": version: 0.3.5 resolution: "@endo/where@npm:0.3.5" @@ -3630,6 +3757,13 @@ __metadata: languageName: node linkType: hard +"@endo/where@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 + languageName: node + linkType: hard + "@endo/zip@npm:0.2.31, @endo/zip@npm:^0.2.31": version: 0.2.31 resolution: "@endo/zip@npm:0.2.31" @@ -3651,6 +3785,13 @@ __metadata: languageName: node linkType: hard +"@endo/zip@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc + languageName: node + linkType: hard + "@es-joy/jsdoccomment@npm:~0.41.0": version: 0.41.0 resolution: "@es-joy/jsdoccomment@npm:0.41.0" @@ -10936,7 +11077,7 @@ __metadata: "@agoric/zoe": "npm:^0.26.3-u17.1" "@agoric/zone": "npm:^0.3.0-u17.1" "@cosmjs/proto-signing": "npm:^0.32.3" - "@endo/bundle-source": "npm:^3.4.0" + "@endo/bundle-source": "npm:^3.5.0" "@endo/errors": "npm:^1.2.4" "@endo/eslint-plugin": "npm:^2.2.0" "@endo/far": "npm:^1.1.4" @@ -17617,6 +17758,15 @@ __metadata: languageName: node linkType: hard +"ses@npm:^1.10.0": + version: 1.10.0 + resolution: "ses@npm:1.10.0" + dependencies: + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/83b92bc49e27af04eeb7ee01a2196a0c4b0906e4de51e70403aa9ffc82be1d27a0c3506f2d54da8d6d260be0855f2123a13a7e2c6896e81ec85899df1a428609 + languageName: node + linkType: hard + "ses@npm:^1.8.0": version: 1.8.0 resolution: "ses@npm:1.8.0" @@ -18485,6 +18635,15 @@ __metadata: languageName: node linkType: hard +"ts-blank-space@npm:^0.4.1": + version: 0.4.3 + resolution: "ts-blank-space@npm:0.4.3" + dependencies: + typescript: "npm:5.1.6 - 5.6.x" + checksum: 10c0/362feac2e19cf8f1936cefdc658463558e0ef88568fdb7267910c50eb20b27ab2e21b4cf8100890f9ff1568a4e185daa68947c00dd4bfe176d61f554010266e1 + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -18768,6 +18927,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.1.6 - 5.6.x": + version: 5.6.3 + resolution: "typescript@npm:5.6.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 + languageName: node + linkType: hard + "typescript@npm:^5.2.2, typescript@npm:^5.3.3, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": version: 5.6.2 resolution: "typescript@npm:5.6.2" @@ -18778,6 +18947,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin": + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/ac8307bb06bbfd08ae7137da740769b7d8c3ee5943188743bb622c621f8ad61d244767480f90fbd840277fbf152d8932aa20c33f867dea1bb5e79b187ca1a92f + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": version: 5.6.2 resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=74658d" From 7199164d45765b34f64c368e108d3d3dd2dfcd80 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 19 Nov 2024 11:17:09 +0500 Subject: [PATCH 12/31] chore: add deps for auto-stake-it --- contract/package.json | 22 +- contract/src/auto-stake-it-tap-kit.js | 154 ++ contract/src/auto-stake-it.contract.js | 76 + contract/src/auto-stake-it.flows.js | 102 + contract/src/chain-info.js | 108 + contract/src/exos/README.md | 130 ++ contract/src/exos/chain-hub-admin.js | 84 + contract/src/exos/chain-hub.js | 488 ++++ .../src/exos/combine-invitation-makers.js | 59 + .../src/exos/cosmos-interchain-service.js | 280 +++ .../src/exos/cosmos-orchestration-account.js | 1147 ++++++++++ contract/src/exos/exo-interfaces.ts | 35 + contract/src/exos/ibc-packet.js | 219 ++ contract/src/exos/ica-account-kit.js | 231 ++ contract/src/exos/icq-connection-kit.js | 132 ++ contract/src/exos/local-chain-facade.js | 196 ++ .../src/exos/local-orchestration-account.js | 747 +++++++ contract/src/exos/orchestrator.js | 196 ++ contract/src/exos/packet-tools.js | 372 +++ contract/src/exos/portfolio-holder-kit.js | 230 ++ contract/src/exos/remote-chain-facade.js | 269 +++ contract/src/facade.js | 150 ++ contract/src/fetched-chain-info.js | 1990 +++++++++++++++++ contract/src/typeGuards.js | 197 ++ contract/src/utils/address.js | 103 + contract/src/utils/amounts.js | 59 + contract/src/utils/cosmos.js | 82 + contract/src/utils/denomHash.js | 22 + contract/src/utils/orc.js | 38 + contract/src/utils/orchestrationAccount.js | 40 + contract/src/utils/packet.js | 112 + contract/src/utils/registry.js | 130 ++ contract/src/utils/start-helper.js | 214 ++ contract/src/utils/time.js | 48 + contract/src/utils/zcf-tools.js | 35 + contract/src/utils/zoe-tools.js | 186 ++ contract/test/auto-stake-it.contract.test.ts | 154 ++ contract/test/ibc-mocks.ts | 128 ++ contract/test/supports.ts | 236 ++ contract/tools/ibc-mocks.ts | 262 +++ contract/tools/protobuf-decoder.js | 153 ++ yarn.lock | 37 +- 42 files changed, 9636 insertions(+), 17 deletions(-) create mode 100644 contract/src/auto-stake-it-tap-kit.js create mode 100644 contract/src/auto-stake-it.contract.js create mode 100644 contract/src/auto-stake-it.flows.js create mode 100644 contract/src/chain-info.js create mode 100644 contract/src/exos/README.md create mode 100644 contract/src/exos/chain-hub-admin.js create mode 100644 contract/src/exos/chain-hub.js create mode 100644 contract/src/exos/combine-invitation-makers.js create mode 100644 contract/src/exos/cosmos-interchain-service.js create mode 100644 contract/src/exos/cosmos-orchestration-account.js create mode 100644 contract/src/exos/exo-interfaces.ts create mode 100644 contract/src/exos/ibc-packet.js create mode 100644 contract/src/exos/ica-account-kit.js create mode 100644 contract/src/exos/icq-connection-kit.js create mode 100644 contract/src/exos/local-chain-facade.js create mode 100644 contract/src/exos/local-orchestration-account.js create mode 100644 contract/src/exos/orchestrator.js create mode 100644 contract/src/exos/packet-tools.js create mode 100644 contract/src/exos/portfolio-holder-kit.js create mode 100644 contract/src/exos/remote-chain-facade.js create mode 100644 contract/src/facade.js create mode 100644 contract/src/fetched-chain-info.js create mode 100644 contract/src/typeGuards.js create mode 100644 contract/src/utils/address.js create mode 100644 contract/src/utils/amounts.js create mode 100644 contract/src/utils/cosmos.js create mode 100644 contract/src/utils/denomHash.js create mode 100644 contract/src/utils/orc.js create mode 100644 contract/src/utils/orchestrationAccount.js create mode 100644 contract/src/utils/packet.js create mode 100644 contract/src/utils/registry.js create mode 100644 contract/src/utils/start-helper.js create mode 100644 contract/src/utils/time.js create mode 100644 contract/src/utils/zcf-tools.js create mode 100644 contract/src/utils/zoe-tools.js create mode 100644 contract/test/auto-stake-it.contract.test.ts create mode 100644 contract/test/ibc-mocks.ts create mode 100644 contract/test/supports.ts create mode 100644 contract/tools/ibc-mocks.ts create mode 100644 contract/tools/protobuf-decoder.js diff --git a/contract/package.json b/contract/package.json index 36e6468b..556225e2 100644 --- a/contract/package.json +++ b/contract/package.json @@ -31,6 +31,7 @@ "@agoric/vat-data": "^0.5.3-u17.1", "@agoric/vow": "^0.2.0-u17.1", "@agoric/zone": "^0.3.0-u17.1", + "@ava/typescript": "^5.0.0", "@cosmjs/proto-signing": "^0.32.3", "@endo/eslint-plugin": "^2.2.0", "@endo/nat": "^5.0.9", @@ -43,7 +44,7 @@ "@rollup/plugin-replace": "^5.0.5", "@rollup/plugin-typescript": "^11.1.6", "@types/fs-extra": "^11", - "@types/node": "^20.11.13", + "@types/node": "^22.9.0", "@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/parser": "^7.15.0", "agoric": "^0.22.0-u17.1", @@ -64,9 +65,10 @@ "prettier-plugin-jsdoc": "^1.0.0", "rollup": "^4.18.0", "starshipjs": "^2.4.0", + "ts-node": "^10.9.2", "tsimp": "^2.0.10", "type-coverage": "^2.26.3", - "typescript": "^5.3.3", + "typescript": "^5.6.3", "typescript-eslint": "^7.18.0" }, "dependencies": { @@ -90,15 +92,17 @@ "ts": "module" }, "files": [ - "test/**/test-*.*", - "test/**/*.test.*", - "!test/orca-multichain.test.js" + "test/**/*.test.*" + ], + "nodeArguments": [ + "--loader=ts-blank-space/register", + "--no-warnings" + ], + "require": [ + "@endo/init/debug.js" ], "timeout": "20m", - "workerThreads": false, - "match": [ - "!test/*multichain*" - ] + "workerThreads": false }, "keywords": [], "repository": { diff --git a/contract/src/auto-stake-it-tap-kit.js b/contract/src/auto-stake-it-tap-kit.js new file mode 100644 index 00000000..8e73fc74 --- /dev/null +++ b/contract/src/auto-stake-it-tap-kit.js @@ -0,0 +1,154 @@ +import { M, mustMatch } from '@endo/patterns'; +import { E } from '@endo/far'; +import { VowShape } from '@agoric/vow'; +import { makeTracer } from '@agoric/internal'; +import { atob } from '@endo/base64'; +import { ChainAddressShape } from '../typeGuards.js'; + +const trace = makeTracer('AutoStakeItTap'); + +/** + * @import {IBCChannelID, VTransferIBCEvent} from '@agoric/vats'; + * @import {VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {TargetApp} from '@agoric/vats/src/bridge-target.js'; + * @import {ChainAddress, CosmosValidatorAddress, Denom, OrchestrationAccount, StakingAccountActions} from '@agoric/orchestration'; + * @import {FungibleTokenPacketData} from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; + * @import {TypedPattern} from '@agoric/internal'; + */ + +/** + * @typedef {{ + * stakingAccount: ERef & StakingAccountActions>; + * localAccount: ERef>; + * validator: CosmosValidatorAddress; + * localChainAddress: ChainAddress; + * remoteChainAddress: ChainAddress; + * sourceChannel: IBCChannelID; + * remoteDenom: Denom; + * localDenom: Denom; + * }} StakingTapState + */ + +/** @type {TypedPattern} */ +const StakingTapStateShape = { + stakingAccount: M.remotable('CosmosOrchestrationAccount'), + localAccount: M.remotable('LocalOrchestrationAccount'), + validator: ChainAddressShape, + localChainAddress: ChainAddressShape, + remoteChainAddress: ChainAddressShape, + sourceChannel: M.string(), + remoteDenom: M.string(), + localDenom: M.string(), +}; +harden(StakingTapStateShape); + +/** + * @param {Zone} zone + * @param {VowTools} vowTools + */ +const prepareStakingTapKit = (zone, { watch }) => { + return zone.exoClassKit( + 'StakingTapKit', + { + tap: M.interface('AutoStakeItTap', { + receiveUpcall: M.call(M.record()).returns( + M.or(VowShape, M.undefined()), + ), + }), + transferWatcher: M.interface('TransferWatcher', { + onFulfilled: M.call(M.undefined()) + .optional(M.bigint()) + .returns(VowShape), + }), + }, + /** @param {StakingTapState} initialState */ + initialState => { + mustMatch(initialState, StakingTapStateShape); + return harden(initialState); + }, + { + tap: { + /** + * Transfers from localAccount to stakingAccount, then delegates from + * the stakingAccount to `validator` if the expected token (remoteDenom) + * is received. + * + * @param {VTransferIBCEvent} event + */ + receiveUpcall(event) { + trace('receiveUpcall', event); + + // ignore packets from unknown channels + if (event.packet.source_channel !== this.state.sourceChannel) { + return; + } + + const tx = /** @type {FungibleTokenPacketData} */ ( + JSON.parse(atob(event.packet.data)) + ); + trace('receiveUpcall packet data', tx); + + const { remoteDenom, localChainAddress } = this.state; + // ignore outgoing transfers + if (tx.receiver !== localChainAddress.value) { + return; + } + // only interested in transfers of `remoteDenom` + if (tx.denom !== remoteDenom) { + return; + } + + const { localAccount, localDenom, remoteChainAddress } = this.state; + return watch( + E(localAccount).transfer(remoteChainAddress, { + denom: localDenom, + value: BigInt(tx.amount), + }), + this.facets.transferWatcher, + BigInt(tx.amount), + ); + }, + }, + transferWatcher: { + /** + * @param {void} _result + * @param {bigint} value the qty of uatom to delegate + */ + onFulfilled(_result, value) { + const { stakingAccount, validator, remoteDenom } = this.state; + return watch( + E(stakingAccount).delegate(validator, { + denom: remoteDenom, + value, + }), + ); + }, + }, + }, + ); +}; + +/** + * Provides a {@link TargetApp} that reacts to an incoming IBC transfer by: + * + * 1. transferring the funds to the staking account specified at initialization + * 2. delegating the funds to the validator specified at initialization + * + * XXX consider a facet with a method for changing the validator + * + * XXX consider logic for multiple stakingAccounts + denoms + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @returns {( + * ...args: Parameters> + * ) => ReturnType>['tap']} + */ +export const prepareStakingTap = (zone, vowTools) => { + const makeKit = prepareStakingTapKit(zone, vowTools); + return (...args) => makeKit(...args).tap; +}; + +/** @typedef {ReturnType} MakeStakingTap */ +/** @typedef {ReturnType} StakingTap */ diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js new file mode 100644 index 00000000..25651fae --- /dev/null +++ b/contract/src/auto-stake-it.contract.js @@ -0,0 +1,76 @@ +import { + EmptyProposalShape, + InvitationShape, +} from '@agoric/zoe/src/typeGuards.js'; +import { M } from '@endo/patterns'; +import { prepareChainHubAdmin } from './exos/chain-hub-admin.js'; +import { preparePortfolioHolder } from './exos/portfolio-holder-kit.js'; +import { withOrchestration } from './utils/start-helper.js'; +import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; +import * as flows from './auto-stake-it.flows.js'; + +/** + * @import {Zone} from '@agoric/zone'; + * @import {OrchestrationPowers, OrchestrationTools} from './utils/start-helper.js'; + */ + +/** + * AutoStakeIt allows users to to create an auto-forwarding address that + * transfers and stakes tokens on a remote chain when received. + * + * To be wrapped with `withOrchestration`. + * + * @param {ZCF} zcf + * @param {OrchestrationPowers & { + * marshaller: Marshaller; + * }} _privateArgs + * @param {Zone} zone + * @param {OrchestrationTools} tools + */ +const contract = async ( + zcf, + _privateArgs, + zone, + { chainHub, orchestrateAll, vowTools }, +) => { + const makeStakingTap = prepareStakingTap( + zone.subZone('stakingTap'), + vowTools, + ); + const makePortfolioHolder = preparePortfolioHolder( + zone.subZone('portfolio'), + vowTools, + ); + + const { makeAccounts } = orchestrateAll(flows, { + makeStakingTap, + makePortfolioHolder, + chainHub, + }); + + const publicFacet = zone.exo( + 'AutoStakeIt Public Facet', + M.interface('AutoStakeIt Public Facet', { + makeAccountsInvitation: M.callWhen().returns(InvitationShape), + }), + { + makeAccountsInvitation() { + return zcf.makeInvitation( + makeAccounts, + 'Make Accounts', + undefined, + EmptyProposalShape, + ); + }, + }, + ); + + const creatorFacet = prepareChainHubAdmin(zone, chainHub); + + return { publicFacet, creatorFacet }; +}; + +export const start = withOrchestration(contract); +harden(start); + +/** @typedef {typeof start} AutoStakeItSF */ diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/auto-stake-it.flows.js new file mode 100644 index 00000000..74d1fc83 --- /dev/null +++ b/contract/src/auto-stake-it.flows.js @@ -0,0 +1,102 @@ +import { Fail } from '@endo/errors'; +import { denomHash } from '../utils/denomHash.js'; + +/** + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {GuestInterface} from '@agoric/async-flow'; + * @import {CosmosValidatorAddress, Orchestrator, CosmosInterchainService, Denom, OrchestrationAccount, StakingAccountActions, OrchestrationFlow} from '@agoric/orchestration'; + * @import {MakeStakingTap} from './auto-stake-it-tap-kit.js'; + * @import {MakePortfolioHolder} from '../exos/portfolio-holder-kit.js'; + * @import {ChainHub} from '../exos/chain-hub.js'; + */ + +/** + * @satisfies {OrchestrationFlow} + * @param {Orchestrator} orch + * @param {{ + * makeStakingTap: MakeStakingTap; + * makePortfolioHolder: MakePortfolioHolder; + * chainHub: GuestInterface; + * }} ctx + * @param {ZCFSeat} seat + * @param {{ + * chainName: string; + * validator: CosmosValidatorAddress; + * }} offerArgs + */ +export const makeAccounts = async ( + orch, + { makeStakingTap, makePortfolioHolder, chainHub }, + seat, + { chainName, validator }, +) => { + seat.exit(); // no funds exchanged + const [agoric, remoteChain] = await Promise.all([ + orch.getChain('agoric'), + orch.getChain(chainName), + ]); + const { chainId, stakingTokens } = await remoteChain.getChainInfo(); + const remoteDenom = stakingTokens[0].denom; + remoteDenom || + Fail`${chainId || chainName} does not have stakingTokens in config`; + if (chainId !== validator.chainId) { + Fail`validator chainId ${validator.chainId} does not match remote chainId ${chainId}`; + } + const [localAccount, stakingAccount] = await Promise.all([ + agoric.makeAccount(), + /** @type {Promise & StakingAccountActions>} */ ( + remoteChain.makeAccount() + ), + ]); + + const [localChainAddress, remoteChainAddress] = await Promise.all([ + localAccount.getAddress(), + stakingAccount.getAddress(), + ]); + const agoricChainId = (await agoric.getChainInfo()).chainId; + const { transferChannel } = await chainHub.getConnectionInfo( + agoricChainId, + chainId, + ); + assert(transferChannel.counterPartyChannelId, 'unable to find sourceChannel'); + + const localDenom = `ibc/${denomHash({ denom: remoteDenom, channelId: transferChannel.channelId })}`; + + // Every time the `localAccount` receives `remoteDenom` over IBC, delegate it. + const tap = makeStakingTap({ + localAccount, + stakingAccount, + validator, + localChainAddress, + remoteChainAddress, + sourceChannel: transferChannel.counterPartyChannelId, + remoteDenom, + localDenom, + }); + // XXX consider storing appRegistration, so we can .revoke() or .updateTargetApp() + // @ts-expect-error tap.receiveUpcall: 'Vow | undefined' not assignable to 'Promise' + await localAccount.monitorTransfers(tap); + + const accountEntries = harden( + /** @type {[string, OrchestrationAccount][]} */ ([ + ['agoric', localAccount], + [chainName, stakingAccount], + ]), + ); + const publicTopicEntries = harden( + /** @type {[string, ResolvedPublicTopic][]} */ ( + await Promise.all( + accountEntries.map(async ([name, account]) => { + const { account: topicRecord } = await account.getPublicTopics(); + return [name, topicRecord]; + }), + ) + ), + ); + const portfolioHolder = makePortfolioHolder( + accountEntries, + publicTopicEntries, + ); + return portfolioHolder.asContinuingOffer(); +}; +harden(makeAccounts); diff --git a/contract/src/chain-info.js b/contract/src/chain-info.js new file mode 100644 index 00000000..c90aebec --- /dev/null +++ b/contract/src/chain-info.js @@ -0,0 +1,108 @@ +import { E } from '@endo/far'; +import { M, mustMatch } from '@endo/patterns'; +import { HubName, normalizeConnectionInfo } from './exos/chain-hub.js'; +import fetchedChainInfo from './fetched-chain-info.js'; // Refresh with scripts/refresh-chain-info.ts +import { CosmosAssetInfoShape, CosmosChainInfoShape } from './typeGuards.js'; + +/** @import {Chain, CosmosAssetInfo, CosmosChainInfo, EthChainInfo, IBCConnectionInfo} from './types.js'; */ +/** @import {NameAdmin} from '@agoric/vats'; */ + +/** + * Info used to build a {@link Chain} object - channel, connection, and denom + * info. + * + * @typedef {CosmosChainInfo | EthChainInfo} ChainInfo + */ + +const knownChains = /** @satisfies {Record} */ ( + harden(fetchedChainInfo) +); + +/** + * @typedef {typeof knownChains} KnownChains + * @internal + */ + +// TODO(#9966, #9967): include this in registerChain +/** + * Register chain assets into agoricNames + * + * @param {ERef} agoricNamesAdmin + * @param {string} name + * @param {CosmosAssetInfo[]} assets + * @alpha + */ +export const registerChainAssets = async (agoricNamesAdmin, name, assets) => { + mustMatch(assets, M.arrayOf(CosmosAssetInfoShape)); + const { nameAdmin: assetAdmin } = await E(agoricNamesAdmin).provideChild( + HubName.ChainAssets, + ); + return E(assetAdmin).update(name, assets); +}; + +/** + * Register a chain into agoricNames + * + * @param {ERef} agoricNamesAdmin + * @param {string} name + * @param {CosmosChainInfo} chainInfo + * @param {(...messages: string[]) => void} [log] + * @param {Set} [handledConnections] connection keys that need not be + * updated + */ +export const registerChain = async ( + agoricNamesAdmin, + name, + chainInfo, + log = () => {}, + handledConnections = new Set(), +) => { + const { nameAdmin } = await E(agoricNamesAdmin).provideChild(HubName.Chain); + const { nameAdmin: connAdmin } = await E(agoricNamesAdmin).provideChild( + HubName.ChainConnection, + ); + + mustMatch(chainInfo, CosmosChainInfoShape); + const { connections = {}, ...vertex } = chainInfo; + + const promises = [ + E(nameAdmin) + .update(name, vertex) + .then(() => log(`registered agoricNames chain.${name}`)), + ]; + + const { chainId } = chainInfo; + for (const [counterChainId, connInfo] of Object.entries(connections)) { + const [key, connectionInfo] = normalizeConnectionInfo( + chainId, + counterChainId, + connInfo, + ); + if (handledConnections.has(key)) { + continue; + } + + promises.push( + E(connAdmin) + .update(key, connectionInfo) + .then(() => log(`registering agoricNames chainConnection.${key}`)), + ); + + handledConnections.add(key); + } + // Bundle to pipeline IO + await Promise.all(promises); +}; + +/** + * Register all the chains that are known statically. + * + * @param {ERef} agoricNamesAdmin + * @param {(...messages: string[]) => void} [log] + */ +export const registerKnownChains = async (agoricNamesAdmin, log) => { + const handledConnections = new Set(); + for await (const [name, info] of Object.entries(knownChains)) { + await registerChain(agoricNamesAdmin, name, info, log, handledConnections); + } +}; diff --git a/contract/src/exos/README.md b/contract/src/exos/README.md new file mode 100644 index 00000000..0599cbbb --- /dev/null +++ b/contract/src/exos/README.md @@ -0,0 +1,130 @@ +# Exo structure + +Last verified 2024-10-30 + +```mermaid +classDiagram + +%% Orchestration vat business logic (Zoe) + ICQConnection --* Port + ICQConnection --* Connection + IcaAccount --* Port + IcaAccount --* Connection + IcaAccount --* CosmosInterchainService + ICQConnection --* CosmosInterchainService + CosmosInterchainService --* PortAllocator + PortAllocator --* NetworkVat + LocalChainAccount --* LocalChainVat + + class IcaAccount { + port: Port + connection: Connection + localAddress: LocalIbcAddress + requestedRemoteAddress: string + remoteAddress: RemoteIbcAddress + chainAddress: ChainAddress + getAddress() + getLocalAddress() + getRemoteAddress() + getPort() + executeTx() + executeEncodedTx() + deactivate() + reactivate() + } + class ICQConnection { + port: Port + connection: Connection + localAddress: LocalIbcAddress + remoteAddress: RemoteIbcAddress + getLocalAddress() + getRemoteAddress() + query() + } + + class CosmosInterchainService { + portAllocator: PortAllocator + icqConnections: MapStore + sharedICQPort: Port + makeAccount() + provideICQConnection() + } + +%% In other vats + class Port { + addListener() + connect() + getLocalAddress() + removeListener() + revoke() + } + + class Connection { + getLocalAddress() + getRemoteAddress() + send() + close() + } + + class PortAllocator { + allocateCustomIBCPort() + allocateICAControllerPort() + allocateICQControllerPort() + } + + class LocalChainAccount { + deposit() + executeTx() + getBalance() + monitorTransfers() + withdraw() + } + +%% In api consumer vats + + LocalOrchestrationAccount --* LocalChainAccount + CosmosOrchestrationAccount --* IcaAccount + + class LocalOrchestrationAccount { + account: LocalChainAccount + address: ChainAddress + topicKit: RecorderKit + asContinuingOffer() + delegate() + deposit() + executeTx() + getAddress() + getBalance() + getBalances() + getPublicTopics() + monitorTransfers() + send() + sendAll() + transfer() + undelegate() + withdraw() + } + + class CosmosOrchestrationAccount { + account: LocalChainAccount + chainAddress: ChainAddress + icqConnection: ICQConnection | undefined + timer: Timer + topicKit: RecorderKit + asContinuingOffer() + deactivate() + delegate() + executeEncodedTx() + getAddress() + getBalance() + getBalances() + getPublicTopics() + reactivate() + redelegate() + send() + sendAll() + transfer() + undelegate() + withdrawReward() + } +``` diff --git a/contract/src/exos/chain-hub-admin.js b/contract/src/exos/chain-hub-admin.js new file mode 100644 index 00000000..e790257b --- /dev/null +++ b/contract/src/exos/chain-hub-admin.js @@ -0,0 +1,84 @@ +/* we expect promises to resolved promptly, */ +/* eslint-disable no-restricted-syntax */ +import { heapVowE } from '@agoric/vow/vat.js'; +import { M } from '@endo/patterns'; +import { CosmosChainInfoShape } from '../typeGuards.js'; +import { DenomDetailShape } from './chain-hub.js'; + +/** + * @import {Zone} from '@agoric/zone'; + * @import {CosmosChainInfo, Denom, IBCConnectionInfo} from '@agoric/orchestration'; + * @import {ChainHub, DenomDetail} from './chain-hub.js'; + */ + +/** + * For use with async-flow contracts: can be used as a creator facet that allows + * developers to add new chain configurations to a local chainHub, in the event + * the information is not available widely in `agoricNames`. + * + * @example + * + * ```js + * const chainHubAdmin = prepareChainHubAdmin(zone, chainHub); + * chainHubAdmin.initChain( + * 'hotNewChain', + * hotNewChainInfo, + * agoricTohotNewChainConnectionInfo, + * ); + * ``` + * + * @param {Zone} zone + * @param {ChainHub} chainHub + */ +export const prepareChainHubAdmin = (zone, chainHub) => { + const ConnectionInfoShape = M.record(); // TODO + const makeCreatorFacet = zone.exo( + 'ChainHub Admin', + M.interface('ChainHub Admin', { + registerChain: M.callWhen( + M.string(), + CosmosChainInfoShape, + ConnectionInfoShape, + ).returns(M.undefined()), + registerAsset: M.call(M.string(), DenomDetailShape).returns(M.promise()), + }), + { + /** + * Register information for a chain + * + * @param {string} chainName - must not exist in chainHub + * @param {CosmosChainInfo} chainInfo + * @param {IBCConnectionInfo} connectionInfo - from Agoric chain + */ + async registerChain(chainName, chainInfo, connectionInfo) { + // when() because chainHub methods return vows. If this were inside + // orchestrate() the membrane would wrap/unwrap automatically. + const agoricChainInfo = await heapVowE.when( + chainHub.getChainInfo('agoric'), + ); + chainHub.registerChain(chainName, chainInfo); + chainHub.registerConnection( + agoricChainInfo.chainId, + chainInfo.chainId, + connectionInfo, + ); + }, + /** + * Register an asset that may be held on a chain other than the issuing + * chain. + * + * @param {Denom} denom - on the holding chain, whose name is given in + * `detail.chainName` + * @param {DenomDetail} detail - chainName and baseName must be registered + */ + async registerAsset(denom, detail) { + // XXX async work necessary before the synchronous call + await heapVowE.when(chainHub.getChainInfo('agoric')); + chainHub.registerAsset(denom, detail); + }, + }, + ); + return makeCreatorFacet; +}; + +/** @typedef {ReturnType} ChainHubAdmin */ diff --git a/contract/src/exos/chain-hub.js b/contract/src/exos/chain-hub.js new file mode 100644 index 00000000..368ce240 --- /dev/null +++ b/contract/src/exos/chain-hub.js @@ -0,0 +1,488 @@ +import { Fail, makeError, q } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; + +import { VowShape } from '@agoric/vow'; +import { + ChainAddressShape, + CosmosChainInfoShape, + IBCConnectionInfoShape, +} from '../typeGuards.js'; +import { getBech32Prefix } from '../utils/address.js'; + +/** + * @import {NameHub} from '@agoric/vats'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CosmosAssetInfo, CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; + * @import {ChainInfo, KnownChains} from '../chain-info.js'; + * @import {ChainAddress, Denom} from '../orchestration-api.js'; + * @import {Remote} from '@agoric/internal'; + * @import {TypedPattern} from '@agoric/internal'; + */ + +/** + * If K matches a known chain, narrow the type from generic ChainInfo + * + * @template {string} K + * @typedef {K extends keyof KnownChains + * ? ChainInfo & Omit + * : ChainInfo} ActualChainInfo + * @internal + */ + +/** + * @typedef {object} DenomDetail + * @property {string} baseName - name of issuing chain; e.g. cosmoshub + * @property {Denom} baseDenom - e.g. uatom + * @property {string} chainName - name of holding chain; e.g. agoric + * @property {Brand<'nat'>} [brand] - vbank brand, if registered + * @see {ChainHub} `registerAsset` method + */ +/** @type {TypedPattern} */ +export const DenomDetailShape = M.splitRecord( + { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, + { brand: BrandShape }, +); + +/** + * @enum {(typeof HubName)[keyof typeof HubName]} + */ +export const HubName = /** @type {const} */ ({ + /** agoricNames key for ChainInfo hub */ + Chain: 'chain', + /** namehub for assets info */ + ChainAssets: 'chainAssets', + /** namehub for connection info */ + ChainConnection: 'chainConnection', +}); +harden(HubName); + +/** @deprecated use HubName.Chain */ +export const CHAIN_KEY = HubName.Chain; +/** @deprecated use HubName.ChainConnection */ +export const CONNECTIONS_KEY = HubName.ChainConnection; +/** @deprecated use HubName.ChainAssets */ +export const ASSETS_KEY = HubName.ChainAssets; + +/** + * Character used in a connection tuple key to separate the two chain ids. Valid + * because a chainId can contain only alphanumerics and dash. + * + * Vstorage keys can be only alphanumerics, dash or underscore. That leaves + * underscore as the only valid separator. + * + * @see {@link https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md} + */ +const CHAIN_ID_SEPARATOR = '_'; + +/** + * The entries of the top-level namehubs in agoricNames are reflected to + * vstorage. But only the top level. So we combine the 2 chain ids into 1 key. + * Connections are directionless, so we sort the ids. + * + * @param {string} chainId1 + * @param {string} chainId2 + */ +export const connectionKey = (chainId1, chainId2) => { + if ( + chainId1.includes(CHAIN_ID_SEPARATOR) || + chainId2.includes(CHAIN_ID_SEPARATOR) + ) { + Fail`invalid chain id ${chainId1} or ${chainId2}`; + } + return [chainId1, chainId2].sort().join(CHAIN_ID_SEPARATOR); +}; + +/** + * Utility to reverse connection info perspective. + * + * @param {IBCConnectionInfo} connInfo + * @returns {IBCConnectionInfo} + */ +const reverseConnInfo = connInfo => { + const { transferChannel } = connInfo; + return { + id: connInfo.counterparty.connection_id, + client_id: connInfo.counterparty.client_id, + counterparty: { + client_id: connInfo.client_id, + connection_id: connInfo.id, + }, + state: connInfo.state, + transferChannel: { + ...transferChannel, + channelId: transferChannel.counterPartyChannelId, + counterPartyChannelId: transferChannel.channelId, + portId: transferChannel.counterPartyPortId, + counterPartyPortId: transferChannel.portId, + }, + }; +}; + +/** + * Convert the info to an undirected form. + * + * @param {string} primaryChainId + * @param {string} counterChainId + * @param {IBCConnectionInfo} directed + * @returns {[string, IBCConnectionInfo]} + */ +export const normalizeConnectionInfo = ( + primaryChainId, + counterChainId, + directed, +) => { + const key = connectionKey(primaryChainId, counterChainId); + if (primaryChainId < counterChainId) { + return [key, directed]; + } else { + return [key, reverseConnInfo(directed)]; + } +}; + +/** + * Provide a view on the connection from the primary chain's perspective. + * + * @param {string} primaryChainId + * @param {string} counterChainId + * @param {IBCConnectionInfo} normalized + */ +const denormalizeConnectionInfo = ( + primaryChainId, + counterChainId, + normalized, +) => { + if (primaryChainId < counterChainId) { + return normalized; + } else { + return reverseConnInfo(normalized); + } +}; + +const ChainIdArgShape = M.or( + M.string(), + M.splitRecord( + { + chainId: M.string(), + }, + undefined, + M.any(), + ), +); + +const ChainHubI = M.interface('ChainHub', { + registerChain: M.call(M.string(), CosmosChainInfoShape).returns(), + getChainInfo: M.call(M.string()).returns(VowShape), + registerConnection: M.call( + M.string(), + M.string(), + IBCConnectionInfoShape, + ).returns(), + getConnectionInfo: M.call(ChainIdArgShape, ChainIdArgShape).returns(VowShape), + getChainsAndConnection: M.call(M.string(), M.string()).returns(VowShape), + registerAsset: M.call(M.string(), DenomDetailShape).returns(), + getAsset: M.call(M.string()).returns(M.or(DenomDetailShape, M.undefined())), + getDenom: M.call(BrandShape).returns(M.or(M.string(), M.undefined())), + makeChainAddress: M.call(M.string()).returns(ChainAddressShape), +}); + +/** + * Make a new ChainHub in the zone. + * + * The resulting object is an Exo singleton. It has no precious state. It's only + * state is a cache of queries to agoricNames and whatever info was provided in + * registration calls. When you need a newer version you can simply make a hub + * hub and repeat the registrations. + * + * @param {Zone} zone + * @param {Remote} agoricNames + * @param {VowTools} vowTools + */ +export const makeChainHub = (zone, agoricNames, vowTools) => { + /** @type {MapStore} */ + const chainInfos = zone.mapStore('chainInfos', { + keyShape: M.string(), + valueShape: CosmosChainInfoShape, + }); + /** @type {MapStore} */ + const connectionInfos = zone.mapStore('connectionInfos', { + keyShape: M.string(), + valueShape: IBCConnectionInfoShape, + }); + + /** @type {MapStore} */ + const denomDetails = zone.mapStore('denom', { + keyShape: M.string(), + valueShape: DenomDetailShape, + }); + /** @type {MapStore} */ + const brandDenoms = zone.mapStore('brandDenom', { + keyShape: BrandShape, + valueShape: M.string(), + }); + /** @type {MapStore} */ + const bech32PrefixToChainName = zone.mapStore('bech32PrefixToChainName', { + keyShape: M.string(), + valueShape: M.string(), + }); + + const lookupChainInfo = vowTools.retriable( + zone, + 'lookupChainInfo', + /** @param {string} chainName */ + // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices + async chainName => { + await null; + try { + const chainInfo = await E(agoricNames).lookup(HubName.Chain, chainName); + // It may have been set by another concurrent call + // TODO consider makeAtomicProvider for vows + if (!chainInfos.has(chainName)) { + chainInfos.init(chainName, chainInfo); + if (chainInfo.bech32Prefix) { + bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName); + } + } + return chainInfo; + } catch (e) { + console.error('lookupChainInfo', chainName, 'error', e); + throw makeError(`chain not found:${chainName}`); + } + }, + ); + + const lookupConnectionInfo = vowTools.retriable( + zone, + 'lookupConnectionInfo', + /** + * @param {string} chainId1 + * @param {string} chainId2 + */ + // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices + async (chainId1, chainId2) => { + await null; + const key = connectionKey(chainId1, chainId2); + try { + const connectionInfo = await E(agoricNames).lookup( + HubName.ChainConnection, + key, + ); + // It may have been set by another concurrent call + // TODO consider makeAtomicProvider for vows + if (!connectionInfos.has(key)) { + connectionInfos.init(key, connectionInfo); + } + + return denormalizeConnectionInfo(chainId1, chainId2, connectionInfo); + } catch (e) { + console.error('lookupConnectionInfo', chainId1, chainId2, 'error', e); + throw makeError(`connection not found: ${chainId1}<->${chainId2}`); + } + }, + ); + + /* eslint-disable no-use-before-define -- chainHub defined below */ + const lookupChainsAndConnection = vowTools.retriable( + zone, + 'lookupChainsAndConnection', + /** + * @template {string} C1 + * @template {string} C2 + * @param {C1} primaryName + * @param {C2} counterName + * @returns {Promise< + * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] + * >} + */ + // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices + async (primaryName, counterName) => { + const [primary, counter] = await vowTools.asPromise( + vowTools.allVows([ + chainHub.getChainInfo(primaryName), + chainHub.getChainInfo(counterName), + ]), + ); + const connectionInfo = await vowTools.asPromise( + chainHub.getConnectionInfo(primary, counter), + ); + return /** @type {[ActualChainInfo, ActualChainInfo, IBCConnectionInfo]} */ ([ + primary, + counter, + connectionInfo, + ]); + }, + ); + + const chainHub = zone.exo('ChainHub', ChainHubI, { + /** + * Register a new chain. The name will override a name in well known chain + * names. + * + * If a durable zone was not provided, registration will not survive a + * reincarnation of the vat. Then if the chain is not yet in the well known + * names at that point, it will have to be registered again. In an unchanged + * contract `start` the call will happen again naturally. + * + * @param {string} name + * @param {CosmosChainInfo} chainInfo + */ + registerChain(name, chainInfo) { + chainInfos.init(name, chainInfo); + if (chainInfo.bech32Prefix) { + bech32PrefixToChainName.init(chainInfo.bech32Prefix, name); + } + }, + /** + * @template {string} K + * @param {K} chainName + * @returns {Vow>} + */ + getChainInfo(chainName) { + // Either from registerChain or memoized remote lookup() + if (chainInfos.has(chainName)) { + return /** @type {Vow>} */ ( + vowTools.asVow(() => chainInfos.get(chainName)) + ); + } + + return lookupChainInfo(chainName); + }, + /** + * @param {string} primaryChainId + * @param {string} counterpartyChainId + * @param {IBCConnectionInfo} connectionInfo from primary to counterparty + */ + registerConnection(primaryChainId, counterpartyChainId, connectionInfo) { + const [key, normalized] = normalizeConnectionInfo( + primaryChainId, + counterpartyChainId, + connectionInfo, + ); + connectionInfos.init(key, normalized); + }, + + /** + * @param {string | { chainId: string }} primary the primary chain + * @param {string | { chainId: string }} counter the counterparty chain + * @returns {Vow} + */ + getConnectionInfo(primary, counter) { + const primaryId = typeof primary === 'string' ? primary : primary.chainId; + const counterId = typeof counter === 'string' ? counter : counter.chainId; + const key = connectionKey(primaryId, counterId); + if (connectionInfos.has(key)) { + return vowTools.asVow(() => + denormalizeConnectionInfo( + primaryId, + counterId, + connectionInfos.get(key), + ), + ); + } + + return lookupConnectionInfo(primaryId, counterId); + }, + + /** + * @template {string} C1 + * @template {string} C2 + * @param {C1} primaryName the primary chain name + * @param {C2} counterName the counterparty chain name + * @returns {Vow< + * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] + * >} + */ + getChainsAndConnection(primaryName, counterName) { + // @ts-expect-error XXX generic parameter propagation + return lookupChainsAndConnection(primaryName, counterName); + }, + + /** + * Register an asset that may be held on a chain other than the issuing + * chain. + * + * @param {Denom} denom - on the holding chain, whose name is given in + * `detail.chainName` + * @param {DenomDetail} detail - chainName and baseName must be registered + */ + registerAsset(denom, detail) { + const { chainName, baseName } = detail; + chainInfos.has(chainName) || + Fail`must register chain ${q(chainName)} first`; + chainInfos.has(baseName) || + Fail`must register chain ${q(baseName)} first`; + denomDetails.init(denom, detail); + if (detail.brand) { + brandDenoms.init(detail.brand, denom); + } + }, + /** + * Retrieve holding, issuing chain names etc. for a denom. + * + * @param {Denom} denom + * @returns {DenomDetail | undefined} + */ + getAsset(denom) { + if (denomDetails.has(denom)) { + return denomDetails.get(denom); + } + return undefined; + }, + /** + * Retrieve denom (string) for a Brand. + * + * @param {Brand} brand + * @returns {Denom | undefined} + */ + getDenom(brand) { + if (brandDenoms.has(brand)) { + return brandDenoms.get(brand); + } + return undefined; + }, + /** + * @param {string} address bech32 address + * @returns {ChainAddress} + */ + makeChainAddress(address) { + const prefix = getBech32Prefix(address); + if (!bech32PrefixToChainName.has(prefix)) { + throw makeError(`Chain info not found for bech32Prefix ${q(prefix)}`); + } + const chainName = bech32PrefixToChainName.get(prefix); + const { chainId } = chainInfos.get(chainName); + return harden({ + chainId, + value: address, + encoding: /** @type {const} */ ('bech32'), + }); + }, + }); + + return chainHub; +}; +/** @typedef {ReturnType} ChainHub */ + +/** + * Register assets with the given ChainHub so they are available for lookup + * + * @param {ChainHub} chainHub + * @param {string} name + * @param {CosmosAssetInfo[]} assets + */ +export const registerAssets = (chainHub, name, assets) => { + for (const { base, traces } of assets) { + const native = !traces; + native || traces.length === 1 || Fail`unexpected ${traces.length} traces`; + const [chainName, baseName, baseDenom] = native + ? [name, name, base] + : [ + name, + traces[0].counterparty.chain_name, + traces[0].counterparty.base_denom, + ]; + chainHub.registerAsset(base, { chainName, baseName, baseDenom }); + } +}; diff --git a/contract/src/exos/combine-invitation-makers.js b/contract/src/exos/combine-invitation-makers.js new file mode 100644 index 00000000..3dd20625 --- /dev/null +++ b/contract/src/exos/combine-invitation-makers.js @@ -0,0 +1,59 @@ +import { M } from '@endo/patterns'; +import { + prepareGuardedAttenuator, + makeSyncMethodCallback, +} from '@agoric/internal/src/callback.js'; +import { getMethodNames } from '@agoric/internal'; + +/** + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {Zone} from '@agoric/zone'; + */ + +// TODO use a helper from Endo https://github.com/endojs/endo/issues/2448 +/** + * Takes two or more InvitationMaker exos and combines them into a new one. + * Combine with `publicTopics` to form a {@link ContinuingOfferResult} that can + * be returned to a smart-wallet client. + * + * Useful for writing your own invitationMakers while preserving + * platform-provided ones like `Delegate`, `Transfer`, `Send`. + * + * @param {Zone} zone + * @param {import('@endo/patterns').InterfaceGuard[]} interfaceGuards + */ +export const prepareCombineInvitationMakers = (zone, ...interfaceGuards) => { + const methodGuards = interfaceGuards.map(ig => ig.payload.methodGuards); + const CombinedInterfaceGuard = M.interface( + 'CombinedInvitationMakers interface', + Object.assign({}, ...methodGuards), + ); + + const mixin = prepareGuardedAttenuator(zone, CombinedInterfaceGuard, { + tag: 'CombinedInvitationMakers', + }); + + /** + * @template {InvitationMakers[]} IM + * @param {IM} invitationMakers + * @returns {IM[number]} + */ + const combineInvitationMakers = (...invitationMakers) => { + const overrides = {}; + for (const invMakers of invitationMakers) { + // remove '__getInterfaceGuard__', '__getMethodNames__' + const names = getMethodNames(invMakers).filter(n => !n.startsWith('__')); + for (const key of names) { + overrides[key] = makeSyncMethodCallback(invMakers, key); + } + } + return mixin({ + overrides, + }); + }; + + return combineInvitationMakers; +}; + +/** @typedef {ReturnType} MakeCombineInvitationMakers */ +/** @typedef {ReturnType} CombinedInvitationMakers */ diff --git a/contract/src/exos/cosmos-interchain-service.js b/contract/src/exos/cosmos-interchain-service.js new file mode 100644 index 00000000..5724cc94 --- /dev/null +++ b/contract/src/exos/cosmos-interchain-service.js @@ -0,0 +1,280 @@ +/** @file Orchestration service */ + +import { Shape as NetworkShape } from '@agoric/network'; +import { pickFacet } from '@agoric/vat-data'; +import { E } from '@endo/far'; +import { M, mustMatch } from '@endo/patterns'; +import { + DEFAULT_ICQ_VERSION, + makeICAChannelAddress, + makeICQChannelAddress, +} from '../utils/address.js'; +import { prepareIcaAccountKit } from './ica-account-kit.js'; +import { prepareICQConnectionKit } from './icq-connection-kit.js'; + +/** + * @import {Zone} from '@agoric/base-zone'; + * @import {Remote} from '@agoric/internal'; + * @import {Connection, Port, PortAllocator} from '@agoric/network'; + * @import {IBCConnectionID} from '@agoric/vats'; + * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {ICQConnection, IcaAccount, ICQConnectionKit, IcaAccountKit} from '../types.js'; + * @import {ICAChannelAddressOpts} from '../utils/address.js'; + */ + +const { Vow$ } = NetworkShape; // TODO #9611 +/** + * @typedef {object} OrchestrationPowers + * @property {Remote} portAllocator + * @property {undefined} reserved reserve a state key for future use. can hold + * an additional power or a record of powers + */ + +/** @typedef {MapStore} ICQConnectionStore */ + +/** @typedef {IcaAccountKit | ICQConnectionKit} ConnectionKit */ + +/** + * @typedef {{ + * icqConnections: ICQConnectionStore; + * sharedICQPort: Remote | undefined; + * } & OrchestrationPowers} OrchestrationState + */ + +/** + * Creates a key for the icqConnections mapStore based on connectionId and + * version + * + * @param {IBCConnectionID} controllerConnectionId + * @param {string} [version] + * @returns {string} + */ +const getICQConnectionKey = (controllerConnectionId, version) => { + return `${controllerConnectionId}:${version || DEFAULT_ICQ_VERSION}`; +}; + +/** + * @param {Zone} zone + * @param {VowTools} vowTools + * @param {ReturnType} makeIcaAccountKit + * @param {ReturnType} makeICQConnectionKit + */ +const prepareCosmosOrchestrationServiceKit = ( + zone, + { watch, asVow }, + makeIcaAccountKit, + makeICQConnectionKit, +) => + zone.exoClassKit( + 'Orchestration', + { + requestICAChannelWatcher: M.interface('RequestICAChannelWatcher', { + onFulfilled: M.call(M.remotable('Port')) + .optional({ chainId: M.string(), remoteConnAddr: M.string() }) + .returns(Vow$(NetworkShape.Connection)), + }), + requestICQChannelWatcher: M.interface('RequestICQChannelWatcher', { + onFulfilled: M.call(M.remotable('Port')) + .optional({ + remoteConnAddr: M.string(), + icqLookupKey: M.string(), + }) + .returns(Vow$(NetworkShape.Connection)), + }), + channelOpenWatcher: M.interface('ChannelOpenWatcher', { + onFulfilled: M.call(M.remotable('Connection')) + .optional( + M.splitRecord( + { connectionKit: M.record(), returnFacet: M.string() }, + { icqLookupKey: M.string() }, + ), + ) + .returns(M.remotable('ConnectionKit Holder facet')), + }), + public: M.interface('CosmosInterchainService', { + makeAccount: M.call(M.string(), M.string(), M.string()) + .optional(M.record()) + .returns(Vow$(M.remotable('IcaAccountKit'))), + provideICQConnection: M.call(M.string()) + .optional(M.string()) + .returns(Vow$(M.remotable('ICQConnection'))), + }), + }, + /** @param {Partial} powers */ + powers => { + mustMatch(powers?.portAllocator, M.remotable('PortAllocator')); + const icqConnections = zone.detached().mapStore('ICQConnections'); + return /** @type {OrchestrationState} */ ({ + icqConnections, + sharedICQPort: undefined, + reserved: undefined, + ...powers, + }); + }, + { + requestICAChannelWatcher: { + /** + * @param {Port} port + * @param {{ + * chainId: string; + * remoteConnAddr: RemoteIbcAddress; + * }} watchContext + */ + onFulfilled(port, { chainId, remoteConnAddr }) { + const connectionKit = makeIcaAccountKit( + chainId, + port, + remoteConnAddr, + ); + return watch( + E(port).connect(remoteConnAddr, connectionKit.connectionHandler), + this.facets.channelOpenWatcher, + { returnFacet: 'account', connectionKit }, + ); + }, + }, + requestICQChannelWatcher: { + /** + * @param {Port} port + * @param {{ + * remoteConnAddr: RemoteIbcAddress; + * icqLookupKey: string; + * }} watchContext + */ + onFulfilled(port, { remoteConnAddr, icqLookupKey }) { + if (!this.state.sharedICQPort) { + this.state.sharedICQPort = port; + } + const connectionKit = makeICQConnectionKit(port); + return watch( + E(port).connect(remoteConnAddr, connectionKit.connectionHandler), + this.facets.channelOpenWatcher, + { + connectionKit, + returnFacet: 'connection', + icqLookupKey, + }, + ); + }, + }, + /** + * Waits for a channel (ICA, ICQ) to open and returns the consumer-facing + * facet of the ConnectionKit, specified by `returnFacet`. Saves the + * ConnectionKit if `saveICQConnection` is provided. + */ + channelOpenWatcher: { + /** + * @param {Connection} _connection + * @param {{ + * connectionKit: ConnectionKit; + * returnFacet: string; + * icqLookupKey?: string; + * }} watchContext + */ + onFulfilled(_connection, { connectionKit, returnFacet, icqLookupKey }) { + if (icqLookupKey) { + this.state.icqConnections.init( + icqLookupKey, + /** @type {ICQConnectionKit} */ (connectionKit), + ); + } + return connectionKit[returnFacet]; + }, + }, + public: { + /** + * @satisfies {CosmosInterchainService['makeAccount']} + * @param {string} chainId + * @param {IBCConnectionID} hostConnectionId the counterparty + * connection_id + * @param {IBCConnectionID} controllerConnectionId self connection_id + * @param {ICAChannelAddressOpts} [opts] optional to configure the + * channel address, such as version and ordering + * @returns {Vow} + */ + makeAccount(chainId, hostConnectionId, controllerConnectionId, opts) { + const remoteConnAddr = makeICAChannelAddress( + hostConnectionId, + controllerConnectionId, + opts, + ); + const { portAllocator } = this.state; + return watch( + E(portAllocator).allocateICAControllerPort(), + this.facets.requestICAChannelWatcher, + { + chainId, + remoteConnAddr, + }, + ); + }, + /** + * @satisfies {CosmosInterchainService['provideICQConnection']} + * @param {IBCConnectionID} controllerConnectionId + * @param {string} [version] + * @returns {Vow | ICQConnection} + */ + provideICQConnection(controllerConnectionId, version) { + const icqLookupKey = getICQConnectionKey( + controllerConnectionId, + version, + ); + if (this.state.icqConnections.has(icqLookupKey)) { + return asVow( + () => this.state.icqConnections.get(icqLookupKey).connection, + ); + } + const remoteConnAddr = makeICQChannelAddress( + controllerConnectionId, + version, + ); + const { portAllocator, sharedICQPort } = this.state; + const portOrPortVow = + sharedICQPort || E(portAllocator).allocateICQControllerPort(); + + return watch(portOrPortVow, this.facets.requestICQChannelWatcher, { + remoteConnAddr, + icqLookupKey, + }); + }, + }, + }, + { + stateShape: { + icqConnections: M.remotable('icqConnections mapStore'), + sharedICQPort: M.or(M.remotable('Port'), M.undefined()), + portAllocator: M.remotable('PortAllocator'), + reserved: M.any(), + }, + }, + ); + +/** + * Used only by vat-orchestration and tests mocking it + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @internal + */ +export const prepareCosmosInterchainService = (zone, vowTools) => { + const makeIcaAccountKit = prepareIcaAccountKit(zone, vowTools); + const makeICQConnectionKit = prepareICQConnectionKit(zone, vowTools); + const makeCosmosOrchestrationServiceKit = + prepareCosmosOrchestrationServiceKit( + zone, + vowTools, + makeIcaAccountKit, + makeICQConnectionKit, + ); + + const makeCosmosInterchainService = pickFacet( + makeCosmosOrchestrationServiceKit, + 'public', + ); + + return makeCosmosInterchainService; +}; +harden(prepareCosmosInterchainService); + +/** @typedef {ReturnType} MakeCosmosInterchainService */ diff --git a/contract/src/exos/cosmos-orchestration-account.js b/contract/src/exos/cosmos-orchestration-account.js new file mode 100644 index 00000000..cc33d39c --- /dev/null +++ b/contract/src/exos/cosmos-orchestration-account.js @@ -0,0 +1,1147 @@ +/** @file Use-object for the owner of a staking account */ +import { toRequestQueryJson } from '@agoric/cosmic-proto'; +import { + QueryAllBalancesRequest, + QueryAllBalancesResponse, + QueryBalanceRequest, + QueryBalanceResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; +import { MsgSend } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; +import { + QueryDelegationRewardsRequest, + QueryDelegationRewardsResponse, + QueryDelegationTotalRewardsRequest, + QueryDelegationTotalRewardsResponse, +} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; +import { + MsgWithdrawDelegatorReward, + MsgWithdrawDelegatorRewardResponse, +} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/tx.js'; +import { + QueryDelegationRequest, + QueryDelegationResponse, + QueryDelegatorDelegationsRequest, + QueryDelegatorDelegationsResponse, + QueryDelegatorUnbondingDelegationsRequest, + QueryDelegatorUnbondingDelegationsResponse, + QueryRedelegationsRequest, + QueryRedelegationsResponse, + QueryUnbondingDelegationRequest, + QueryUnbondingDelegationResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/query.js'; +import { + MsgBeginRedelegate, + MsgDelegate, + MsgUndelegate, + MsgUndelegateResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; +import { makeTracer } from '@agoric/internal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { M } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { decodeBase64 } from '@endo/base64'; +import { Fail, makeError, q } from '@endo/errors'; +import { E } from '@endo/far'; +import { + AmountArgShape, + ChainAddressShape, + DelegationShape, + DenomAmountShape, + IBCTransferOptionsShape, + Proto3Shape, + TxBodyOptsShape, +} from '../typeGuards.js'; +import { coerceCoin, coerceDenom } from '../utils/amounts.js'; +import { + maxClockSkew, + toCosmosDelegationResponse, + toCosmosValidatorAddress, + toDenomAmount, + toTruncatedDenomAmount, + tryDecodeResponse, +} from '../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../utils/time.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {AmountArg, IcaAccount, ChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, OrchestrationAccountI, CosmosRewardsResponse, IBCConnectionInfo, IBCMsgTransferOptions, ChainHub, CosmosDelegationResponse} from '../types.js'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + * @import {Remote} from '@agoric/internal'; + * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {TimerService} from '@agoric/time'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; + * @import {JsonSafe} from '@agoric/cosmic-proto'; + * @import {Matcher} from '@endo/patterns'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +const trace = makeTracer('ComosOrchestrationAccountHolder'); + +const { Vow$ } = NetworkShape; // TODO #9611 + +/** + * @typedef {object} ComosOrchestrationAccountNotification + * @property {ChainAddress} chainAddress + */ + +/** + * @private + * @typedef {{ + * topicKit: RecorderKit; + * account: IcaAccount; + * chainAddress: ChainAddress; + * localAddress: LocalIbcAddress; + * remoteAddress: RemoteIbcAddress; + * icqConnection: ICQConnection | undefined; + * timer: Remote; + * }} State + * Internal to the IcaAccountHolder exo + */ + +/** + * @typedef {{ + * localAddress: LocalIbcAddress; + * remoteAddress: RemoteIbcAddress; + * }} CosmosOrchestrationAccountStorageState + */ + +/** @see {StakingAccountActions} */ +const stakingAccountActionsMethods = { + delegate: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), + redelegate: M.call( + ChainAddressShape, + ChainAddressShape, + AmountArgShape, + ).returns(VowShape), + undelegate: M.call(M.arrayOf(DelegationShape)).returns(VowShape), + withdrawReward: M.call(ChainAddressShape).returns( + Vow$(M.arrayOf(DenomAmountShape)), + ), + withdrawRewards: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), +}; + +/** @see {StakingAccountQueries} */ +const stakingAccountQueriesMethods = { + getDelegation: M.call(ChainAddressShape).returns(VowShape), + getDelegations: M.call().returns(VowShape), + getUnbondingDelegation: M.call(ChainAddressShape).returns(VowShape), + getUnbondingDelegations: M.call().returns(VowShape), + getRedelegations: M.call().returns(VowShape), + getReward: M.call(ChainAddressShape).returns(VowShape), + getRewards: M.call().returns(VowShape), +}; + +/** @see {OrchestrationAccountI} */ +export const IcaAccountHolderI = M.interface('IcaAccountHolder', { + ...orchestrationAccountMethods, + ...stakingAccountActionsMethods, + ...stakingAccountQueriesMethods, + deactivate: M.call().returns(VowShape), + reactivate: M.call().returns(VowShape), + executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) + .optional(TxBodyOptsShape) + .returns(VowShape), +}); + +/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ +const PUBLIC_TOPICS = { + account: ['Staking Account holder status', M.any()], +}; + +export const CosmosOrchestrationInvitationMakersI = M.interface( + 'invitationMakers', + { + Delegate: M.call(ChainAddressShape, AmountArgShape).returns(M.promise()), + Redelegate: M.call( + ChainAddressShape, + ChainAddressShape, + AmountArgShape, + ).returns(M.promise()), + WithdrawReward: M.call(ChainAddressShape).returns(M.promise()), + Undelegate: M.call(M.arrayOf(DelegationShape)).returns(M.promise()), + DeactivateAccount: M.call().returns(M.promise()), + ReactivateAccount: M.call().returns(M.promise()), + TransferAccount: M.call().returns(M.promise()), + Send: M.call().returns(M.promise()), + SendAll: M.call().returns(M.promise()), + Transfer: M.call().returns(M.promise()), + }, +); +harden(CosmosOrchestrationInvitationMakersI); + +/** + * @param {Zone} zone + * @param {object} powers + * @param {ChainHub} powers.chainHub + * @param {MakeRecorderKit} powers.makeRecorderKit + * @param {Remote} powers.timerService + * @param {VowTools} powers.vowTools + * @param {ZCF} powers.zcf + */ +export const prepareCosmosOrchestrationAccountKit = ( + zone, + { + chainHub, + makeRecorderKit, + timerService, + vowTools: { watch, asVow, when, allVows }, + zcf, + }, +) => { + const timestampHelper = makeTimestampHelper(timerService); + const makeCosmosOrchestrationAccountKit = zone.exoClassKit( + 'Cosmos Orchestration Account Holder', + { + helper: M.interface('helper', { + owned: M.call().returns(M.remotable()), + getUpdater: M.call().returns(M.remotable()), + amountToCoin: M.call(AmountArgShape).returns(M.record()), + }), + returnVoidWatcher: M.interface('returnVoidWatcher', { + onFulfilled: M.call(M.or(M.string(), M.record())) + .optional(M.arrayOf(M.undefined())) + .returns(M.undefined()), + }), + balanceQueryWatcher: M.interface('balanceQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(M.or(M.record(), M.undefined())), + }), + allBalancesQueryWatcher: M.interface('allBalancesQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + undelegateWatcher: M.interface('undelegateWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(Vow$(M.promise())), + }), + withdrawRewardWatcher: M.interface('withdrawRewardWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(M.arrayOf(DenomAmountShape)), + }), + transferWatcher: M.interface('transferWatcher', { + onFulfilled: M.call([M.record(), M.nat()]) + .optional({ + destination: ChainAddressShape, + opts: M.or(M.undefined(), IBCTransferOptionsShape), + token: { + denom: M.string(), + amount: M.string(), + }, + }) + .returns(Vow$(M.record())), + }), + delegationQueryWatcher: M.interface('delegationQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), + }), + delegationsQueryWatcher: M.interface('delegationsQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + unbondingDelegationQueryWatcher: M.interface( + 'unbondingDelegationQueryWatcher', + { + onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), + }, + ), + unbondingDelegationsQueryWatcher: M.interface( + 'unbondingDelegationsQueryWatcher', + { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }, + ), + redelegationQueryWatcher: M.interface('redelegationQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + redelegationsQueryWatcher: M.interface('redelegationsQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + rewardQueryWatcher: M.interface('rewardQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + rewardsQueryWatcher: M.interface('rewardsQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), + }), + holder: IcaAccountHolderI, + invitationMakers: CosmosOrchestrationInvitationMakersI, + }, + /** + * @param {object} info + * @param {ChainAddress} info.chainAddress + * @param {LocalIbcAddress} info.localAddress + * @param {RemoteIbcAddress} info.remoteAddress + * @param {object} io + * @param {IcaAccount} io.account + * @param {Remote} io.storageNode + * @param {ICQConnection | undefined} io.icqConnection + * @param {Remote} io.timer + * @returns {State} + */ + ({ chainAddress, localAddress, remoteAddress }, io) => { + const { storageNode } = io; + // must be the fully synchronous maker because the kit is held in durable state + const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); + // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 + // XXX consider parsing local/remoteAddr to portId, channelId, counterpartyPortId, counterpartyChannelId, connectionId, counterpartyConnectionId + // FIXME these values will not update if IcaAccount gets new values after reopening. + // consider having IcaAccount responsible for the owning the writer. It might choose to share it with COA. + void E(topicKit.recorder).write( + /** @type {CosmosOrchestrationAccountStorageState} */ ({ + localAddress, + remoteAddress, + }), + ); + + const { account, icqConnection, timer } = io; + return { + account, + chainAddress, + icqConnection, + localAddress, + remoteAddress, + timer, + topicKit, + }; + }, + { + helper: { + /** @throws if this holder no longer owns the account */ + owned() { + const { account } = this.state; + if (!account) { + throw Fail`Using account holder after transfer`; + } + return account; + }, + getUpdater() { + return this.state.topicKit.recorder; + }, + /** + * @param {AmountArg} amount + * @returns {Coin} + */ + amountToCoin(amount) { + return coerceCoin(chainHub, amount); + }, + }, + balanceQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { balance } = QueryBalanceResponse.decode( + decodeBase64(result.key), + ); + if (!balance) throw Fail`Result lacked balance key: ${result}`; + return harden(toDenomAmount(balance)); + }, + }, + delegationQueryWatcher: { + /** + * @param {JsonSafe[]} results + * @returns {CosmosDelegationResponse} + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { delegationResponse } = QueryDelegationResponse.decode( + decodeBase64(result.key), + ); + if (!delegationResponse) + throw Fail`Result lacked delegationResponse key: ${result}`; + const { chainAddress } = this.state; + return harden( + toCosmosDelegationResponse(chainAddress, delegationResponse), + ); + }, + }, + delegationsQueryWatcher: { + /** + * @param {JsonSafe[]} results + * @returns {CosmosDelegationResponse[]} + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { delegationResponses } = + QueryDelegatorDelegationsResponse.decode(decodeBase64(result.key)); + if (!delegationResponses) + throw Fail`Result lacked delegationResponses key: ${result}`; + const { chainAddress } = this.state; + return harden( + delegationResponses.map(r => + toCosmosDelegationResponse(chainAddress, r), + ), + ); + }, + }, + unbondingDelegationQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { unbond } = QueryUnbondingDelegationResponse.decode( + decodeBase64(result.key), + ); + if (!unbond) throw Fail`Result lacked unbond key: ${result}`; + return harden(unbond); + }, + }, + unbondingDelegationsQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { unbondingResponses } = + QueryDelegatorUnbondingDelegationsResponse.decode( + decodeBase64(result.key), + ); + if (!unbondingResponses) + throw Fail`Result lacked unbondingResponses key: ${result}`; + return harden(unbondingResponses); + }, + }, + redelegationQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { redelegationResponses } = QueryRedelegationsResponse.decode( + decodeBase64(result.key), + ); + if (!redelegationResponses) + throw Fail`Result lacked redelegationResponses key: ${result}`; + return harden(redelegationResponses); + }, + }, + redelegationsQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { redelegationResponses } = QueryRedelegationsResponse.decode( + decodeBase64(result.key), + ); + if (!redelegationResponses) + throw Fail`Result lacked redelegationResponses key: ${result}`; + return harden(redelegationResponses); + }, + }, + rewardQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { rewards } = QueryDelegationRewardsResponse.decode( + decodeBase64(result.key), + ); + if (!rewards) throw Fail`Result lacked rewards key: ${result}`; + return harden(rewards.map(toTruncatedDenomAmount)); + }, + }, + rewardsQueryWatcher: { + /** + * @param {JsonSafe[]} results + * @returns {CosmosRewardsResponse} + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { rewards, total } = QueryDelegationTotalRewardsResponse.decode( + decodeBase64(result.key), + ); + if (!rewards || !total) + throw Fail`Result lacked rewards or total key: ${result}`; + const { chainAddress } = this.state; + return harden({ + rewards: rewards.map(reward => ({ + validator: toCosmosValidatorAddress(reward, chainAddress.chainId), + reward: reward.reward.map(toTruncatedDenomAmount), + })), + total: total.map(toTruncatedDenomAmount), + }); + }, + }, + allBalancesQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + let response; + try { + response = QueryAllBalancesResponse.decode( + // note: an empty string for result.key is a valid result + decodeBase64(result.key), + ); + } catch (cause) { + throw makeError( + `Error parsing QueryAllBalances result ${q(result)}`, + undefined, + { cause }, + ); + } + const { balances } = response; + if (!balances) throw Fail`Result lacked balances key: ${q(result)}`; + return harden(balances.map(coin => toDenomAmount(coin))); + }, + }, + undelegateWatcher: { + /** + * @param {string} result + */ + onFulfilled(result) { + const response = tryDecodeResponse( + result, + MsgUndelegateResponse.fromProtoMsg, + ); + trace('undelegate response', response); + const { completionTime } = response; + completionTime || Fail`No completion time result ${result}`; + return watch( + // ignore nanoseconds and just use seconds from Timestamp + E(this.state.timer).wakeAt(completionTime.seconds + maxClockSkew), + ); + }, + }, + /** + * takes an array of results (from `executeEncodedTx`) and returns void + * since we are not interested in the result + */ + returnVoidWatcher: { + /** @param {string | Record} result */ + onFulfilled(result) { + trace('Result', result); + return undefined; + }, + }, + withdrawRewardWatcher: { + /** @param {string} result */ + onFulfilled(result) { + const response = tryDecodeResponse( + result, + MsgWithdrawDelegatorRewardResponse.fromProtoMsg, + ); + trace('withdrawReward response', response); + const { amount: coins } = response; + return harden(coins.map(toDenomAmount)); + }, + }, + transferWatcher: { + /** + * @param {[ + * { transferChannel: IBCConnectionInfo['transferChannel'] }, + * bigint, + * ]} results + * @param {{ + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * token: Coin; + * }} ctx + */ + onFulfilled( + [{ transferChannel }, timeoutTimestamp], + { opts, token, destination }, + ) { + const results = E(this.facets.helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgTransfer.toProtoMsg({ + sourcePort: transferChannel.portId, + sourceChannel: transferChannel.channelId, + token, + sender: this.state.chainAddress.value, + receiver: destination.value, + timeoutHeight: opts?.timeoutHeight ?? { + revisionHeight: 0n, + revisionNumber: 0n, + }, + timeoutTimestamp, + memo: opts?.memo ?? '', + }), + ), + ]); + return watch(results, this.facets.returnVoidWatcher); + }, + }, + invitationMakers: { + /** + * @param {CosmosValidatorAddress} validator + * @param {AmountArg} amount + */ + Delegate(validator, amount) { + trace('Delegate', validator, amount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.delegate(validator, amount)); + }, 'Delegate'); + }, + /** + * @param {CosmosValidatorAddress} srcValidator + * @param {CosmosValidatorAddress} dstValidator + * @param {AmountArg} amount + */ + Redelegate(srcValidator, dstValidator, amount) { + trace('Redelegate', srcValidator, dstValidator, amount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch( + this.facets.holder.redelegate(srcValidator, dstValidator, amount), + ); + }, 'Redelegate'); + }, + /** @param {CosmosValidatorAddress} validator */ + WithdrawReward(validator) { + trace('WithdrawReward', validator); + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.withdrawReward(validator)); + }, 'WithdrawReward'); + }, + /** + * @param {{ + * amount: AmountArg; + * validator: CosmosValidatorAddress; + * }[]} delegations + */ + Undelegate(delegations) { + trace('Undelegate', delegations); + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.undelegate(delegations)); + }, 'Undelegate'); + }, + DeactivateAccount() { + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.deactivate()); + }, 'DeactivateAccount'); + }, + ReactivateAccount() { + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.reactivate()); + }, 'ReactivateAccount'); + }, + Send() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amount: AmountArg } + * >} + */ + const offerHandler = (seat, { toAccount, amount }) => { + seat.exit(); + return watch(this.facets.holder.send(toAccount, amount)); + }; + return zcf.makeInvitation(offerHandler, 'Send'); + }, + SendAll() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amounts: AmountArg[] } + * >} + */ + const offerHandler = (seat, { toAccount, amounts }) => { + seat.exit(); + return watch(this.facets.holder.sendAll(toAccount, amounts)); + }; + return zcf.makeInvitation(offerHandler, 'SendAll'); + }, + /** + * Starting a transfer revokes the account holder. The associated + * updater will get a special notification that the account is being + * transferred. + */ + TransferAccount() { + throw Error('not yet implemented'); + }, + Transfer() { + /** + * @type {OfferHandler< + * Vow, + * { + * amount: AmountArg; + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * } + * >} + */ + const offerHandler = (seat, { amount, destination, opts }) => { + seat.exit(); + return watch( + this.facets.holder.transfer(destination, amount, opts), + ); + }; + return zcf.makeInvitation(offerHandler, 'Transfer'); + }, + }, + holder: { + /** @type {HostOf} */ + asContinuingOffer() { + // @ts-expect-error XXX invitationMakers + // getPublicTopics resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { holder, invitationMakers: im } = this.facets; + // XXX cast to a type that has string index signature + const invitationMakers = /** @type {InvitationMakers} */ ( + /** @type {unknown} */ (im) + ); + + return harden({ + // getPublicTopics returns a vow, for membrane compatibility. + // it's safe to unwrap to a promise and get the result as we + // expect this complete in the same run + publicSubscribers: await when(holder.getPublicTopics()), + invitationMakers, + }); + }); + }, + /** @type {HostOf} */ + getPublicTopics() { + // getStoragePath resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { topicKit } = this.state; + return harden({ + account: { + description: PUBLIC_TOPICS.account[0], + subscriber: topicKit.subscriber, + storagePath: await topicKit.recorder.getStoragePath(), + }, + }); + }); + }, + + /** @type {HostOf} */ + getAddress() { + return this.state.chainAddress; + }, + /** @type {HostOf} */ + delegate(validator, amount) { + return asVow(() => { + trace('delegate', validator, amount); + const { helper } = this.facets; + const { chainAddress } = this.state; + + const amountAsCoin = helper.amountToCoin(amount); + + const results = E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgDelegate.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + amount: amountAsCoin, + }), + ), + ]); + return watch(results, this.facets.returnVoidWatcher); + }); + }, + + /** @type {HostOf} */ + redelegate(srcValidator, dstValidator, amount) { + return asVow(() => { + trace('redelegate', srcValidator, dstValidator, amount); + const { helper } = this.facets; + const { chainAddress } = this.state; + + const results = E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgBeginRedelegate.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorSrcAddress: srcValidator.value, + validatorDstAddress: dstValidator.value, + amount: helper.amountToCoin(amount), + }), + ), + ]); + + return watch( + results, + // NOTE: response, including completionTime, is currently discarded. + this.facets.returnVoidWatcher, + ); + }); + }, + /** @type {HostOf} */ + withdrawReward(validator) { + return asVow(() => { + trace('withdrawReward', validator); + const { helper } = this.facets; + const { chainAddress } = this.state; + const msg = MsgWithdrawDelegatorReward.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + }); + const account = helper.owned(); + + const results = E(account).executeEncodedTx([Any.toJSON(msg)]); + return watch(results, this.facets.withdrawRewardWatcher); + }); + }, + /** @type {HostOf} */ + getBalance(denom) { + return asVow(() => { + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryBalanceRequest.toProtoMsg({ + address: chainAddress.value, + denom: coerceDenom(chainHub, denom), + }), + ), + ]); + return watch(results, this.facets.balanceQueryWatcher); + }); + }, + + /** @type {HostOf} */ + getBalances() { + return asVow(() => { + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryAllBalancesRequest.toProtoMsg({ + address: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.allBalancesQueryWatcher); + }); + }, + + /** @type {HostOf} */ + send(toAccount, amount) { + return asVow(() => { + trace('send', toAccount, amount); + const { helper } = this.facets; + const { chainAddress } = this.state; + return watch( + E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgSend.toProtoMsg({ + fromAddress: chainAddress.value, + toAddress: toAccount.value, + amount: [helper.amountToCoin(amount)], + }), + ), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + + /** @type {HostOf} */ + sendAll(toAccount, amounts) { + return asVow(() => { + trace('sendAll', toAccount, amounts); + const { helper } = this.facets; + const { chainAddress } = this.state; + return watch( + E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgSend.toProtoMsg({ + fromAddress: chainAddress.value, + toAddress: toAccount.value, + amount: amounts.map(x => helper.amountToCoin(x)), + }), + ), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + + /** @type {HostOf} */ + transfer(destination, amount, opts) { + trace('transfer', destination, amount, opts); + return asVow(() => { + const { helper } = this.facets; + const token = helper.amountToCoin(amount); + + const connectionInfoV = watch( + chainHub.getConnectionInfo( + this.state.chainAddress.chainId, + destination.chainId, + ), + ); + + // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` + // TODO #9324 what's a reasonable default? currently 5 minutes + const timeoutTimestampVowOrValue = + opts?.timeoutTimestamp ?? + (opts?.timeoutHeight + ? 0n + : E(timestampHelper).getTimeoutTimestampNS()); + + // Resolves when host chain successfully submits, but not when + // the receiving chain acknowledges. + // See https://github.com/Agoric/agoric-sdk/issues/9784 for a + // solution that tracks the acknowledgement on the receiving chain. + return watch( + allVows([connectionInfoV, timeoutTimestampVowOrValue]), + this.facets.transferWatcher, + { opts, token, destination }, + ); + }); + }, + + /** @type {HostOf} */ + transferSteps(amount, msg) { + console.log('transferSteps got', amount, msg); + return asVow(() => Fail`not yet implemented`); + }, + + /** @type {HostOf} */ + withdrawRewards() { + return asVow(() => Fail`Not Implemented. Try using withdrawReward.`); + }, + + /** @type {HostOf} */ + undelegate(delegations) { + return asVow(() => { + trace('undelegate', delegations); + const { helper } = this.facets; + const { chainAddress } = this.state; + + delegations.every(d => + d.delegator ? d.delegator.value === chainAddress.value : true, + ) || Fail`Some delegation record is for another delegator`; + + const undelegateV = watch( + E(helper.owned()).executeEncodedTx( + delegations.map(({ validator, amount }) => + Any.toJSON( + MsgUndelegate.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + amount: coerceCoin(chainHub, amount), + }), + ), + ), + ), + this.facets.undelegateWatcher, + ); + return watch(undelegateV, this.facets.returnVoidWatcher); + }); + }, + /** @type {HostOf} */ + deactivate() { + return asVow(() => watch(E(this.facets.helper.owned()).deactivate())); + }, + /** @type {HostOf} */ + reactivate() { + return asVow(() => watch(E(this.facets.helper.owned()).reactivate())); + }, + /** @type {HostOf} */ + getDelegation(validator) { + return asVow(() => { + trace('getDelegation', validator); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegationRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + validatorAddr: validator.value, + }), + ), + ]); + return watch(results, this.facets.delegationQueryWatcher); + }); + }, + /** @type {HostOf} */ + getDelegations() { + return asVow(() => { + trace('getDelegations'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegatorDelegationsRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.delegationsQueryWatcher); + }); + }, + /** @type {HostOf} */ + getUnbondingDelegation(validator) { + return asVow(() => { + trace('getUnbondingDelegation', validator); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryUnbondingDelegationRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + validatorAddr: validator.value, + }), + ), + ]); + return watch(results, this.facets.unbondingDelegationQueryWatcher); + }); + }, + /** @type {HostOf} */ + getUnbondingDelegations() { + return asVow(() => { + trace('getUnbondingDelegations'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegatorUnbondingDelegationsRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.unbondingDelegationsQueryWatcher); + }); + }, + /** @type {HostOf} */ + getRedelegations() { + return asVow(() => { + trace('getRedelegations'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryRedelegationsRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + // These are optional but the protobufs require values to be set + dstValidatorAddr: '', + srcValidatorAddr: '', + }), + ), + ]); + return watch(results, this.facets.redelegationsQueryWatcher); + }); + }, + /** @type {HostOf} */ + getReward(validator) { + return asVow(() => { + trace('getReward', validator); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegationRewardsRequest.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + }), + ), + ]); + return watch(results, this.facets.rewardQueryWatcher); + }); + }, + /** @type {HostOf} */ + getRewards() { + return asVow(() => { + trace('getRewards'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegationTotalRewardsRequest.toProtoMsg({ + delegatorAddress: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.rewardsQueryWatcher); + }); + }, + /** @type {HostOf} */ + executeEncodedTx(msgs, opts) { + return asVow(() => + watch(E(this.facets.helper.owned()).executeEncodedTx(msgs, opts)), + ); + }, + }, + }, + ); + + return makeCosmosOrchestrationAccountKit; +}; + +/** + * @typedef {ReturnType< + * ReturnType + * >} CosmosOrchestrationAccountKit + */ + +/** + * @param {Zone} zone + * @param {object} powers + * @param {ChainHub} powers.chainHub + * @param {MakeRecorderKit} powers.makeRecorderKit + * @param {Remote} powers.timerService + * @param {VowTools} powers.vowTools + * @param {ZCF} powers.zcf + * @returns {( + * ...args: Parameters< + * ReturnType + * > + * ) => CosmosOrchestrationAccountKit['holder']} + */ +export const prepareCosmosOrchestrationAccount = ( + zone, + { chainHub, makeRecorderKit, timerService, vowTools, zcf }, +) => { + const makeKit = prepareCosmosOrchestrationAccountKit(zone, { + chainHub, + makeRecorderKit, + timerService, + vowTools, + zcf, + }); + return (...args) => makeKit(...args).holder; +}; +/** @typedef {CosmosOrchestrationAccountKit['holder']} CosmosOrchestrationAccount */ diff --git a/contract/src/exos/exo-interfaces.ts b/contract/src/exos/exo-interfaces.ts new file mode 100644 index 00000000..41f321d1 --- /dev/null +++ b/contract/src/exos/exo-interfaces.ts @@ -0,0 +1,35 @@ +import type { IBCConnectionID } from '@agoric/vats'; +import type { Vow } from '@agoric/vow'; +import type { IcaAccount } from '../cosmos-api.js'; +import type { ICAChannelAddressOpts } from '../utils/address.js'; +import type { ICQConnection } from './icq-connection-kit.js'; + +/** + * Authority to make a Cosmos interchain account or an interchain query connection. + */ +export interface CosmosInterchainService { + /** + * @param {string} chainId + * @param {IBCConnectionID} hostConnectionId the counterparty + * connection_id + * @param {IBCConnectionID} controllerConnectionId self connection_id + * @param {ICAChannelAddressOpts} [opts] optional to configure the + * channel address, such as version and ordering + * @returns {Vow} + */ + makeAccount( + chainId: string, + hostConnectionId: IBCConnectionID, + controllerConnectionId: IBCConnectionID, + opts?: ICAChannelAddressOpts | undefined, + ): Vow; + /** + * @param {IBCConnectionID} controllerConnectionId + * @param {string} [version] + * @returns {Vow | ICQConnection} + */ + provideICQConnection( + controllerConnectionId: IBCConnectionID, + version?: string | undefined, + ): Vow | ICQConnection; +} diff --git a/contract/src/exos/ibc-packet.js b/contract/src/exos/ibc-packet.js new file mode 100644 index 00000000..dd25ac55 --- /dev/null +++ b/contract/src/exos/ibc-packet.js @@ -0,0 +1,219 @@ +import { assertAllDefined } from '@agoric/internal'; +import { base64ToBytes, Shape as NetworkShape } from '@agoric/network'; +import { M } from '@endo/patterns'; +import { E } from '@endo/far'; + +// As specified in ICS20, the success result is a base64-encoded '\0x1' byte. +export const ICS20_TRANSFER_SUCCESS_RESULT = 'AQ=='; + +/** + * @import {JsonSafe, TypedJson, ResponseTo} from '@agoric/cosmic-proto'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; + * @import {PacketOptions} from './packet-tools.js'; + */ + +const { Fail, bare } = assert; +const { Vow$ } = NetworkShape; // TODO #9611 + +/** + * Create a pattern for alterative representations of a sequence number. + * + * @param {any} sequence + * @returns {Pattern} + */ +export const createSequencePattern = sequence => { + const sequencePatterns = []; + + try { + const bintSequence = BigInt(sequence); + bintSequence > 0n && sequencePatterns.push(bintSequence); + } catch (e) { + // ignore + } + + const numSequence = Number(sequence); + numSequence > 0 && + Number.isSafeInteger(numSequence) && + sequencePatterns.push(numSequence); + + const strSequence = String(sequence); + strSequence && sequencePatterns.push(strSequence); + + if (!sequencePatterns.find(seq => seq === sequence)) { + sequencePatterns.push(sequence); + } + + switch (sequencePatterns.length) { + case 0: + throw Fail`sequence ${sequence} is not valid`; + case 1: + return sequencePatterns[0]; + default: + return M.or(...sequencePatterns); + } +}; +harden(createSequencePattern); + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools & { makeIBCReplyKit: MakeIBCReplyKit }} powers + */ +export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => { + const makeIBCTransferSenderKit = zone.exoClassKit( + 'IBCTransferSenderKit', + { + public: M.interface('IBCTransferSender', { + sendPacket: M.call(Vow$(M.any()), M.any()).returns(Vow$(M.record())), + }), + responseWatcher: M.interface('responseWatcher', { + onFulfilled: M.call([M.record()], M.record()).returns(M.any()), + }), + verifyTransferSuccess: M.interface('verifyTransferSuccess', { + onFulfilled: M.call(M.any()).returns(), + }), + }, + /** + * @param {{ + * executeTx: LocalChainAccount['executeTx']; + * }} txExecutor + * @param {TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'>} transferMsg + */ + (txExecutor, transferMsg) => ({ + txExecutor, + transferMsg: harden(transferMsg), + }), + { + public: { + sendPacket(match, opts) { + const { txExecutor, transferMsg } = this.state; + return watch( + E(txExecutor).executeTx([transferMsg]), + this.facets.responseWatcher, + { opts, match }, + ); + }, + }, + responseWatcher: { + /** + * Wait for successfully sending the transfer packet. + * + * @param {[ + * JsonSafe< + * ResponseTo< + * TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'> + * > + * >, + * ]} response + * @param {Record} ctx + */ + onFulfilled([{ sequence }], ctx) { + const { match } = ctx; + const { transferMsg } = this.state; + + // Match the port/channel and sequence number. + const replyPacketPattern = M.splitRecord({ + source_port: transferMsg.sourcePort, + source_channel: transferMsg.sourceChannel, + sequence: createSequencePattern(sequence), + }); + + const { resultV: ackDataV, ...rest } = makeIBCReplyKit( + replyPacketPattern, + match, + ctx, + ); + const resultV = watch(ackDataV, this.facets.verifyTransferSuccess); + return harden({ resultV, ...rest }); + }, + }, + verifyTransferSuccess: { + onFulfilled(ackData) { + let obj; + try { + obj = JSON.parse(ackData); + } catch { + Fail`ICS20-1 transfer ack data is not JSON: ${ackData}`; + } + const { result, error } = obj; + error === undefined || Fail`ICS20-1 transfer error ${error}`; + result ?? Fail`Missing result in ICS20-1 transfer ack ${obj}`; + result === ICS20_TRANSFER_SUCCESS_RESULT || + Fail`ICS20-1 transfer unsuccessful with ack result ${result}`; + }, + }, + }, + ); + + /** + * @param {Parameters} args + */ + return (...args) => makeIBCTransferSenderKit(...args).public; +}; +harden(prepareIBCTransferSender); + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools} vowTools + */ +export const prepareIBCReplyKit = (zone, vowTools) => { + const { watch } = vowTools; + const ibcWatcher = zone.exo( + 'ibcResultWatcher', + M.interface('processIBCWatcher', { + onFulfilled: M.call(M.record(), M.record()).returns(Vow$(M.string())), + }), + { + onFulfilled({ event, acknowledgement }, { opName = 'unknown' }) { + assertAllDefined({ event, acknowledgement }); + switch (event) { + case 'acknowledgementPacket': + return base64ToBytes(acknowledgement); + case 'timeoutPacket': + throw Fail`${bare(opName)} operation received timeout packet`; + default: + throw Fail`Unexpected event: ${event}`; + } + }, + }, + ); + + /** + * @param {Pattern} replyPacketPattern + * @param {Vow} matchV + * @param {PacketOptions} opts + */ + const makeIBCReplyKit = (replyPacketPattern, matchV, opts) => { + const eventPattern = M.or( + M.splitRecord({ + event: 'acknowledgementPacket', + packet: replyPacketPattern, + acknowledgement: M.string(), + }), + M.splitRecord({ + event: 'timeoutPacket', + packet: replyPacketPattern, + }), + ); + const resultV = watch(matchV, ibcWatcher, opts); + return harden({ eventPattern, resultV }); + }; + + return makeIBCReplyKit; +}; +harden(prepareIBCReplyKit); +/** @typedef {ReturnType} MakeIBCReplyKit */ + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools} vowTools + */ +export const prepareIBCTools = (zone, vowTools) => { + const makeIBCReplyKit = prepareIBCReplyKit(zone, vowTools); + const makeIBCTransferSender = prepareIBCTransferSender(zone, { + makeIBCReplyKit, + ...vowTools, + }); + return harden({ makeIBCTransferSender, makeIBCReplyKit }); +}; +harden(prepareIBCTools); diff --git a/contract/src/exos/ica-account-kit.js b/contract/src/exos/ica-account-kit.js new file mode 100644 index 00000000..1802666b --- /dev/null +++ b/contract/src/exos/ica-account-kit.js @@ -0,0 +1,231 @@ +/** @file IcaAccount exo */ +import { Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { NonNullish, makeTracer } from '@agoric/internal'; +import { VowShape } from '@agoric/vow'; +import { + ChainAddressShape, + OutboundConnectionHandlerI, + Proto3Shape, + TxBodyOptsShape, +} from '../typeGuards.js'; +import { findAddressField } from '../utils/address.js'; +import { makeTxPacket, parseTxPacket } from '../utils/packet.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/base-zone'; + * @import {Connection, Port} from '@agoric/network'; + * @import {Remote, Vow, VowTools} from '@agoric/vow'; + * @import {AnyJson} from '@agoric/cosmic-proto'; + * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + * @import {ChainAddress, IcaAccount} from '../types.js'; + */ + +const trace = makeTracer('IcaAccountKit'); + +const UNPARSABLE_CHAIN_ADDRESS = 'UNPARSABLE_CHAIN_ADDRESS'; + +export const IcaAccountI = M.interface('IcaAccount', { + getAddress: M.call().returns(ChainAddressShape), + getLocalAddress: M.call().returns(M.string()), + getRemoteAddress: M.call().returns(M.string()), + getPort: M.call().returns(M.remotable('Port')), + executeTx: M.call(M.arrayOf(M.record())).returns(VowShape), + executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) + .optional(TxBodyOptsShape) + .returns(VowShape), + deactivate: M.call().returns(VowShape), + reactivate: M.call().returns(VowShape), +}); + +// XXX none of these modifiers are working to exclude this type from api-docs +/** + * @private + * @typedef {{ + * chainId: string; + * port: Port; + * connection: Remote | undefined; + * localAddress: LocalIbcAddress | undefined; + * requestedRemoteAddress: string; + * remoteAddress: RemoteIbcAddress | undefined; + * chainAddress: ChainAddress | undefined; + * isInitiatingClose: boolean; + * }} State + * Internal to the IcaAccountKit exo + * @internal + */ + +/** + * Used only by CosmosInterchainService + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @internal + */ +export const prepareIcaAccountKit = (zone, { watch, asVow }) => + zone.exoClassKit( + 'IcaAccountKit', + { + account: IcaAccountI, + connectionHandler: OutboundConnectionHandlerI, + parseTxPacketWatcher: M.interface('ParseTxPacketWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // does not need watcherContext + .returns(M.string()), + }), + }, + /** + * @param {string} chainId + * @param {Port} port + * @param {string} requestedRemoteAddress + */ + (chainId, port, requestedRemoteAddress) => + /** @type {State} */ ({ + chainId, + port, + connection: undefined, + requestedRemoteAddress, + remoteAddress: undefined, + chainAddress: undefined, + localAddress: undefined, + isInitiatingClose: false, + }), + { + parseTxPacketWatcher: { + /** @param {string} ack */ + onFulfilled(ack) { + return parseTxPacket(ack); + }, + }, + account: { + /** @returns {ChainAddress} */ + getAddress() { + return NonNullish( + this.state.chainAddress, + 'ICA channel creation acknowledgement not yet received.', + ); + }, + getLocalAddress() { + return NonNullish( + this.state.localAddress, + 'local address not available', + ); + }, + getRemoteAddress() { + return NonNullish( + this.state.remoteAddress, + 'remote address not available', + ); + }, + getPort() { + return this.state.port; + }, + executeTx() { + return asVow(() => Fail`not yet implemented`); + }, + /** + * Submit a transaction on behalf of the remote account for execution on + * the remote chain. + * + * @param {AnyJson[]} msgs + * @param {Omit} [opts] + * @returns {Vow} - base64 encoded bytes string. Can be decoded + * using the corresponding `Msg*Response` object. + * @throws {Error} if packet fails to send or an error is returned + */ + executeEncodedTx(msgs, opts) { + return asVow(() => { + const { connection } = this.state; + if (!connection) { + throw Fail`Account not available or deactivated.`; + } + return watch( + E(connection).send(makeTxPacket(msgs, opts)), + this.facets.parseTxPacketWatcher, + ); + }); + }, + /** @type {HostOf} */ + deactivate() { + return asVow(() => { + const { connection } = this.state; + if (!connection) throw Fail`Account not available or deactivated.`; + this.state.isInitiatingClose = true; + return E(connection).close(); + }); + }, + /** @type {HostOf} */ + reactivate() { + return asVow(() => { + const { connection, port, requestedRemoteAddress } = this.state; + if (connection) { + throw Fail`Account is already active.`; + } + return watch( + E(port).connect( + requestedRemoteAddress, + this.facets.connectionHandler, + ), + ); + }); + }, + }, + connectionHandler: { + /** + * @param {Remote} connection + * @param {LocalIbcAddress} localAddr + * @param {RemoteIbcAddress} remoteAddr + */ + async onOpen(connection, localAddr, remoteAddr) { + trace(`ICA Channel Opened for ${localAddr} at ${remoteAddr}`); + this.state.connection = connection; + this.state.remoteAddress = remoteAddr; + this.state.localAddress = localAddr; + const address = findAddressField(remoteAddr); + if (!address) { + console.error('⚠️ failed to parse chain address', remoteAddr); + } + this.state.chainAddress = harden({ + value: address || UNPARSABLE_CHAIN_ADDRESS, + chainId: this.state.chainId, + encoding: 'bech32', + }); + }, + /** + * This handler fires any time the connection (channel) closes. This + * could be due to external factors (e.g. a packet timeout), or a holder + * initiated action (`.deactivate()`). + * + * Here, if a connection is opened again, we clear the connection and + * addresses from state as they will change - a new channel will be + * established if the connection is reopened. + * + * If the holder did not initiate the closure, a new connection is + * established using the original requested remote address. This will + * result in a new channelID but the ChainAddress will be preserved. + * + * @param {Remote} _connection + * @param {unknown} reason + * @see {@link https://docs.cosmos.network/v0.45/ibc/overview.html#:~:text=In%20ORDERED%20channels%2C%20a%20timeout%20of%20a%20single%20packet%20in%20the%20channel%20closes%20the%20channel.} + */ + async onClose(_connection, reason) { + trace(`ICA Channel closed. Reason: ${reason}`); + this.state.connection = undefined; + this.state.localAddress = undefined; + this.state.remoteAddress = undefined; + if (this.state.isInitiatingClose === true) { + trace('Account deactivated by holder. Skipping reactivation.'); + this.state.isInitiatingClose = false; + } else { + trace('Account closed unexpectedly. Automatically reactivating.'); + void watch(this.facets.account.reactivate()); + } + }, + }, + }, + ); + +/** @typedef {ReturnType>} IcaAccountKit */ diff --git a/contract/src/exos/icq-connection-kit.js b/contract/src/exos/icq-connection-kit.js new file mode 100644 index 00000000..e01e4499 --- /dev/null +++ b/contract/src/exos/icq-connection-kit.js @@ -0,0 +1,132 @@ +/** @file ICQConnection Exo */ +import { Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { VowShape } from '@agoric/vow'; +import { NonNullish, makeTracer } from '@agoric/internal'; +import { makeQueryPacket, parseQueryPacket } from '../utils/packet.js'; +import { ICQMsgShape, OutboundConnectionHandlerI } from '../typeGuards.js'; + +/** + * @import {Zone} from '@agoric/base-zone'; + * @import {Connection, Port} from '@agoric/network'; + * @import {Remote, Vow, VowTools} from '@agoric/vow'; + * @import {JsonSafe} from '@agoric/cosmic-proto'; + * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +const trace = makeTracer('Orchestration:ICQConnection'); + +export const ICQConnectionI = M.interface('ICQConnection', { + getLocalAddress: M.call().returns(M.string()), + getRemoteAddress: M.call().returns(M.string()), + query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), +}); + +/** + * @typedef {{ + * port: Port; + * connection: Remote | undefined; + * localAddress: LocalIbcAddress | undefined; + * remoteAddress: RemoteIbcAddress | undefined; + * }} ICQConnectionKitState + */ + +/** + * Used only by CosmosInterchainService + * + * Prepares an ICQ Connection Kit based on the + * {@link https://github.com/cosmos/ibc-apps/blob/e9b46e4bf0ad0a66cf6bc53b5e5496f6e2b4b02b/modules/async-icq/README.md | `icq/v1` IBC application protocol}. + * + * `icq/v1`, also referred to as `async-icq`, is a protocol for asynchronous + * queries between IBC-enabled chains. It allows a chain to send queries to + * another chain and receive responses asynchronously. + * + * The ICQ connection kit provides the necessary functionality to establish and + * manage an ICQ connection between two chains. It includes methods for + * retrieving the local and remote addresses of the connection, as well as + * sending queries and handling connection events. + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @internal + */ +export const prepareICQConnectionKit = (zone, { watch, asVow }) => + zone.exoClassKit( + 'ICQConnectionKit', + { + connection: ICQConnectionI, + connectionHandler: OutboundConnectionHandlerI, + parseQueryPacketWatcher: M.interface('ParseQueryPacketWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // does not need watcherContext + .returns(M.arrayOf(M.record())), + }), + }, + /** @param {Port} port */ + port => + /** @type {ICQConnectionKitState} */ ({ + port, + connection: undefined, + remoteAddress: undefined, + localAddress: undefined, + }), + { + connection: { + getLocalAddress() { + return NonNullish( + this.state.localAddress, + 'local address not available', + ); + }, + getRemoteAddress() { + return NonNullish( + this.state.remoteAddress, + 'remote address not available', + ); + }, + /** + * Vow rejects if packet fails to send or an error is returned + * + * @param {JsonSafe[]} msgs + * @returns {Vow[]>} + */ + query(msgs) { + return asVow(() => { + const { connection } = this.state; + if (!connection) throw Fail`connection not available`; + return watch( + E(connection).send(makeQueryPacket(msgs)), + this.facets.parseQueryPacketWatcher, + ); + }); + }, + }, + parseQueryPacketWatcher: { + /** @param {string} ack packet acknowledgement string */ + onFulfilled(ack) { + return parseQueryPacket(ack); + }, + }, + connectionHandler: { + /** + * @param {Remote} connection + * @param {LocalIbcAddress} localAddr + * @param {RemoteIbcAddress} remoteAddr + */ + async onOpen(connection, localAddr, remoteAddr) { + trace(`ICQ Channel Opened for ${localAddr} at ${remoteAddr}`); + this.state.connection = connection; + this.state.remoteAddress = remoteAddr; + this.state.localAddress = localAddr; + }, + async onClose(_connection, reason) { + trace(`ICQ Channel closed. Reason: ${reason}`); + }, + }, + }, + ); + +/** @typedef {ReturnType>} ICQConnectionKit */ +/** @typedef {ICQConnectionKit['connection']} ICQConnection */ diff --git a/contract/src/exos/local-chain-facade.js b/contract/src/exos/local-chain-facade.js new file mode 100644 index 00000000..7f4ace2d --- /dev/null +++ b/contract/src/exos/local-chain-facade.js @@ -0,0 +1,196 @@ +/** @file Localchain Facade exo */ +import { E } from '@endo/far'; +// eslint-disable-next-line no-restricted-syntax -- just the import +import { heapVowE } from '@agoric/vow/vat.js'; +import { M } from '@endo/patterns'; +import { pickFacet } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; + +import { chainFacadeMethods, TypedJsonShape } from '../typeGuards.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/base-zone'; + * @import {TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + * @import {LocalChain, LocalChainAccount, QueryManyFn} from '@agoric/vats/src/localchain.js'; + * @import {AssetInfo} from '@agoric/vats/src/vat-bank.js'; + * @import {NameHub} from '@agoric/vats'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {CosmosInterchainService} from './exo-interfaces.js'; + * @import {LocalOrchestrationAccountKit, MakeLocalOrchestrationAccountKit} from './local-orchestration-account.js'; + * @import {Chain, ChainAddress, ChainInfo, CosmosChainInfo, IBCConnectionInfo, OrchestrationAccount} from '../types.js'; + */ + +/** + * Chain facade methods unique to the Agoric (local) chain. + * + * @typedef {object} AgoricChainMethods + * @property {() => Promise} getVBankAssetInfo Get asset info from + * agoricNames.vbankAsset. + * + * Caches the query to agoricNames in the first call. + */ + +/** + * @typedef {{ + * makeLocalOrchestrationAccountKit: MakeLocalOrchestrationAccountKit; + * orchestration: Remote; + * storageNode: Remote; + * agoricNames: Remote; + * timer: Remote; + * localchain: Remote; + * vowTools: VowTools; + * }} LocalChainFacadePowers + */ + +/** + * @param {Zone} zone + * @param {LocalChainFacadePowers} powers + */ +const prepareLocalChainFacadeKit = ( + zone, + { + makeLocalOrchestrationAccountKit, + agoricNames, + localchain, + // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 + // consider making an `accounts` childNode + storageNode, + vowTools: { allVows, watch, asVow }, + }, +) => + zone.exoClassKit( + 'LocalChainFacade', + { + public: M.interface('LocalChainFacade', { + ...chainFacadeMethods, + query: M.call(M.arrayOf(TypedJsonShape)).returns(VowShape), + getVBankAssetInfo: M.call().optional(M.boolean()).returns(VowShape), + }), + vbankAssetValuesWatcher: M.interface('vbankAssetValuesWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(VowShape), + }), + makeAccountWatcher: M.interface('makeAccountWatcher', { + onFulfilled: M.call([M.remotable('LCA Account'), M.string()]) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(VowShape), + }), + makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { + onFulfilled: M.call(M.remotable()) + .optional({ account: M.remotable(), address: M.string() }) // empty context + .returns(M.remotable()), + }), + }, + /** + * @param {CosmosChainInfo} localChainInfo + */ + localChainInfo => { + return { + localChainInfo, + vbankAssets: /** @type {AssetInfo[] | undefined} */ (undefined), + }; + }, + { + public: { + getChainInfo() { + return watch(this.state.localChainInfo); + }, + + /** @returns {Vow} */ + makeAccount() { + const lcaP = E(localchain).makeAccount(); + return watch( + // XXX makeAccount returns a Promise for an exo but reserves being able to return a vow + // so we use heapVowE to shorten the promise path + // eslint-disable-next-line no-restricted-syntax -- will run in one turn + allVows([lcaP, heapVowE(lcaP).getAddress()]), + this.facets.makeAccountWatcher, + ); + }, + /** @type {HostOf['query']>} */ + query(requests) { + return watch(E(localchain).queryMany(requests)); + }, + /** @type {HostOf} */ + getVBankAssetInfo() { + return asVow(() => { + const { vbankAssets } = this.state; + if (vbankAssets) { + return vbankAssets; + } + const vbankAssetNameHubP = E(agoricNames).lookup('vbankAsset'); + const vbankAssetValuesP = E(vbankAssetNameHubP).values(); + const { vbankAssetValuesWatcher } = this.facets; + return watch(vbankAssetValuesP, vbankAssetValuesWatcher); + }); + }, + }, + vbankAssetValuesWatcher: { + /** + * @param {AssetInfo[]} assets + */ + onFulfilled(assets) { + const { state } = this; + return asVow(() => { + state.vbankAssets = assets; + return assets; + }); + }, + }, + makeAccountWatcher: { + /** + * @param {[LocalChainAccount, ChainAddress['value']]} results + */ + onFulfilled([account, address]) { + return watch( + E(storageNode).makeChildNode(address), + this.facets.makeChildNodeWatcher, + { account, address }, + ); + }, + }, + makeChildNodeWatcher: { + /** + * @param {Remote} childNode + * @param {{ + * account: LocalChainAccount; + * address: ChainAddress['value']; + * }} ctx + */ + onFulfilled(childNode, { account, address }) { + const { localChainInfo } = this.state; + const { holder } = makeLocalOrchestrationAccountKit({ + account, + address: harden({ + value: address, + encoding: 'bech32', + chainId: localChainInfo.chainId, + }), + // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 + storageNode: childNode, + }); + return holder; + }, + }, + }, + ); +harden(prepareLocalChainFacadeKit); + +/** + * Used only by `withOrchestration` helper + * + * @param {Zone} zone + * @param {LocalChainFacadePowers} powers + * @internal + */ +export const prepareLocalChainFacade = (zone, powers) => { + const makeLocalChainFacadeKit = prepareLocalChainFacadeKit(zone, powers); + return pickFacet(makeLocalChainFacadeKit, 'public'); +}; +harden(prepareLocalChainFacade); + +/** @typedef {ReturnType} MakeLocalChainFacade */ +/** @typedef {ReturnType} LocalChainFacade */ diff --git a/contract/src/exos/local-orchestration-account.js b/contract/src/exos/local-orchestration-account.js new file mode 100644 index 00000000..bc5e1f2a --- /dev/null +++ b/contract/src/exos/local-orchestration-account.js @@ -0,0 +1,747 @@ +/** @file Use-object for the owner of a localchain account */ +import { typedJson } from '@agoric/cosmic-proto'; +import { AmountShape, PaymentShape } from '@agoric/ertp'; +import { makeTracer } from '@agoric/internal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { M } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { E } from '@endo/far'; +import { Fail, q } from '@endo/errors'; + +import { + AmountArgShape, + AnyNatAmountsRecord, + ChainAddressShape, + DenomAmountShape, + DenomShape, + IBCTransferOptionsShape, + TimestampProtoShape, + TypedJsonShape, +} from '../typeGuards.js'; +import { maxClockSkew, toDenomAmount } from '../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../utils/time.js'; +import { preparePacketTools } from './packet-tools.js'; +import { prepareIBCTools } from './ibc-packet.js'; +import { coerceCoin, coerceDenomAmount } from '../utils/amounts.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {LocalChain, LocalChainAccount} from '@agoric/vats/src/localchain.js'; + * @import {AmountArg, ChainAddress, DenomAmount, IBCMsgTransferOptions, IBCConnectionInfo, OrchestrationAccountI, LocalAccountMethods} from '@agoric/orchestration'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. + * @import {Zone} from '@agoric/zone'; + * @import {Remote} from '@agoric/internal'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {TimerService, TimestampRecord} from '@agoric/time'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {TypedJson, JsonSafe, ResponseTo} from '@agoric/cosmic-proto'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + * @import {Matcher} from '@endo/patterns'; + * @import {ChainHub} from './chain-hub.js'; + * @import {PacketTools} from './packet-tools.js'; + * @import {ZoeTools} from '../utils/zoe-tools.js'; + */ + +const trace = makeTracer('LOA'); + +const { Vow$ } = NetworkShape; // TODO #9611 + +const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); + +/** + * @typedef {object} LocalChainAccountNotification + * @property {string} address + */ + +/** + * @private + * @typedef {{ + * topicKit: RecorderKit; + * packetTools: PacketTools; + * account: LocalChainAccount; + * address: ChainAddress; + * }} State + * Internal to the LocalOrchestrationAccount exo + */ + +const HolderI = M.interface('holder', { + ...orchestrationAccountMethods, + delegate: M.call(M.string(), AmountShape).returns(VowShape), + undelegate: M.call(M.string(), AmountShape).returns(VowShape), + deposit: M.call(PaymentShape).returns(VowShape), + withdraw: M.call(AmountShape).returns(Vow$(PaymentShape)), + executeTx: M.call(M.arrayOf(M.record())).returns(Vow$(M.record())), + sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) + .optional(M.any()) + .returns(EVow$(M.string())), + matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), + monitorTransfers: M.call(M.remotable('TargetApp')).returns(EVow$(M.any())), +}); + +/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ +const PUBLIC_TOPICS = { + account: ['Account holder status', M.any()], +}; + +/** + * @param {Zone} zone + * @param {object} powers + * @param {MakeRecorderKit} powers.makeRecorderKit + * @param {ZCF} powers.zcf + * @param {Remote} powers.timerService + * @param {VowTools} powers.vowTools + * @param {ChainHub} powers.chainHub + * @param {Remote} powers.localchain + * @param {ZoeTools} powers.zoeTools + */ +export const prepareLocalOrchestrationAccountKit = ( + zone, + { + makeRecorderKit, + zcf, + timerService, + vowTools, + chainHub, + localchain, + zoeTools, + }, +) => { + const { watch, allVows, asVow, when } = vowTools; + const { makeIBCTransferSender } = prepareIBCTools( + zone.subZone('ibcTools'), + vowTools, + ); + const makePacketTools = preparePacketTools( + zone.subZone('packetTools'), + vowTools, + ); + const timestampHelper = makeTimestampHelper(timerService); + + /** Make an object wrapping an LCA with Zoe interfaces. */ + const makeLocalOrchestrationAccountKit = zone.exoClassKit( + 'Local Orchestration Account Kit', + { + helper: M.interface('helper', { + amountToCoin: M.call(AmountArgShape).returns(M.record()), + }), + holder: HolderI, + undelegateWatcher: M.interface('undelegateWatcher', { + onFulfilled: M.call([ + M.splitRecord({ completionTime: TimestampProtoShape }), + ]) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(VowShape), + }), + transferWatcher: M.interface('transferWatcher', { + onFulfilled: M.call([M.record(), M.nat()]) + .optional({ + destination: ChainAddressShape, + opts: M.or(M.undefined(), IBCTransferOptionsShape), + amount: DenomAmountShape, + }) + .returns(Vow$(M.record())), + }), + extractFirstResultWatcher: M.interface('extractFirstResultWatcher', { + onFulfilled: M.call([M.record()]) + .optional(M.arrayOf(M.undefined())) + .returns(M.any()), + }), + returnVoidWatcher: M.interface('returnVoidWatcher', { + onFulfilled: M.call(M.any()).optional(M.any()).returns(M.undefined()), + }), + seatExiterHandler: M.interface('seatExiterHandler', { + onFulfilled: M.call(M.undefined(), M.remotable()).returns( + M.undefined(), + ), + onRejected: M.call(M.error(), M.remotable()).returns(M.undefined()), + }), + getBalanceWatcher: M.interface('getBalanceWatcher', { + onFulfilled: M.call(AmountShape, DenomShape).returns(DenomAmountShape), + }), + queryBalanceWatcher: M.interface('queryBalanceWatcher', { + onFulfilled: M.call(TypedJsonShape).returns(DenomAmountShape), + }), + queryBalancesWatcher: M.interface('queryBalancesWatcher', { + onFulfilled: M.call(TypedJsonShape).returns( + M.arrayOf(DenomAmountShape), + ), + }), + invitationMakers: M.interface('invitationMakers', { + CloseAccount: M.call().returns(M.promise()), + Delegate: M.call(M.string(), AmountShape).returns(M.promise()), + Deposit: M.call().returns(M.promise()), + Send: M.call().returns(M.promise()), + SendAll: M.call().returns(M.promise()), + Transfer: M.call().returns(M.promise()), + Undelegate: M.call(M.string(), AmountShape).returns(M.promise()), + Withdraw: M.call().returns(M.promise()), + }), + }, + /** + * @param {object} initState + * @param {LocalChainAccount} initState.account + * @param {ChainAddress} initState.address + * @param {Remote} initState.storageNode + * @returns {State} + */ + ({ account, address, storageNode }) => { + // must be the fully synchronous maker because the kit is held in durable state + const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); + // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 + void E(topicKit.recorder).write(''); + const packetTools = makePacketTools(account); + + return { account, address, topicKit, packetTools }; + }, + { + helper: { + /** + * @param {AmountArg} amount + * @returns {Coin} + */ + amountToCoin(amount) { + return coerceCoin(chainHub, amount); + }, + }, + invitationMakers: { + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + */ + Delegate(validatorAddress, ertpAmount) { + trace('Delegate', validatorAddress, ertpAmount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch( + this.facets.holder.delegate(validatorAddress, ertpAmount), + ); + }, 'Delegate'); + }, + Deposit() { + trace('Deposit'); + return zcf.makeInvitation( + seat => { + const { give } = seat.getProposal(); + return watch( + zoeTools.localTransfer( + seat, + // @ts-expect-error LocalAccount vs LocalAccountMethods + this.state.account, + give, + ), + this.facets.seatExiterHandler, + seat, + ); + }, + 'Deposit', + undefined, + M.splitRecord({ give: AnyNatAmountsRecord, want: {} }), + ); + }, + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + */ + Undelegate(validatorAddress, ertpAmount) { + trace('Undelegate', validatorAddress, ertpAmount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch( + this.facets.holder.undelegate(validatorAddress, ertpAmount), + ); + }, 'Undelegate'); + }, + CloseAccount() { + throw Error('not yet implemented'); + }, + Send() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amount: AmountArg } + * >} + */ + const offerHandler = (seat, { toAccount, amount }) => { + seat.exit(); + return watch(this.facets.holder.send(toAccount, amount)); + }; + return zcf.makeInvitation(offerHandler, 'Send'); + }, + SendAll() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amounts: AmountArg[] } + * >} + */ + const offerHandler = (seat, { toAccount, amounts }) => { + seat.exit(); + return watch(this.facets.holder.sendAll(toAccount, amounts)); + }; + return zcf.makeInvitation(offerHandler, 'SendAll'); + }, + Transfer() { + /** + * @type {OfferHandler< + * Vow, + * { + * amount: AmountArg; + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * } + * >} + */ + const offerHandler = (seat, { amount, destination, opts }) => { + seat.exit(); + return watch( + this.facets.holder.transfer(destination, amount, opts), + ); + }; + return zcf.makeInvitation(offerHandler, 'Transfer'); + }, + Withdraw() { + trace('Withdraw'); + return zcf.makeInvitation( + seat => { + const { want } = seat.getProposal(); + return watch( + zoeTools.withdrawToSeat( + // @ts-expect-error LocalAccount vs LocalAccountMethods + this.state.account, + seat, + want, + ), + this.facets.seatExiterHandler, + seat, + ); + }, + 'Withdraw', + undefined, + M.splitRecord({ give: {}, want: AnyNatAmountsRecord }), + ); + }, + }, + undelegateWatcher: { + /** + * @param {[ + * JsonSafe< + * TypedJson<'/cosmos.staking.v1beta1.MsgUndelegateResponse'> + * >, + * ]} response + */ + onFulfilled(response) { + const { completionTime } = response[0]; + return watch( + E(timerService).wakeAt( + // ignore nanoseconds and just use seconds from Timestamp + BigInt(completionTime.seconds) + maxClockSkew, + ), + this.facets.returnVoidWatcher, + ); + }, + }, + transferWatcher: { + /** + * @param {[ + * { transferChannel: IBCConnectionInfo['transferChannel'] }, + * bigint, + * ]} results + * @param {{ + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * amount: DenomAmount; + * }} ctx + */ + onFulfilled( + [{ transferChannel }, timeoutTimestamp], + { opts, amount, destination }, + ) { + const transferMsg = typedJson( + '/ibc.applications.transfer.v1.MsgTransfer', + { + sourcePort: transferChannel.portId, + sourceChannel: transferChannel.channelId, + token: { + amount: String(amount.value), + denom: amount.denom, + }, + sender: this.state.address.value, + receiver: destination.value, + timeoutHeight: opts?.timeoutHeight ?? { + revisionHeight: 0n, + revisionNumber: 0n, + }, + timeoutTimestamp, + memo: opts?.memo ?? '', + }, + ); + + const { holder } = this.facets; + const sender = makeIBCTransferSender( + /** @type {any} */ (holder), + transferMsg, + ); + // Begin capturing packets, send the transfer packet, then return a + // vow that rejects unless the packet acknowledgment comes back and is + // verified. + return holder.sendThenWaitForAck(sender); + }, + }, + /** + * takes an array of results (from `executeEncodedTx`) and returns the + * first result + */ + extractFirstResultWatcher: { + /** + * @param {Record[]} results + */ + onFulfilled(results) { + results.length === 1 || + Fail`expected exactly one result; got ${results}`; + return results[0]; + }, + }, + returnVoidWatcher: { + onFulfilled() { + return undefined; + }, + }, + /** + * handles a request for balance from a bank purse and returns the balance + * as a Chain Amount + */ + getBalanceWatcher: { + /** + * @param {Amount<'nat'>} natAmount + * @param {DenomAmount['denom']} denom + * @returns {DenomAmount} + */ + onFulfilled(natAmount, denom) { + return harden({ denom, value: natAmount.value }); + }, + }, + /** exits or fails a seat depending the outcome */ + seatExiterHandler: { + /** + * @param {undefined} _ + * @param {ZCFSeat} seat + */ + onFulfilled(_, seat) { + seat.exit(); + }, + /** + * @param {Error} reason + * @param {ZCFSeat} seat + */ + onRejected(reason, seat) { + seat.exit(reason); + throw reason; + }, + }, + /** + * handles a QueryBalanceRequest from localchain.query and returns the + * balance as a DenomAmount + */ + queryBalanceWatcher: { + /** + * @param {ResponseTo< + * TypedJson<'/cosmos.bank.v1beta1.QueryBalanceRequest'> + * >} result + * @returns {DenomAmount} + */ + onFulfilled(result) { + const { balance } = result; + if (!balance || !balance?.denom) { + throw Fail`Expected balance ${q(result)};`; + } + return harden(toDenomAmount(balance)); + }, + }, + /** + * handles a QueryAllBalancesRequest from localchain.query and returns the + * balances as a DenomAmounts + */ + queryBalancesWatcher: { + /** + * @param {JsonSafe< + * ResponseTo< + * TypedJson<'/cosmos.bank.v1beta1.QueryAllBalancesRequest'> + * > + * >} result + * @returns {DenomAmount[]} + */ + onFulfilled(result) { + const { balances } = result; + if (!balances || !Array.isArray(balances)) { + throw Fail`Expected balances ${q(result)};`; + } + return harden(balances.map(toDenomAmount)); + }, + }, + holder: { + /** @type {HostOf} */ + asContinuingOffer() { + // @ts-expect-error XXX invitationMakers + // getPublicTopics resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { holder, invitationMakers: im } = this.facets; + // XXX cast to a type that has string index signature + const invitationMakers = /** @type {InvitationMakers} */ ( + /** @type {unknown} */ (im) + ); + + return harden({ + // getPublicTopics returns a vow, for membrane compatibility. + // it's safe to unwrap to a promise and get the result as we + // expect this complete in the same run + publicSubscribers: await when(holder.getPublicTopics()), + invitationMakers, + }); + }); + }, + /** + * @type {HostOf} + */ + getBalance(denomArg) { + return asVow(() => { + const [brand, denom] = + typeof denomArg === 'string' + ? [chainHub.getAsset(denomArg)?.brand, denomArg] + : [denomArg, chainHub.getDenom(denomArg)]; + + if (!denom) { + throw Fail`No denom for brand: ${denomArg}`; + } + + if (brand) { + return watch( + E(this.state.account).getBalance(brand), + this.facets.getBalanceWatcher, + denom, + ); + } + + return watch( + E(localchain).query( + typedJson('/cosmos.bank.v1beta1.QueryBalanceRequest', { + address: this.state.address.value, + denom, + }), + ), + this.facets.queryBalanceWatcher, + ); + }); + }, + /** @type {HostOf} */ + getBalances() { + return watch( + E(localchain).query( + typedJson('/cosmos.bank.v1beta1.QueryAllBalancesRequest', { + address: this.state.address.value, + }), + ), + this.facets.queryBalancesWatcher, + ); + }, + + /** + * @type {HostOf} + */ + getPublicTopics() { + // getStoragePath resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { topicKit } = this.state; + return harden({ + account: { + description: PUBLIC_TOPICS.account[0], + subscriber: topicKit.subscriber, + storagePath: await topicKit.recorder.getStoragePath(), + }, + }); + }); + }, + // FIXME take ChainAddress to match OrchestrationAccountI + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + */ + delegate(validatorAddress, ertpAmount) { + const { account: lca } = this.state; + + const amount = coerceCoin(chainHub, ertpAmount); + + return watch( + E(lca).executeTx([ + typedJson('/cosmos.staking.v1beta1.MsgDelegate', { + amount, + validatorAddress, + delegatorAddress: this.state.address.value, + }), + ]), + this.facets.extractFirstResultWatcher, + ); + }, + // FIXME take ChainAddress to match OrchestrationAccountI + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + * @returns {Vow} + */ + undelegate(validatorAddress, ertpAmount) { + const amount = coerceCoin(chainHub, ertpAmount); + const { account: lca } = this.state; + return watch( + E(lca).executeTx([ + typedJson('/cosmos.staking.v1beta1.MsgUndelegate', { + amount, + validatorAddress, + delegatorAddress: this.state.address.value, + }), + ]), + this.facets.undelegateWatcher, + ); + }, + /** + * Starting a transfer revokes the account holder. The associated + * updater will get a special notification that the account is being + * transferred. + */ + /** @type {HostOf} */ + deposit(payment) { + return watch( + E(this.state.account).deposit(payment), + this.facets.returnVoidWatcher, + ); + }, + /** @type {HostOf} */ + withdraw(amount) { + return watch(E(this.state.account).withdraw(amount)); + }, + /** @type {HostOf} */ + executeTx(messages) { + return watch(E(this.state.account).executeTx(messages)); + }, + /** @type {OrchestrationAccountI['getAddress']} */ + getAddress() { + return this.state.address; + }, + /** + * XXX consider using ERTP to send if it's vbank asset + * + * @type {HostOf} + */ + send(toAccount, amount) { + return asVow(() => { + trace('send', toAccount, amount); + const { helper } = this.facets; + return watch( + E(this.state.account).executeTx([ + typedJson('/cosmos.bank.v1beta1.MsgSend', { + amount: [helper.amountToCoin(amount)], + toAddress: toAccount.value, + fromAddress: this.state.address.value, + }), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + /** + * XXX consider using ERTP to send if it's vbank asset + * + * @type {HostOf} + */ + sendAll(toAccount, amounts) { + return asVow(() => { + trace('sendAll', toAccount, amounts); + const { helper } = this.facets; + return watch( + E(this.state.account).executeTx([ + typedJson('/cosmos.bank.v1beta1.MsgSend', { + amount: amounts.map(a => helper.amountToCoin(a)), + toAddress: toAccount.value, + fromAddress: this.state.address.value, + }), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + /** + * @param {ChainAddress} destination + * @param {AmountArg} amount an ERTP {@link Amount} or a + * {@link DenomAmount} + * @param {IBCMsgTransferOptions} [opts] if either timeoutHeight or + * timeoutTimestamp are not supplied, a default timeoutTimestamp will + * be set for 5 minutes in the future + * @returns {Vow} + */ + transfer(destination, amount, opts) { + return asVow(() => { + trace('Transferring funds from LCA over IBC'); + + const connectionInfoV = watch( + chainHub.getConnectionInfo( + this.state.address.chainId, + destination.chainId, + ), + ); + + // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` + // TODO #9324 what's a reasonable default? currently 5 minutes + const timeoutTimestampVowOrValue = + opts?.timeoutTimestamp ?? + (opts?.timeoutHeight + ? 0n + : E(timestampHelper).getTimeoutTimestampNS()); + + // don't resolve the vow until the transfer is confirmed on remote + // and reject vow if the transfer fails for any reason + const resultV = watch( + allVows([connectionInfoV, timeoutTimestampVowOrValue]), + this.facets.transferWatcher, + { + opts, + amount: coerceDenomAmount(chainHub, amount), + destination, + }, + ); + return resultV; + }); + }, + /** @type {HostOf} */ + transferSteps(amount, msg) { + return asVow(() => { + console.log('transferSteps got', amount, msg); + throw Fail`not yet implemented`; + }); + }, + /** @type {HostOf} */ + sendThenWaitForAck(sender, opts) { + return watch( + E(this.state.packetTools).sendThenWaitForAck(sender, opts), + ); + }, + /** @type {HostOf} */ + matchFirstPacket(patternV) { + return watch(E(this.state.packetTools).matchFirstPacket(patternV)); + }, + /** @type {HostOf} */ + monitorTransfers(tap) { + return watch(E(this.state.packetTools).monitorTransfers(tap)); + }, + }, + }, + ); + return makeLocalOrchestrationAccountKit; +}; + +/** @typedef {ReturnType} MakeLocalOrchestrationAccountKit */ +/** @typedef {ReturnType} LocalOrchestrationAccountKit */ diff --git a/contract/src/exos/orchestrator.js b/contract/src/exos/orchestrator.js new file mode 100644 index 00000000..70e02ee6 --- /dev/null +++ b/contract/src/exos/orchestrator.js @@ -0,0 +1,196 @@ +/** @file Orchestrator exo */ +import { AmountShape } from '@agoric/ertp'; +import { pickFacet } from '@agoric/vat-data'; +import { makeTracer } from '@agoric/internal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { Fail, q } from '@endo/errors'; +import { M } from '@endo/patterns'; +import { + DenomInfoShape, + ChainInfoShape, + DenomAmountShape, + DenomShape, +} from '../typeGuards.js'; + +/** + * @import {Zone} from '@agoric/base-zone'; + * @import {ActualChainInfo, ChainHub} from './chain-hub.js'; + * @import {AsyncFlowTools, HostInterface, HostOf} from '@agoric/async-flow'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {TimerService} from '@agoric/time'; + * @import {LocalChain} from '@agoric/vats/src/localchain.js'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. + * @import {Remote} from '@agoric/internal'; + * @import {PickFacet} from '@agoric/swingset-liveslots'; + * @import {CosmosInterchainService} from './exo-interfaces.js'; + * @import {MakeLocalChainFacade} from './local-chain-facade.js'; + * @import {MakeRemoteChainFacade} from './remote-chain-facade.js'; + * @import {Chain, ChainInfo, IBCConnectionInfo, KnownChains, Orchestrator} from '../types.js'; + */ + +const { Vow$ } = NetworkShape; // TODO #9611 +const trace = makeTracer('Orchestrator'); + +/** @see {Orchestrator} */ +export const OrchestratorI = M.interface('Orchestrator', { + getChain: M.call(M.string()).returns(Vow$(ChainInfoShape)), + getDenomInfo: M.call(DenomShape).returns(DenomInfoShape), + asAmount: M.call(DenomAmountShape).returns(AmountShape), +}); + +/** + * @param {Zone} zone + * @param {{ + * chainHub: ChainHub; + * makeLocalChainFacade: MakeLocalChainFacade; + * makeRemoteChainFacade: MakeRemoteChainFacade; + * vowTools: VowTools; + * }} powers + */ +const prepareOrchestratorKit = ( + zone, + { + chainHub, + makeLocalChainFacade, + makeRemoteChainFacade, + vowTools: { watch, asVow }, + }, +) => { + /** + * @template T + * @typedef {{ vow: Vow; pending: true } | { value: T; pending: false }} MaybePendingValue + */ + + /** @type {MapStore>>} */ + const chainByName = zone.mapStore('chainName'); + + return zone.exoClassKit( + 'Orchestrator', + { + orchestrator: OrchestratorI, + makeLocalChainFacadeWatcher: M.interface('makeLocalChainFacadeWatcher', { + onFulfilled: M.call(M.record()).returns(M.remotable()), + }), + makeRemoteChainFacadeWatcher: M.interface( + 'makeRemoteChainFacadeWatcher', + { + onFulfilled: M.call(M.any(), M.string()) + .optional(M.arrayOf(M.undefined())) // XXX needed? + .returns(M.remotable()), + }, + ), + }, + () => { + trace('making an Orchestrator'); + return {}; + }, + { + /** Waits for `chainInfo` and returns a LocalChainFacade */ + makeLocalChainFacadeWatcher: { + /** + * @param {ActualChainInfo<'agoric'>} agoricChainInfo + */ + onFulfilled(agoricChainInfo) { + const it = makeLocalChainFacade(agoricChainInfo); + chainByName.set('agoric', harden({ value: it, pending: false })); + return it; + }, + }, + /** + * Waits for `chainInfo` for `agoric` and a remote chain and returns a + * RemoteChainFacade + */ + makeRemoteChainFacadeWatcher: { + /** + * Waits for `chainInfo` for `agoric` and a remote chain and returns a + * RemoteChainFacade + * + * @param {[ChainInfo, ChainInfo, IBCConnectionInfo]} chainsAndConnection + * @param {string} name + */ + onFulfilled([_agoricChainInfo, remoteChainInfo, connectionInfo], name) { + const it = makeRemoteChainFacade(remoteChainInfo, connectionInfo); + chainByName.set(name, harden({ value: it, pending: false })); + return it; + }, + }, + orchestrator: { + /** @type {HostOf} */ + getChain(name) { + return asVow(() => { + if (chainByName.has(name)) { + const maybeChain = chainByName.get(name); + return maybeChain.pending ? maybeChain.vow : maybeChain.value; + } + const vow = + name === 'agoric' + ? watch( + chainHub.getChainInfo('agoric'), + this.facets.makeLocalChainFacadeWatcher, + ) + : watch( + chainHub.getChainsAndConnection('agoric', name), + this.facets.makeRemoteChainFacadeWatcher, + name, + ); + chainByName.init(name, harden({ vow, pending: true })); + return vow; + }); + }, + /** @type {HostOf} */ + getDenomInfo(denom) { + const denomDetail = chainHub.getAsset(denom); + if (!denomDetail) throw Fail`No denom detail for ${q(denom)}`; + const { chainName, baseName, baseDenom, brand } = denomDetail; + chainByName.has(chainName) || + Fail`use getChain(${q(chainName)}) before getDenomInfo(${q(denom)})`; + const maybeChain = chainByName.get(chainName); + if (maybeChain.pending) { + throw Fail`wait until getChain(${q(chainName)}) completes before getDenomInfo(${q(denom)})`; + } + const chain = + /** @type {HostInterface>} */ ( + maybeChain.value + ); + chainByName.has(baseName) || + Fail`use getChain(${q(baseName)}) before getDenomInfo(${q(denom)})`; + const maybeBase = chainByName.get(baseName); + if (maybeBase.pending) { + throw Fail`wait until getChain(${q(baseName)}) completes before getDenomInfo(${q(denom)})`; + } + const base = + /** @type {HostInterface>} */ ( + maybeBase.value + ); + return harden({ chain, base, brand, baseDenom }); + }, + /** @type {HostOf} */ + asAmount: () => Fail`not yet implemented`, + }, + }, + ); +}; +harden(prepareOrchestratorKit); + +/** + * @param {Zone} zone + * @param {{ + * chainHub: ChainHub; + * makeLocalChainFacade: MakeLocalChainFacade; + * makeRemoteChainFacade: MakeRemoteChainFacade; + * vowTools: VowTools; + * }} powers + */ +export const prepareOrchestrator = (zone, powers) => { + const makeOrchestratorKit = prepareOrchestratorKit(zone, powers); + return pickFacet(makeOrchestratorKit, 'orchestrator'); +}; + +/** + * Host side of the Orchestrator interface. (Methods return vows instead of + * promises as the interface within the guest function.) + * + * @typedef {ReturnType< + * ReturnType + * >['orchestrator']} HostOrchestrator + */ diff --git a/contract/src/exos/packet-tools.js b/contract/src/exos/packet-tools.js new file mode 100644 index 00000000..a4ba79c2 --- /dev/null +++ b/contract/src/exos/packet-tools.js @@ -0,0 +1,372 @@ +import { makeMarshal, decodeToJustin } from '@endo/marshal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { M, matches } from '@endo/patterns'; +import { E } from '@endo/far'; +import { pickFacet } from '@agoric/vat-data'; + +const { toCapData } = makeMarshal(undefined, undefined, { + marshalName: 'JustEncoder', + serializeBodyFormat: 'capdata', +}); +const just = obj => { + const { body } = toCapData(obj); + return decodeToJustin(JSON.parse(body), true); +}; + +/** + * @import {Pattern} from '@endo/patterns'; + * @import {EVow, Remote, Vow, VowResolver, VowTools} from '@agoric/vow'; + * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; + * @import {TargetApp, TargetRegistration} from '@agoric/vats/src/bridge-target.js'; + */ + +/** + * @callback MatchEvent + * @param {EVow} pattern + * @returns {Vow<{ resolver: VowResolver; match: Vow }>} + */ + +/** + * @typedef {object} PacketSender + * @property {( + * opts: PacketOptions, + * ) => Vow<{ eventPattern: Pattern; resultV: Vow }>} sendPacket + */ + +/** + * @typedef {object} PacketOptions + * @property {string} [opName] + * @property {PacketTimeout} [timeout] + */ + +/** + * @typedef {Pick< + * import('../cosmos-api').IBCMsgTransferOptions, + * 'timeoutHeight' | 'timeoutTimestamp' + * >} PacketTimeout + */ + +const { Vow$ } = NetworkShape; // TODO #9611 + +const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); + +const sink = () => {}; +harden(sink); + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools} vowTools + */ +export const preparePacketTools = (zone, vowTools) => { + const { allVows, makeVowKit, watch, when } = vowTools; + + const makePacketToolsKit = zone.exoClassKit( + 'PacketToolsKit', + { + public: M.interface('PacketTools', { + sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) + .optional(M.any()) + .returns(EVow$(M.any())), + matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), + monitorTransfers: M.call(M.remotable('TargetApp')).returns( + EVow$(M.any()), + ), + }), + tap: M.interface('tap', { + // eslint-disable-next-line no-restricted-syntax + receiveUpcall: M.callWhen(M.any()).returns(M.any()), + }), + monitorRegistration: M.interface('monitorRegistration', { + // eslint-disable-next-line no-restricted-syntax + updateTargetApp: M.callWhen( + M.await(M.remotable('TargetApp')), + ).returns(), + // eslint-disable-next-line no-restricted-syntax + revoke: M.callWhen().returns(), + }), + watchPacketMatch: M.interface('watchPacketMatch', { + onFulfilled: M.call(M.any(), M.record()).returns(M.any()), + }), + watchPacketPattern: M.interface('watchPacketPattern', { + onFulfilled: M.call(M.any(), M.record()).returns(M.any()), + onRejected: M.call(M.any(), M.record()).returns(M.any()), + }), + watchDecrPendingPatterns: M.interface('watchDecrPendingPatterns', { + onFulfilled: M.call(M.any()).returns(M.any()), + onRejected: M.call(M.any()).returns(M.any()), + }), + sendPacketWatcher: M.interface('sendPacketWatcher', { + onFulfilled: M.call( + [M.record(), M.remotable('PacketSender')], + M.record(), + ).returns(M.any()), + }), + packetWasSentWatcher: M.interface('packetWasSentWatcher', { + onFulfilled: M.call( + { eventPattern: M.pattern(), resultV: Vow$(M.any()) }, + M.record(), + ).returns(M.any()), + }), + utils: M.interface('utils', { + subscribeToTransfers: M.call().returns(M.promise()), + unsubscribeFromTransfers: M.call().returns(M.undefined()), + incrPendingPatterns: M.call().returns(Vow$(M.undefined())), + decrPendingPatterns: M.call().returns(Vow$(M.undefined())), + }), + rejectResolverAndRethrowWatcher: M.interface('rejectResolverWatcher', { + onRejected: M.call(M.any(), { + resolver: M.remotable('resolver'), + }).returns(M.any()), + }), + }, + /** + * @param {LocalChainAccount} lca + */ + lca => { + const resolverToPattern = zone.detached().mapStore('resolverToPattern'); + return { + lca, + reg: /** @type {Remote | null} */ (null), + resolverToPattern, + upcallQueue: /** @type {any[] | null} */ (null), + pending: 0, + extra: null, + monitor: /** @type {Remote | null} */ (null), + }; + }, + { + public: { + /** + * @param {ERef} monitor + */ + // eslint-disable-next-line no-restricted-syntax + async monitorTransfers(monitor) { + // We set the monitor here, but we only ever subscribe our + // this.facets.tap handler to transfers. + const mreg = this.facets.monitorRegistration; + await mreg.updateTargetApp(monitor); + return mreg; + }, + /** + * @type {MatchEvent} + */ + matchFirstPacket(patternP) { + return watch( + this.facets.utils.incrPendingPatterns(), + this.facets.watchPacketMatch, + { patternP }, + ); + }, + /** + * @param {Remote} packetSender + * @param {PacketOptions} [opts] + * @returns {Vow} + */ + sendThenWaitForAck(packetSender, opts = {}) { + /** @type {import('@agoric/vow').VowKit} */ + const pattern = makeVowKit(); + + // Establish the packet matcher immediately, but don't fulfill + // the match until after pattern.vow has been resolved. + const matchV = watch( + allVows([ + this.facets.public.matchFirstPacket(pattern.vow), + packetSender, + ]), + this.facets.sendPacketWatcher, + { opts }, + ); + + // When the packet is sent, resolve the resultV for the reply. + const resultV = watch(matchV, this.facets.packetWasSentWatcher, { + opts, + patternResolver: pattern.resolver, + }); + + // If anything fails, try to reject the packet sender. + return watch(resultV, this.facets.rejectResolverAndRethrowWatcher, { + resolver: pattern.resolver, + }); + }, + }, + monitorRegistration: { + /** @type {TargetRegistration['updateTargetApp']} */ + // eslint-disable-next-line no-restricted-syntax + async updateTargetApp(tap) { + this.state.monitor = await tap; + await this.facets.utils.subscribeToTransfers(); + }, + /** @type {TargetRegistration['revoke']} */ + // eslint-disable-next-line no-restricted-syntax + async revoke() { + this.state.monitor = null; + }, + }, + tap: { + // eslint-disable-next-line no-restricted-syntax + async receiveUpcall(obj) { + const { monitor, resolverToPattern, upcallQueue, pending } = + this.state; + console.debug( + `Trying ${resolverToPattern.getSize()} current patterns and ${pending} pending patterns against`, + just(obj), + ); + + if (monitor) { + // Call the monitor (if any), but in a future turn. + void E(monitor).receiveUpcall(obj); + } + // Check all our fulfilled patterns for matches. + for (const [resolver, pattern] of resolverToPattern.entries()) { + if (matches(obj, pattern)) { + console.debug('Matched pattern:', just(pattern)); + resolver.resolve(obj); + resolverToPattern.delete(resolver); + return; + } + } + if (upcallQueue) { + // We have some pending patterns (ones that have been requested but + // haven't yet settled) that may match this object. + console.debug('Stashing object in upcallQueue'); + this.state.upcallQueue = harden(upcallQueue.concat(obj)); + } + console.debug('No match yet.'); + }, + }, + sendPacketWatcher: { + onFulfilled([{ match }, sender], ctx) { + return watch(E(sender).sendPacket(match, ctx.opts)); + }, + }, + packetWasSentWatcher: { + onFulfilled({ eventPattern, resultV }, ctx) { + const { patternResolver } = ctx; + patternResolver.resolve(eventPattern); + return resultV; + }, + }, + rejectResolverAndRethrowWatcher: { + onRejected(rej, { resolver }) { + resolver.reject(rej); + throw rej; + }, + }, + watchPacketMatch: { + onFulfilled(_, { patternP }) { + const { vow, resolver } = makeVowKit(); + const patternV = watch( + patternP, + this.facets.watchPacketPattern, + harden({ resolver }), + ); + /* void */ watch(patternV, this.facets.watchDecrPendingPatterns); + return harden({ match: vow, resolver }); + }, + }, + watchDecrPendingPatterns: { + onFulfilled() { + return this.facets.utils.decrPendingPatterns(); + }, + onRejected() { + return this.facets.utils.decrPendingPatterns(); + }, + }, + watchPacketPattern: { + onFulfilled(pattern, { resolver }) { + const { resolverToPattern, upcallQueue } = this.state; + + console.debug('watchPacketPattern onFulfilled', just(pattern)); + if (!upcallQueue) { + // Save the pattern for later. + console.debug('No upcall queue yet. Save the pattern for later.'); + resolverToPattern.init(resolver, pattern); + return; + } + + // Try matching the first in queue. + const i = upcallQueue.findIndex(obj => matches(obj, pattern)); + if (i < 0) { + // No match yet. Save the pattern for later. + console.debug('No match yet. Save the pattern for later.'); + resolverToPattern.init(resolver, pattern); + return; + } + + // Success! Remove the matched object from the queue. + console.debug( + 'Success! Remove the matched object from the queue.', + just(upcallQueue[i]), + ); + resolver.resolve(upcallQueue[i]); + this.state.upcallQueue = harden( + upcallQueue.slice(0, i).concat(upcallQueue.slice(i + 1)), + ); + }, + onRejected(reason, { resolver }) { + resolver.reject(reason); + }, + }, + + utils: { + incrPendingPatterns() { + const { pending, reg, upcallQueue } = this.state; + this.state.pending += 1; + if (!upcallQueue) { + this.state.upcallQueue = harden([]); + } + if (reg || pending > 0) { + return watch(undefined); + } + return watch(this.facets.utils.subscribeToTransfers()); + }, + decrPendingPatterns() { + this.state.pending -= 1; + if (this.state.pending > 0) { + return; + } + this.state.pending = 0; + this.state.upcallQueue = null; + // FIXME when it returns undefined this causes an error: + // In "unsubscribeFromTransfers" method of (PacketToolsKit utils): result: undefined "[undefined]" - Must be a promise + return watch(this.facets.utils.unsubscribeFromTransfers()); + }, + subscribeToTransfers() { + // Subscribe to the transfers for this account. + const { lca, reg } = this.state; + if (reg) { + return when(reg); + } + const { tap } = this.facets; + // XXX racy; fails if subscribeToTransfers is called while this promise is in flight + // e.g. 'Target "agoric1fakeLCAAddress" already registered' + return when(E(lca).monitorTransfers(tap), r => { + this.state.reg = r; + return r; + }); + }, + unsubscribeFromTransfers() { + const { reg, monitor } = this.state; + if (!reg || monitor) { + return undefined; + } + // this.state.reg = null; + // return E(reg).revoke().then(sink); + }, + }, + }, + { + finish(context) { + void context.facets.utils.subscribeToTransfers(); + }, + }, + ); + + const makePacketTools = pickFacet(makePacketToolsKit, 'public'); + return makePacketTools; +}; +harden(preparePacketTools); + +/** + * @typedef {Awaited>>} PacketTools + */ diff --git a/contract/src/exos/portfolio-holder-kit.js b/contract/src/exos/portfolio-holder-kit.js new file mode 100644 index 00000000..a5c03ece --- /dev/null +++ b/contract/src/exos/portfolio-holder-kit.js @@ -0,0 +1,230 @@ +import { M, mustMatch } from '@endo/patterns'; +import { E } from '@endo/far'; +import { Fail } from '@endo/errors'; +import { PublicTopicShape } from '@agoric/zoe/src/contractSupport/topics.js'; +import { makeScalarBigMapStore } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; + +const { fromEntries } = Object; + +/** + * @import {HostInterface, HostOf} from '@agoric/async-flow'; + * @import {MapStore} from '@agoric/store'; + * @import {VowTools} from '@agoric/vow'; + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {Zone} from '@agoric/zone'; + * @import {OrchestrationAccount, OrchestrationAccountI, MakeCombineInvitationMakers} from '@agoric/orchestration'; + */ + +/** + * @typedef {{ + * accounts: MapStore>>; + * publicTopics: MapStore>; + * }} PortfolioHolderState + */ + +const ChainNameShape = M.string(); + +const AccountEntriesShape = M.arrayOf([ + M.string(), + M.remotable('OrchestrationAccount'), +]); +const PublicTopicEntriesShape = M.arrayOf([M.string(), PublicTopicShape]); + +/** + * Kit that holds several OrchestrationAccountKits and returns a invitation + * makers. + * + * @param {Zone} zone + * @param {VowTools} vowTools + */ +const preparePortfolioHolderKit = (zone, { asVow, when }) => { + return zone.exoClassKit( + 'PortfolioHolderKit', + { + invitationMakers: M.interface('InvitationMakers', { + Proxying: M.call(ChainNameShape, M.string()) + .optional(M.arrayOf(M.any())) + .returns(M.promise()), + }), + holder: M.interface('Holder', { + asContinuingOffer: M.call().returns(VowShape), + getPublicTopics: M.call().returns(VowShape), + getAccount: M.call(ChainNameShape).returns(VowShape), + addAccount: M.call( + ChainNameShape, + M.remotable(), + PublicTopicShape, + ).returns(VowShape), + }), + }, + /** + * @param {Iterable<[string, OrchestrationAccount]>} accountEntries + * @param {Iterable<[string, ResolvedPublicTopic]>} publicTopicEntries + */ + (accountEntries, publicTopicEntries) => { + mustMatch(accountEntries, AccountEntriesShape, 'must provide accounts'); + mustMatch( + publicTopicEntries, + PublicTopicEntriesShape, + 'must provide public topics', + ); + const accounts = harden( + makeScalarBigMapStore('accounts', { durable: true }), + ); + const publicTopics = harden( + makeScalarBigMapStore('publicTopics', { durable: true }), + ); + accounts.addAll(accountEntries); + publicTopics.addAll(publicTopicEntries); + return /** @type {PortfolioHolderState} */ ( + harden({ + accounts, + publicTopics, + }) + ); + }, + { + invitationMakers: { + /** + * @template {unknown[]} IA + * @param {string} chainName key where the account is stored + * @param {string} action invitation maker name, e.g. 'Delegate' + * @param {IA} [invitationArgs] + * @returns {Promise>} + */ + Proxying(chainName, action, invitationArgs) { + const { accounts } = this.state; + accounts.has(chainName) || Fail`no account found for ${chainName}`; + const account = accounts.get(chainName); + // @ts-expect-error XXX invitationMakers + return when(E(account).asContinuingOffer(), ({ invitationMakers }) => + E(invitationMakers)[action](...(invitationArgs || [])), + ); + }, + }, + holder: { + // FIXME /** @type {HostOf} */ + asContinuingOffer() { + return asVow(() => { + const { invitationMakers } = this.facets; + const { publicTopics } = this.state; + return harden({ + publicSubscribers: fromEntries(publicTopics.entries()), + invitationMakers, + }); + }); + }, + // FIXME /** @type {HostOf} */ + getPublicTopics() { + return asVow(() => { + const { publicTopics } = this.state; + return harden(fromEntries(publicTopics.entries())); + }); + }, + /** + * @param {string} chainName key where the account is stored + * @param {HostInterface>} account + * @param {ResolvedPublicTopic} publicTopic + */ + addAccount(chainName, account, publicTopic) { + return asVow(() => { + if (this.state.accounts.has(chainName)) { + throw Fail`account already exists for ${chainName}`; + } + zone.isStorable(account) || + Fail`account for ${chainName} must be storable`; + zone.isStorable(publicTopic) || + Fail`publicTopic for ${chainName} must be storable`; + + this.state.publicTopics.init(chainName, publicTopic); + this.state.accounts.init(chainName, account); + }); + }, + /** + * @param {string} chainName key where the account is stored + */ + getAccount(chainName) { + return asVow(() => this.state.accounts.get(chainName)); + }, + }, + }, + ); +}; + +/** + * A portfolio holder stores two or more OrchestrationAccounts and combines + * ContinuingOfferResult's from each into a single result. + * + * The invitationMakers can be accessed via the `Proxy` invitationMaker, which + * calls out to other invitationMakers. + * + * See {@link MakeCombineInvitationMakers} for an exo that allows a developer to + * define extra invitationMakers to combine with platform-provided ones. + * + * @example + * + * ```js + * // in contract start/prepare + * const makePortfolioHolder = preparePortfolioHolder( + * rootZone.subZone('portfolio'), + * vowTools, + * ); + * + * // in a flow + * const accounts = { + * cosmoshub: await cosmosChain.makeAccount(), + * agoric: await agoricChain.makeAccount(), + * }; + * const accountEntries = harden(Object.entries(accounts)); + * const publicTopicEntries = harden( + * await Promise.all( + * Object.entries(accounts).map(async ([chainName, holder]) => { + * const { account } = await E(holder).getPublicTopics(); + * return [chainName, account]; + * }), + * ), + * ); + * const holder = makePortfolioHolder(accountEntries, publicTopicEntries); + * + * // return ContinuingOfferResult to client + * return E(holder).asContinuingOffer(); + * + * const { invitationMakers } = await E(holder).asContinuingOffer(); + * + * // with invitationArgs + * const delegateInv = await E(invitationMakers).Proxying( + * 'cosmoshub', + * 'Delegate', + * [ + * { + * value: 'cosmos1valoper', + * chainId: 'cosmoshub-99', + * encoding: 'bech32', + * }, + * { + * denom: 'uatom', + * value: 10n, + * }, + * ], + * ); + * + * // without invitationArgs + * const transferInv = await E(invitationMakers).Proxying( + * 'cosmoshub', + * 'Transfer', + * ); + * ``` + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @returns {( + * ...args: Parameters> + * ) => ReturnType>['holder']} + */ +export const preparePortfolioHolder = (zone, vowTools) => { + const makeKit = preparePortfolioHolderKit(zone, vowTools); + return (...args) => makeKit(...args).holder; +}; +/** @typedef {ReturnType} MakePortfolioHolder */ +/** @typedef {ReturnType} PortfolioHolder */ diff --git a/contract/src/exos/remote-chain-facade.js b/contract/src/exos/remote-chain-facade.js new file mode 100644 index 00000000..3efebfff --- /dev/null +++ b/contract/src/exos/remote-chain-facade.js @@ -0,0 +1,269 @@ +/** @file Remote Chain Facade exo */ +import { makeTracer } from '@agoric/internal'; +import { E } from '@endo/far'; +import { Fail, q } from '@endo/errors'; +import { M } from '@endo/patterns'; +import { pickFacet } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { + ChainAddressShape, + chainFacadeMethods, + ICQMsgShape, +} from '../typeGuards.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/base-zone'; + * @import {JsonSafe} from '@agoric/cosmic-proto'; + * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; + * @import {TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + * @import {CosmosInterchainService} from './exo-interfaces.js'; + * @import {prepareCosmosOrchestrationAccount} from './cosmos-orchestration-account.js'; + * @import {CosmosChainInfo, IBCConnectionInfo, ChainAddress, IcaAccount, Chain, ICQConnection} from '../types.js'; + */ + +const trace = makeTracer('RemoteChainFacade'); + +/** + * @typedef {{ + * makeCosmosOrchestrationAccount: ReturnType< + * typeof prepareCosmosOrchestrationAccount + * >; + * orchestration: Remote; + * storageNode: Remote; + * timer: Remote; + * vowTools: VowTools; + * }} RemoteChainFacadePowers + */ + +/** + * @typedef {{ + * remoteChainInfo: CosmosChainInfo; + * connectionInfo: IBCConnectionInfo; + * icqConnection: ICQConnection | undefined; + * }} RemoteChainFacadeState + */ + +/** + * @param {Zone} zone + * @param {RemoteChainFacadePowers} powers + */ +const prepareRemoteChainFacadeKit = ( + zone, + { + makeCosmosOrchestrationAccount, + orchestration, + // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 + // consider making an `accounts` childNode + storageNode, + timer, + vowTools: { allVows, asVow, watch }, + }, +) => + zone.exoClassKit( + 'RemoteChainFacade', + { + public: M.interface('RemoteChainFacade', { + ...chainFacadeMethods, + query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), + }), + makeICQConnectionQueryWatcher: M.interface( + 'makeICQConnectionQueryWatcher', + { + onFulfilled: M.call(M.remotable(), M.arrayOf(ICQMsgShape)).returns( + VowShape, + ), + }, + ), + makeAccountAndProvideQueryConnWatcher: M.interface( + 'makeAccountAndProvideQueryConnWatcher', + { + onFulfilled: M.call([ + M.remotable(), + M.or(M.remotable(), M.undefined()), + ]).returns(VowShape), + }, + ), + getAddressesWatcher: M.interface('getAddressWatcher', { + onFulfilled: M.call( + [ChainAddressShape, M.string(), M.string()], + M.remotable(), + ).returns(VowShape), + }), + makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { + onFulfilled: M.call(M.remotable(), { + account: M.remotable(), + chainAddress: ChainAddressShape, + localAddress: M.string(), + remoteAddress: M.string(), + }).returns(M.remotable()), + }), + }, + /** + * @param {CosmosChainInfo} remoteChainInfo + * @param {IBCConnectionInfo} connectionInfo + */ + (remoteChainInfo, connectionInfo) => { + trace('making a RemoteChainFacade'); + return /** @type {RemoteChainFacadeState} */ ({ + remoteChainInfo, + connectionInfo, + icqConnection: undefined, + }); + }, + { + public: { + /** @type {HostOf} */ + getChainInfo() { + return watch(this.state.remoteChainInfo); + }, + + /** @type {HostOf} */ + makeAccount() { + return asVow(() => { + const { remoteChainInfo, connectionInfo } = this.state; + const stakingDenom = remoteChainInfo.stakingTokens?.[0]?.denom; + if (!stakingDenom) throw Fail`chain info lacks staking denom`; + + // icqConnection is ultimately retrieved from state, but let's + // create a connection if it doesn't exist + const icqConnOrUndefinedV = + remoteChainInfo.icqEnabled && !this.state.icqConnection + ? E(orchestration).provideICQConnection(connectionInfo.id) + : undefined; + + const makeAccountV = E(orchestration).makeAccount( + remoteChainInfo.chainId, + connectionInfo.counterparty.connection_id, + connectionInfo.id, + ); + + return watch( + allVows([makeAccountV, icqConnOrUndefinedV]), + this.facets.makeAccountAndProvideQueryConnWatcher, + ); + }); + }, + /** + * @type {HostOf< + * Chain['query'] + * >} + */ + query(msgs) { + return asVow(() => { + const { + remoteChainInfo: { icqEnabled, chainId }, + connectionInfo, + } = this.state; + if (!icqEnabled) { + throw Fail`Queries not available for chain ${q(chainId)}`; + } + // if none exists, make one and still send the query in the handler + if (!this.state.icqConnection) { + return watch( + E(orchestration).provideICQConnection(connectionInfo.id), + this.facets.makeICQConnectionQueryWatcher, + msgs, + ); + } + return watch(E(this.state.icqConnection).query(msgs)); + }); + }, + }, + makeAccountAndProvideQueryConnWatcher: { + /** + * @param {[IcaAccount, ICQConnection | undefined]} account + */ + onFulfilled([account, icqConnection]) { + if (icqConnection && !this.state.icqConnection) { + this.state.icqConnection = icqConnection; + // no need to pass icqConnection in ctx; we can get it from state + } + return watch( + allVows([ + E(account).getAddress(), + E(account).getLocalAddress(), + E(account).getRemoteAddress(), + ]), + this.facets.getAddressesWatcher, + account, + ); + }, + }, + makeICQConnectionQueryWatcher: { + /** + * @param {ICQConnection} icqConnection + * @param {JsonSafe[]} msgs + * @returns {Vow[]>} + */ + onFulfilled(icqConnection, msgs) { + if (!this.state.icqConnection) { + this.state.icqConnection = icqConnection; + } + return watch(E(icqConnection).query(msgs)); + }, + }, + getAddressesWatcher: { + /** + * @param {[ChainAddress, LocalIbcAddress, RemoteIbcAddress]} chainAddresses + * @param {IcaAccount} account + */ + onFulfilled([chainAddress, localAddress, remoteAddress], account) { + return watch( + E(storageNode).makeChildNode(chainAddress.value), + this.facets.makeChildNodeWatcher, + { account, chainAddress, localAddress, remoteAddress }, + ); + }, + }, + makeChildNodeWatcher: { + /** + * @param {Remote} childNode + * @param {{ + * account: IcaAccount; + * chainAddress: ChainAddress; + * localAddress: LocalIbcAddress; + * remoteAddress: RemoteIbcAddress; + * }} ctx + */ + onFulfilled( + childNode, + { account, chainAddress, localAddress, remoteAddress }, + ) { + const { icqConnection } = this.state; + + return makeCosmosOrchestrationAccount( + { + chainAddress, + localAddress, + remoteAddress, + }, + { + account, + // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 + storageNode: childNode, + icqConnection, + timer, + }, + ); + }, + }, + }, + ); +harden(prepareRemoteChainFacadeKit); + +/** + * @param {Zone} zone + * @param {RemoteChainFacadePowers} powers + */ +export const prepareRemoteChainFacade = (zone, powers) => { + const makeLocalChainFacadeKit = prepareRemoteChainFacadeKit(zone, powers); + return pickFacet(makeLocalChainFacadeKit, 'public'); +}; +harden(prepareRemoteChainFacade); + +/** @typedef {ReturnType} MakeRemoteChainFacade */ +/** @typedef {ReturnType} RemoteChainFacade */ diff --git a/contract/src/facade.js b/contract/src/facade.js new file mode 100644 index 00000000..d2fe5b59 --- /dev/null +++ b/contract/src/facade.js @@ -0,0 +1,150 @@ +/** @file Orchestration facade */ +import { assertAllDefined, deepMapObject } from '@agoric/internal'; + +/** + * @import {AsyncFlowTools, GuestInterface, HostArgs, HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/zone'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {TimerService} from '@agoric/time'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. + * @import {HostOrchestrator} from './exos/orchestrator.js'; + * @import {Remote} from '@agoric/internal'; + * @import {CosmosInterchainService} from './exos/exo-interfaces.js'; + * @import {Chain, ChainInfo, CosmosChainInfo, IBCConnectionInfo, OrchestrationAccount, OrchestrationFlow, Orchestrator} from './types.js'; + */ + +/** + * For a given guest passed to orchestrate(), return the host-side form. + * + * @template {OrchestrationFlow} GF + * @typedef {GF extends ( + * orc: Orchestrator, + * ctx: any, + * ...args: infer GA + * ) => Promise + * ? (...args: HostArgs) => Vow + * : never} HostForGuest + */ + +/** + * @param {{ + * zone: Zone; + * timerService: Remote; + * zcf: ZCF; + * storageNode: Remote; + * orchestrationService: Remote; + * makeRecorderKit: MakeRecorderKit; + * makeOrchestrator: () => HostOrchestrator; + * vowTools: VowTools; + * asyncFlowTools: AsyncFlowTools; + * }} powers + */ +export const makeOrchestrationFacade = ({ + zone, + timerService, + zcf, + storageNode, + orchestrationService, + makeRecorderKit, + makeOrchestrator, + vowTools, + asyncFlowTools, +}) => { + assertAllDefined({ + zone, + timerService, + zcf, + storageNode, + orchestrationService, + makeRecorderKit, + makeOrchestrator, + vowTools, + asyncFlowTools, + }); + + const { prepareEndowment, asyncFlow } = asyncFlowTools; + + /** + * @template HC - host context + * @template {OrchestrationFlow>} GF guest fn + * @param {string} durableName - the orchestration flow identity in the zone + * (to resume across upgrades) + * @param {HC} hostCtx - values to pass through the async flow membrane + * @param {GF} guestFn + * @returns {HostForGuest} + */ + const orchestrate = (durableName, hostCtx, guestFn) => { + const subZone = zone.subZone(durableName); + const [wrappedCtx] = prepareEndowment(subZone, 'endowments', [hostCtx]); + const hostFn = asyncFlow(subZone, 'asyncFlow', guestFn); + + deepMapObject( + wrappedCtx, + val => + val === zcf && + assert.fail('do not use zcf in orchestration context; try zcfTools'), + ); + + // cast because return could be arbitrary subtype + const orcFn = /** @type {HostForGuest} */ ( + (...args) => { + // each invocation gets a new orchestrator + const hostOrc = makeOrchestrator(); + // TODO: why are the types showing the guest types for arguments? + // @ts-expect-error XXX fix broken types + return hostFn(hostOrc, wrappedCtx, ...args); + } + ); + return harden(orcFn); + }; + + /** + * Orchestrate all the guest functions. + * + * If the `guestFns` object is provided as a property of `hostCtx` the + * functions will be available within the other guests. + * + * NOTE multiple calls to this with the same guestFn name will fail + * + * @template {Record} HC - host context + * @template {{ + * [durableName: string]: OrchestrationFlow>; + * }} GFM + * guest fn map + * @param {GFM} guestFns + * @param {HC} hostCtx + * @returns {{ [N in keyof GFM]: HostForGuest }} + */ + const orchestrateAll = (guestFns, hostCtx) => { + const mappedFlows = new Map( + Object.entries(guestFns).map(([name, guestFn]) => [ + guestFn, + // eslint-disable-next-line no-use-before-define + (...args) => orcFns[name](...args), + ]), + ); + + const mappedContext = deepMapObject( + hostCtx, + val => mappedFlows.get(val) || val, + ); + + const orcFns = /** @type {{ [N in keyof GFM]: HostForGuest }} */ ( + Object.fromEntries( + Object.entries(guestFns).map(([name, guestFn]) => [ + name, + orchestrate(name, mappedContext, guestFn), + ]), + ) + ); + + return { ...orcFns }; + }; + + return harden({ + orchestrate, + orchestrateAll, + }); +}; +harden(makeOrchestrationFacade); +/** @typedef {ReturnType} OrchestrationFacade */ diff --git a/contract/src/fetched-chain-info.js b/contract/src/fetched-chain-info.js new file mode 100644 index 00000000..651633fd --- /dev/null +++ b/contract/src/fetched-chain-info.js @@ -0,0 +1,1990 @@ +/** @file Generated by fetch-chain-info.ts */ +export default /** @type {const} } */ ({ + agoric: { + bech32Prefix: 'agoric', + chainId: 'agoric-3', + stakingTokens: [ + { + denom: 'ubld', + }, + ], + icqEnabled: false, + connections: { + 'cosmoshub-4': { + id: 'connection-8', + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-927', + connection_id: 'connection-649', + }, + state: 3, + transferChannel: { + channelId: 'channel-5', + portId: 'transfer', + counterPartyChannelId: 'channel-405', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-72', + client_id: '07-tendermint-77', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-40', + }, + state: 3, + transferChannel: { + channelId: 'channel-62', + portId: 'transfer', + counterPartyChannelId: 'channel-21', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-67', + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-47', + connection_id: 'connection-40', + }, + state: 3, + transferChannel: { + channelId: 'channel-58', + portId: 'transfer', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-1', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2109', + connection_id: 'connection-1649', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-320', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-17', + client_id: '07-tendermint-17', + counterparty: { + client_id: '07-tendermint-111', + connection_id: 'connection-80', + }, + state: 3, + transferChannel: { + channelId: 'channel-10', + portId: 'transfer', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-68', + client_id: '07-tendermint-74', + counterparty: { + client_id: '07-tendermint-129', + connection_id: 'connection-118', + }, + state: 3, + transferChannel: { + channelId: 'channel-59', + portId: 'transfer', + counterPartyChannelId: 'channel-148', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-18', + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-152', + connection_id: 'connection-101', + }, + state: 3, + transferChannel: { + channelId: 'channel-11', + portId: 'transfer', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + celestia: { + bech32Prefix: 'celestia', + chainId: 'celestia', + stakingTokens: [ + { + denom: 'utia', + }, + ], + icqEnabled: false, + connections: { + 'neutron-1': { + id: 'connection-7', + client_id: '07-tendermint-29', + counterparty: { + client_id: '07-tendermint-48', + connection_id: 'connection-36', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-35', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-2', + client_id: '07-tendermint-10', + counterparty: { + client_id: '07-tendermint-3012', + connection_id: 'connection-2503', + }, + state: 3, + transferChannel: { + channelId: 'channel-2', + portId: 'transfer', + counterPartyChannelId: 'channel-6994', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-15', + client_id: '07-tendermint-52', + counterparty: { + client_id: '07-tendermint-174', + connection_id: 'connection-131', + }, + state: 3, + transferChannel: { + channelId: 'channel-14', + portId: 'transfer', + counterPartyChannelId: 'channel-91', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-56', + client_id: '07-tendermint-86', + counterparty: { + client_id: '07-tendermint-359', + connection_id: 'connection-296', + }, + state: 3, + transferChannel: { + channelId: 'channel-33', + portId: 'transfer', + counterPartyChannelId: 'channel-291', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-4', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-137', + connection_id: 'connection-125', + }, + state: 3, + transferChannel: { + channelId: 'channel-4', + portId: 'transfer', + counterPartyChannelId: 'channel-162', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + cosmoshub: { + bech32Prefix: 'cosmos', + chainId: 'cosmoshub-4', + stakingTokens: [ + { + denom: 'uatom', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-649', + client_id: '07-tendermint-927', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-8', + }, + state: 3, + transferChannel: { + channelId: 'channel-405', + portId: 'transfer', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-372', + client_id: '07-tendermint-439', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-207', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-809', + client_id: '07-tendermint-1119', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-569', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-790', + client_id: '07-tendermint-1116', + counterparty: { + client_id: '07-tendermint-4', + connection_id: 'connection-12', + }, + state: 3, + transferChannel: { + channelId: 'channel-536', + portId: 'transfer', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-501', + client_id: '07-tendermint-656', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-19', + }, + state: 3, + transferChannel: { + channelId: 'channel-306', + portId: 'transfer', + counterPartyChannelId: 'channel-12', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-257', + client_id: '07-tendermint-259', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-141', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-401', + client_id: '07-tendermint-492', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-235', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-918', + client_id: '07-tendermint-1188', + counterparty: { + client_id: '07-tendermint-320', + connection_id: 'connection-256', + }, + state: 3, + transferChannel: { + channelId: 'channel-730', + portId: 'transfer', + counterPartyChannelId: 'channel-239', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-635', + client_id: '07-tendermint-913', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-391', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + dydx: { + bech32Prefix: 'dydx', + chainId: 'dydx-mainnet-1', + stakingTokens: [ + { + denom: 'adydx', + }, + ], + icqEnabled: false, + connections: { + 'neutron-1': { + id: 'connection-17', + client_id: '07-tendermint-11', + counterparty: { + client_id: '07-tendermint-72', + connection_id: 'connection-51', + }, + state: 3, + transferChannel: { + channelId: 'channel-11', + portId: 'transfer', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-59', + connection_id: 'connection-57', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-7', + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-3009', + connection_id: 'connection-2500', + }, + state: 3, + transferChannel: { + channelId: 'channel-3', + portId: 'transfer', + counterPartyChannelId: 'channel-6787', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-1', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-133', + connection_id: 'connection-123', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-160', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-13', + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-244', + connection_id: 'connection-208', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-118', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + juno: { + bech32Prefix: 'juno', + chainId: 'juno-1', + stakingTokens: [ + { + denom: 'ujuno', + }, + ], + icqEnabled: false, + connections: { + 'cosmoshub-4': { + id: 'connection-2', + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-439', + connection_id: 'connection-372', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-207', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-524', + client_id: '07-tendermint-557', + counterparty: { + client_id: '07-tendermint-97', + connection_id: 'connection-71', + }, + state: 3, + transferChannel: { + channelId: 'channel-548', + portId: 'transfer', + counterPartyChannelId: 'channel-4328', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-322', + client_id: '07-tendermint-334', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-8', + }, + state: 3, + transferChannel: { + channelId: 'channel-224', + portId: 'transfer', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1457', + connection_id: 'connection-1142', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-68', + client_id: '07-tendermint-108', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-9', + }, + state: 3, + transferChannel: { + channelId: 'channel-48', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-30', + client_id: '07-tendermint-44', + counterparty: { + client_id: '07-tendermint-13', + connection_id: 'connection-11', + }, + state: 3, + transferChannel: { + channelId: 'channel-20', + portId: 'transfer', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-205', + client_id: '07-tendermint-263', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-19', + }, + state: 3, + transferChannel: { + channelId: 'channel-139', + portId: 'transfer', + counterPartyChannelId: 'channel-24', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + neutron: { + bech32Prefix: 'neutron', + chainId: 'neutron-1', + stakingTokens: [ + { + denom: 'untrn', + }, + ], + icqEnabled: false, + connections: { + celestia: { + id: 'connection-36', + client_id: '07-tendermint-48', + counterparty: { + client_id: '07-tendermint-29', + connection_id: 'connection-7', + }, + state: 3, + transferChannel: { + channelId: 'channel-35', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1119', + connection_id: 'connection-809', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-569', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-51', + client_id: '07-tendermint-72', + counterparty: { + client_id: '07-tendermint-11', + connection_id: 'connection-17', + }, + state: 3, + transferChannel: { + channelId: 'channel-48', + portId: 'transfer', + counterPartyChannelId: 'channel-11', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-71', + client_id: '07-tendermint-97', + counterparty: { + client_id: '07-tendermint-557', + connection_id: 'connection-524', + }, + state: 3, + transferChannel: { + channelId: 'channel-4328', + portId: 'transfer', + counterPartyChannelId: 'channel-548', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-31', + client_id: '07-tendermint-40', + counterparty: { + client_id: '07-tendermint-25', + connection_id: 'connection-34', + }, + state: 3, + transferChannel: { + channelId: 'channel-30', + portId: 'transfer', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-18', + client_id: '07-tendermint-19', + counterparty: { + client_id: '07-tendermint-2823', + connection_id: 'connection-2338', + }, + state: 3, + transferChannel: { + channelId: 'channel-10', + portId: 'transfer', + counterPartyChannelId: 'channel-874', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-63', + client_id: '07-tendermint-85', + counterparty: { + client_id: '07-tendermint-199', + connection_id: 'connection-192', + }, + state: 3, + transferChannel: { + channelId: 'channel-1551', + portId: 'transfer', + counterPartyChannelId: 'channel-144', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-23', + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-283', + connection_id: 'connection-211', + }, + state: 3, + transferChannel: { + channelId: 'channel-18', + portId: 'transfer', + counterPartyChannelId: 'channel-191', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-15', + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-125', + connection_id: 'connection-113', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + noble: { + bech32Prefix: 'noble', + chainId: 'noble-1', + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-40', + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-77', + connection_id: 'connection-72', + }, + state: 3, + transferChannel: { + channelId: 'channel-21', + portId: 'transfer', + counterPartyChannelId: 'channel-62', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-12', + client_id: '07-tendermint-4', + counterparty: { + client_id: '07-tendermint-1116', + connection_id: 'connection-790', + }, + state: 3, + transferChannel: { + channelId: 'channel-4', + portId: 'transfer', + counterPartyChannelId: 'channel-536', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-57', + client_id: '07-tendermint-59', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-33', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-8', + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-334', + connection_id: 'connection-322', + }, + state: 3, + transferChannel: { + channelId: 'channel-3', + portId: 'transfer', + counterPartyChannelId: 'channel-224', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-34', + client_id: '07-tendermint-25', + counterparty: { + client_id: '07-tendermint-40', + connection_id: 'connection-31', + }, + state: 3, + transferChannel: { + channelId: 'channel-18', + portId: 'transfer', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-65', + client_id: '07-tendermint-68', + counterparty: { + client_id: '07-tendermint-51', + connection_id: 'connection-49', + }, + state: 3, + transferChannel: { + channelId: 'channel-44', + portId: 'transfer', + counterPartyChannelId: 'channel-38', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-2', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-2704', + connection_id: 'connection-2241', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-750', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-33', + client_id: '07-tendermint-24', + counterparty: { + client_id: '07-tendermint-170', + connection_id: 'connection-127', + }, + state: 3, + transferChannel: { + channelId: 'channel-17', + portId: 'transfer', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-25', + client_id: '07-tendermint-16', + counterparty: { + client_id: '07-tendermint-287', + connection_id: 'connection-214', + }, + state: 3, + transferChannel: { + channelId: 'channel-11', + portId: 'transfer', + counterPartyChannelId: 'channel-204', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-74', + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-248', + connection_id: 'connection-210', + }, + state: 3, + transferChannel: { + channelId: 'channel-51', + portId: 'transfer', + counterPartyChannelId: 'channel-120', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + omniflixhub: { + bech32Prefix: 'omniflix', + chainId: 'omniflixhub-1', + stakingTokens: [ + { + denom: 'uflix', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-40', + client_id: '07-tendermint-47', + counterparty: { + client_id: '07-tendermint-73', + connection_id: 'connection-67', + }, + state: 3, + transferChannel: { + channelId: 'channel-30', + portId: 'transfer', + counterPartyChannelId: 'channel-58', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-19', + client_id: '07-tendermint-23', + counterparty: { + client_id: '07-tendermint-656', + connection_id: 'connection-501', + }, + state: 3, + transferChannel: { + channelId: 'channel-12', + portId: 'transfer', + counterPartyChannelId: 'channel-306', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-49', + client_id: '07-tendermint-51', + counterparty: { + client_id: '07-tendermint-68', + connection_id: 'connection-65', + }, + state: 3, + transferChannel: { + channelId: 'channel-38', + portId: 'transfer', + counterPartyChannelId: 'channel-44', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-8', + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-1829', + connection_id: 'connection-1431', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-199', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + osmosis: { + bech32Prefix: 'osmo', + chainId: 'osmosis-1', + stakingTokens: [ + { + denom: 'uosmo', + }, + ], + icqEnabled: true, + connections: { + 'agoric-3': { + id: 'connection-1649', + client_id: '07-tendermint-2109', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-320', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + celestia: { + id: 'connection-2503', + client_id: '07-tendermint-3012', + counterparty: { + client_id: '07-tendermint-10', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-6994', + portId: 'transfer', + counterPartyChannelId: 'channel-2', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-1', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-259', + connection_id: 'connection-257', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-141', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-2500', + client_id: '07-tendermint-3009', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-7', + }, + state: 3, + transferChannel: { + channelId: 'channel-6787', + portId: 'transfer', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-1142', + client_id: '07-tendermint-1457', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-42', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-2338', + client_id: '07-tendermint-2823', + counterparty: { + client_id: '07-tendermint-19', + connection_id: 'connection-18', + }, + state: 3, + transferChannel: { + channelId: 'channel-874', + portId: 'transfer', + counterPartyChannelId: 'channel-10', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-2241', + client_id: '07-tendermint-2704', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-750', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-1431', + client_id: '07-tendermint-1829', + counterparty: { + client_id: '07-tendermint-8', + connection_id: 'connection-8', + }, + state: 3, + transferChannel: { + channelId: 'channel-199', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-1244', + client_id: '07-tendermint-1588', + counterparty: { + client_id: '07-tendermint-2', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-88', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-1223', + client_id: '07-tendermint-1562', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-75', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-1657', + client_id: '07-tendermint-2119', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-326', + portId: 'transfer', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-1410', + client_id: '07-tendermint-1805', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-184', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + secretnetwork: { + bech32Prefix: 'secret', + chainId: 'secret-4', + stakingTokens: [ + { + denom: 'uscrt', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-80', + client_id: '07-tendermint-111', + counterparty: { + client_id: '07-tendermint-17', + connection_id: 'connection-17', + }, + state: 3, + transferChannel: { + channelId: 'channel-51', + portId: 'transfer', + counterPartyChannelId: 'channel-10', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + celestia: { + id: 'connection-131', + client_id: '07-tendermint-174', + counterparty: { + client_id: '07-tendermint-52', + connection_id: 'connection-15', + }, + state: 3, + transferChannel: { + channelId: 'channel-91', + portId: 'transfer', + counterPartyChannelId: 'channel-14', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-0', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-492', + connection_id: 'connection-401', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-235', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-9', + client_id: '07-tendermint-23', + counterparty: { + client_id: '07-tendermint-108', + connection_id: 'connection-68', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-192', + client_id: '07-tendermint-199', + counterparty: { + client_id: '07-tendermint-85', + connection_id: 'connection-63', + }, + state: 3, + transferChannel: { + channelId: 'channel-144', + portId: 'transfer', + counterPartyChannelId: 'channel-1551', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-127', + client_id: '07-tendermint-170', + counterparty: { + client_id: '07-tendermint-24', + connection_id: 'connection-33', + }, + state: 3, + transferChannel: { + channelId: 'channel-88', + portId: 'transfer', + counterPartyChannelId: 'channel-17', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-1', + client_id: '07-tendermint-2', + counterparty: { + client_id: '07-tendermint-1588', + connection_id: 'connection-1244', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-25', + client_id: '07-tendermint-43', + counterparty: { + client_id: '07-tendermint-177', + connection_id: 'connection-110', + }, + state: 3, + transferChannel: { + channelId: 'channel-19', + portId: 'transfer', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-40', + client_id: '07-tendermint-75', + counterparty: { + client_id: '07-tendermint-37', + connection_id: 'connection-25', + }, + state: 3, + transferChannel: { + channelId: 'channel-37', + portId: 'transfer', + counterPartyChannelId: 'channel-40', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-188', + client_id: '07-tendermint-193', + counterparty: { + client_id: '07-tendermint-249', + connection_id: 'connection-213', + }, + state: 3, + transferChannel: { + channelId: 'channel-126', + portId: 'transfer', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + stargaze: { + bech32Prefix: 'stars', + chainId: 'stargaze-1', + stakingTokens: [ + { + denom: 'ustars', + }, + ], + icqEnabled: false, + connections: { + celestia: { + id: 'connection-296', + client_id: '07-tendermint-359', + counterparty: { + client_id: '07-tendermint-86', + connection_id: 'connection-56', + }, + state: 3, + transferChannel: { + channelId: 'channel-291', + portId: 'transfer', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-256', + client_id: '07-tendermint-320', + counterparty: { + client_id: '07-tendermint-1188', + connection_id: 'connection-918', + }, + state: 3, + transferChannel: { + channelId: 'channel-239', + portId: 'transfer', + counterPartyChannelId: 'channel-730', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-11', + client_id: '07-tendermint-13', + counterparty: { + client_id: '07-tendermint-44', + connection_id: 'connection-30', + }, + state: 3, + transferChannel: { + channelId: 'channel-5', + portId: 'transfer', + counterPartyChannelId: 'channel-20', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-211', + client_id: '07-tendermint-283', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-23', + }, + state: 3, + transferChannel: { + channelId: 'channel-191', + portId: 'transfer', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-214', + client_id: '07-tendermint-287', + counterparty: { + client_id: '07-tendermint-16', + connection_id: 'connection-25', + }, + state: 3, + transferChannel: { + channelId: 'channel-204', + portId: 'transfer', + counterPartyChannelId: 'channel-11', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1562', + connection_id: 'connection-1223', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-75', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-110', + client_id: '07-tendermint-177', + counterparty: { + client_id: '07-tendermint-43', + connection_id: 'connection-25', + }, + state: 3, + transferChannel: { + channelId: 'channel-48', + portId: 'transfer', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-128', + client_id: '07-tendermint-195', + counterparty: { + client_id: '07-tendermint-30', + connection_id: 'connection-18', + }, + state: 3, + transferChannel: { + channelId: 'channel-106', + portId: 'transfer', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + stride: { + bech32Prefix: 'stride', + chainId: 'stride-1', + stakingTokens: [ + { + denom: 'ustrd', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-118', + client_id: '07-tendermint-129', + counterparty: { + client_id: '07-tendermint-74', + connection_id: 'connection-68', + }, + state: 3, + transferChannel: { + channelId: 'channel-148', + portId: 'transfer', + counterPartyChannelId: 'channel-59', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + celestia: { + id: 'connection-125', + client_id: '07-tendermint-137', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-4', + }, + state: 3, + transferChannel: { + channelId: 'channel-162', + portId: 'transfer', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-913', + connection_id: 'connection-635', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-391', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-123', + client_id: '07-tendermint-133', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-160', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-19', + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-263', + connection_id: 'connection-205', + }, + state: 3, + transferChannel: { + channelId: 'channel-24', + portId: 'transfer', + counterPartyChannelId: 'channel-139', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-113', + client_id: '07-tendermint-125', + counterparty: { + client_id: '07-tendermint-18', + connection_id: 'connection-15', + }, + state: 3, + transferChannel: { + channelId: 'channel-123', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-2', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2119', + connection_id: 'connection-1657', + }, + state: 3, + transferChannel: { + channelId: 'channel-5', + portId: 'transfer', + counterPartyChannelId: 'channel-326', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-25', + client_id: '07-tendermint-37', + counterparty: { + client_id: '07-tendermint-75', + connection_id: 'connection-40', + }, + state: 3, + transferChannel: { + channelId: 'channel-40', + portId: 'transfer', + counterPartyChannelId: 'channel-37', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-18', + client_id: '07-tendermint-30', + counterparty: { + client_id: '07-tendermint-195', + connection_id: 'connection-128', + }, + state: 3, + transferChannel: { + channelId: 'channel-19', + portId: 'transfer', + counterPartyChannelId: 'channel-106', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-20', + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-64', + connection_id: 'connection-45', + }, + state: 3, + transferChannel: { + channelId: 'channel-29', + portId: 'transfer', + counterPartyChannelId: 'channel-34', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + umee: { + bech32Prefix: 'umee', + chainId: 'umee-1', + stakingTokens: [ + { + denom: 'uumee', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-101', + client_id: '07-tendermint-152', + counterparty: { + client_id: '07-tendermint-18', + connection_id: 'connection-18', + }, + state: 3, + transferChannel: { + channelId: 'channel-42', + portId: 'transfer', + counterPartyChannelId: 'channel-11', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-208', + client_id: '07-tendermint-244', + counterparty: { + client_id: '07-tendermint-8', + connection_id: 'connection-13', + }, + state: 3, + transferChannel: { + channelId: 'channel-118', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-210', + client_id: '07-tendermint-248', + counterparty: { + client_id: '07-tendermint-73', + connection_id: 'connection-74', + }, + state: 3, + transferChannel: { + channelId: 'channel-120', + portId: 'transfer', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-0', + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-1805', + connection_id: 'connection-1410', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-184', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-213', + client_id: '07-tendermint-249', + counterparty: { + client_id: '07-tendermint-193', + connection_id: 'connection-188', + }, + state: 3, + transferChannel: { + channelId: 'channel-123', + portId: 'transfer', + counterPartyChannelId: 'channel-126', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-45', + client_id: '07-tendermint-64', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-20', + }, + state: 3, + transferChannel: { + channelId: 'channel-34', + portId: 'transfer', + counterPartyChannelId: 'channel-29', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, +}); diff --git a/contract/src/typeGuards.js b/contract/src/typeGuards.js new file mode 100644 index 00000000..995754dd --- /dev/null +++ b/contract/src/typeGuards.js @@ -0,0 +1,197 @@ +import { VowShape } from '@agoric/vow'; +import { M } from '@endo/patterns'; + +/** + * @import {TypedPattern} from '@agoric/internal'; + * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; + * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; + * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {TypedJson} from '@agoric/cosmic-proto'; + */ + +/** + * Used for IBC Channel Connections that only send outgoing transactions. If + * your channel expects incoming transactions, please extend this interface to + * include the `onReceive` handler. + */ +export const OutboundConnectionHandlerI = M.interface( + 'OutboundConnectionHandler', + { + onOpen: M.callWhen(M.any(), M.string(), M.string(), M.any()).returns( + M.any(), + ), + onClose: M.callWhen(M.any(), M.any(), M.any()).returns(M.any()), + }, +); + +/** @type {TypedPattern} */ +export const ChainAddressShape = { + chainId: M.string(), + encoding: M.string(), + value: M.string(), +}; +harden(ChainAddressShape); + +/** @type {TypedPattern} */ +export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; +harden(ChainAddressShape); + +/** @internal */ +export const IBCTransferOptionsShape = M.splitRecord( + {}, + { + timeoutTimestamp: M.bigint(), + timeoutHeight: { + revisionHeight: M.bigint(), + revisionNumber: M.bigint(), + }, + memo: M.string(), + }, +); + +/** @internal */ +export const IBCChannelIDShape = M.string(); + +/** @internal */ +export const IBCChannelInfoShape = M.splitRecord({ + portId: M.string(), + channelId: IBCChannelIDShape, + counterPartyPortId: M.string(), + counterPartyChannelId: IBCChannelIDShape, + ordering: M.scalar(), // XXX + state: M.scalar(), // XXX + version: M.string(), +}); + +/** @internal */ +export const IBCConnectionIDShape = M.string(); + +/** @internal */ +export const IBCConnectionInfoShape = M.splitRecord({ + id: IBCConnectionIDShape, + client_id: M.string(), + state: M.scalar(), // XXX STATE_OPEN or... + counterparty: { + client_id: M.string(), + connection_id: IBCConnectionIDShape, + }, + transferChannel: IBCChannelInfoShape, +}); + +/** @type {TypedPattern} */ +export const CosmosAssetInfoShape = M.splitRecord({ + base: M.string(), + name: M.string(), + display: M.string(), + symbol: M.string(), + denom_units: M.arrayOf( + M.splitRecord({ denom: M.string(), exponent: M.number() }), + ), +}); + +/** @type {TypedPattern} */ +export const CosmosChainInfoShape = M.splitRecord( + { + chainId: M.string(), + }, + { + bech32Prefix: M.string(), + connections: M.record(), + stakingTokens: M.arrayOf({ denom: M.string() }), + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: M.boolean(), + }, +); + +/** @type {TypedPattern} */ +export const ChainInfoShape = M.splitRecord({ + chainId: M.string(), +}); +export const DenomShape = M.string(); + +/** @type {TypedPattern>} */ +export const DenomInfoShape = { + chain: M.remotable('Chain'), + base: M.remotable('Chain'), + brand: M.or(M.remotable('Brand'), M.undefined()), + baseDenom: M.string(), +}; +harden(DenomInfoShape); + +/** @type {TypedPattern} */ +export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; +harden(DenomAmountShape); + +/** @type {TypedPattern>} */ +export const AnyNatAmountShape = { + brand: M.remotable('Brand'), + value: M.nat(), +}; +harden(AnyNatAmountShape); + +/** @type {TypedPattern} */ +export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); + +/** + * @type {TypedPattern<{ + * validator: CosmosValidatorAddress; + * amount: AmountArg; + * }>} + */ +export const DelegationShape = M.splitRecord( + { + validator: ChainAddressShape, + amount: AmountArgShape, + }, + { delegator: ChainAddressShape }, +); + +/** Approximately @see RequestQuery */ +export const ICQMsgShape = M.splitRecord( + { path: M.string(), data: M.string() }, + { height: M.string(), prove: M.boolean() }, +); + +/** @type {TypedPattern} */ +export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); + +/** @see {Chain} */ +export const chainFacadeMethods = { + getChainInfo: M.call().returns(VowShape), + makeAccount: M.call().returns(VowShape), +}; +harden(chainFacadeMethods); + +/** + * for google/protobuf/timestamp.proto, not to be confused with TimestampShape + * from `@agoric/time` + * + * `seconds` is a big integer but since it goes through JSON it is encoded as + * string + */ +export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; +harden(TimestampProtoShape); + +/** + * see {@link TxBody} for more details + * + * @internal + */ +export const TxBodyOptsShape = M.splitRecord( + {}, + { + memo: M.string(), + timeoutHeight: M.bigint(), + extensionOptions: M.arrayOf(M.any()), + nonCriticalExtensionOptions: M.arrayOf(M.any()), + }, +); + +/** + * Ensures at least one {@link AmountKeywordRecord} entry is present and only + * permits Nat (fungible) amounts. + */ +export const AnyNatAmountsRecord = M.and( + M.recordOf(M.string(), AnyNatAmountShape), + M.not({}), +); diff --git a/contract/src/utils/address.js b/contract/src/utils/address.js new file mode 100644 index 00000000..8d39ed5a --- /dev/null +++ b/contract/src/utils/address.js @@ -0,0 +1,103 @@ +import { Fail, q } from '@endo/errors'; + +/** + * @import {IBCConnectionID} from '@agoric/vats'; + * @import {ChainAddress} from '../types.js'; + * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +/** + * @typedef {object} ICAChannelAddressOpts + * @property {string} [encoding='proto3'] message encoding format for the + * channel + * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. + * currently only `ordered` is supported for ics27-1 + * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` + * @property {string} [version='ics27-1'] default is `ics27-1` + */ + +/** + * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID + * @param {IBCConnectionID} controllerConnectionId Self Connection ID + * @param {ICAChannelAddressOpts} [opts] + * @returns {RemoteIbcAddress} + */ +export const makeICAChannelAddress = ( + hostConnectionId, + controllerConnectionId, + { + version = 'ics27-1', + encoding = 'proto3', + ordering = 'ordered', + txType = 'sdk_multi_msg', + } = {}, +) => { + hostConnectionId || Fail`hostConnectionId is required`; + controllerConnectionId || Fail`controllerConnectionId is required`; + const connString = JSON.stringify({ + version, + controllerConnectionId, + hostConnectionId, + address: '', // will be provided by the counterparty after channelOpenAck + encoding, + txType, + }); + return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; +}; +harden(makeICAChannelAddress); + +export const DEFAULT_ICQ_VERSION = 'icq-1'; + +/** + * @param {IBCConnectionID} controllerConnectionId + * @param {string} version defaults to icq-1 + * @returns {RemoteIbcAddress} + */ +export const makeICQChannelAddress = ( + controllerConnectionId, + version = DEFAULT_ICQ_VERSION, +) => { + controllerConnectionId || Fail`controllerConnectionId is required`; + return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; +}; +harden(makeICQChannelAddress); + +/** + * Parse a chain address from a remote address string. Assumes the address + * string is in a JSON format and contains an "address" field. This function is + * designed to be safe against malformed inputs and unexpected data types, and + * will return `undefined` in those cases. + * + * @param {RemoteIbcAddress} remoteAddressString - remote address string, + * including version + * @returns {ChainAddress['value'] | undefined} returns undefined on error + */ +export const findAddressField = remoteAddressString => { + try { + // Extract JSON version string assuming it's always surrounded by {} + const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; + const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; + if (!jsonObj?.address?.length) return undefined; + return jsonObj.address; + } catch (error) { + return undefined; + } +}; +harden(findAddressField); + +/** + * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. + * + * see + * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) + * for reference implementation + * + * @param {string} address + */ +export const getBech32Prefix = address => { + assert(address, 'address is required'); + const split = address.lastIndexOf('1'); + if (split === -1) return Fail`No separator character for ${q(address)}`; + if (split === 0) return Fail`Missing prefix for ${q(address)}`; + return address.slice(0, split); +}; diff --git a/contract/src/utils/amounts.js b/contract/src/utils/amounts.js new file mode 100644 index 00000000..3974f922 --- /dev/null +++ b/contract/src/utils/amounts.js @@ -0,0 +1,59 @@ +import { makeError } from '@endo/errors'; + +/** + * @import {ChainHub} from "../types.js"; + * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + */ + +/** + * @param {ChainHub} chainHub + * @param {DenomArg} denomArg + * @returns {Denom} + * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom + * mapping + */ +export const coerceDenom = (chainHub, denomArg) => { + if (typeof denomArg === 'string') { + return denomArg; + } + const denom = chainHub.getDenom(denomArg); + if (!denom) { + throw makeError(`No denom for brand ${denomArg}`); + } + return denom; +}; + +/** + * @param {ChainHub} chainHub + * @param {DenomAmount | Amount<'nat'>} amount + * @returns {DenomAmount} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceDenomAmount = (chainHub, amount) => { + if ('denom' in amount) { + return amount; + } + const denom = coerceDenom(chainHub, amount.brand); + return harden({ + denom, + value: amount.value, + }); +}; + +/** + * @param {ChainHub} chainHub + * @param {AmountArg} amount + * @returns {Coin} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceCoin = (chainHub, amount) => { + const denom = + 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); + return harden({ + denom, + amount: String(amount.value), + }); +}; diff --git a/contract/src/utils/cosmos.js b/contract/src/utils/cosmos.js new file mode 100644 index 00000000..5082a1c5 --- /dev/null +++ b/contract/src/utils/cosmos.js @@ -0,0 +1,82 @@ +import { makeError } from '@endo/errors'; +import { decodeBase64 } from '@endo/base64'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; + +/** + * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' + * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; + */ + +/** maximum clock skew, in seconds, for unbonding time reported from other chain */ +export const maxClockSkew = 10n * 60n; + +/** + * @template T + * @param {string} ackStr + * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg + */ +export const tryDecodeResponse = (ackStr, fromProtoMsg) => { + try { + const any = Any.decode(decodeBase64(ackStr)); + const protoMsg = Any.decode(any.value); + + const msg = fromProtoMsg(protoMsg); + return msg; + } catch (cause) { + throw makeError(`bad response: ${ackStr}`, undefined, { cause }); + } +}; + +/** + * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + * @see {@link toTruncatedDenomAmount} for DecCoin + */ +export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); + +/** + * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by + * truncating the fractional portion. + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + */ +export const toTruncatedDenomAmount = c => ({ + denom: c.denom, + value: BigInt(c.amount.split('.')[0]), +}); + +/** + * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration + * {@link CosmosValidatorAddress} + * + * @type {( + * r: { validatorAddress: string }, + * chainId: string, + * ) => CosmosValidatorAddress} + */ +export const toCosmosValidatorAddress = (r, chainId) => ({ + encoding: 'bech32', + value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), + chainId, +}); + +/** + * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration + * {@link CosmosDelegationResponse} + * + * @type {( + * chainInfo: { chainId: string }, + * r: DelegationResponse, + * ) => CosmosDelegationResponse} + */ +export const toCosmosDelegationResponse = ({ chainId }, r) => ({ + delegator: { + chainId, + encoding: 'bech32', + value: r.delegation.delegatorAddress, + }, + validator: toCosmosValidatorAddress(r.delegation, chainId), + amount: toDenomAmount(r.balance), +}); diff --git a/contract/src/utils/denomHash.js b/contract/src/utils/denomHash.js new file mode 100644 index 00000000..561ee4b5 --- /dev/null +++ b/contract/src/utils/denomHash.js @@ -0,0 +1,22 @@ +// @ts-check +import { sha256 } from '@noble/hashes/sha256'; +import { bytesToHex } from '@noble/hashes/utils'; + +/** + * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ + * + * @param {object} opts + * @param {string} [opts.portId] + * @param {string} [opts.channelId] required unless `path` is supplied + * @param {string} [opts.path] alternative to portId, channelId + * @param {string} opts.denom base denom + */ +export const denomHash = ({ + portId = 'transfer', + channelId = /** @type {string | undefined} */ (undefined), + path = `${portId}/${channelId}`, + denom, +}) => { + const h = sha256.create().update(`${path}/${denom}`).digest(); + return bytesToHex(h).toUpperCase(); +}; diff --git a/contract/src/utils/orc.js b/contract/src/utils/orc.js new file mode 100644 index 00000000..47a0d260 --- /dev/null +++ b/contract/src/utils/orc.js @@ -0,0 +1,38 @@ +/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ + +export const orcUtils = { + /** + * unwinds denom with PFM, if necessary + * + * @param {Omit} _args + * @returns {TransferMsg} + */ + makeTransferMsg: _args => { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, + /** + * SwapExact or SwapMaxSlippage, with optional AfterAction + * + * @param {(SwapExact | SwapMaxSlippage) & + * (AfterAction | Record)} _args + * + * @returns {TransferMsg} + */ + makeOsmosisSwap(_args) { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, +}; diff --git a/contract/src/utils/orchestrationAccount.js b/contract/src/utils/orchestrationAccount.js new file mode 100644 index 00000000..23f5337d --- /dev/null +++ b/contract/src/utils/orchestrationAccount.js @@ -0,0 +1,40 @@ +import { BrandShape } from '@agoric/ertp'; +import { Shape as NetworkShape } from '@agoric/network'; +import { VowShape } from '@agoric/vow'; +import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; +import { M } from '@endo/patterns'; +import { + AmountArgShape, + ChainAddressShape, + DenomAmountShape, + IBCTransferOptionsShape, +} from '../typeGuards.js'; + +/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ + +const { Vow$ } = NetworkShape; // TODO #9611 + +/** @see {OrchestrationAccountI} */ +export const orchestrationAccountMethods = { + getAddress: M.call().returns(ChainAddressShape), + getBalance: M.call(M.or(BrandShape, M.string())).returns( + Vow$(DenomAmountShape), + ), + getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), + send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), + sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( + VowShape, + ), + transfer: M.call(ChainAddressShape, AmountArgShape) + .optional(IBCTransferOptionsShape) + .returns(VowShape), + transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), + asContinuingOffer: M.call().returns( + Vow$({ + publicSubscribers: TopicsRecordShape, + invitationMakers: M.any(), + holder: M.remotable(), + }), + ), + getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), +}; diff --git a/contract/src/utils/packet.js b/contract/src/utils/packet.js new file mode 100644 index 00000000..70564cff --- /dev/null +++ b/contract/src/utils/packet.js @@ -0,0 +1,112 @@ +import { Fail } from '@endo/errors'; +import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; +import { + CosmosQuery, + CosmosResponse, +} from '@agoric/cosmic-proto/icq/v1/packet.js'; +import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + +/** + * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; + * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; + */ + +/** + * Makes an IBC transaction packet from an array of messages. Expects the + * `value` of each message to be base64 encoded bytes. Skips checks for + * malformed messages in favor of interface guards. + * + * @param {AnyJson[]} msgs + * @param {Partial>} [opts] + * @returns {string} stringified InterchainAccountPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeTxPacket(msgs, opts) { + const messages = msgs.map(Any.fromJSON); + const bytes = TxBody.encode( + TxBody.fromPartial({ + messages, + ...opts, + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + type: PacketType.TYPE_EXECUTE_TX, + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeTxPacket); + +/** + * Makes an IBC query packet from an array of query messages. Expects the `data` + * of each message to be base64 encoded bytes. Skips checks for malformed + * messages in favor of interface guards. + * + * @param {JsonSafe[]} msgs + * @returns {string} stringified InterchainQueryPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeQueryPacket(msgs) { + const bytes = CosmosQuery.encode( + CosmosQuery.fromPartial({ + requests: msgs.map(RequestQuery.fromJSON), + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeQueryPacket); + +/** + * Looks for a result or error key in the response string, and returns a + * Base64Bytes string. This string can be decoded using the corresponding + * Msg*Response object. Error strings seem to be plain text and do not need + * decoding. + * + * @param {string} response + * @returns {string} - base64 encoded bytes string + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseTxPacket(response) { + const { result, error } = JSON.parse(response); + if (result) return result; + else if (error) throw Error(error); + else throw Fail`expected either result or error: ${response}`; +} +harden(parseTxPacket); + +/** + * Looks for a result or error key in the response string. If a result is found, + * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on + * the resulting entries are base64 encoded for inter-vat communication. These + * can be decoded using the corresponding Query*Response objects. Error strings + * seem to be plain text and do not need decoding. + * + * @param {string} response + * @returns {JsonSafe[]} + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseQueryPacket(response) { + const result = parseTxPacket(response); + const { data } = JSON.parse(atob(result)); + const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); + return harden(responses.map(ResponseQuery.toJSON)); +} +harden(parseQueryPacket); diff --git a/contract/src/utils/registry.js b/contract/src/utils/registry.js new file mode 100644 index 00000000..25789864 --- /dev/null +++ b/contract/src/utils/registry.js @@ -0,0 +1,130 @@ +import { + State as IBCChannelState, + Order, +} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; +import assert from 'node:assert'; + +/** + * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; + * @import {Chain, IBCInfo} from '@chain-registry/types'; + * @import {ChainRegistryClient} from '@chain-registry/client'; + * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; + */ + +/** + * @param {IBCInfo} ibcInfo + * @param {string} name + * @param {Record} chainInfo + * @returns {[string, IBCConnectionInfo] | []} + */ +function toConnectionEntry(ibcInfo, name, chainInfo) { + // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order + const fromChain1 = ibcInfo.chain_1.chain_name === name; + const [from, to] = fromChain1 + ? [ibcInfo.chain_1, ibcInfo.chain_2] + : [ibcInfo.chain_2, ibcInfo.chain_1]; + assert.equal(from.chain_name, name); + const transferChannels = ibcInfo.channels.filter( + c => + c.chain_1.port_id === 'transfer' && + // @ts-expect-error tags does not specify keys + c.tags?.preferred, + ); + if (transferChannels.length === 0) { + console.warn( + 'no transfer channel for [', + from.chain_name, + to.chain_name, + ']', + '(skipping)', + ); + return []; + } + if (transferChannels.length > 1) { + console.warn( + 'multiple preferred transfer channels [', + from.chain_name, + to.chain_name, + ']:', + transferChannels, + '(choosing first)', + ); + } + const [channel] = transferChannels; + const [channelFrom, channelTo] = fromChain1 + ? [channel.chain_1, channel.chain_2] + : [channel.chain_2, channel.chain_1]; + const record = { + id: /** @type {IBCConnectionID} */ (from.connection_id), + client_id: from.client_id, + counterparty: { + client_id: to.client_id, + connection_id: /** @type {IBCConnectionID} */ (to.connection_id), + }, + state: IBCConnectionState.STATE_OPEN, // XXX presumably + transferChannel: { + channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), + portId: channelFrom.port_id, + counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), + counterPartyPortId: channelTo.port_id, + // FIXME mapping, our guard expects a numerical enum + ordering: Order.ORDER_NONE_UNSPECIFIED, + state: IBCChannelState.STATE_OPEN, // XXX presumably + version: channel.version, + }, + }; + const destChainId = chainInfo[to.chain_name].chainId; + return [destChainId, record]; +} + +/** + * Converts the given chain info to our local config format + * + * @param {Pick} registry + */ +export const convertChainInfo = async registry => { + /** @type {Record} */ + const chainInfo = {}; + + for (const chain of registry.chains) { + console.log('processing info', chain.chain_name); + chainInfo[chain.chain_name] = { + bech32Prefix: chain.bech32_prefix, + chainId: chain.chain_id, + stakingTokens: chain.staking?.staking_tokens, + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: chain.chain_name === 'osmosis', + }; + } + + // XXX probably easier to keep ibc separate + const ibcLookup = {}; + for (const ibc of registry.ibcData) { + ibcLookup[ibc.chain_1.chain_name] ||= []; + ibcLookup[ibc.chain_2.chain_name] ||= []; + + ibcLookup[ibc.chain_1.chain_name].push(ibc); + ibcLookup[ibc.chain_2.chain_name].push(ibc); + } + + const chainNames = registry.chains.map(c => c.chain_name).sort(); + + // iterate this after chainInfo is filled out + for (const name of chainNames) { + console.log('processing connections', name); + + const ibcData = ibcLookup[name]; + const connections = Object.fromEntries( + ibcData + .map(datum => toConnectionEntry(datum, name, chainInfo)) + .filter(entry => entry.length > 0) + // sort alphabetically for consistency + .sort(([a], [b]) => a.localeCompare(b)), + ); + chainInfo[name] = { ...chainInfo[name], connections }; + } + + // return object with insertion in alphabetical order of chain name + return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); +}; diff --git a/contract/src/utils/start-helper.js b/contract/src/utils/start-helper.js new file mode 100644 index 00000000..902c7194 --- /dev/null +++ b/contract/src/utils/start-helper.js @@ -0,0 +1,214 @@ +import { prepareAsyncFlowTools } from '@agoric/async-flow'; +import { prepareVowTools } from '@agoric/vow'; +import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { makeChainHub } from '../exos/chain-hub.js'; +import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; +import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; +import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; +import { prepareOrchestrator } from '../exos/orchestrator.js'; +import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; +import { makeOrchestrationFacade } from '../facade.js'; +import { makeZoeTools } from './zoe-tools.js'; +import { makeZcfTools } from './zcf-tools.js'; + +/** + * @import {LocalChain} from '@agoric/vats/src/localchain.js'; + * @import {TimerService, TimerBrand} from '@agoric/time'; + * @import {Baggage} from '@agoric/vat-data'; + * @import {NameHub} from '@agoric/vats'; + * @import {Remote} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; + */ + +/** + * @typedef {{ + * localchain: Remote; + * orchestrationService: Remote; + * storageNode: Remote; + * timerService: Remote; + * agoricNames: Remote; + * }} OrchestrationPowers + */ + +/** + * Helper that a contract start function can use to set up the objects needed + * for orchestration. + * + * TODO strip problematic operations from ZCF (e.g., getPayouts) + * + * @param {ZCF} zcf + * @param {Baggage} baggage + * @param {OrchestrationPowers} remotePowers + * @param {Marshaller} marshaller + * @internal + */ +export const provideOrchestration = ( + zcf, + baggage, + remotePowers, + marshaller, +) => { + // separate zones + const zones = (() => { + const zone = makeDurableZone(baggage); + return { + /** system names for async flow */ + asyncFlow: zone.subZone('asyncFlow'), + /** system names for orchestration implementation */ + orchestration: zone.subZone('orchestration'), + /** system names for chainHub */ + chainHub: zone.subZone('chainHub'), + /** system names for vows */ + vows: zone.subZone('vows'), + /** contract-provided names, and subzones */ + contract: zone.subZone('contract'), + }; + })(); + + const { agoricNames, timerService, localchain } = remotePowers; + + const vowTools = prepareVowTools(zones.vows); + + const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); + + const zoeTools = makeZoeTools(zcf, vowTools); + + const zcfTools = makeZcfTools(zcf, vowTools); + + const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); + const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( + zones.orchestration, + { + makeRecorderKit, + zcf, + timerService, + vowTools, + chainHub, + localchain, + zoeTools, + }, + ); + + const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { + vowTools, + }); + + const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( + zones.orchestration, + { + chainHub, + makeRecorderKit, + timerService, + vowTools, + zcf, + }, + ); + + const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { + makeCosmosOrchestrationAccount, + orchestration: remotePowers.orchestrationService, + storageNode: remotePowers.storageNode, + timer: remotePowers.timerService, + vowTools, + }); + + const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { + makeLocalOrchestrationAccountKit, + localchain: remotePowers.localchain, + // FIXME what path? + storageNode: remotePowers.storageNode, + agoricNames, + orchestration: remotePowers.orchestrationService, + timer: remotePowers.timerService, + vowTools, + }); + + const makeOrchestrator = prepareOrchestrator(zones.orchestration, { + chainHub, + makeLocalChainFacade, + makeRemoteChainFacade, + vowTools, + }); + + /** + * Create orchestrate functions in a specific zone, instead of the default + * `contract.orchestration` zone. This is used for modules that add their own + * orchestration functions (e.g., a Portfolio with orchestration flows for + * continuing offers) + * + * @param {Zone} zone + */ + const makeOrchestrateKit = zone => + makeOrchestrationFacade({ + zone, + zcf, + makeRecorderKit, + makeOrchestrator, + asyncFlowTools, + vowTools, + ...remotePowers, + }); + + // Create orchestrate functions for the default `contract.orchestration` zone + const defaultOrchestrateKit = makeOrchestrateKit( + zones.contract.subZone('orchestration'), + ); + + zcf.setTestJig(() => ({ + baggage, + chainHub, + })); + + return { + ...defaultOrchestrateKit, + makeOrchestrateKit, + chainHub, + vowTools, + asyncFlowTools, + zcfTools, + zoeTools, + zone: zones.contract, + }; +}; +harden(provideOrchestration); + +/** @typedef {Omit, 'zone'>} OrchestrationTools */ + +/** + * Simplifies contract functions for Orchestration by wrapping a simpler + * function with all the tools it needs in order to use Orchestration. + * + * @example + * + * ```js + * const contract = (zcf, privateArgs, zone, tools) => { ... }; + * export const start = withOrchestration(contract); + * ``` + * + * @template {Record} CT + * @template {OrchestrationPowers & { + * marshaller: Marshaller; + * }} PA + * @template R + * @param {( + * zcf: ZCF, + * privateArgs: PA, + * zone: Zone, + * tools: OrchestrationTools, + * ) => Promise} contractFn + * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a + * Zoe start function + */ +export const withOrchestration = + contractFn => async (zcf, privateArgs, baggage) => { + const { zone, ...tools } = provideOrchestration( + zcf, + baggage, + privateArgs, + privateArgs.marshaller, + ); + return contractFn(zcf, privateArgs, zone, tools); + }; +harden(withOrchestration); diff --git a/contract/src/utils/time.js b/contract/src/utils/time.js new file mode 100644 index 00000000..06f995ab --- /dev/null +++ b/contract/src/utils/time.js @@ -0,0 +1,48 @@ +import { E } from '@endo/far'; +import { TimeMath } from '@agoric/time'; + +/** + * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + */ + +export const SECONDS_PER_MINUTE = 60n; +export const MILLISECONDS_PER_SECOND = 1000n; +export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; +export const NANOSECONDS_PER_SECOND = 1_000_000_000n; + +/** + * XXX should this be durable? resumable? + * + * @param {Remote} timer + */ +export function makeTimestampHelper(timer) { + return harden({ + /** + * XXX do this need to be resumable / use Vows? + * + * Takes the current time from ChainTimerService and adds a relative time to + * determine a timeout timestamp in nanoseconds. Useful for + * {@link MsgTransfer.timeoutTimestamp}. + * + * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes + * @returns {Promise} Timeout timestamp in absolute nanoseconds + * since unix epoch + */ + async getTimeoutTimestampNS(relativeTime) { + const currentTime = await E(timer).getCurrentTimestamp(); + const timeout = + relativeTime || + TimeMath.coerceRelativeTimeRecord( + SECONDS_PER_MINUTE * 5n, + currentTime.timerBrand, + ); + return ( + TimeMath.addAbsRel(currentTime, timeout).absValue * + NANOSECONDS_PER_SECOND + ); + }, + }); +} + +/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/src/utils/zcf-tools.js b/contract/src/utils/zcf-tools.js new file mode 100644 index 00000000..d3843695 --- /dev/null +++ b/contract/src/utils/zcf-tools.js @@ -0,0 +1,35 @@ +/** + * @import {HostInterface} from '@agoric/async-flow'; + * @import {VowTools} from '@agoric/vow'; + * @import {ZcfTools} from '../types.js'; + */ + +import { M, mustMatch } from '@endo/patterns'; + +const HandlerShape = M.remotable('OfferHandler'); + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + * @returns {HostInterface} + */ +export const makeZcfTools = (zcf, vowTools) => + harden({ + makeInvitation(offerHandler, description, customDetails, proposalShape) { + mustMatch(offerHandler, HandlerShape); + return vowTools.watch( + zcf.makeInvitation( + offerHandler, + description, + customDetails, + proposalShape, + ), + ); + }, + atomicRearrange(transfers) { + zcf.atomicRearrange(transfers); + }, + assertUniqueKeyword(keyword) { + zcf.assertUniqueKeyword(keyword); + }, + }); diff --git a/contract/src/utils/zoe-tools.js b/contract/src/utils/zoe-tools.js new file mode 100644 index 00000000..a5cbbe38 --- /dev/null +++ b/contract/src/utils/zoe-tools.js @@ -0,0 +1,186 @@ +/** + * @file Helper functions for transferring payments between a LocalChainAccount + * and a ZCFSeat. + * + * Maintainers: This exists as an endowment for orchestrated async-flows so we + * can make use of E and promises. The logic for recovering partial failures + * is also an added convenience for developers. + * + * Functions are written using `asVow` and non-resumable promises as we expect + * each invocation to resolve promptly - there are no timers or interchain + * network calls. + * + * A promise resolved promptly is currently safe from being severed by an + * upgrade because we only trigger vat upgrades as the result of network + * input. + */ + +import { makeError, q, Fail } from '@endo/errors'; +import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; +import { E } from '@endo/far'; + +const { assign, keys, values } = Object; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {VowTools} from '@agoric/vow'; + * @import {LocalAccountMethods} from '../types.js'; + */ + +/** + * @typedef {{ + * invitationMakers: InvitationMakers; + * publicSubscribers: Record>; + * }} ResolvedContinuingOfferResult + * + * @see {ContinuingOfferResult} + */ + +/** + * @typedef {( + * srcSeat: ZCFSeat, + * localAccount: LocalAccountMethods, + * amounts: AmountKeywordRecord, + * ) => Promise} LocalTransfer + */ + +/** + * @typedef {( + * localAccount: LocalAccountMethods, + * destSeat: ZCFSeat, + * amounts: AmountKeywordRecord, + * ) => Promise} WithdrawToSeat + */ + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + */ +export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { + /** + * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the + * deposits fail, everything will be rolled back to the `srcSeat`. Supports + * multiple items in the `amounts` {@link AmountKeywordRecord}. + * + * @type {HostOf} + */ + const localTransfer = (srcSeat, localAccount, amounts) => + asVow(async () => { + !srcSeat.hasExited() || Fail`The seat cannot have exited.`; + const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); + const userSeat = await userSeatP; + zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); + tempSeat.exit(); + // TODO (#9541) get the userSeat into baggage so it's at least recoverable + // const userSeat = await subzone.makeOnce( + // 'localTransferHelper', + // async () => { + // const { zcfSeat: tempSeat, userSeat: userSeatP } = + // zcf.makeEmptySeatKit(); + // const uSeat = await userSeatP; + // // TODO how do I store in the place for this retryable? + // atomicTransfer(zcf, srcSeat, tempSeat, amounts); + // tempSeat.exit(); + // return uSeat; + // }, + // ); + + // Now all the `amounts` are accessible, so we can move them to the localAccount + const payments = await Promise.all( + keys(amounts).map(kw => E(userSeat).getPayout(kw)), + ); + const settleDeposits = await when( + allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), + ); + // if any of the deposits to localAccount failed, unwind all of the allocations + if (settleDeposits.find(x => x.status === 'rejected')) { + const amts = values(amounts); + const errors = []; + // withdraw the successfully deposited payments + const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { + if (x.status === 'rejected') { + errors.push(x.reason); + return payments[i]; + } + return E(localAccount).withdraw(amts[i]); + }); + + // return all payments to the srcSeat + const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); + const paymentKwr = harden( + keys(amounts).reduce( + (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + srcSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + throw makeError(`One or more deposits failed ${q(errors)}`); + } + // TODO #9541 remove userSeat from baggage + }); + + /** + * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any + * of the withdrawals fail, everything will be rolled back to the + * `srcLocalAccount`. Supports multiple items in the `amounts` + * {@link PaymentKeywordRecord} + * + * @type {HostOf} + */ + const withdrawToSeat = (localAccount, destSeat, amounts) => + asVow(async () => { + !destSeat.hasExited() || Fail`The seat cannot have exited.`; + + const settledWithdrawals = await when( + allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), + ); + + // if any of the withdrawals were rejected, unwind the successful ones + if (settledWithdrawals.find(x => x.status === 'rejected')) { + const returnPaymentVs = []; + const errors = []; + for (const result of settledWithdrawals) { + if (result.status === 'fulfilled') { + returnPaymentVs.push(E(localAccount).deposit(result.value)); + } else { + errors.push(result.reason); + } + } + await when(allVows(returnPaymentVs)); + throw makeError(`One or more withdrawals failed ${q(errors)}`); + } + // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat + const paymentKwr = harden( + keys(amounts).reduce( + (acc, kw, i) => + assign(acc, { + [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] + .value, + }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + destSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + }); + + return harden({ + localTransfer, + withdrawToSeat, + }); +}; + +/** @typedef {ReturnType} ZoeTools */ diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts new file mode 100644 index 00000000..c0cae528 --- /dev/null +++ b/contract/test/auto-stake-it.contract.test.ts @@ -0,0 +1,154 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { setUpZoeForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import { createRequire } from 'module'; +import { E } from '@endo/far'; +import { heapVowE } from '@agoric/vow/vat.js'; +import path from 'path'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { MsgDelegateResponse } from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import type { IBCEvent } from '@agoric/vats'; +import type { AutoStakeItSF } from '../src/auto-stake-it.contract.js'; +import { commonSetup } from './supports.js'; +import { + buildMsgResponseString, + buildVTransferEvent, +} from '../tools/ibc-mocks.js'; + +const dirname = path.dirname(new URL(import.meta.url).pathname); + +const nodeRequire = createRequire(import.meta.url); + +const contractFile = nodeRequire.resolve('../src/auto-stake-it.contract.js'); +const contractName = 'auto-stake-it'; +// const contractFile = `${dirname}/../src/${contractName}.contract.js`; +// const contractFile = '/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js'; +// type StartFn = + // typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; + +test('make accounts, register tap, return invitationMakers', async t => { + t.log('bootstrap, orchestration core-eval'); + const { + bootstrap: { storage }, + commonPrivateArgs, + mocks: { transferBridge }, + utils: { inspectLocalBridge, inspectDibcBridge, transmitTransferAck }, + } = await commonSetup(t); + + const { zoe, bundleAndInstall } = await setUpZoeForTest(); + + t.log('contract coreEval', contractName); + const installation: Installation = + await bundleAndInstall(contractFile); + const storageNode = await E(storage.rootNode).makeChildNode(contractName); + const autoAutoStakeItKit = await E(zoe).startInstance( + installation, + undefined, + {}, + { ...commonPrivateArgs, storageNode }, + ); + const publicFacet = await E(zoe).getPublicFacet(autoAutoStakeItKit.instance); + + // make an offer to create an LocalOrchAcct and a CosmosOrchAccount + const inv = E(publicFacet).makeAccountsInvitation(); + const userSeat = E(zoe).offer(inv, {}, undefined, { + chainName: 'cosmoshub', + validator: { + chainId: 'cosmoshub-4', + value: 'cosmosvaloper1test', + encoding: 'bech32', + }, + }); + const result = await heapVowE(userSeat).getOfferResult(); + + const { + publicSubscribers: { agoric, cosmoshub }, + } = result; + + const loaAddress = agoric.storagePath.split('.').pop()!; + const icaAddress = cosmoshub.storagePath.split('.').pop()!; + t.regex(loaAddress, /^agoric/); + t.regex(icaAddress, /^cosmos/); + + // simulate incoming transfers with upcall from golang to VM to initiate the + // incoming transfer Tap + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: 'agoric1fakeLCAAddress', + amount: 10n, + denom: 'unknown-token', + }), + ); + await eventLoopIteration(); + { + const { messages } = inspectLocalBridge().at(-1); + // we do not expect to see MsgTransfer for unknown tokens + t.not(messages?.length, 1, 'unknown-token is ignored'); + } + + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: 'agoric1fakeLCAAddress', + amount: 10n, + denom: 'unknown-token', + sourceChannel: 'channel-0', + }), + ); + await eventLoopIteration(); + { + const { messages } = inspectLocalBridge().at(-1); + // we do not expect to see MsgTransfer for an sourceChannel + t.not(messages?.length, 1, 'unknown sourceChannel is ignored'); + } + + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: 'agoric1fakeLCAAddress', + amount: 10n, + denom: 'uatom', + }), + ); + await eventLoopIteration(); + + const { messages, address: execAddr } = inspectLocalBridge().at(-1); + t.is(messages?.length, 1, 'transfer message sent'); + t.like( + messages[0], + { + '@type': '/ibc.applications.transfer.v1.MsgTransfer', + receiver: 'cosmos1test', + sender: execAddr, + sourceChannel: 'channel-5', + token: { + amount: '10', + }, + }, + 'tokens transferred from LOA to COA', + ); + await transmitTransferAck(); + const { acknowledgement } = (await inspectDibcBridge()).bridgeEvents.at( + -1, + ) as IBCEvent<'acknowledgementPacket'>; + // XXX consider checking ICA (dest|source)_channel, to verify the sender of + // MsgDelegate, once available in vstorage + t.is( + acknowledgement, + buildMsgResponseString(MsgDelegateResponse, {}), + 'COA delegated the received funds', + ); + + // second user can make an account + const inv2 = E(publicFacet).makeAccountsInvitation(); + const userSeat2 = E(zoe).offer(inv2, {}, undefined, { + chainName: 'cosmoshub', + validator: { + chainId: 'cosmoshub-4', + value: 'cosmosvaloper1test', + encoding: 'bech32', + }, + }); + const { publicSubscribers: pubSubs2 } = + await heapVowE(userSeat2).getOfferResult(); + + t.regex(pubSubs2.agoric.storagePath.split('.').pop()!, /^agoric/); + t.regex(pubSubs2.cosmoshub.storagePath.split('.').pop()!, /^cosmos/); +}); diff --git a/contract/test/ibc-mocks.ts b/contract/test/ibc-mocks.ts new file mode 100644 index 00000000..6992227e --- /dev/null +++ b/contract/test/ibc-mocks.ts @@ -0,0 +1,128 @@ +/** @file The mocks used in these tests */ +import { + QueryBalanceRequest, + QueryBalanceResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; +import { + MsgBeginRedelegate, + MsgBeginRedelegateResponse, + MsgDelegate, + MsgDelegateResponse, + MsgUndelegate, + MsgUndelegateResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import { + MsgWithdrawDelegatorReward, + MsgWithdrawDelegatorRewardResponse, +} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/tx.js'; +import type { Timestamp } from '@agoric/cosmic-proto/google/protobuf/timestamp.js'; +import { + MsgSend, + MsgSendResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; +import { + buildMsgResponseString, + buildQueryResponseString, + buildMsgErrorString, + buildTxPacketString, + buildQueryPacketString, + createMockAckMap, +} from '../tools/ibc-mocks.js'; + +/** + * TODO: provide mappings to cosmos error codes (and module specific error codes) + * see https://github.com/Agoric/agoric-sdk/issues/9629 for more details about + * error messages over ibc + */ +export const errorAcknowledgments = { + error5: buildMsgErrorString( + 'ABCI code: 5: error handling packet: see events for details', + ), +}; + +const delegation = { + amount: { + denom: 'uatom', + amount: '10', + }, + delegatorAddress: 'cosmos1test', + validatorAddress: 'cosmosvaloper1test', +}; +const redelegation = { + delegatorAddress: 'cosmos1test', + validatorSrcAddress: 'cosmosvaloper1test', + validatorDstAddress: 'cosmosvaloper2test', + amount: { + denom: 'uatom', + amount: '10', + }, +}; +const bankSend = { + fromAddress: 'cosmos1test', + toAddress: 'cosmos99test', + amount: [{ denom: 'uatom', amount: '10' }], +}; +const bankSendMulti = { + fromAddress: 'cosmos1test', + toAddress: 'cosmos99test', + amount: [ + { denom: 'uatom', amount: '10' }, + { denom: 'ibc/1234', amount: '10' }, + ], +}; + +export const UNBOND_PERIOD_SECONDS = 5n; + +const getUnbondingTime = (): Timestamp => ({ + seconds: UNBOND_PERIOD_SECONDS, + nanos: 0, +}); + +export const protoMsgMocks = { + delegate: { + msg: buildTxPacketString([MsgDelegate.toProtoMsg(delegation)]), + ack: buildMsgResponseString(MsgDelegateResponse, {}), + }, + undelegate: { + msg: buildTxPacketString([MsgUndelegate.toProtoMsg(delegation)]), + ack: buildMsgResponseString(MsgUndelegateResponse, { + completionTime: getUnbondingTime(), + }), + }, + redelegate: { + msg: buildTxPacketString([MsgBeginRedelegate.toProtoMsg(redelegation)]), + ack: buildMsgResponseString(MsgBeginRedelegateResponse, { + completionTime: getUnbondingTime(), + }), + }, + withdrawReward: { + msg: buildTxPacketString([ + MsgWithdrawDelegatorReward.toProtoMsg(delegation), + ]), + ack: buildMsgResponseString(MsgWithdrawDelegatorRewardResponse, { + amount: [{ amount: '1', denom: 'uatom' }], + }), + }, + queryBalance: { + msg: buildQueryPacketString([ + QueryBalanceRequest.toProtoMsg({ + address: 'cosmos1test', + denom: 'uatom', + }), + ]), + ack: buildQueryResponseString(QueryBalanceResponse, { + balance: { amount: '0', denom: 'uatom' }, + }), + }, + bankSend: { + msg: buildTxPacketString([MsgSend.toProtoMsg(bankSend)]), + ack: buildMsgResponseString(MsgSendResponse, {}), + }, + bankSendMulti: { + msg: buildTxPacketString([MsgSend.toProtoMsg(bankSendMulti)]), + ack: buildMsgResponseString(MsgSendResponse, {}), + }, +}; + +export const defaultMockAckMap: Record = + createMockAckMap(protoMsgMocks); diff --git a/contract/test/supports.ts b/contract/test/supports.ts new file mode 100644 index 00000000..dbf539c0 --- /dev/null +++ b/contract/test/supports.ts @@ -0,0 +1,236 @@ +import { makeIssuerKit } from '@agoric/ertp'; +import { VTRANSFER_IBC_EVENT } from '@agoric/internal/src/action-types.js'; +import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { makeNameHubKit } from '@agoric/vats'; +import { prepareBridgeTargetModule } from '@agoric/vats/src/bridge-target.js'; +import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; +import { prepareLocalChainTools } from '@agoric/vats/src/localchain.js'; +import { prepareTransferTools } from '@agoric/vats/src/transfer.js'; +import { makeFakeBankManagerKit } from '@agoric/vats/tools/bank-utils.js'; +import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; +import { + makeFakeLocalchainBridge, + makeFakeTransferBridge, +} from '@agoric/vats/tools/fake-bridge.js'; +import { prepareSwingsetVowTools } from '@agoric/vow/vat.js'; +import type { Installation } from '@agoric/zoe/src/zoeService/utils.js'; +import { buildZoeManualTimer } from '@agoric/zoe/tools/manualTimer.js'; +import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; +import { makeHeapZone } from '@agoric/zone'; +import { E } from '@endo/far'; +import type { ExecutionContext } from 'ava'; +import { registerKnownChains } from '../src/chain-info.js'; +import { makeChainHub } from '../src/exos/chain-hub.js'; +import { prepareCosmosInterchainService } from '../src/exos/cosmos-interchain-service.js'; +import fetchedChainInfo from '../src/fetched-chain-info.js'; +import { buildVTransferEvent } from '../tools/ibc-mocks.js'; +import { setupFakeNetwork } from './network-fakes.js'; + +export { + makeFakeLocalchainBridge, + makeFakeTransferBridge, +} from '@agoric/vats/tools/fake-bridge.js'; + +export const commonSetup = async (t: ExecutionContext) => { + t.log('bootstrap vat dependencies'); + // The common setup cannot support a durable zone because many of the fakes are not durable. + // They were made before we had durable kinds (and thus don't take a zone or baggage). + // To test durability in unit tests, test a particular entity with `relaxDurabilityRules: false`. + // To test durability integrating multiple vats, use a RunUtils/bootstrap test. + const rootZone = makeHeapZone(); + + const { nameHub: agoricNames, nameAdmin: agoricNamesAdmin } = + makeNameHubKit(); + + const bld = withAmountUtils(makeIssuerKit('BLD')); + const ist = withAmountUtils(makeIssuerKit('IST')); + const bankBridgeMessages = [] as any[]; + const { bankManager, pourPayment } = await makeFakeBankManagerKit({ + onToBridge: obj => bankBridgeMessages.push(obj), + }); + await E(bankManager).addAsset('ubld', 'BLD', 'Staking Token', bld.issuerKit); + await E(bankManager).addAsset( + 'uist', + 'IST', + 'Inter Stable Token', + ist.issuerKit, + ); + // These mints no longer stay in sync with bankManager. + // Use pourPayment() for IST. + const { mint: _b, ...bldSansMint } = bld; + const { mint: _i, ...istSansMint } = ist; + // XXX real bankManager does this. fake should too? + // TODO https://github.com/Agoric/agoric-sdk/issues/9966 + await makeWellKnownSpaces(agoricNamesAdmin, t.log, ['vbankAsset']); + await E(E(agoricNamesAdmin).lookupAdmin('vbankAsset')).update( + 'uist', + /** @type {AssetInfo} */ harden({ + brand: ist.brand, + issuer: ist.issuer, + issuerName: 'IST', + denom: 'uist', + proposedName: 'IST', + displayInfo: { IOU: true }, + }), + ); + await E(E(agoricNamesAdmin).lookupAdmin('vbankAsset')).update( + 'ubld', + /** @type {AssetInfo} */ harden({ + brand: bld.brand, + issuer: bld.issuer, + issuerName: 'BLD', + denom: 'ubld', + proposedName: 'BLD', + displayInfo: { IOU: true }, + }), + ); + + const vowTools = prepareSwingsetVowTools(rootZone.subZone('vows')); + + const transferBridge = makeFakeTransferBridge(rootZone); + const { makeBridgeTargetKit } = prepareBridgeTargetModule( + rootZone.subZone('bridge'), + ); + const { makeTransferMiddlewareKit } = prepareTransferTools( + rootZone.subZone('transfer'), + vowTools, + ); + + const { finisher, interceptorFactory, transferMiddleware } = + makeTransferMiddlewareKit(); + const bridgeTargetKit = makeBridgeTargetKit( + transferBridge, + VTRANSFER_IBC_EVENT, + interceptorFactory, + ); + finisher.useRegistry(bridgeTargetKit.targetRegistry); + await E(transferBridge).initHandler(bridgeTargetKit.bridgeHandler); + + const localBridgeMessages = [] as any[]; + const localchainBridge = makeFakeLocalchainBridge(rootZone, obj => + localBridgeMessages.push(obj), + ); + const localchain = prepareLocalChainTools( + rootZone.subZone('localchain'), + vowTools, + ).makeLocalChain({ + bankManager, + system: localchainBridge, + transfer: transferMiddleware, + }); + const timer = buildZoeManualTimer(t.log); + const marshaller = makeFakeBoard().getReadonlyMarshaller(); + const storage = makeFakeStorageKit('mockChainStorageRoot', { + sequence: false, + }); + + const { portAllocator, setupIBCProtocol, ibcBridge } = setupFakeNetwork( + rootZone.subZone('network'), + { vowTools }, + ); + await setupIBCProtocol(); + + const makeCosmosInterchainService = prepareCosmosInterchainService( + rootZone.subZone('orchestration'), + vowTools, + ); + const cosmosInterchainService = makeCosmosInterchainService({ + portAllocator, + }); + + await registerKnownChains(agoricNamesAdmin, () => {}); + + let ibcSequenceNonce = 0n; + /** simulate incoming message as if the transfer completed over IBC */ + const transmitTransferAck = async () => { + // assume this is called after each outgoing IBC transfer + ibcSequenceNonce += 1n; + // let the promise for the transfer start + await eventLoopIteration(); + const lastMsgTransfer = localBridgeMessages.at(-1).messages[0]; + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: lastMsgTransfer.receiver, + sender: lastMsgTransfer.sender, + target: lastMsgTransfer.sender, + sourceChannel: lastMsgTransfer.sourceChannel, + sequence: ibcSequenceNonce, + }), + ); + // let the bridge handler finish + await eventLoopIteration(); + }; + + const chainHub = makeChainHub( + rootZone.subZone('chainHub'), + agoricNames, + vowTools, + ); + + /** + * Register BLD if it's not already registered. + * Does not work with `withOrchestration` contracts, as these have their own + * ChainHub. Use `ChainHubAdmin` instead. + */ + const registerAgoricBld = () => { + if (!chainHub.getAsset('ubld')) { + chainHub.registerChain('agoric', fetchedChainInfo.agoric); + chainHub.registerAsset('ubld', { + chainName: 'agoric', + baseName: 'agoric', + baseDenom: 'ubld', + brand: bld.brand, + }); + } + }; + + return { + bootstrap: { + agoricNames, + agoricNamesAdmin, + bankManager, + timer, + localchain, + cosmosInterchainService, + // TODO remove; bootstrap doesn't have a zone + rootZone: rootZone.subZone('contract'), + storage, + // TODO remove; bootstrap doesn't have vowTools + vowTools, + }, + brands: { + bld: bldSansMint, + ist: istSansMint, + }, + mocks: { + ibcBridge, + transferBridge, + }, + commonPrivateArgs: { + agoricNames, + localchain, + orchestrationService: cosmosInterchainService, + storageNode: storage.rootNode, + marshaller, + timerService: timer, + }, + facadeServices: { + agoricNames, + chainHub, + localchain, + orchestrationService: cosmosInterchainService, + timerService: timer, + }, + utils: { + pourPayment, + inspectLocalBridge: () => harden([...localBridgeMessages]), + inspectDibcBridge: () => E(ibcBridge).inspectDibcBridge(), + inspectBankBridge: () => harden([...bankBridgeMessages]), + registerAgoricBld, + transmitTransferAck, + }, + }; +}; + +export const makeDefaultContext = (contract: Installation) => {}; diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts new file mode 100644 index 00000000..96995b9e --- /dev/null +++ b/contract/tools/ibc-mocks.ts @@ -0,0 +1,262 @@ +/** @file Tools to support making IBC mocks */ +import { type JsonSafe, toRequestQueryJson } from '@agoric/cosmic-proto'; +import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { FungibleTokenPacketData } from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; +import type { PacketSDKType } from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import { CosmosResponse } from '@agoric/cosmic-proto/icq/v1/packet.js'; +import { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import { + IBC_EVENT, + VTRANSFER_IBC_EVENT, +} from '@agoric/internal/src/action-types.js'; +import type { + IBCChannelID, + IBCEvent, + IBCPacket, + VTransferIBCEvent, +} from '@agoric/vats'; +import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; +import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; +import type { ChainAddress } from '../src/orchestration-api.js'; +import { makeQueryPacket, makeTxPacket } from '../src/utils/packet.js'; + +interface EncoderI { + encode: (message: T) => { + finish: () => Uint8Array; + }; + fromPartial: (partial: Partial) => T; + typeUrl: string; +} + +const toPacket = (obj: Record): string => + btoa(JSON.stringify(obj)); + +/** + * Build a response "packet bytes string" we'd expect to see from a Msg + * Response + * + * XXX support multiple responses in a single message + * + * @param Encoder + * @param message + */ +export function buildMsgResponseString( + Encoder: EncoderI, + message: Partial, +): string { + const encodedMsg = Encoder.encode(Encoder.fromPartial(message)).finish(); + + // cosmos-sdk double Any encodes + const encodedAny = Any.encode( + Any.fromPartial({ + value: Any.encode( + Any.fromPartial({ + typeUrl: Encoder.typeUrl, + value: encodedMsg, + }), + ).finish(), + }), + ).finish(); + + return toPacket({ + result: encodeBase64(encodedAny), + }); +} + +/** + * Build an example error packet for a failed Tx Msg + * @param msg + */ +export function buildMsgErrorString( + msg = 'ABCI code: 5: error handling packet: see events for details', +): string { + return toPacket({ + error: msg, + }); +} + +/** + * Build a response "packet bytes string" we'd expect to see from a Query + * request + * + * XXX accept multiple queries at once + * + * @param Encoder + * @param query + * @param opts + */ +export function buildQueryResponseString( + Encoder: EncoderI, + query: Partial, + opts: Omit = { + value: new Uint8Array(), + height: 0n, + index: 0n, + code: 0, + log: '', + info: '', + codespace: '', + }, +): string { + const encodedResp = CosmosResponse.encode( + CosmosResponse.fromPartial({ + responses: [ + { + key: Encoder.encode(Encoder.fromPartial(query)).finish(), + ...opts, + }, + ], + }), + ).finish(); + + return toPacket({ + result: toPacket({ data: encodeBase64(encodedResp) }), + }); +} + +/** + * Build a tx packet string for the mocked dibc bridge handler + * @param msgs + * @returns {string} + */ +export function buildTxPacketString( + msgs: { value: Uint8Array; typeUrl: string }[], +): string { + return btoa(makeTxPacket(msgs.map(Any.toJSON))); +} + +/** + * Parse an outgoing ica tx packet. Useful for testing when inspecting + * outgoing dibc bridge messages. + * + * @param b64 base64 encoded string + */ +export const parseOutgoingTxPacket = (b64: string) => { + return TxBody.decode(decodeBase64(JSON.parse(atob(b64)).data)); +}; + +/** + * Build a query packet string for the mocked dibc bridge handler + * @param msgs + * @param opts + * @returns {string} + */ +export function buildQueryPacketString( + msgs: Any[], + opts: Partial> = {}, +): string { + return btoa(makeQueryPacket(msgs.map(msg => toRequestQueryJson(msg, opts)))); +} + +type BuildVTransferEventParams = { + event?: VTransferIBCEvent['event']; + /* defaults to cosmos1AccAddress. set to `agoric1fakeLCAAddress` to simulate an outgoing transfer event */ + sender?: ChainAddress['value']; + /* defaults to agoric1fakeLCAAddress. set to a different value to simulate an outgoing transfer event */ + receiver?: ChainAddress['value']; + target?: ChainAddress['value']; + amount?: bigint; + denom?: string; + destinationChannel?: IBCChannelID; + sourceChannel?: IBCChannelID; + /* support bigint and string, to facilitate bootstrap testing */ + sequence?: PacketSDKType['sequence'] | JsonSafe; +}; + +/** + * `buildVTransferEvent` can be used with `transferBridge` to simulate incoming + * and outgoing IBC fungible tokens transfers to a LocalChain account. + * + * It defaults to simulating incoming transfers. To simulate an outgoing one, + * ensure `sender=agoric1fakeLCAAddress` and this after LocalChainBridge + * receives the outgoing MsgTransfer, + * + * @example + * ```js + * const { mocks: { transferBridge } = await commonSetup(t); + * await E(transferBridge).fromBridge( + * buildVTransferEvent({ + * receiver: 'agoric1fakeLCAAddress', + * amount: 10n, + * denom: 'uatom', + * }), + * ); + * ``` + * + * XXX integrate vlocalchain and vtransfer ScopedBridgeManagers + * in test supports. + * + * @param {{BuildVTransferEventParams}} args + */ +export const buildVTransferEvent = ({ + event = 'acknowledgementPacket' as const, + sender = 'cosmos1AccAddress', + receiver = LOCALCHAIN_DEFAULT_ADDRESS, + target = LOCALCHAIN_DEFAULT_ADDRESS, + amount = 10n, + denom = 'uatom', + destinationChannel = 'channel-0' as IBCChannelID, + sourceChannel = 'channel-405' as IBCChannelID, + sequence = 0n, +}: BuildVTransferEventParams = {}): VTransferIBCEvent => ({ + type: VTRANSFER_IBC_EVENT, + blockHeight: 0, + blockTime: 0, + event, + acknowledgement: btoa(JSON.stringify({ result: 'AQ==' })), + relayer: 'agoric123', + target, + packet: { + data: btoa( + JSON.stringify( + FungibleTokenPacketData.fromPartial({ + amount: String(amount), + denom, + sender, + receiver, + }), + ), + ), + destination_channel: destinationChannel, + source_channel: sourceChannel, + destination_port: 'transfer', + source_port: 'transfer', + sequence, + } as IBCPacket, +}); + +export function createMockAckMap( + mockMap: Record, +) { + const res = Object.values(mockMap).reduce((acc, { msg, ack }) => { + acc[msg] = ack; + return acc; + }, {}); + return res; +} + +/** + * Simulate an IBC channelCloseConfirm event. This can be used to simulate an + * ICA channel closing for an unexpected reason from a remote chain, _or + * anything besides the Connection holder calling `.close()`_. If `close()` is + * called, we'd instead expect to see a Downcall for channelCloseInit. + * + * @param {Pick, 'portID' | 'channelID'>} event + */ +export const buildChannelCloseConfirmEvent = ({ + channelID = 'channel-0', + portID = 'icacontroller-1', +}: Partial> = {}): Partial< + IBCEvent<'channelCloseConfirm'> +> => ({ + blockHeight: 0, + blockTime: 0, + channelID, + event: 'channelCloseConfirm', + portID, + type: IBC_EVENT, +}); diff --git a/contract/tools/protobuf-decoder.js b/contract/tools/protobuf-decoder.js new file mode 100644 index 00000000..a7b68896 --- /dev/null +++ b/contract/tools/protobuf-decoder.js @@ -0,0 +1,153 @@ +/* eslint-env node */ +/* eslint-disable -- generated by Sonnet, easier to leave alone */ + +const WIRE_TYPES = { + VARINT: 0, + FIXED64: 1, + LENGTH_DELIMITED: 2, + START_GROUP: 3, + END_GROUP: 4, + FIXED32: 5, +}; + +function decodeVarint(buffer, offset) { + let result = 0n; + let shift = 0; + let byte; + + do { + if (offset >= buffer.length) { + throw new Error('Buffer overflow while decoding varint'); + } + byte = buffer[offset]; + result |= BigInt(byte & 0x7f) << BigInt(shift); + shift += 7; + offset++; + } while (byte & 0x80); + + return { value: result, bytesRead: shift / 7 }; +} + +function decodeFixed32(buffer, offset) { + if (offset + 4 > buffer.length) { + throw new Error('Buffer overflow while decoding fixed32'); + } + return { + value: buffer.readUInt32LE(offset), + bytesRead: 4, + }; +} + +function decodeFixed64(buffer, offset) { + if (offset + 8 > buffer.length) { + throw new Error('Buffer overflow while decoding fixed64'); + } + const low = buffer.readUInt32LE(offset); + const high = buffer.readUInt32LE(offset + 4); + return { + value: BigInt(high) * 2n ** 32n + BigInt(low), + bytesRead: 8, + }; +} + +function decodeString(buffer, offset, length) { + if (offset + length > buffer.length) { + throw new Error('Buffer overflow while decoding string'); + } + return { + value: buffer.toString('utf8', offset, offset + length), + bytesRead: length, + }; +} + +function decodeField(buffer, offset) { + const tag = decodeVarint(buffer, offset); + offset += tag.bytesRead; + + const fieldNumber = Number(tag.value >> 3n); + const wireType = Number(tag.value & 0x7n); + + let value; + let bytesRead; + + switch (wireType) { + case WIRE_TYPES.VARINT: + ({ value, bytesRead } = decodeVarint(buffer, offset)); + break; + case WIRE_TYPES.FIXED64: + ({ value, bytesRead } = decodeFixed64(buffer, offset)); + break; + case WIRE_TYPES.LENGTH_DELIMITED: + const length = decodeVarint(buffer, offset); + offset += length.bytesRead; + // Try to decode as a nested message first + try { + ({ value, bytesRead } = decodeProtobuf( + buffer.slice(offset, offset + Number(length.value)), + )); + } catch (e) { + // If it fails, decode as a string + ({ value, bytesRead } = decodeString( + buffer, + offset, + Number(length.value), + )); + } + bytesRead += length.bytesRead; + break; + case WIRE_TYPES.FIXED32: + ({ value, bytesRead } = decodeFixed32(buffer, offset)); + break; + default: + throw new Error(`Unsupported wire type: ${wireType}`); + } + + return { + fieldNumber, + wireType, + value, + bytesRead: tag.bytesRead + bytesRead, + }; +} + +function getFieldName(fieldNumber, wireType) { + const typePrefix = + wireType === WIRE_TYPES.LENGTH_DELIMITED + ? 'subMessage' + : wireType === WIRE_TYPES.VARINT + ? 'int' + : wireType === WIRE_TYPES.FIXED32 + ? 'fixed32' + : wireType === WIRE_TYPES.FIXED64 + ? 'fixed64' + : 'string'; + return `${typePrefix}_${fieldNumber}`; +} + +/** + * Decodes a protobuf message from the given buffer. + * + * @param {Buffer} buffer + */ +export function decodeProtobuf(buffer) { + let offset = 0; + const message = {}; + + while (offset < buffer.length) { + const field = decodeField(buffer, offset); + const fieldName = getFieldName(field.fieldNumber, field.wireType); + message[fieldName] = field.value; + offset += field.bytesRead; + } + + return { value: message, bytesRead: offset }; +} +/** + * Decodes a protobuf message from the given base64-encoded data. + * + * @param {string} base64String + */ +export function decodeProtobufBase64(base64String) { + const buffer = Buffer.from(base64String, 'base64'); + return decodeProtobuf(buffer); +} diff --git a/yarn.lock b/yarn.lock index cfc49b6a..589e7ef3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1211,6 +1211,16 @@ __metadata: languageName: node linkType: hard +"@ava/typescript@npm:^5.0.0": + version: 5.0.0 + resolution: "@ava/typescript@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + execa: "npm:^8.0.1" + checksum: 10c0/4f0f9fbcf34f632a95d5565d2c0f7b397873cdc9b55288c54bc7d1dde58fbf600beaa470639e5367aceb99841efa3d4b8c0b5b4bf4778fe8fe5f7e926e4a3fad + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" @@ -8220,7 +8230,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:20.16.8, @types/node@npm:>=13.7.0, @types/node@npm:^20.11.13": +"@types/node@npm:*, @types/node@npm:20.16.8, @types/node@npm:>=13.7.0": version: 20.16.8 resolution: "@types/node@npm:20.16.8" dependencies: @@ -8243,6 +8253,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.9.0": + version: 22.9.0 + resolution: "@types/node@npm:22.9.0" + dependencies: + undici-types: "npm:~6.19.8" + checksum: 10c0/3f46cbe0a49bab4ba30494025e4c8a6e699b98ac922857aa1f0209ce11a1313ee46e6808b8f13fe5b8b960a9d7796b77c8d542ad4e9810e85ef897d5593b5d51 + languageName: node + linkType: hard + "@types/prop-types@npm:*": version: 15.7.13 resolution: "@types/prop-types@npm:15.7.13" @@ -11076,6 +11095,7 @@ __metadata: "@agoric/vow": "npm:^0.2.0-u17.1" "@agoric/zoe": "npm:^0.26.3-u17.1" "@agoric/zone": "npm:^0.3.0-u17.1" + "@ava/typescript": "npm:^5.0.0" "@cosmjs/proto-signing": "npm:^0.32.3" "@endo/bundle-source": "npm:^3.5.0" "@endo/errors": "npm:^1.2.4" @@ -11094,7 +11114,7 @@ __metadata: "@rollup/plugin-replace": "npm:^5.0.5" "@rollup/plugin-typescript": "npm:^11.1.6" "@types/fs-extra": "npm:^11" - "@types/node": "npm:^20.11.13" + "@types/node": "npm:^22.9.0" "@typescript-eslint/eslint-plugin": "npm:^7.0.2" "@typescript-eslint/parser": "npm:^7.15.0" agoric: "npm:^0.22.0-u17.1" @@ -11115,9 +11135,10 @@ __metadata: prettier-plugin-jsdoc: "npm:^1.0.0" rollup: "npm:^4.18.0" starshipjs: "npm:^2.4.0" + ts-node: "npm:^10.9.2" tsimp: "npm:^2.0.10" type-coverage: "npm:^2.26.3" - typescript: "npm:^5.3.3" + typescript: "npm:^5.6.3" typescript-eslint: "npm:^7.18.0" languageName: unknown linkType: soft @@ -18927,7 +18948,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.6 - 5.6.x": +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": version: 5.6.3 resolution: "typescript@npm:5.6.3" bin: @@ -18937,7 +18958,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2, typescript@npm:^5.3.3, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": +"typescript@npm:^5.2.2, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": version: 5.6.2 resolution: "typescript@npm:5.6.2" bin: @@ -18947,7 +18968,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin": +"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": version: 5.6.3 resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" bin: @@ -18957,7 +18978,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": +"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": version: 5.6.2 resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=74658d" bin: @@ -19009,7 +19030,7 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": +"undici-types@npm:~6.19.2, undici-types@npm:~6.19.8": version: 6.19.8 resolution: "undici-types@npm:6.19.8" checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 From 11ea3641eb1870e2f81301b0b76a543afa84cb1d Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 14:40:57 +0500 Subject: [PATCH 13/31] chore: fixing unit tests for auto-stake-it --- contract/package.json | 41 +- contract/src/auto-stake-it.contract.js | 1 + contract/src/auto-stake-it.flows.js | 4 +- .../src/exos/cosmos-interchain-service.js | 4 +- contract/src/types-index.d.ts | 1 + contract/src/types-index.js | 1 + contract/src/types.ts | 24 + contract/test/auto-stake-it.contract.test.ts | 18 +- contract/test/network-fakes.ts | 389 + ...{network-fakes.js => old_network-fakes.js} | 8 +- contract/test/orca-contract.test.js | 2 +- contract/typeGuards.js | 197 + contract/utils/address.js | 103 + contract/utils/amounts.js | 59 + contract/utils/cosmos.js | 82 + contract/utils/denomHash.js | 22 + contract/utils/orc.js | 38 + contract/utils/orchestrationAccount.js | 40 + contract/utils/packet.js | 112 + contract/utils/registry.js | 130 + contract/utils/start-helper.js | 214 + contract/utils/time.js | 48 + contract/utils/zcf-tools.js | 35 + contract/utils/zoe-tools.js | 186 + yarn.lock | 8226 +++++++++-------- 25 files changed, 6171 insertions(+), 3814 deletions(-) create mode 100644 contract/src/types-index.d.ts create mode 100644 contract/src/types-index.js create mode 100644 contract/src/types.ts create mode 100644 contract/test/network-fakes.ts rename contract/test/{network-fakes.js => old_network-fakes.js} (95%) create mode 100644 contract/typeGuards.js create mode 100644 contract/utils/address.js create mode 100644 contract/utils/amounts.js create mode 100644 contract/utils/cosmos.js create mode 100644 contract/utils/denomHash.js create mode 100644 contract/utils/orc.js create mode 100644 contract/utils/orchestrationAccount.js create mode 100644 contract/utils/packet.js create mode 100644 contract/utils/registry.js create mode 100644 contract/utils/start-helper.js create mode 100644 contract/utils/time.js create mode 100644 contract/utils/zcf-tools.js create mode 100644 contract/utils/zoe-tools.js diff --git a/contract/package.json b/contract/package.json index 556225e2..66a6a0cf 100644 --- a/contract/package.json +++ b/contract/package.json @@ -20,24 +20,40 @@ "lint": "tsc && eslint '**/*.js'", "lint:fix": "eslint --fix '**/*.js'" }, - "devDependencies": { + "dependencies": { "@agoric/async-flow": "^0.1.1-u17.1", + "@agoric/cosmic-proto": "latest", "@agoric/deploy-script-support": "^0.10.4-u17.1", + "@agoric/ertp": "^0.16.3-u17.1", "@agoric/eslint-config": "^0.4.1-u17.1", + "@agoric/governance": "^0.10.4-u17.1", "@agoric/inter-protocol": "^0.17.0-u17.1", + "@agoric/internal": "^0.4.0-u17.1", + "@agoric/network": "0.1.1-dev-d1562a1.0", + "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch", "@agoric/smart-wallet": "^0.5.4-u17.1", "@agoric/store": "^0.9.3-u17.1", "@agoric/time": "^0.3.3-u17.1", "@agoric/vat-data": "^0.5.3-u17.1", + "@agoric/vats": "^0.16.0-u17.1", "@agoric/vow": "^0.2.0-u17.1", - "@agoric/zone": "^0.3.0-u17.1", + "@agoric/zoe": "^0.26.3-u17.1", + "@agoric/zone": "latest", "@ava/typescript": "^5.0.0", "@cosmjs/proto-signing": "^0.32.3", + "@endo/base64": "latest", + "@endo/bundle-source": "^3.5.0", + "@endo/errors": "^1.2.4", "@endo/eslint-plugin": "^2.2.0", + "@endo/far": "^1.1.4", + "@endo/init": "^1.1.3", + "@endo/marshal": "^1.6.1", "@endo/nat": "^5.0.9", + "@endo/patterns": "^1.4.6", "@endo/promise-kit": "^1.1.4", "@endo/ses-ava": "^1.2.2", "@jessie.js/eslint-plugin": "^0.4.1", + "@noble/hashes": "latest", "@rollup/plugin-commonjs": "^25.0.8", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", @@ -71,20 +87,13 @@ "typescript": "^5.6.3", "typescript-eslint": "^7.18.0" }, - "dependencies": { - "@agoric/ertp": "^0.16.3-u17.1", - "@agoric/governance": "^0.10.4-u17.1", - "@agoric/internal": "^0.4.0-u17.1", - "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch", - "@agoric/store": "^0.9.3-u17.1", - "@agoric/vats": "^0.16.0-u17.1", - "@agoric/zoe": "^0.26.3-u17.1", - "@endo/bundle-source": "^3.5.0", - "@endo/errors": "^1.2.4", - "@endo/far": "^1.1.4", - "@endo/init": "^1.1.3", - "@endo/marshal": "^1.5.2", - "@endo/patterns": "^1.4.2" + "resolutions": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "ava": { "extensions": { diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js index 25651fae..a78f7bb5 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/auto-stake-it.contract.js @@ -12,6 +12,7 @@ import * as flows from './auto-stake-it.flows.js'; /** * @import {Zone} from '@agoric/zone'; * @import {OrchestrationPowers, OrchestrationTools} from './utils/start-helper.js'; + * @import { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; */ /** diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/auto-stake-it.flows.js index 74d1fc83..16b10212 100644 --- a/contract/src/auto-stake-it.flows.js +++ b/contract/src/auto-stake-it.flows.js @@ -6,8 +6,8 @@ import { denomHash } from '../utils/denomHash.js'; * @import {GuestInterface} from '@agoric/async-flow'; * @import {CosmosValidatorAddress, Orchestrator, CosmosInterchainService, Denom, OrchestrationAccount, StakingAccountActions, OrchestrationFlow} from '@agoric/orchestration'; * @import {MakeStakingTap} from './auto-stake-it-tap-kit.js'; - * @import {MakePortfolioHolder} from '../exos/portfolio-holder-kit.js'; - * @import {ChainHub} from '../exos/chain-hub.js'; + * @import {MakePortfolioHolder} from './exos/portfolio-holder-kit.js'; + * @import {ChainHub} from './exos/chain-hub.js'; */ /** diff --git a/contract/src/exos/cosmos-interchain-service.js b/contract/src/exos/cosmos-interchain-service.js index 5724cc94..c6d72b96 100644 --- a/contract/src/exos/cosmos-interchain-service.js +++ b/contract/src/exos/cosmos-interchain-service.js @@ -8,7 +8,7 @@ import { DEFAULT_ICQ_VERSION, makeICAChannelAddress, makeICQChannelAddress, -} from '../utils/address.js'; +} from '../../utils/address.js'; import { prepareIcaAccountKit } from './ica-account-kit.js'; import { prepareICQConnectionKit } from './icq-connection-kit.js'; @@ -20,7 +20,7 @@ import { prepareICQConnectionKit } from './icq-connection-kit.js'; * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; * @import {Vow, VowTools} from '@agoric/vow'; * @import {ICQConnection, IcaAccount, ICQConnectionKit, IcaAccountKit} from '../types.js'; - * @import {ICAChannelAddressOpts} from '../utils/address.js'; + * @import {ICAChannelAddressOpts} from '../../utils/address.js'; */ const { Vow$ } = NetworkShape; // TODO #9611 diff --git a/contract/src/types-index.d.ts b/contract/src/types-index.d.ts new file mode 100644 index 00000000..06c33f56 --- /dev/null +++ b/contract/src/types-index.d.ts @@ -0,0 +1 @@ +export type * from './types.js'; diff --git a/contract/src/types-index.js b/contract/src/types-index.js new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/contract/src/types-index.js @@ -0,0 +1 @@ +export {}; diff --git a/contract/src/types.ts b/contract/src/types.ts new file mode 100644 index 00000000..905892a2 --- /dev/null +++ b/contract/src/types.ts @@ -0,0 +1,24 @@ +/** @file Rollup of all type definitions in the package, for local import and external export */ + +export type * from './chain-info.js'; +export type * from './cosmos-api.js'; +export type * from './ethereum-api.js'; +export type * from './exos/chain-hub.js'; +export type * from './exos/combine-invitation-makers.js'; +export type * from './exos/cosmos-interchain-service.js'; +export type * from './exos/exo-interfaces.js'; +export type * from './exos/ica-account-kit.js'; +export type * from './exos/icq-connection-kit.js'; +export type * from './exos/local-chain-facade.js'; +export type * from './exos/portfolio-holder-kit.js'; +export type * from './orchestration-api.js'; +export type * from './vat-orchestration.js'; + +/** + * ({@link ZCF})-like tools for use in {@link OrchestrationFlow}s. + */ +export interface ZcfTools { + assertUniqueKeyword: ZCF['assertUniqueKeyword']; + atomicRearrange: ZCF['atomicRearrange']; + makeInvitation: ZCF['makeInvitation']; +} diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index c0cae528..8df36680 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -1,13 +1,11 @@ -import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { test } from './prepare-test-env-ava.js'; import { setUpZoeForTest } from '@agoric/zoe/tools/setup-zoe.js'; -import { createRequire } from 'module'; import { E } from '@endo/far'; import { heapVowE } from '@agoric/vow/vat.js'; import path from 'path'; import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; import { MsgDelegateResponse } from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; import type { IBCEvent } from '@agoric/vats'; -import type { AutoStakeItSF } from '../src/auto-stake-it.contract.js'; import { commonSetup } from './supports.js'; import { buildMsgResponseString, @@ -15,15 +13,11 @@ import { } from '../tools/ibc-mocks.js'; const dirname = path.dirname(new URL(import.meta.url).pathname); - -const nodeRequire = createRequire(import.meta.url); - -const contractFile = nodeRequire.resolve('../src/auto-stake-it.contract.js'); const contractName = 'auto-stake-it'; -// const contractFile = `${dirname}/../src/${contractName}.contract.js`; -// const contractFile = '/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js'; -// type StartFn = - // typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; +const contractFile = `${dirname}/../src/${contractName}.contract.js`; + +type StartFn = + typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); @@ -37,7 +31,7 @@ test('make accounts, register tap, return invitationMakers', async t => { const { zoe, bundleAndInstall } = await setUpZoeForTest(); t.log('contract coreEval', contractName); - const installation: Installation = + const installation: Installation = await bundleAndInstall(contractFile); const storageNode = await E(storage.rootNode).makeChildNode(contractName); const autoAutoStakeItKit = await E(zoe).startInstance( diff --git a/contract/test/network-fakes.ts b/contract/test/network-fakes.ts new file mode 100644 index 00000000..b137a619 --- /dev/null +++ b/contract/test/network-fakes.ts @@ -0,0 +1,389 @@ +import { inspect } from 'node:util'; + +import type { VowTools } from '@agoric/vow'; +import { + base64ToBytes, + prepareEchoConnectionKit, + prepareLoopbackProtocolHandler, + prepareNetworkPowers, + preparePortAllocator, + prepareRouterProtocol, +} from '@agoric/network'; +import type { Zone } from '@agoric/zone'; +import type { + IBCChannelID, + IBCMethod, + IBCEvent, + ScopedBridgeManagerMethods, + IBCConnectionID, + IBCPortID, +} from '@agoric/vats'; +import { + prepareCallbacks as prepareIBCCallbacks, + prepareIBCProtocol, +} from '@agoric/vats/src/ibc.js'; +import { BridgeId, makeTracer } from '@agoric/internal'; +import { E, Far } from '@endo/far'; +import type { Guarded } from '@endo/exo'; +import { defaultMockAckMap, errorAcknowledgments } from './ibc-mocks.js'; +import { decodeProtobufBase64 } from '../tools/protobuf-decoder.js'; + +const trace = makeTracer('NetworkFakes'); + +/** + * Mimic IBC Channel version negotation + * + * As part of the IBC Channel initialization, the version field is negotiated + * with the host. `version` is a String or JSON string as determined by the IBC + * Application protol. + * + * @param version requested version string + * @param params mock parameters to add to version string + * @param params.address for ICS-27, the bech32 address provided by the host + */ +const addParamsIfJsonVersion = ( + version: string, + params: { address: string }, +): string => { + try { + const parsed = JSON.parse(version); + return JSON.stringify({ + ...parsed, + ...params, + }); + } catch { + return version; + } +}; + +type ImplementedIBCEvents = 'channelOpenAck' | 'acknowledgementPacket'; + +export const ibcBridgeMocks: { + [T in ImplementedIBCEvents]: T extends 'channelOpenAck' + ? ( + obj: IBCMethod<'startChannelOpenInit'>, + opts: { + channelID: IBCChannelID; + counterpartyChannelID: IBCChannelID; + mockChainAddress: string; + }, + ) => IBCEvent<'channelOpenAck'> + : T extends 'acknowledgementPacket' + ? ( + obj: IBCMethod<'sendPacket'>, + opts: { sequence: bigint; acknowledgement: string }, + ) => IBCEvent<'acknowledgementPacket'> + : never; +} = { + channelOpenAck: ( + obj: IBCMethod<'startChannelOpenInit'>, + { + channelID, + counterpartyChannelID, + mockChainAddress, + }: { + channelID: IBCChannelID; + counterpartyChannelID: IBCChannelID; + mockChainAddress: string; + }, + ): IBCEvent<'channelOpenAck'> => { + return { + type: 'IBC_EVENT', + blockHeight: 99, + blockTime: 1711571357, + event: 'channelOpenAck', + portID: obj.packet.source_port, + channelID, + counterparty: { + port_id: obj.packet.destination_port, + channel_id: counterpartyChannelID, + }, + counterpartyVersion: addParamsIfJsonVersion(obj.version, { + address: mockChainAddress, + }), + connectionHops: obj.hops, + order: obj.order, + version: obj.version, + }; + }, + + acknowledgementPacket: ( + obj: IBCMethod<'sendPacket'>, + opts: { sequence: bigint; acknowledgement: string }, + ): IBCEvent<'acknowledgementPacket'> => { + const { sequence, acknowledgement } = opts; + return { + acknowledgement, + blockHeight: 289, + blockTime: 1712180320, + event: 'acknowledgementPacket', + packet: { + data: obj.packet.data, + destination_channel: obj.packet.destination_channel, + destination_port: obj.packet.destination_port, + sequence, + source_channel: obj.packet.source_channel, + source_port: obj.packet.source_port, + timeout_timestamp: 1712183910866313000n, + }, + relayer: 'agoric1gtkg0g6x8lqc734ht3qe2sdkrfugpdp2h7fuu0', + type: 'IBC_EVENT', + }; + }, +}; + +type BridgeEvents = Array< + | IBCEvent<'channelOpenAck'> + | IBCEvent<'acknowledgementPacket'> + | IBCEvent<'channelCloseConfirm'> + | IBCEvent<'sendPacket'> +>; + +type BridgeDowncalls = Array< + | IBCMethod<'startChannelOpenInit'> + | IBCMethod<'startChannelCloseInit'> + | IBCMethod<'bindPort'> + | IBCMethod<'sendPacket'> +>; + +/** + * Make a fake IBC Bridge, extended from the dibc ScopedBridgeManager. + * + * Has extra `setMockAck` and `setAddressPrefix` met + * + * @param zone + */ +export const makeFakeIBCBridge = ( + zone: Zone, +): Guarded< + ScopedBridgeManagerMethods<'dibc'> & { + addMockAck: (msgData: string, ackData: string) => void; + setMockAck: (mockAckMap: Record) => void; + setAddressPrefix: (addressPrefix: string) => void; + inspectDibcBridge: () => { + bridgeEvents: BridgeEvents; + bridgeDowncalls: BridgeDowncalls; + }; + } +> => { + let bridgeHandler: any; + /** + * Intended to mock an individual account's sequence, but is global for all + * accounts. + * XXX teach this about IBCConnections and store sequence on a + * per-channel basis. + * @type {bigint} + */ + let ibcSequenceNonce = 0n; + /** + * The number of channels created. Currently used as a proxy to increment + * fake account addresses and channels. + * @type {nubmer} + */ + let channelCount = 0; + let icaAccountCount = 0; + let bech32Prefix = 'cosmos'; + + /** + * Keep track channels requested by remote chain. Used as a proxy for + * counterpaty channel ids + */ + const remoteChannelMap: Record = {}; + + /** + * Packet byte string map of requests to responses + * @type {Record} + */ + let mockAckMap = defaultMockAckMap; + let bridgeEvents: BridgeEvents = []; + let bridgeDowncalls: BridgeDowncalls = []; + + /** + * Store remote mock addresses that have been distributed. + * If there's a `channelOpenInit` request for a PortId:ConnnectionId + * pair that's been previously established, let's reuse it to mimic + * the behavior of the ICS-27 protocol. + */ + type AddressKey = `${IBCPortID}:${IBCConnectionID}`; + const getAddressKey = ( + obj: IBCMethod<'startChannelOpenInit'>, + ): AddressKey => { + return `${obj.packet.source_port as IBCPortID}:${obj.hops[0] as IBCConnectionID}`; + }; + const addressMap = new Map(); + + return zone.exo('Fake IBC Bridge Manager', undefined, { + getBridgeId: () => BridgeId.DIBC, + toBridge: async obj => { + trace( + 'toBridge', + obj, + obj.packet?.data ? base64ToBytes(obj.packet.data) : undefined, + ); + if (obj.type === 'IBC_METHOD') { + bridgeDowncalls = bridgeDowncalls.concat(obj); + switch (obj.method) { + case 'startChannelOpenInit': { + const connectionChannelCount = remoteChannelMap[obj.hops[0]] || 0; + const addressKey = getAddressKey(obj); + let mockChainAddress; + if (addressMap.has(addressKey)) { + mockChainAddress = addressMap.get(addressKey); + } else { + mockChainAddress = + icaAccountCount > 0 + ? `${bech32Prefix}1test${icaAccountCount}` + : `${bech32Prefix}1test`; + addressMap.set(addressKey, mockChainAddress); + } + const ackEvent = ibcBridgeMocks.channelOpenAck(obj, { + mockChainAddress, + channelID: `channel-${channelCount}`, + counterpartyChannelID: `channel-${connectionChannelCount}`, + }); + bridgeHandler?.fromBridge(ackEvent); + bridgeEvents = bridgeEvents.concat(ackEvent); + channelCount += 1; + if (obj.packet.source_port.includes('icacontroller')) { + icaAccountCount += 1; + } + remoteChannelMap[obj.hops[0]] = connectionChannelCount + 1; + return undefined; + } + case 'sendPacket': { + const mockAckMapHasData = obj.packet.data in mockAckMap; + if (!mockAckMapHasData) { + trace( + `sendPacket acking err because no mock ack for b64 data key: '${obj.packet.data}'`, + ); + try { + const decoded = decodeProtobufBase64( + JSON.parse(base64ToBytes(obj.packet.data)).data, + ); + trace( + 'Fix the source of this request or define a ack mapping for it:', + inspect(decoded, { depth: null }), + ); + } catch (err) { + trace('Could not decode packet data', err); + } + } + const ackEvent = ibcBridgeMocks.acknowledgementPacket(obj, { + sequence: ibcSequenceNonce, + acknowledgement: mockAckMapHasData + ? mockAckMap[obj.packet.data] + : errorAcknowledgments.error5, + }); + bridgeEvents = bridgeEvents.concat(ackEvent); + ibcSequenceNonce += 1n; + bridgeHandler?.fromBridge(ackEvent); + return ackEvent.packet; + } + default: + return undefined; + } + } + return undefined; + }, + fromBridge: async obj => { + trace('fromBridge', obj); + bridgeEvents = bridgeEvents.concat(obj); + if (!bridgeHandler) throw Error('no handler!'); + return bridgeHandler.fromBridge(obj); + }, + initHandler: handler => { + if (bridgeHandler) throw Error('already init'); + bridgeHandler = handler; + }, + setHandler: handler => { + if (!bridgeHandler) throw Error('must init first'); + bridgeHandler = handler; + }, + /** + * Set a map of requests to responses to simulate different scenarios. Defaults to `defaultMockAckMap`. + * See `@agoric/orchestration/tools/ibc-mocks.js` for helpers to build this map. + * + * @param ackMap + */ + setMockAck: (ackMap: typeof mockAckMap) => { + trace('setMockAck', ackMap); + mockAckMap = ackMap; + }, + addMockAck: (msgData: string, ackData: string) => { + trace('addMockAck', msgData, ackData); + mockAckMap[msgData] = ackData; + }, + /** + * Set a new bech32 prefix for the mocked ICA channel. Defaults to `cosmos`. + * + * @param newPrefix + */ + setAddressPrefix: (newPrefix: typeof bech32Prefix) => { + trace('setAddressPrefix', newPrefix); + bech32Prefix = newPrefix; + }, + /** + * for debugging and testing + */ + inspectDibcBridge() { + return { bridgeEvents, bridgeDowncalls }; + }, + }); +}; + +export const setupFakeNetwork = ( + zone: Zone, + { vowTools }: { vowTools: VowTools }, +) => { + const powers = prepareNetworkPowers(zone, vowTools); + const makeRouterProtocol = prepareRouterProtocol(zone, powers); + const makePortAllocator = preparePortAllocator(zone, powers); + const makeLoopbackProtocolHandler = prepareLoopbackProtocolHandler( + zone, + vowTools, + ); + const makeEchoConnectionKit = prepareEchoConnectionKit(zone); + const makeIBCProtocolHandler = prepareIBCProtocol(zone, vowTools); + + const protocol = makeRouterProtocol(); + const portAllocator = makePortAllocator({ protocol }); + const ibcBridge = makeFakeIBCBridge(zone); + + const networkVat = Far('vat-network', { + registerProtocolHandler: (prefixes, handler) => + protocol.registerProtocolHandler(prefixes, handler), + makeLoopbackProtocolHandler, + makeEchoConnectionKit, + unregisterProtocolHandler: (prefix, handler) => + protocol.unregisterProtocolHandler(prefix, handler), + getPortAllocator: () => portAllocator, + }); + + const ibcVat = Far('vat-ibc', { + makeCallbacks: prepareIBCCallbacks(zone), + createHandlers(callbacks) { + const ibcHandler = makeIBCProtocolHandler(callbacks); + return harden(ibcHandler); + }, + }); + + const setupIBCProtocol = async () => { + const callbacks = await E(ibcVat).makeCallbacks(ibcBridge); + const { protocolHandler, bridgeHandler } = + await E(ibcVat).createHandlers(callbacks); + await E(ibcBridge).initHandler(bridgeHandler); + await E(networkVat).registerProtocolHandler( + ['/ibc-port', '/ibc-hop'], + protocolHandler, + ); + }; + + return { + portAllocator, + protocol, + ibcBridge, + networkVat, + ibcVat, + setupIBCProtocol, + }; +}; diff --git a/contract/test/network-fakes.js b/contract/test/old_network-fakes.js similarity index 95% rename from contract/test/network-fakes.js rename to contract/test/old_network-fakes.js index ab5859d7..4e9b5e93 100644 --- a/contract/test/network-fakes.js +++ b/contract/test/old_network-fakes.js @@ -2,6 +2,7 @@ import { prepareEchoConnectionKit, prepareLoopbackProtocolHandler, + prepareNetworkPowers, preparePortAllocator, prepareRouterProtocol, } from '@agoric/network'; @@ -211,8 +212,11 @@ export const makeFakeIBCBridge = zone => { }; export const setupFakeNetwork = (zone, { vowTools }) => { - const makeRouterProtocol = prepareRouterProtocol(zone, vowTools); - const makePortAllocator = preparePortAllocator(zone, vowTools); + const powers = prepareNetworkPowers(zone, vowTools); + const makeRouterProtocol = prepareRouterProtocol(zone, powers); + const makePortAllocator = preparePortAllocator(zone, powers); + // const makeRouterProtocol = prepareRouterProtocol(zone, vowTools); + // const makePortAllocator = preparePortAllocator(zone, vowTools); const makeLoopbackProtocolHandler = prepareLoopbackProtocolHandler( zone, vowTools, diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index 271c1885..a363101e 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -1,7 +1,6 @@ // @ts-check import { test as anyTest } from './prepare-test-env-ava.js'; - import { createRequire } from 'module'; import { E, Far, passStyleOf } from '@endo/far'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; @@ -365,6 +364,7 @@ const orchestrationAccountAndFundScenario = test.macro({ ); let offerResult; + offerResult = await E(seat).getOfferResult(); await t.throwsAsync( async () => (offerResult = await vt.when(E(seat).getOfferResult())), { message: /TODO: use IBC mocks or something/ }, diff --git a/contract/typeGuards.js b/contract/typeGuards.js new file mode 100644 index 00000000..995754dd --- /dev/null +++ b/contract/typeGuards.js @@ -0,0 +1,197 @@ +import { VowShape } from '@agoric/vow'; +import { M } from '@endo/patterns'; + +/** + * @import {TypedPattern} from '@agoric/internal'; + * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; + * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; + * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {TypedJson} from '@agoric/cosmic-proto'; + */ + +/** + * Used for IBC Channel Connections that only send outgoing transactions. If + * your channel expects incoming transactions, please extend this interface to + * include the `onReceive` handler. + */ +export const OutboundConnectionHandlerI = M.interface( + 'OutboundConnectionHandler', + { + onOpen: M.callWhen(M.any(), M.string(), M.string(), M.any()).returns( + M.any(), + ), + onClose: M.callWhen(M.any(), M.any(), M.any()).returns(M.any()), + }, +); + +/** @type {TypedPattern} */ +export const ChainAddressShape = { + chainId: M.string(), + encoding: M.string(), + value: M.string(), +}; +harden(ChainAddressShape); + +/** @type {TypedPattern} */ +export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; +harden(ChainAddressShape); + +/** @internal */ +export const IBCTransferOptionsShape = M.splitRecord( + {}, + { + timeoutTimestamp: M.bigint(), + timeoutHeight: { + revisionHeight: M.bigint(), + revisionNumber: M.bigint(), + }, + memo: M.string(), + }, +); + +/** @internal */ +export const IBCChannelIDShape = M.string(); + +/** @internal */ +export const IBCChannelInfoShape = M.splitRecord({ + portId: M.string(), + channelId: IBCChannelIDShape, + counterPartyPortId: M.string(), + counterPartyChannelId: IBCChannelIDShape, + ordering: M.scalar(), // XXX + state: M.scalar(), // XXX + version: M.string(), +}); + +/** @internal */ +export const IBCConnectionIDShape = M.string(); + +/** @internal */ +export const IBCConnectionInfoShape = M.splitRecord({ + id: IBCConnectionIDShape, + client_id: M.string(), + state: M.scalar(), // XXX STATE_OPEN or... + counterparty: { + client_id: M.string(), + connection_id: IBCConnectionIDShape, + }, + transferChannel: IBCChannelInfoShape, +}); + +/** @type {TypedPattern} */ +export const CosmosAssetInfoShape = M.splitRecord({ + base: M.string(), + name: M.string(), + display: M.string(), + symbol: M.string(), + denom_units: M.arrayOf( + M.splitRecord({ denom: M.string(), exponent: M.number() }), + ), +}); + +/** @type {TypedPattern} */ +export const CosmosChainInfoShape = M.splitRecord( + { + chainId: M.string(), + }, + { + bech32Prefix: M.string(), + connections: M.record(), + stakingTokens: M.arrayOf({ denom: M.string() }), + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: M.boolean(), + }, +); + +/** @type {TypedPattern} */ +export const ChainInfoShape = M.splitRecord({ + chainId: M.string(), +}); +export const DenomShape = M.string(); + +/** @type {TypedPattern>} */ +export const DenomInfoShape = { + chain: M.remotable('Chain'), + base: M.remotable('Chain'), + brand: M.or(M.remotable('Brand'), M.undefined()), + baseDenom: M.string(), +}; +harden(DenomInfoShape); + +/** @type {TypedPattern} */ +export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; +harden(DenomAmountShape); + +/** @type {TypedPattern>} */ +export const AnyNatAmountShape = { + brand: M.remotable('Brand'), + value: M.nat(), +}; +harden(AnyNatAmountShape); + +/** @type {TypedPattern} */ +export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); + +/** + * @type {TypedPattern<{ + * validator: CosmosValidatorAddress; + * amount: AmountArg; + * }>} + */ +export const DelegationShape = M.splitRecord( + { + validator: ChainAddressShape, + amount: AmountArgShape, + }, + { delegator: ChainAddressShape }, +); + +/** Approximately @see RequestQuery */ +export const ICQMsgShape = M.splitRecord( + { path: M.string(), data: M.string() }, + { height: M.string(), prove: M.boolean() }, +); + +/** @type {TypedPattern} */ +export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); + +/** @see {Chain} */ +export const chainFacadeMethods = { + getChainInfo: M.call().returns(VowShape), + makeAccount: M.call().returns(VowShape), +}; +harden(chainFacadeMethods); + +/** + * for google/protobuf/timestamp.proto, not to be confused with TimestampShape + * from `@agoric/time` + * + * `seconds` is a big integer but since it goes through JSON it is encoded as + * string + */ +export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; +harden(TimestampProtoShape); + +/** + * see {@link TxBody} for more details + * + * @internal + */ +export const TxBodyOptsShape = M.splitRecord( + {}, + { + memo: M.string(), + timeoutHeight: M.bigint(), + extensionOptions: M.arrayOf(M.any()), + nonCriticalExtensionOptions: M.arrayOf(M.any()), + }, +); + +/** + * Ensures at least one {@link AmountKeywordRecord} entry is present and only + * permits Nat (fungible) amounts. + */ +export const AnyNatAmountsRecord = M.and( + M.recordOf(M.string(), AnyNatAmountShape), + M.not({}), +); diff --git a/contract/utils/address.js b/contract/utils/address.js new file mode 100644 index 00000000..8d39ed5a --- /dev/null +++ b/contract/utils/address.js @@ -0,0 +1,103 @@ +import { Fail, q } from '@endo/errors'; + +/** + * @import {IBCConnectionID} from '@agoric/vats'; + * @import {ChainAddress} from '../types.js'; + * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +/** + * @typedef {object} ICAChannelAddressOpts + * @property {string} [encoding='proto3'] message encoding format for the + * channel + * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. + * currently only `ordered` is supported for ics27-1 + * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` + * @property {string} [version='ics27-1'] default is `ics27-1` + */ + +/** + * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID + * @param {IBCConnectionID} controllerConnectionId Self Connection ID + * @param {ICAChannelAddressOpts} [opts] + * @returns {RemoteIbcAddress} + */ +export const makeICAChannelAddress = ( + hostConnectionId, + controllerConnectionId, + { + version = 'ics27-1', + encoding = 'proto3', + ordering = 'ordered', + txType = 'sdk_multi_msg', + } = {}, +) => { + hostConnectionId || Fail`hostConnectionId is required`; + controllerConnectionId || Fail`controllerConnectionId is required`; + const connString = JSON.stringify({ + version, + controllerConnectionId, + hostConnectionId, + address: '', // will be provided by the counterparty after channelOpenAck + encoding, + txType, + }); + return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; +}; +harden(makeICAChannelAddress); + +export const DEFAULT_ICQ_VERSION = 'icq-1'; + +/** + * @param {IBCConnectionID} controllerConnectionId + * @param {string} version defaults to icq-1 + * @returns {RemoteIbcAddress} + */ +export const makeICQChannelAddress = ( + controllerConnectionId, + version = DEFAULT_ICQ_VERSION, +) => { + controllerConnectionId || Fail`controllerConnectionId is required`; + return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; +}; +harden(makeICQChannelAddress); + +/** + * Parse a chain address from a remote address string. Assumes the address + * string is in a JSON format and contains an "address" field. This function is + * designed to be safe against malformed inputs and unexpected data types, and + * will return `undefined` in those cases. + * + * @param {RemoteIbcAddress} remoteAddressString - remote address string, + * including version + * @returns {ChainAddress['value'] | undefined} returns undefined on error + */ +export const findAddressField = remoteAddressString => { + try { + // Extract JSON version string assuming it's always surrounded by {} + const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; + const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; + if (!jsonObj?.address?.length) return undefined; + return jsonObj.address; + } catch (error) { + return undefined; + } +}; +harden(findAddressField); + +/** + * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. + * + * see + * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) + * for reference implementation + * + * @param {string} address + */ +export const getBech32Prefix = address => { + assert(address, 'address is required'); + const split = address.lastIndexOf('1'); + if (split === -1) return Fail`No separator character for ${q(address)}`; + if (split === 0) return Fail`Missing prefix for ${q(address)}`; + return address.slice(0, split); +}; diff --git a/contract/utils/amounts.js b/contract/utils/amounts.js new file mode 100644 index 00000000..3974f922 --- /dev/null +++ b/contract/utils/amounts.js @@ -0,0 +1,59 @@ +import { makeError } from '@endo/errors'; + +/** + * @import {ChainHub} from "../types.js"; + * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + */ + +/** + * @param {ChainHub} chainHub + * @param {DenomArg} denomArg + * @returns {Denom} + * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom + * mapping + */ +export const coerceDenom = (chainHub, denomArg) => { + if (typeof denomArg === 'string') { + return denomArg; + } + const denom = chainHub.getDenom(denomArg); + if (!denom) { + throw makeError(`No denom for brand ${denomArg}`); + } + return denom; +}; + +/** + * @param {ChainHub} chainHub + * @param {DenomAmount | Amount<'nat'>} amount + * @returns {DenomAmount} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceDenomAmount = (chainHub, amount) => { + if ('denom' in amount) { + return amount; + } + const denom = coerceDenom(chainHub, amount.brand); + return harden({ + denom, + value: amount.value, + }); +}; + +/** + * @param {ChainHub} chainHub + * @param {AmountArg} amount + * @returns {Coin} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceCoin = (chainHub, amount) => { + const denom = + 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); + return harden({ + denom, + amount: String(amount.value), + }); +}; diff --git a/contract/utils/cosmos.js b/contract/utils/cosmos.js new file mode 100644 index 00000000..5082a1c5 --- /dev/null +++ b/contract/utils/cosmos.js @@ -0,0 +1,82 @@ +import { makeError } from '@endo/errors'; +import { decodeBase64 } from '@endo/base64'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; + +/** + * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' + * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; + */ + +/** maximum clock skew, in seconds, for unbonding time reported from other chain */ +export const maxClockSkew = 10n * 60n; + +/** + * @template T + * @param {string} ackStr + * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg + */ +export const tryDecodeResponse = (ackStr, fromProtoMsg) => { + try { + const any = Any.decode(decodeBase64(ackStr)); + const protoMsg = Any.decode(any.value); + + const msg = fromProtoMsg(protoMsg); + return msg; + } catch (cause) { + throw makeError(`bad response: ${ackStr}`, undefined, { cause }); + } +}; + +/** + * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + * @see {@link toTruncatedDenomAmount} for DecCoin + */ +export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); + +/** + * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by + * truncating the fractional portion. + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + */ +export const toTruncatedDenomAmount = c => ({ + denom: c.denom, + value: BigInt(c.amount.split('.')[0]), +}); + +/** + * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration + * {@link CosmosValidatorAddress} + * + * @type {( + * r: { validatorAddress: string }, + * chainId: string, + * ) => CosmosValidatorAddress} + */ +export const toCosmosValidatorAddress = (r, chainId) => ({ + encoding: 'bech32', + value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), + chainId, +}); + +/** + * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration + * {@link CosmosDelegationResponse} + * + * @type {( + * chainInfo: { chainId: string }, + * r: DelegationResponse, + * ) => CosmosDelegationResponse} + */ +export const toCosmosDelegationResponse = ({ chainId }, r) => ({ + delegator: { + chainId, + encoding: 'bech32', + value: r.delegation.delegatorAddress, + }, + validator: toCosmosValidatorAddress(r.delegation, chainId), + amount: toDenomAmount(r.balance), +}); diff --git a/contract/utils/denomHash.js b/contract/utils/denomHash.js new file mode 100644 index 00000000..561ee4b5 --- /dev/null +++ b/contract/utils/denomHash.js @@ -0,0 +1,22 @@ +// @ts-check +import { sha256 } from '@noble/hashes/sha256'; +import { bytesToHex } from '@noble/hashes/utils'; + +/** + * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ + * + * @param {object} opts + * @param {string} [opts.portId] + * @param {string} [opts.channelId] required unless `path` is supplied + * @param {string} [opts.path] alternative to portId, channelId + * @param {string} opts.denom base denom + */ +export const denomHash = ({ + portId = 'transfer', + channelId = /** @type {string | undefined} */ (undefined), + path = `${portId}/${channelId}`, + denom, +}) => { + const h = sha256.create().update(`${path}/${denom}`).digest(); + return bytesToHex(h).toUpperCase(); +}; diff --git a/contract/utils/orc.js b/contract/utils/orc.js new file mode 100644 index 00000000..47a0d260 --- /dev/null +++ b/contract/utils/orc.js @@ -0,0 +1,38 @@ +/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ + +export const orcUtils = { + /** + * unwinds denom with PFM, if necessary + * + * @param {Omit} _args + * @returns {TransferMsg} + */ + makeTransferMsg: _args => { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, + /** + * SwapExact or SwapMaxSlippage, with optional AfterAction + * + * @param {(SwapExact | SwapMaxSlippage) & + * (AfterAction | Record)} _args + * + * @returns {TransferMsg} + */ + makeOsmosisSwap(_args) { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, +}; diff --git a/contract/utils/orchestrationAccount.js b/contract/utils/orchestrationAccount.js new file mode 100644 index 00000000..23f5337d --- /dev/null +++ b/contract/utils/orchestrationAccount.js @@ -0,0 +1,40 @@ +import { BrandShape } from '@agoric/ertp'; +import { Shape as NetworkShape } from '@agoric/network'; +import { VowShape } from '@agoric/vow'; +import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; +import { M } from '@endo/patterns'; +import { + AmountArgShape, + ChainAddressShape, + DenomAmountShape, + IBCTransferOptionsShape, +} from '../typeGuards.js'; + +/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ + +const { Vow$ } = NetworkShape; // TODO #9611 + +/** @see {OrchestrationAccountI} */ +export const orchestrationAccountMethods = { + getAddress: M.call().returns(ChainAddressShape), + getBalance: M.call(M.or(BrandShape, M.string())).returns( + Vow$(DenomAmountShape), + ), + getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), + send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), + sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( + VowShape, + ), + transfer: M.call(ChainAddressShape, AmountArgShape) + .optional(IBCTransferOptionsShape) + .returns(VowShape), + transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), + asContinuingOffer: M.call().returns( + Vow$({ + publicSubscribers: TopicsRecordShape, + invitationMakers: M.any(), + holder: M.remotable(), + }), + ), + getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), +}; diff --git a/contract/utils/packet.js b/contract/utils/packet.js new file mode 100644 index 00000000..70564cff --- /dev/null +++ b/contract/utils/packet.js @@ -0,0 +1,112 @@ +import { Fail } from '@endo/errors'; +import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; +import { + CosmosQuery, + CosmosResponse, +} from '@agoric/cosmic-proto/icq/v1/packet.js'; +import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + +/** + * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; + * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; + */ + +/** + * Makes an IBC transaction packet from an array of messages. Expects the + * `value` of each message to be base64 encoded bytes. Skips checks for + * malformed messages in favor of interface guards. + * + * @param {AnyJson[]} msgs + * @param {Partial>} [opts] + * @returns {string} stringified InterchainAccountPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeTxPacket(msgs, opts) { + const messages = msgs.map(Any.fromJSON); + const bytes = TxBody.encode( + TxBody.fromPartial({ + messages, + ...opts, + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + type: PacketType.TYPE_EXECUTE_TX, + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeTxPacket); + +/** + * Makes an IBC query packet from an array of query messages. Expects the `data` + * of each message to be base64 encoded bytes. Skips checks for malformed + * messages in favor of interface guards. + * + * @param {JsonSafe[]} msgs + * @returns {string} stringified InterchainQueryPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeQueryPacket(msgs) { + const bytes = CosmosQuery.encode( + CosmosQuery.fromPartial({ + requests: msgs.map(RequestQuery.fromJSON), + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeQueryPacket); + +/** + * Looks for a result or error key in the response string, and returns a + * Base64Bytes string. This string can be decoded using the corresponding + * Msg*Response object. Error strings seem to be plain text and do not need + * decoding. + * + * @param {string} response + * @returns {string} - base64 encoded bytes string + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseTxPacket(response) { + const { result, error } = JSON.parse(response); + if (result) return result; + else if (error) throw Error(error); + else throw Fail`expected either result or error: ${response}`; +} +harden(parseTxPacket); + +/** + * Looks for a result or error key in the response string. If a result is found, + * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on + * the resulting entries are base64 encoded for inter-vat communication. These + * can be decoded using the corresponding Query*Response objects. Error strings + * seem to be plain text and do not need decoding. + * + * @param {string} response + * @returns {JsonSafe[]} + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseQueryPacket(response) { + const result = parseTxPacket(response); + const { data } = JSON.parse(atob(result)); + const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); + return harden(responses.map(ResponseQuery.toJSON)); +} +harden(parseQueryPacket); diff --git a/contract/utils/registry.js b/contract/utils/registry.js new file mode 100644 index 00000000..25789864 --- /dev/null +++ b/contract/utils/registry.js @@ -0,0 +1,130 @@ +import { + State as IBCChannelState, + Order, +} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; +import assert from 'node:assert'; + +/** + * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; + * @import {Chain, IBCInfo} from '@chain-registry/types'; + * @import {ChainRegistryClient} from '@chain-registry/client'; + * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; + */ + +/** + * @param {IBCInfo} ibcInfo + * @param {string} name + * @param {Record} chainInfo + * @returns {[string, IBCConnectionInfo] | []} + */ +function toConnectionEntry(ibcInfo, name, chainInfo) { + // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order + const fromChain1 = ibcInfo.chain_1.chain_name === name; + const [from, to] = fromChain1 + ? [ibcInfo.chain_1, ibcInfo.chain_2] + : [ibcInfo.chain_2, ibcInfo.chain_1]; + assert.equal(from.chain_name, name); + const transferChannels = ibcInfo.channels.filter( + c => + c.chain_1.port_id === 'transfer' && + // @ts-expect-error tags does not specify keys + c.tags?.preferred, + ); + if (transferChannels.length === 0) { + console.warn( + 'no transfer channel for [', + from.chain_name, + to.chain_name, + ']', + '(skipping)', + ); + return []; + } + if (transferChannels.length > 1) { + console.warn( + 'multiple preferred transfer channels [', + from.chain_name, + to.chain_name, + ']:', + transferChannels, + '(choosing first)', + ); + } + const [channel] = transferChannels; + const [channelFrom, channelTo] = fromChain1 + ? [channel.chain_1, channel.chain_2] + : [channel.chain_2, channel.chain_1]; + const record = { + id: /** @type {IBCConnectionID} */ (from.connection_id), + client_id: from.client_id, + counterparty: { + client_id: to.client_id, + connection_id: /** @type {IBCConnectionID} */ (to.connection_id), + }, + state: IBCConnectionState.STATE_OPEN, // XXX presumably + transferChannel: { + channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), + portId: channelFrom.port_id, + counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), + counterPartyPortId: channelTo.port_id, + // FIXME mapping, our guard expects a numerical enum + ordering: Order.ORDER_NONE_UNSPECIFIED, + state: IBCChannelState.STATE_OPEN, // XXX presumably + version: channel.version, + }, + }; + const destChainId = chainInfo[to.chain_name].chainId; + return [destChainId, record]; +} + +/** + * Converts the given chain info to our local config format + * + * @param {Pick} registry + */ +export const convertChainInfo = async registry => { + /** @type {Record} */ + const chainInfo = {}; + + for (const chain of registry.chains) { + console.log('processing info', chain.chain_name); + chainInfo[chain.chain_name] = { + bech32Prefix: chain.bech32_prefix, + chainId: chain.chain_id, + stakingTokens: chain.staking?.staking_tokens, + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: chain.chain_name === 'osmosis', + }; + } + + // XXX probably easier to keep ibc separate + const ibcLookup = {}; + for (const ibc of registry.ibcData) { + ibcLookup[ibc.chain_1.chain_name] ||= []; + ibcLookup[ibc.chain_2.chain_name] ||= []; + + ibcLookup[ibc.chain_1.chain_name].push(ibc); + ibcLookup[ibc.chain_2.chain_name].push(ibc); + } + + const chainNames = registry.chains.map(c => c.chain_name).sort(); + + // iterate this after chainInfo is filled out + for (const name of chainNames) { + console.log('processing connections', name); + + const ibcData = ibcLookup[name]; + const connections = Object.fromEntries( + ibcData + .map(datum => toConnectionEntry(datum, name, chainInfo)) + .filter(entry => entry.length > 0) + // sort alphabetically for consistency + .sort(([a], [b]) => a.localeCompare(b)), + ); + chainInfo[name] = { ...chainInfo[name], connections }; + } + + // return object with insertion in alphabetical order of chain name + return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); +}; diff --git a/contract/utils/start-helper.js b/contract/utils/start-helper.js new file mode 100644 index 00000000..902c7194 --- /dev/null +++ b/contract/utils/start-helper.js @@ -0,0 +1,214 @@ +import { prepareAsyncFlowTools } from '@agoric/async-flow'; +import { prepareVowTools } from '@agoric/vow'; +import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { makeChainHub } from '../exos/chain-hub.js'; +import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; +import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; +import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; +import { prepareOrchestrator } from '../exos/orchestrator.js'; +import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; +import { makeOrchestrationFacade } from '../facade.js'; +import { makeZoeTools } from './zoe-tools.js'; +import { makeZcfTools } from './zcf-tools.js'; + +/** + * @import {LocalChain} from '@agoric/vats/src/localchain.js'; + * @import {TimerService, TimerBrand} from '@agoric/time'; + * @import {Baggage} from '@agoric/vat-data'; + * @import {NameHub} from '@agoric/vats'; + * @import {Remote} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; + */ + +/** + * @typedef {{ + * localchain: Remote; + * orchestrationService: Remote; + * storageNode: Remote; + * timerService: Remote; + * agoricNames: Remote; + * }} OrchestrationPowers + */ + +/** + * Helper that a contract start function can use to set up the objects needed + * for orchestration. + * + * TODO strip problematic operations from ZCF (e.g., getPayouts) + * + * @param {ZCF} zcf + * @param {Baggage} baggage + * @param {OrchestrationPowers} remotePowers + * @param {Marshaller} marshaller + * @internal + */ +export const provideOrchestration = ( + zcf, + baggage, + remotePowers, + marshaller, +) => { + // separate zones + const zones = (() => { + const zone = makeDurableZone(baggage); + return { + /** system names for async flow */ + asyncFlow: zone.subZone('asyncFlow'), + /** system names for orchestration implementation */ + orchestration: zone.subZone('orchestration'), + /** system names for chainHub */ + chainHub: zone.subZone('chainHub'), + /** system names for vows */ + vows: zone.subZone('vows'), + /** contract-provided names, and subzones */ + contract: zone.subZone('contract'), + }; + })(); + + const { agoricNames, timerService, localchain } = remotePowers; + + const vowTools = prepareVowTools(zones.vows); + + const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); + + const zoeTools = makeZoeTools(zcf, vowTools); + + const zcfTools = makeZcfTools(zcf, vowTools); + + const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); + const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( + zones.orchestration, + { + makeRecorderKit, + zcf, + timerService, + vowTools, + chainHub, + localchain, + zoeTools, + }, + ); + + const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { + vowTools, + }); + + const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( + zones.orchestration, + { + chainHub, + makeRecorderKit, + timerService, + vowTools, + zcf, + }, + ); + + const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { + makeCosmosOrchestrationAccount, + orchestration: remotePowers.orchestrationService, + storageNode: remotePowers.storageNode, + timer: remotePowers.timerService, + vowTools, + }); + + const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { + makeLocalOrchestrationAccountKit, + localchain: remotePowers.localchain, + // FIXME what path? + storageNode: remotePowers.storageNode, + agoricNames, + orchestration: remotePowers.orchestrationService, + timer: remotePowers.timerService, + vowTools, + }); + + const makeOrchestrator = prepareOrchestrator(zones.orchestration, { + chainHub, + makeLocalChainFacade, + makeRemoteChainFacade, + vowTools, + }); + + /** + * Create orchestrate functions in a specific zone, instead of the default + * `contract.orchestration` zone. This is used for modules that add their own + * orchestration functions (e.g., a Portfolio with orchestration flows for + * continuing offers) + * + * @param {Zone} zone + */ + const makeOrchestrateKit = zone => + makeOrchestrationFacade({ + zone, + zcf, + makeRecorderKit, + makeOrchestrator, + asyncFlowTools, + vowTools, + ...remotePowers, + }); + + // Create orchestrate functions for the default `contract.orchestration` zone + const defaultOrchestrateKit = makeOrchestrateKit( + zones.contract.subZone('orchestration'), + ); + + zcf.setTestJig(() => ({ + baggage, + chainHub, + })); + + return { + ...defaultOrchestrateKit, + makeOrchestrateKit, + chainHub, + vowTools, + asyncFlowTools, + zcfTools, + zoeTools, + zone: zones.contract, + }; +}; +harden(provideOrchestration); + +/** @typedef {Omit, 'zone'>} OrchestrationTools */ + +/** + * Simplifies contract functions for Orchestration by wrapping a simpler + * function with all the tools it needs in order to use Orchestration. + * + * @example + * + * ```js + * const contract = (zcf, privateArgs, zone, tools) => { ... }; + * export const start = withOrchestration(contract); + * ``` + * + * @template {Record} CT + * @template {OrchestrationPowers & { + * marshaller: Marshaller; + * }} PA + * @template R + * @param {( + * zcf: ZCF, + * privateArgs: PA, + * zone: Zone, + * tools: OrchestrationTools, + * ) => Promise} contractFn + * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a + * Zoe start function + */ +export const withOrchestration = + contractFn => async (zcf, privateArgs, baggage) => { + const { zone, ...tools } = provideOrchestration( + zcf, + baggage, + privateArgs, + privateArgs.marshaller, + ); + return contractFn(zcf, privateArgs, zone, tools); + }; +harden(withOrchestration); diff --git a/contract/utils/time.js b/contract/utils/time.js new file mode 100644 index 00000000..06f995ab --- /dev/null +++ b/contract/utils/time.js @@ -0,0 +1,48 @@ +import { E } from '@endo/far'; +import { TimeMath } from '@agoric/time'; + +/** + * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + */ + +export const SECONDS_PER_MINUTE = 60n; +export const MILLISECONDS_PER_SECOND = 1000n; +export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; +export const NANOSECONDS_PER_SECOND = 1_000_000_000n; + +/** + * XXX should this be durable? resumable? + * + * @param {Remote} timer + */ +export function makeTimestampHelper(timer) { + return harden({ + /** + * XXX do this need to be resumable / use Vows? + * + * Takes the current time from ChainTimerService and adds a relative time to + * determine a timeout timestamp in nanoseconds. Useful for + * {@link MsgTransfer.timeoutTimestamp}. + * + * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes + * @returns {Promise} Timeout timestamp in absolute nanoseconds + * since unix epoch + */ + async getTimeoutTimestampNS(relativeTime) { + const currentTime = await E(timer).getCurrentTimestamp(); + const timeout = + relativeTime || + TimeMath.coerceRelativeTimeRecord( + SECONDS_PER_MINUTE * 5n, + currentTime.timerBrand, + ); + return ( + TimeMath.addAbsRel(currentTime, timeout).absValue * + NANOSECONDS_PER_SECOND + ); + }, + }); +} + +/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/utils/zcf-tools.js b/contract/utils/zcf-tools.js new file mode 100644 index 00000000..d3843695 --- /dev/null +++ b/contract/utils/zcf-tools.js @@ -0,0 +1,35 @@ +/** + * @import {HostInterface} from '@agoric/async-flow'; + * @import {VowTools} from '@agoric/vow'; + * @import {ZcfTools} from '../types.js'; + */ + +import { M, mustMatch } from '@endo/patterns'; + +const HandlerShape = M.remotable('OfferHandler'); + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + * @returns {HostInterface} + */ +export const makeZcfTools = (zcf, vowTools) => + harden({ + makeInvitation(offerHandler, description, customDetails, proposalShape) { + mustMatch(offerHandler, HandlerShape); + return vowTools.watch( + zcf.makeInvitation( + offerHandler, + description, + customDetails, + proposalShape, + ), + ); + }, + atomicRearrange(transfers) { + zcf.atomicRearrange(transfers); + }, + assertUniqueKeyword(keyword) { + zcf.assertUniqueKeyword(keyword); + }, + }); diff --git a/contract/utils/zoe-tools.js b/contract/utils/zoe-tools.js new file mode 100644 index 00000000..a5cbbe38 --- /dev/null +++ b/contract/utils/zoe-tools.js @@ -0,0 +1,186 @@ +/** + * @file Helper functions for transferring payments between a LocalChainAccount + * and a ZCFSeat. + * + * Maintainers: This exists as an endowment for orchestrated async-flows so we + * can make use of E and promises. The logic for recovering partial failures + * is also an added convenience for developers. + * + * Functions are written using `asVow` and non-resumable promises as we expect + * each invocation to resolve promptly - there are no timers or interchain + * network calls. + * + * A promise resolved promptly is currently safe from being severed by an + * upgrade because we only trigger vat upgrades as the result of network + * input. + */ + +import { makeError, q, Fail } from '@endo/errors'; +import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; +import { E } from '@endo/far'; + +const { assign, keys, values } = Object; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {VowTools} from '@agoric/vow'; + * @import {LocalAccountMethods} from '../types.js'; + */ + +/** + * @typedef {{ + * invitationMakers: InvitationMakers; + * publicSubscribers: Record>; + * }} ResolvedContinuingOfferResult + * + * @see {ContinuingOfferResult} + */ + +/** + * @typedef {( + * srcSeat: ZCFSeat, + * localAccount: LocalAccountMethods, + * amounts: AmountKeywordRecord, + * ) => Promise} LocalTransfer + */ + +/** + * @typedef {( + * localAccount: LocalAccountMethods, + * destSeat: ZCFSeat, + * amounts: AmountKeywordRecord, + * ) => Promise} WithdrawToSeat + */ + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + */ +export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { + /** + * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the + * deposits fail, everything will be rolled back to the `srcSeat`. Supports + * multiple items in the `amounts` {@link AmountKeywordRecord}. + * + * @type {HostOf} + */ + const localTransfer = (srcSeat, localAccount, amounts) => + asVow(async () => { + !srcSeat.hasExited() || Fail`The seat cannot have exited.`; + const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); + const userSeat = await userSeatP; + zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); + tempSeat.exit(); + // TODO (#9541) get the userSeat into baggage so it's at least recoverable + // const userSeat = await subzone.makeOnce( + // 'localTransferHelper', + // async () => { + // const { zcfSeat: tempSeat, userSeat: userSeatP } = + // zcf.makeEmptySeatKit(); + // const uSeat = await userSeatP; + // // TODO how do I store in the place for this retryable? + // atomicTransfer(zcf, srcSeat, tempSeat, amounts); + // tempSeat.exit(); + // return uSeat; + // }, + // ); + + // Now all the `amounts` are accessible, so we can move them to the localAccount + const payments = await Promise.all( + keys(amounts).map(kw => E(userSeat).getPayout(kw)), + ); + const settleDeposits = await when( + allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), + ); + // if any of the deposits to localAccount failed, unwind all of the allocations + if (settleDeposits.find(x => x.status === 'rejected')) { + const amts = values(amounts); + const errors = []; + // withdraw the successfully deposited payments + const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { + if (x.status === 'rejected') { + errors.push(x.reason); + return payments[i]; + } + return E(localAccount).withdraw(amts[i]); + }); + + // return all payments to the srcSeat + const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); + const paymentKwr = harden( + keys(amounts).reduce( + (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + srcSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + throw makeError(`One or more deposits failed ${q(errors)}`); + } + // TODO #9541 remove userSeat from baggage + }); + + /** + * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any + * of the withdrawals fail, everything will be rolled back to the + * `srcLocalAccount`. Supports multiple items in the `amounts` + * {@link PaymentKeywordRecord} + * + * @type {HostOf} + */ + const withdrawToSeat = (localAccount, destSeat, amounts) => + asVow(async () => { + !destSeat.hasExited() || Fail`The seat cannot have exited.`; + + const settledWithdrawals = await when( + allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), + ); + + // if any of the withdrawals were rejected, unwind the successful ones + if (settledWithdrawals.find(x => x.status === 'rejected')) { + const returnPaymentVs = []; + const errors = []; + for (const result of settledWithdrawals) { + if (result.status === 'fulfilled') { + returnPaymentVs.push(E(localAccount).deposit(result.value)); + } else { + errors.push(result.reason); + } + } + await when(allVows(returnPaymentVs)); + throw makeError(`One or more withdrawals failed ${q(errors)}`); + } + // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat + const paymentKwr = harden( + keys(amounts).reduce( + (acc, kw, i) => + assign(acc, { + [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] + .value, + }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + destSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + }); + + return harden({ + localTransfer, + withdrawToSeat, + }); +}; + +/** @typedef {ReturnType} ZoeTools */ diff --git a/yarn.lock b/yarn.lock index 589e7ef3..b59e68ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,13 +15,6 @@ __metadata: languageName: node linkType: hard -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 10c0/53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f - languageName: node - linkType: hard - "@adraffy/ens-normalize@npm:1.10.0": version: 1.10.0 resolution: "@adraffy/ens-normalize@npm:1.10.0" @@ -29,14 +22,21 @@ __metadata: languageName: node linkType: hard -"@agoric/access-token@npm:0.4.22-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.4.22-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/access-token@npm:0.4.22-upgrade-17-dev-ec448b0.0" +"@adraffy/ens-normalize@npm:^1.10.1": + version: 1.11.0 + resolution: "@adraffy/ens-normalize@npm:1.11.0" + checksum: 10c0/5111d0f1a273468cb5661ed3cf46ee58de8f32f84e2ebc2365652e66c1ead82649df94c736804e2b9cfa831d30ef24e1cc3575d970dbda583416d3a98d8870a6 + languageName: node + linkType: hard + +"@agoric/access-token@npm:0.4.22-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.4.22-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/access-token@npm:0.4.22-upgrade-18-dev-bf39b10.0" dependencies: n-readlines: "npm:^1.0.0" proper-lockfile: "npm:^4.1.2" tmp: "npm:^0.2.1" - checksum: 10c0/668cd1fcf4661da652aa66af88c0deb65e82d8e2b72cd12824ab036edb651130961dd7266f95b624756cf5371bd0e7094bc9935ff7eaa0b34a0fe3404ef583ab + checksum: 10c0/825688202025ddde3e90b3d52cab71cbc153628c3b9ed5280d67fd540961851de01e6f41df8103772a28c35ad708a0b7396407af3bbfa4429e84a4902e30777f languageName: node linkType: hard @@ -58,14 +58,7 @@ __metadata: languageName: node linkType: hard -"@agoric/assert@npm:^0.6.1-u11wf.0": - version: 0.6.1-upgrade-16a-dev-fb592e4.0 - resolution: "@agoric/assert@npm:0.6.1-upgrade-16a-dev-fb592e4.0" - checksum: 10c0/cb43433b33e74db3b9dbb01d3be2d737002eda0af4a387725355bcd22edcbda606e062f295a75722a7bb68705adcd329126d78c0695143967b94352dfe1d566e - languageName: node - linkType: hard - -"@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/async-flow@npm:^0.1.1-u17.1": +"@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.1.1-upgrade-17-dev-ec448b0.0 resolution: "@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0" dependencies: @@ -84,6 +77,25 @@ __metadata: languageName: node linkType: hard +"@agoric/async-flow@npm:^0.1.1-u17.1": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/async-flow@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/6f754d60efe6516f53c4e89c500954dd421c8bb6a742fe56cc861dcc91bb63aab3c5a8a8b71f90452eab6d9f84fa421d9392e0b26102ff6cef6247c008bf794f + languageName: node + linkType: hard + "@agoric/babel-generator@npm:^7.17.4, @agoric/babel-generator@npm:^7.17.6": version: 7.17.6 resolution: "@agoric/babel-generator@npm:7.17.6" @@ -95,6 +107,21 @@ __metadata: languageName: node linkType: hard +"@agoric/base-zone@npm:0.1.1-dev-d1562a1.0+d1562a1": + version: 0.1.1-dev-d1562a1.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-d1562a1.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/312265b75f8151bac076d24ba0c4ebfb7eafa74f10f2906dc066d072474c93ff19411a6b6653a7f3deddf3fc0daa0e255073430a6cce218c55a3d9fdca80dfdc + languageName: node + linkType: hard + "@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.1.1-upgrade-17-dev-ec448b0.0 resolution: "@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0" @@ -110,17 +137,47 @@ __metadata: languageName: node linkType: hard -"@agoric/cache@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/cache@npm:0.3.3-upgrade-17-dev-ec448b0.0" +"@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.1.1-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - checksum: 10c0/062a3b1942ed480e9d4ddfc2d53fc44c4f9d325e82fbba4ae1467d2d42162a92038c5dbce016d1872d688cb71da132bbd9277a282e261f6984aa597ef15e9c43 + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/96a42740cf32bd841a519ccc75b465f35381cf009a413142211f3f916c94ed2df77c87bea30957bef6a0c3791cd98005906b36fd709198ddbf3f04a0193b4996 + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/base-zone@npm:^0.1.1-u18.0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/0df4eba4133cf41c8a3e4edbfe5ba74a0976fde58687c50a1fb32b932160538ec1af077495c375b3ee223df271086500e571b02086275c8ea5be2d5c6c658702 + languageName: node + linkType: hard + +"@agoric/cache@npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.3.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/cache@npm:0.3.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/fb8c24680abdcd15c75ce193a11dda0772503ed681681505ab71141fc6389f8fcc1f45f284bb425abd108040177b0580f6739aa05b73d4e1f01990973d400299 languageName: node linkType: hard @@ -138,25 +195,45 @@ __metadata: languageName: node linkType: hard -"@agoric/casting@npm:0.4.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/casting@npm:^0.4.3-u13.0": - version: 0.4.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/casting@npm:0.4.3-upgrade-17-dev-ec448b0.0" +"@agoric/casting@npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.4.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/casting@npm:0.4.3-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" "@cosmjs/encoding": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" "@cosmjs/stargate": "npm:^0.32.3" "@cosmjs/tendermint-rpc": "npm:^0.32.3" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/lockdown": "npm:^1.0.10" - "@endo/marshal": "npm:^1.5.3" - "@endo/promise-kit": "npm:^1.1.5" - node-fetch: "npm:^2.6.0" - checksum: 10c0/cefa79ff785f9d06c29fe920d56ac808b40436fdd7cdaf2e8058e7201967d9c09339a139cf4646b9508e3a5a7d0fa1ff0000f04be855f7c76f361732fc0019e7 + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/lockdown": "npm:^1.0.12" + "@endo/marshal": "npm:^1.6.1" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/a268b949154c0a7ac0c1b1682881ee0276bc61598f5f09d50ea5ed2106079416cc2831364d5a274775848247ef5368f503ef993695ae51627f59adf269f89c40 + languageName: node + linkType: hard + +"@agoric/casting@npm:0.4.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/casting@npm:^0.4.3-u13.0": + version: 0.4.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/casting@npm:0.4.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@cosmjs/encoding": "npm:^0.32.3" + "@cosmjs/proto-signing": "npm:^0.32.3" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/lockdown": "npm:^1.0.12" + "@endo/marshal": "npm:^1.6.1" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/48ffbc1ac898bd012b66a40c3498d99cac5b39c84ef19da4ee38c34eaf72dec9bbd3dc24d4a3c581132805565a48bbaee00c490003bf5e67f0c1e80a9ee2e0f0 languageName: node linkType: hard @@ -191,6 +268,16 @@ __metadata: languageName: node linkType: hard +"@agoric/cosmic-proto@npm:0.4.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.4.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/cosmic-proto@npm:0.4.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/95f603201792d7ff36e834efe5c1cbd6949c23535b953c9fa5ab00e9bb8f463985309f0d6048447d56032e3678127ebe224793c0e5d2e3725e01eec0797e8ed9 + languageName: node + linkType: hard + "@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.5.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0" @@ -201,30 +288,50 @@ __metadata: languageName: node linkType: hard -"@agoric/deploy-script-support@npm:^0.10.4-u17.1": - version: 0.10.4-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/deploy-script-support@npm:0.10.4-upgrade-17-dev-ec448b0.0" +"@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.5.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/import-manager": "npm:0.3.12-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/zip": "npm:^1.0.7" - checksum: 10c0/83603c12a4de1e9f5ae3580dd9143eeded85810b722ccdae16eeef023b8918f8b6a4d2f71810bf37648f4e70c819e7269b6c45dc668959122ce4f51b3d34f67e + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/2f1da76916fad1c4de4f0a2330c4618ce3a9f7cc13ea50c8e616190919f85b2f07842f70980a183fe7d908f66429524edc67d52c249af4a65d4152b3bf1974d8 languageName: node linkType: hard -"@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1": +"@agoric/cosmic-proto@npm:latest": + version: 0.5.0-u18.1 + resolution: "@agoric/cosmic-proto@npm:0.5.0-u18.1" + dependencies: + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/56a40d7021396274835135bdc4c1839e5d9c59c2ad541b9cf3d3a5cc20c7e0fa1866e166cd64b218beb6fd8e05a0cfe8a4e61a2ff3bbe75a9e61b0a6af84396f + languageName: node + linkType: hard + +"@agoric/deploy-script-support@npm:^0.10.4-u17.1": + version: 0.10.4-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/deploy-script-support@npm:0.10.4-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/import-manager": "npm:0.3.12-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/zip": "npm:^1.0.8" + checksum: 10c0/5b8c28f081e0ef6f7c6b362b99197137a9a87cad79f09ce755eb3ed47220fa4d8711cc423a83c8d7177b22594c1387954ec7684957c21121eb371cae9d0388ae + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.16.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -243,6 +350,44 @@ __metadata: languageName: node linkType: hard +"@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.16.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/ac40fd99b27b546f4a8538d3f2228c1c8614cf52ad40319f6e69a078476a105b565d9f02dfbda10c8461ef6cff1250e6df49e25b251707c12019bf2879e7b549 + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1": + version: 0.16.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/7566481669eb6c39bc6a5b379f5cc1d7498fa5d90311b5c01ff3f72f7a51d6e65ee59cd9587c226179504473d88be20adcfaeaeab0482cb3b46f8f0612455965 + languageName: node + linkType: hard + "@agoric/ertp@npm:^0.16.2": version: 0.16.2 resolution: "@agoric/ertp@npm:0.16.2" @@ -262,10 +407,10 @@ __metadata: linkType: hard "@agoric/eslint-config@npm:^0.4.1-u17.1": - version: 0.4.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/eslint-config@npm:0.4.1-upgrade-17-dev-ec448b0.0" + version: 0.4.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/eslint-config@npm:0.4.1-upgrade-18-dev-ef001c0.0" peerDependencies: - "@endo/eslint-plugin": ^2.2.1 + "@endo/eslint-plugin": ^2.2.2 "@jessie.js/eslint-plugin": ^0.4.1 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 @@ -277,11 +422,11 @@ __metadata: eslint-plugin-prettier: ^5.0.0 prettier: ^3.0.3 typescript-eslint: ^7.13.1 - checksum: 10c0/4c95f380553a7218001d6e1ae6a7e11482c7f5e260be20de4e346732593a4b95b77e24e2dee33192b2cfaf7b91ef59e8d3e49eb27a6bee8e29def800041bf44e + checksum: 10c0/170140325359540e2a1c6684c0f6a0adabd645d85c416299ca243ecc7cabfac1ae26b1a9b30356da53dabd061161c74fb16cb133809b99f667fb3c23f1536449 languageName: node linkType: hard -"@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/governance@npm:^0.10.4-u17.1": +"@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.10.4-upgrade-17-dev-ec448b0.0 resolution: "@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0" dependencies: @@ -305,6 +450,54 @@ __metadata: languageName: node linkType: hard +"@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.4-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/7e9863d71c2bffe632649da59d8f9cc2d95a4cc09eb27691e66442fe343ad7ee95c1978fb5c20981f1617d694ac3eda54ff1b12ae6b9b33e28b3a37b2d2de222 + languageName: node + linkType: hard + +"@agoric/governance@npm:0.10.4-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/governance@npm:^0.10.4-u17.1": + version: 0.10.4-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/governance@npm:0.10.4-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/1828672b4b731a0fca06a03e2d462c3189ef2ed79487ebad6cbe6bd3f19546509f53c036176b87ec6f83231d859e64418cb4f9c3ed5b39f490a8fa2654272d50 + languageName: node + linkType: hard + "@agoric/governance@npm:^0.10.3": version: 0.10.3 resolution: "@agoric/governance@npm:0.10.3" @@ -329,35 +522,35 @@ __metadata: languageName: node linkType: hard -"@agoric/import-manager@npm:0.3.12-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.12-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/import-manager@npm:0.3.12-upgrade-17-dev-ec448b0.0" - checksum: 10c0/3be6ffbf106dbd6d9b3bdc367b31641e5f4ec1b4e6180bc4b524f29caf89a5f3cecad9845d7ec24e5201754082f330d6b20d90d3cdb0f66da141914c31136b0e +"@agoric/import-manager@npm:0.3.12-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.3.12-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/import-manager@npm:0.3.12-upgrade-18-dev-ef001c0.0" + checksum: 10c0/70d202ad0b64ddd0f04ca4820e2cf829cb8b145fda6afea8125d292312de7d8be8ddc1f2ba6e15597e220b2ea197d68103a1e76baf27c5100c0ef83825b05d99 languageName: node linkType: hard -"@agoric/inter-protocol@npm:0.17.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/inter-protocol@npm:^0.17.0-u17.1": - version: 0.17.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/inter-protocol@npm:0.17.0-upgrade-17-dev-ec448b0.0" +"@agoric/inter-protocol@npm:0.17.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/inter-protocol@npm:^0.17.0-u17.1": + version: 0.17.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/inter-protocol@npm:0.17.0-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/governance": "npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/captp": "npm:^4.3.0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/captp": "npm:^4.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" jessie.js: "npm:^0.3.4" - checksum: 10c0/5a709d4889f39e56bc25d41c485cc0910ffd38829f91284de1a3688b993f2b08d29a6a71b0add834a3df50ee2360abc95a4407d7c448f6e8e1457294ba4e298d + checksum: 10c0/d46793425b122c8c997831d461352653137787094b5eec6649bb01e4d080db53a81fd69b67bc705398e3e0ff05f74984f3e1018b6ceff0cad700f857da34a28d languageName: node linkType: hard @@ -386,7 +579,47 @@ __metadata: languageName: node linkType: hard -"@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/internal@npm:^0.4.0-u14.0, @agoric/internal@npm:^0.4.0-u17.1": +"@agoric/internal@npm:0.3.3-dev-d1562a1.0+d1562a1": + version: 0.3.3-dev-d1562a1.0 + resolution: "@agoric/internal@npm:0.3.3-dev-d1562a1.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-d1562a1.0+d1562a1" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/9c03201492935032a7497aba420cf2e1feff814ef40bf656cb7d4e10794b9fd6d173463118569a06f5110d35c34daffee0a2fbd64478345d81a3a79713303021 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.3.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/internal@npm:0.3.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/570f7168206cce15e52574f8e5f241945866a83fe3ccb20ce99e09567961c5878d44a3a5486221865a727499d1219c5c4d65c637da6b934497dc592307e0d34a + languageName: node + linkType: hard + +"@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.4.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -406,6 +639,26 @@ __metadata: languageName: node linkType: hard +"@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/internal@npm:^0.4.0-u17.1": + version: 0.4.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/629845b02bbd185678fdf83baac2eea878a54ca002f9d105eb3000bf95e31a9fdefa9f15e9ef278a9058d10f7a32a978df63f264ef9cac524891f44acec641d3 + languageName: node + linkType: hard + "@agoric/internal@npm:^0.3.2": version: 0.3.2 resolution: "@agoric/internal@npm:0.3.2" @@ -433,6 +686,62 @@ __metadata: languageName: node linkType: hard +"@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.1.1-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/2dc5d6dc0c9765e63e83dccb660797e0c70d702bad826c35cc481685903e43eb3a7a3e48bd2f49915e3b3f261395b0786b3e1fb820ee9c44fb4b7c997cc3386e + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/5a4230e63cb585a9c4268bcf55091129fdb27f9cb9d97dc72bb6de9de7183ccb2a16dc2641475888c1065c96ab1f81700000f9a34368a0e3cd013065b9ba82c2 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-dev-d1562a1.0": + version: 0.1.1-dev-d1562a1.0 + resolution: "@agoric/network@npm:0.1.1-dev-d1562a1.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-d1562a1.0+d1562a1" + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@agoric/vat-data": "npm:0.5.3-dev-d1562a1.0+d1562a1" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/94602d4a769b9cc8b05e961961771ed0be0fa6bfc8d2bd71e303cdf20313433ced0bb97ff4d36e93ca390c33c47afc7ae8a491c49f2d8b1b733f800dd9ec5223 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/network@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/f33dac0dcb7a9d04a982ba57a1906281c7780b904148199c22bcad4ba71f1b7f4eaec2506508d29015d044452b956786ee6c1d199bc1662ced184b32b87ca8ae + languageName: node + linkType: hard + "@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.2.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0" @@ -450,6 +759,38 @@ __metadata: languageName: node linkType: hard +"@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.2.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/62b6f8354b2982d444a2cd48f9eee5dfc5d36a7b084eaa01a69c675b2694af7f049dc1fb8d8901a4ceb01e945585f802cd0aba5a771ea826822751396662e3bf + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/notifier@npm:^0.6.3-dev-8c14632.0": + version: 0.6.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/notifier@npm:0.6.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/3b840205b44b389acd7c3fc0faa6972a28d93536ebbc8171bd38a5c211395346e383eb0efd5dffb38e225cd82a23dec9a99ca8e652c81b7a27b2c72e156c6aa8 + languageName: node + linkType: hard + "@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.7.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0" @@ -465,6 +806,21 @@ __metadata: languageName: node linkType: hard +"@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.7.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/5894cfcc10dd8cdcf92db2f1c33589af5ec4c82810cef33a7a77703b2306d0d7b8db3bd1ba87a595c60e6679e4a23d88d6ba53bbe1aa1438f20a0a2bb19d66fa + languageName: node + linkType: hard + "@agoric/notifier@npm:^0.6.2": version: 0.6.2 resolution: "@agoric/notifier@npm:0.6.2" @@ -482,23 +838,6 @@ __metadata: languageName: node linkType: hard -"@agoric/notifier@npm:^0.6.3-dev-8c14632.0": - version: 0.6.3-u14.0 - resolution: "@agoric/notifier@npm:0.6.3-u14.0" - dependencies: - "@agoric/assert": "npm:^0.6.1-u11wf.0" - "@agoric/internal": "npm:^0.4.0-u14.0" - "@agoric/store": "npm:^0.9.3-u14.0" - "@agoric/swing-store": "npm:^0.9.2-u14.0" - "@agoric/swingset-vat": "npm:^0.32.3-u14.0" - "@agoric/vat-data": "npm:^0.5.3-u14.0" - "@endo/far": "npm:0.2.18" - "@endo/marshal": "npm:0.8.5" - "@endo/promise-kit": "npm:0.2.56" - checksum: 10c0/55869104b0ff17a387f00dded01f94e1b7cfbecf45604eef75c2126eb6c3e68881092b8c413ae56fcff98d2260fb5b6e59a7b8256590673e624cb6333d528d14 - languageName: node - linkType: hard - "@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0": version: 0.2.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0" @@ -600,27 +939,27 @@ __metadata: languageName: node linkType: hard -"@agoric/smart-wallet@npm:0.5.4-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/smart-wallet@npm:^0.5.4-u17.1": - version: 0.5.4-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/smart-wallet@npm:0.5.4-upgrade-17-dev-ec448b0.0" +"@agoric/smart-wallet@npm:0.5.4-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.5.4-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/casting": "npm:0.4.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/066430978f56f1c2628084ec8935d5eed92cdf43000c07007b37cafc2713039982c9a9cbd09c8aa1954d6d70d60ebce07e0c83a2dbbfea9389af7009c0fd0a5e + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/852a0f57814496356996f0a095748758ac5270c28a6234e75355452b8df0c743ab151cb05063976d421ea5027b0db1b6b158f8da8bb893076391bed87d80165f languageName: node linkType: hard @@ -647,6 +986,30 @@ __metadata: languageName: node linkType: hard +"@agoric/smart-wallet@npm:^0.5.4-u17.1": + version: 0.5.4-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vats": "npm:0.15.2-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/ff0dde21aa164afb661f6ab728765518fe2abc9c2d4ad672ccf1f4e4fa4222085e3f82efbb3409f90f61673fd2bf759f62b14f1c62d5e8b0ca723bfddc65d0b2 + languageName: node + linkType: hard + "@agoric/spawner@npm:^0.6.8": version: 0.6.8 resolution: "@agoric/spawner@npm:0.6.8" @@ -659,7 +1022,20 @@ __metadata: languageName: node linkType: hard -"@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/store@npm:^0.9.3-u14.0, @agoric/store@npm:^0.9.3-u17.1": +"@agoric/store@npm:0.9.3-dev-d1562a1.0+d1562a1": + version: 0.9.3-dev-d1562a1.0 + resolution: "@agoric/store@npm:0.9.3-dev-d1562a1.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/e970c4a39dc9261e8f466dcd4ad54e30cd17a81c76d6e28fe3130fe09b1a19d3cd5a5d047052da67e51f1d68babb5f05def469bf89be3ce2c1b638ad5c5cf61d + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.9.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -672,6 +1048,32 @@ __metadata: languageName: node linkType: hard +"@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.9.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/1b96441baba7d1b3c50d09f8a34e267330069a708c00a91451445c4f96f8cdea1238553385eae0085d49e50cf2c6f18244e77720c5b4e4215a466d74488700d8 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u17.1": + version: 0.9.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/8ca7d3a1b4fe909b98146d6c91c0a79a812f1df27ce298d791a0a1b1224f344eacb756be7a6c5c5abc16a875855b99eeddb0d058bcdcea01a55ccf0e2b8bc8ff + languageName: node + linkType: hard + "@agoric/store@npm:^0.9.2": version: 0.9.2 resolution: "@agoric/store@npm:0.9.2" @@ -690,7 +1092,22 @@ __metadata: languageName: node linkType: hard -"@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/swing-store@npm:^0.9.2-u14.0": +"@agoric/swing-store@npm:0.10.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swing-store@npm:0.10.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/1348d898ebadf1f5689e0357d35bb4677a2a68b27b8b00ab3b24dafc70faff96e97d792698b2c172ddd32bf6e6b77f6799d778513968d2dcd2a1089646d8ca3e + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.9.2-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0" dependencies: @@ -705,6 +1122,21 @@ __metadata: languageName: node linkType: hard +"@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.9.2-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/3b43376a909e608b2e7503ce6e3e52de8c927aec0d137031bd39aaa5380c7825b3148da7b36d309b3850548f2aa9a08ec7e0c51da0400aac7a972afcf4ccf1ea + languageName: node + linkType: hard + "@agoric/swing-store@npm:^0.9.1": version: 0.9.1 resolution: "@agoric/swing-store@npm:0.9.1" @@ -720,7 +1152,28 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/swingset-liveslots@npm:^0.10.3-u14.0": +"@agoric/swingset-liveslots@npm:0.10.3-dev-d1562a1.0+d1562a1": + version: 0.10.3-dev-d1562a1.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-d1562a1.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-d1562a1.0+d1562a1" + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/49130ffe7b99f7fb1effa5cb603a8f51bf95df9fab71cb66da6a70e39cfb0a52664d4442cb6bcc593c4412f4a4156eb71ae1070733ba518edc688ff54364f84f + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.10.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -741,6 +1194,48 @@ __metadata: languageName: node linkType: hard +"@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/bc919c04de8afc89bf377e5959b4b9d80216cba0467ceb8deddd64ded59e2ff6020437ea02bc7074472dfed85e7f20855caf8151928b314e134b916e0d1cfb7d + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.10.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/5f2f024274f69112d29b242f86c5db630f2285bbfc4dfdf776af14bcd50d04795e30978753ce74f70021f1a582aed778e6b2dc1ea636cd0955bd6519f326b48a + languageName: node + linkType: hard + "@agoric/swingset-liveslots@npm:^0.10.2": version: 0.10.2 resolution: "@agoric/swingset-liveslots@npm:0.10.2" @@ -765,6 +1260,54 @@ __metadata: languageName: node linkType: hard +"@agoric/swingset-vat@npm:0.32.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.32.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/kmarshal": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swing-store": "npm:0.9.2-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/xsnap": "npm:0.14.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/compartment-mapper": "npm:^1.3.1" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/ses-ava": "npm:^1.2.7" + "@endo/stream": "npm:^1.2.7" + "@endo/zip": "npm:^1.0.8" + ansi-styles: "npm:^6.2.1" + anylogger: "npm:^0.21.0" + better-sqlite3: "npm:^9.1.1" + import-meta-resolve: "npm:^2.2.1" + microtime: "npm:^3.1.0" + semver: "npm:^6.3.0" + tmp: "npm:^0.2.1" + yargs-parser: "npm:^21.1.1" + peerDependencies: + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/6c53fb399bb6f500a0696c6c98c5d71b2d51b38a85ebf6088b4e98ed90f155aee765d0f24edb878f494aed643dc64c0b6376b5d04a5b4cedae42f2477318683f + languageName: node + linkType: hard + "@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.33.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0" @@ -813,6 +1356,54 @@ __metadata: languageName: node linkType: hard +"@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.33.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/kmarshal": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swing-store": "npm:0.10.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/xsnap": "npm:0.14.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/compartment-mapper": "npm:^1.3.1" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/ses-ava": "npm:^1.2.7" + "@endo/stream": "npm:^1.2.7" + "@endo/zip": "npm:^1.0.8" + ansi-styles: "npm:^6.2.1" + anylogger: "npm:^0.21.0" + better-sqlite3: "npm:^9.1.1" + import-meta-resolve: "npm:^2.2.1" + microtime: "npm:^3.1.0" + semver: "npm:^6.3.0" + tmp: "npm:^0.2.1" + yargs-parser: "npm:^21.1.1" + peerDependencies: + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/6b556ea7e54d4706c551508c293d2546c661f1b49182af29f5ddeb8f94f89fa33dd5ba894d29ee603f1a33d54605df10b3af8f4d9a29762ac151eb7a0a0aa760 + languageName: node + linkType: hard + "@agoric/swingset-vat@npm:^0.32.2": version: 0.32.2 resolution: "@agoric/swingset-vat@npm:0.32.2" @@ -855,55 +1446,27 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-vat@npm:^0.32.3-u14.0": - version: 0.32.3-u14.0 - resolution: "@agoric/swingset-vat@npm:0.32.3-u14.0" - dependencies: - "@agoric/assert": "npm:^0.6.1-u11wf.0" - "@agoric/internal": "npm:^0.4.0-u14.0" - "@agoric/store": "npm:^0.9.3-u14.0" - "@agoric/swing-store": "npm:^0.9.2-u14.0" - "@agoric/swingset-liveslots": "npm:^0.10.3-u14.0" - "@agoric/swingset-xsnap-supervisor": "npm:^0.10.3-u14.0" - "@agoric/time": "npm:^0.3.3-u14.0" - "@agoric/vat-data": "npm:^0.5.3-u14.0" - "@agoric/xsnap": "npm:^0.14.3-u14.0" - "@agoric/xsnap-lockdown": "npm:^0.14.1-u13.0" - "@endo/base64": "npm:0.2.31" - "@endo/bundle-source": "npm:2.5.2-upstream-rollup" - "@endo/captp": "npm:3.1.1" - "@endo/check-bundle": "npm:0.2.18" - "@endo/compartment-mapper": "npm:0.8.4" - "@endo/eventual-send": "npm:0.17.2" - "@endo/far": "npm:0.2.18" - "@endo/import-bundle": "npm:0.3.4" - "@endo/init": "npm:0.5.56" - "@endo/marshal": "npm:0.8.5" - "@endo/nat": "npm:4.1.27" - "@endo/promise-kit": "npm:0.2.56" - "@endo/ses-ava": "npm:0.2.40" - "@endo/zip": "npm:0.2.31" - ansi-styles: "npm:^6.2.1" - anylogger: "npm:^0.21.0" - import-meta-resolve: "npm:^2.2.1" - microtime: "npm:^3.1.0" - semver: "npm:^6.3.0" - tmp: "npm:^0.2.1" - peerDependencies: - ava: ^5.2.0 - bin: - vat: bin/vat - checksum: 10c0/8c75cab17d8352e49f14f9865ffa696e8d856474b8ec878ed2e464d74bc0002026f72e7ce8149f921eba0db17f99676588ce952d6f58a8c92971c5b969a41d24 - languageName: node - linkType: hard - -"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/swingset-xsnap-supervisor@npm:^0.10.3-u14.0": +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.10.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0" checksum: 10c0/0b07fb3a628f96a5e32e26db4d50fb27897340b8759405f0315e15ca60a31c484edee84853fe9d8cdcf51b2f29ab79dfe5f86eeda0358e8462cedb12c099534f languageName: node linkType: hard +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0" + checksum: 10c0/947bc103a17f14a510642329229cab6d781e34af0e047db232d9df7f9e38addd89e4291e7c5c11f1dd894c46213a694b4ab0efeb4f9cebefe3a596908d25ded2 + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.10.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-ef001c0.0" + checksum: 10c0/82da2192be835df39f2d11ab7b6dacbd42a871ee8b3cf8bd27ec8f1b60e92dd2414fefe446f5992d9ffad77ac8096ab31c11952caee287fe9df8f3928d55a400 + languageName: node + linkType: hard + "@agoric/swingset-xsnap-supervisor@npm:^0.10.2": version: 0.10.2 resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.2" @@ -911,7 +1474,7 @@ __metadata: languageName: node linkType: hard -"@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/time@npm:^0.3.3-u14.0, @agoric/time@npm:^0.3.3-u17.1": +"@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.3.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -923,6 +1486,30 @@ __metadata: languageName: node linkType: hard +"@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.3.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/06841385d5020152656b1f8a5762e71c73f051ef35dc5f5a5d16ce0bb1812b9ffe9dbff4d176fc260094a8341d0a1dd4d565cb72bee89e1dbea3412693cefa2b + languageName: node + linkType: hard + +"@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/time@npm:^0.3.3-u17.1": + version: 0.3.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/ca2332206ee1c794918b4e135c924fb52c472f464f5f7bbd17d24d69e20d81485089b7629137f08416accddff0847bf5b4a0a1303be0a514a3c9a1fc9bf2a83e + languageName: node + linkType: hard + "@agoric/time@npm:^0.3.2": version: 0.3.2 resolution: "@agoric/time@npm:0.3.2" @@ -934,7 +1521,21 @@ __metadata: languageName: node linkType: hard -"@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/vat-data@npm:^0.5.3-u14.0, @agoric/vat-data@npm:^0.5.3-u17.1": +"@agoric/vat-data@npm:0.5.3-dev-d1562a1.0+d1562a1": + version: 0.5.3-dev-d1562a1.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-d1562a1.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-d1562a1.0+d1562a1" + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-d1562a1.0+d1562a1" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/bf1026d6966184476bfbd040d2eefcfbcbd682b25e5376fb6846ea776b7b191f9f1cea0c9d8d74897aaec90c34a657d85da3cb4ba148256266ec115679d02666 + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.5.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -948,6 +1549,34 @@ __metadata: languageName: node linkType: hard +"@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.5.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/1d79f0bd47e2198eb61bae67b638540076fad31d26cbce078617936132f0802dcb26f650c3ed2c9786f7d3227d7cd829bd3ac8c3cdddea76e3fb5a22bf82dcc0 + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/vat-data@npm:^0.5.3-u17.1, @agoric/vat-data@npm:^0.5.3-u18.0": + version: 0.5.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/91ed6756e482a6718f9b49139a99a99e87aaaad312fe744088b117d86fd960485b79757592102b44038c376a1664a1e86ad5e9e5671e0268e8524cec65d7b983 + languageName: node + linkType: hard + "@agoric/vat-data@npm:^0.5.2": version: 0.5.2 resolution: "@agoric/vat-data@npm:0.5.2" @@ -959,7 +1588,38 @@ __metadata: languageName: node linkType: hard -"@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/vats@npm:^0.16.0-u17.1": +"@agoric/vats@npm:0.15.2-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.15.2-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/vats@npm:0.15.2-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.4.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/network": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-vat": "npm:0.32.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/3ea78bf0c688cdff2d925b09ccd0cdb3927b78b93bdc1639535d112029c03da4160f007ea24adb5e0802995abc35b391f5a2d6a28a8fb7db6b27dc330e76fdd2 + languageName: node + linkType: hard + +"@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.16.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -990,6 +1650,37 @@ __metadata: languageName: node linkType: hard +"@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vats@npm:^0.16.0-u17.1": + version: 0.16.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/network": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/7a1d0a15d51d78394e3ef03c19adf6a5b31a6565c2ce8bdbc7495d2ed729672e0f069dd9ada490de9981409484fb359c8e11b6d5059a07a94704c652179b4fc7 + languageName: node + linkType: hard + "@agoric/vats@npm:^0.15.1": version: 0.15.1 resolution: "@agoric/vats@npm:0.15.1" @@ -1018,7 +1709,23 @@ __metadata: languageName: node linkType: hard -"@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/vow@npm:^0.2.0-u17.1": +"@agoric/vow@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/vow@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/67613e5832eacef41f13bd3e2072b734cbe804215765b2a32178f63aa16e614fc33f5084877b2e5c9aeb4d0ac69d3650d96b338d81c0237c09b85a43f4dd159c + languageName: node + linkType: hard + +"@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.2.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -1034,6 +1741,22 @@ __metadata: languageName: node linkType: hard +"@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vow@npm:^0.2.0-u17.1": + version: 0.2.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/e03fe8a5dec4472333eff34815dc0dea45030918763ec8a0628625aae45912957d02043e07e4b0a180bd3cc59116ce674a76aafe9a4d7cbcce1d19864dd850e5 + languageName: node + linkType: hard + "@agoric/web-components@npm:0.16.1-dev-e6f79e0.0+e6f79e0": version: 0.16.1-dev-e6f79e0.0 resolution: "@agoric/web-components@npm:0.16.1-dev-e6f79e0.0" @@ -1052,13 +1775,27 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/xsnap-lockdown@npm:^0.14.1-u13.0": +"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.14.1-upgrade-17-dev-ec448b0.0 resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0" checksum: 10c0/78c3bab502052987c88e3e3fffe87aa599a4c47a0f87ba32e5f5722d7a45be6c519eb6305f323ff877e2a911d273a03a9eebd3c9c57b7815b9510bd65ea9cb81 languageName: node linkType: hard +"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.14.1-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0" + checksum: 10c0/17dbbf38efe154128208fe64a96a8864fec25515582e685b32b91f72144e3e8969ce3da5d32b65214aedf5ba9838904b009583f96f17cf623f79fde8f70d2b5e + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.14.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-ef001c0.0" + checksum: 10c0/4b895d2f7c0fff1ec900b03a5c66a37d3138262cd70dc5607ea9f5d904a87d056aa55e8d03cc45fb9ac7705d99f64afc9ad66ded71705b6a66ff23d129228053 + languageName: node + linkType: hard + "@agoric/xsnap-lockdown@npm:^0.14.0": version: 0.14.0 resolution: "@agoric/xsnap-lockdown@npm:0.14.0" @@ -1066,7 +1803,7 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/xsnap@npm:^0.14.3-u14.0": +"@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.14.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -1085,7 +1822,53 @@ __metadata: bin: ava-xs: src/ava-xs.js xsrepl: src/xsrepl - checksum: 10c0/68c6896dcd493748a2b610b7dafb5fcd9ae4108eab659f7415cdeee3748af5d22af668e378467d2ef778a378f41e6198a8a4a1c7e77d6b63afdce79acb3ff387 + checksum: 10c0/68c6896dcd493748a2b610b7dafb5fcd9ae4108eab659f7415cdeee3748af5d22af668e378467d2ef778a378f41e6198a8a4a1c7e77d6b63afdce79acb3ff387 + languageName: node + linkType: hard + +"@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.14.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/init": "npm:^1.1.6" + "@endo/netstring": "npm:^1.0.12" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + "@endo/stream-node": "npm:^1.1.7" + glob: "npm:^7.1.6" + tmp: "npm:^0.2.1" + bin: + ava-xs: src/ava-xs.js + xsrepl: src/xsrepl + checksum: 10c0/e74815bf71d3bec2564550ed0faf886870b27f3b19c57488718ea444674f1290bdf82f1d2e846c5cc25d3091e0ca91f96360dde3ab02d928acf9f0782c636881 + languageName: node + linkType: hard + +"@agoric/xsnap@npm:0.14.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.14.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/init": "npm:^1.1.6" + "@endo/netstring": "npm:^1.0.12" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + "@endo/stream-node": "npm:^1.1.7" + glob: "npm:^7.1.6" + tmp: "npm:^0.2.1" + bin: + ava-xs: src/ava-xs.js + xsrepl: src/xsrepl + checksum: 10c0/21850ed2023f835b97cd6a3565645349901eaa312bdc3343024cd627bd40832ab9e048336198379921f4bf57a50ab7cea650506077dca674c299f7536fb0baf2 languageName: node linkType: hard @@ -1112,7 +1895,7 @@ __metadata: languageName: node linkType: hard -"@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/zoe@npm:^0.26.3-u17.1": +"@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.26.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -1145,6 +1928,72 @@ __metadata: languageName: node linkType: hard +"@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.26.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/b576e9f1e9abc314a279f59fece757f4c2d1813a54e3a10536795b9352536977bc43607f5e31b7e451e1e6fbeae54484b0792b1f462289a500e29303c5d37138 + languageName: node + linkType: hard + +"@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/zoe@npm:^0.26.3-u17.1": + version: 0.26.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-vat": "npm:0.32.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/59bf8dd8a88f31cd42abc8d5613f6996368dedc3a129ca8df54fea6ffcac77a50c8f8554e612c56521546f42503c722ec6a5cdf313806e74850120bcd6607adc + languageName: node + linkType: hard + "@agoric/zoe@npm:^0.26.2": version: 0.26.2 resolution: "@agoric/zoe@npm:0.26.2" @@ -1170,7 +2019,20 @@ __metadata: languageName: node linkType: hard -"@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/zone@npm:^0.3.0-u17.1": +"@agoric/zone@npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.2.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/zone@npm:0.2.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/8241c80ea1075bf8baade37a5de78c7d53e21ee60e49ebddf9547e0902eec142da9117060247c0eace227e7947bb7ce52189421f23a5f94ae5f2d68d3e68d776 + languageName: node + linkType: hard + +"@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.3.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -1183,6 +2045,19 @@ __metadata: languageName: node linkType: hard +"@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.3.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/c846261129da453c0cf234477165f66918ea0617d8f248922fa03b8721d2412e430ed4f8d29ac75c141e9d0bd47f9778f5c023f3d4f5df9c665760223da78e0a + languageName: node + linkType: hard + "@agoric/zone@npm:^0.2.2": version: 0.2.2 resolution: "@agoric/zone@npm:0.2.2" @@ -1194,6 +2069,19 @@ __metadata: languageName: node linkType: hard +"@agoric/zone@npm:latest": + version: 0.3.0-u18.0 + resolution: "@agoric/zone@npm:0.3.0-u18.0" + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/3f841b56e3387d2b37103600c598f40f25b3262c7be4dd36d02558bda76e90aa6ce22ab5d15a36d1a1b618cb6a0264ccd401dd572cd439c4ea5b29bd6a81fe2c + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -1221,247 +2109,209 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" +"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.24.1 - resolution: "@babel/compat-data@npm:7.24.1" - checksum: 10c0/8a1935450345c326b14ea632174696566ef9b353bd0d6fb682456c0774342eeee7654877ced410f24a731d386fdcbf980b75083fc764964d6f816b65792af2f5 +"@babel/compat-data@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/compat-data@npm:7.26.2" + checksum: 10c0/c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 languageName: node linkType: hard -"@babel/core@npm:^7.23.5": - version: 7.24.3 - resolution: "@babel/core@npm:7.24.3" +"@babel/core@npm:^7.25.2": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.1" - "@babel/parser": "npm:^7.24.1" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/e6e756b6de27d0312514a005688fa1915c521ad4269a388913eff2120a546538078f8488d6d16e86f851872f263cb45a6bbae08738297afb9382600d2ac342a9 + checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e languageName: node linkType: hard -"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/f89282cce4ddc63654470b98086994d219407d025497f483eb03ba102086e11e2b685b27122f6ff2e1d93b5b5fa0c3a6b7e974fbf2e4a75b685041a746a4291e + jsesc: "npm:^3.0.2" + checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 + checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/helper-plugin-utils@npm:7.24.0" - checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" - dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/b3445860ae749fc664682b291f092285e949114e8336784ae29f88eb4c176279b01cc6740005a017a0389ae4b4e928d5bbbc01de7da7e400c972e3d6f792063a +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.1" +"@babel/plugin-transform-react-jsx-self@npm:^7.24.7": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ea362ff94b535c753f560eb1f5e063dc72bbbca17ed58837a949a7b289d5eacc7b0a28296d1932c94429b168d6040cdee5484a59b9e3c021f169e0ee137e6a27 + checksum: 10c0/ce0e289f6af93d7c4dc6b385512199c5bb138ae61507b4d5117ba88b6a6b5092f704f1bdf80080b7d69b1b8c36649f2a0b250e8198667d4d30c08bbb1546bd99 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.1" +"@babel/plugin-transform-react-jsx-source@npm:^7.24.7": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ea8e3263c0dc51fbc97c156cc647150a757cc56de10781287353d0ce9b2dcd6b6d93d573c0142d7daf5d6fb554c74fa1971ae60764924ea711161d8458739b63 + checksum: 10c0/fc9ee08efc9be7cbd2cc6788bbf92579adf3cab37912481f1b915221be3d22b0613b5b36a721df5f4c0ab65efe8582fcf8673caab83e6e1ce4cc04ceebf57dfa languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/runtime@npm:7.24.5" +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.21.0": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/05730e43e8ba6550eae9fd4fb5e7d9d3cb91140379425abcb2a1ff9cebad518a280d82c4c4b0f57ada26a863106ac54a748d90c775790c0e2cd0ddd85ccdf346 + checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 languageName: node linkType: hard -"@babel/template@npm:^7.24.0, @babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab languageName: node linkType: hard -"@babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.23.6, @babel/traverse@npm:^7.24.1": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" +"@babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.23.6, @babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.6" - "@babel/parser": "npm:^7.25.6" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 languageName: node linkType: hard @@ -1478,61 +2328,49 @@ __metadata: languageName: node linkType: hard -"@chain-registry/client@npm:^1.18.0, @chain-registry/client@npm:^1.48.1": - version: 1.48.81 - resolution: "@chain-registry/client@npm:1.48.81" +"@chain-registry/client@npm:^1.18.0, @chain-registry/client@npm:^1.49.11": + version: 1.53.17 + resolution: "@chain-registry/client@npm:1.53.17" dependencies: - "@chain-registry/types": "npm:^0.45.81" - "@chain-registry/utils": "npm:^1.46.81" + "@chain-registry/types": "npm:^0.50.17" + "@chain-registry/utils": "npm:^1.51.17" bfs-path: "npm:^1.0.2" cross-fetch: "npm:^3.1.5" - checksum: 10c0/328c2f1445754b8e64470796455216799d5cea4a2dc023774b8203c12fddee9fd3d9a0dc93b9b28669458ad32b13b2b6f0fc8838ad3ba1273b9fb2be21b7a21b + checksum: 10c0/1f8d460a60d41cc413b00eab8d7b92b3b9878273c6b2f56ecf1467f9a8100045f83c827762c741cde1f5991fe587d659d91f6d085fd952fee70b108f08420ffc languageName: node linkType: hard -"@chain-registry/cosmostation@npm:1.66.2": - version: 1.66.2 - resolution: "@chain-registry/cosmostation@npm:1.66.2" +"@chain-registry/cosmostation@npm:1.67.13": + version: 1.67.13 + resolution: "@chain-registry/cosmostation@npm:1.67.13" dependencies: - "@chain-registry/types": "npm:^0.45.1" - "@chain-registry/utils": "npm:^1.46.1" + "@chain-registry/types": "npm:^0.46.11" + "@chain-registry/utils": "npm:^1.47.11" "@cosmostation/extension-client": "npm:0.1.15" - checksum: 10c0/6ec2bdfd32b05e93bfef23ee72dd65c2c0a539ae70c5cf22fc7e73602e0172bda1a8343352cf4025e410dfec88aa3abe2a59a76e88fc69f2fe5d867eca9408f9 + checksum: 10c0/d9cb615ab21fc868eb02a877f0ccd4744478a65e2993d1d936c84f67a97a036e363e081193ea1e5c712e59cde985112f66b67012230a5d5d5f49466e8fbbcce6 languageName: node linkType: hard -"@chain-registry/cosmostation@npm:^1.66.2": - version: 1.66.101 - resolution: "@chain-registry/cosmostation@npm:1.66.101" +"@chain-registry/cosmostation@npm:^1.67.13": + version: 1.72.38 + resolution: "@chain-registry/cosmostation@npm:1.72.38" dependencies: - "@chain-registry/types": "npm:^0.45.81" - "@chain-registry/utils": "npm:^1.46.81" + "@chain-registry/types": "npm:^0.50.17" + "@chain-registry/utils": "npm:^1.51.17" "@cosmostation/extension-client": "npm:0.1.15" - checksum: 10c0/ed2932cddd109bc5254027453ae3c474c7eaf868be14981ac3537b8d7dac0c7f13b51d39144c53a19e60ed7f3397bed8e4e31cbdd917fd640dd8c140f63f5d69 - languageName: node - linkType: hard - -"@chain-registry/keplr@npm:1.68.2": - version: 1.68.2 - resolution: "@chain-registry/keplr@npm:1.68.2" - dependencies: - "@chain-registry/types": "npm:^0.45.1" - "@keplr-wallet/cosmos": "npm:0.12.28" - "@keplr-wallet/crypto": "npm:0.12.28" - semver: "npm:^7.5.0" - checksum: 10c0/a155f2029f7fb366b6aa6169b8774d01a57150af0ca6925024a77d401e9c0302860208520a7dd5fead08a47b65025b1eddd65c77f10d73cbd7be71b2cda8132d + checksum: 10c0/7298e76b0617aa4283e32deaf1586b06ceb1ad14b17446b1408a893c12cedff51735e9bd3d2daf71005be835a9114e4f436a5ccf61978cc2651c25d96f050df3 languageName: node linkType: hard -"@chain-registry/keplr@npm:^1.68.2": - version: 1.68.101 - resolution: "@chain-registry/keplr@npm:1.68.101" +"@chain-registry/keplr@npm:^1.69.13": + version: 1.74.38 + resolution: "@chain-registry/keplr@npm:1.74.38" dependencies: - "@chain-registry/types": "npm:^0.45.81" + "@chain-registry/types": "npm:^0.50.17" "@keplr-wallet/cosmos": "npm:0.12.28" "@keplr-wallet/crypto": "npm:0.12.28" semver: "npm:^7.5.0" - checksum: 10c0/529b1069f35d13e30ff854f247e3a919006ed5fcba51874ebcfaeae815ce50d75e5278a6b2b51b888c6ed77b30a6bf95aa331f7ee7d4cbe46aeb25da4b00c156 + checksum: 10c0/95cdacb4365f0d84137cb25397fddb3afa85d39c957da049bc7055370aeb6d37aca0d9d7a75ed3810cbb7a332177411fc4ad59e7ebbaae08f9d7a0306bf11e34 languageName: node linkType: hard @@ -1545,10 +2383,10 @@ __metadata: languageName: node linkType: hard -"@chain-registry/types@npm:0.45.1": - version: 0.45.1 - resolution: "@chain-registry/types@npm:0.45.1" - checksum: 10c0/d2008c36e2b9d5b4dfbeae2e4038b956789cf7a70bff85d936fdb76a34a16609952b8b233bd09c3e93eeb9ccde26a5492230d1f3e450b2a7a7b8474df76835a5 +"@chain-registry/types@npm:0.46.11": + version: 0.46.11 + resolution: "@chain-registry/types@npm:0.46.11" + checksum: 10c0/bcce836cd6ada20a4cdc033cc9494b0ee0d3d5d8537e3ac5426485c30fbd2dd36e630808cfa8363f6897a4671cde623e4a076c7ae46b725e41ad7bea894d1c38 languageName: node linkType: hard @@ -1562,29 +2400,36 @@ __metadata: linkType: hard "@chain-registry/types@npm:^0.18.0": - version: 0.18.12 - resolution: "@chain-registry/types@npm:0.18.12" + version: 0.18.19 + resolution: "@chain-registry/types@npm:0.18.19" dependencies: "@babel/runtime": "npm:^7.21.0" - checksum: 10c0/6c98d87a59884d5384e5c1dfeb98a68a035e2c20273ea8ddd2640404a54db1e9e39f2022daaa72a97bebbb1fa894a7b1d06feddda8476646566b8fbe84d3844d + checksum: 10c0/43bd8806889a00e4e4cf5f7a4dd8956f96c27d1c92b5831a9ac47098f37b337abef174299f8526b8ea8db094d50afb159d0db88ae0d06666f5e30d85e4db2c2d languageName: node linkType: hard -"@chain-registry/types@npm:^0.45.1, @chain-registry/types@npm:^0.45.81": - version: 0.45.81 - resolution: "@chain-registry/types@npm:0.45.81" - checksum: 10c0/14257fc1441ab80e59aa7e8065db0c991534a9fdbcfc312d269f05e31a93ca8c0c450e23b531db952563dc96cf534566e13e37f16d2e4a5fe28439a3f80ed28b +"@chain-registry/types@npm:^0.46.11": + version: 0.46.15 + resolution: "@chain-registry/types@npm:0.46.15" + checksum: 10c0/11655ead021fcc78f317f682842a73666e080216d22f87be5b9fffa9341130b3e8b8a3b1d2d77ec3c41841af4c1fbdf24af467ef12df552fa2e99fe2eae5f1e1 languageName: node linkType: hard -"@chain-registry/utils@npm:^1.17.0, @chain-registry/utils@npm:^1.46.1, @chain-registry/utils@npm:^1.46.81": - version: 1.46.81 - resolution: "@chain-registry/utils@npm:1.46.81" +"@chain-registry/types@npm:^0.50.17": + version: 0.50.17 + resolution: "@chain-registry/types@npm:0.50.17" + checksum: 10c0/1f7363bb5927511baf99b7c1ae7e9ff2f5504b6b0dedf13318cf6d94abdcc383f6c88afbf9f3f023fecb8bc5fd3975d034e69f8c9aff46e6b48ec49969db2d5b + languageName: node + linkType: hard + +"@chain-registry/utils@npm:^1.17.0, @chain-registry/utils@npm:^1.47.11, @chain-registry/utils@npm:^1.51.17": + version: 1.51.17 + resolution: "@chain-registry/utils@npm:1.51.17" dependencies: - "@chain-registry/types": "npm:^0.45.81" + "@chain-registry/types": "npm:^0.50.17" bignumber.js: "npm:9.1.2" sha.js: "npm:^2.4.11" - checksum: 10c0/30632124686eeecf56946f5bf4099811768946c1f0ef12f75b67b6f082bd7e3ea79f976245d9da018c77ad8de87364c960d64ea2f915d3a8d7167da455aeeebc + checksum: 10c0/eb6c3b7a3f41152436c4f9420c8bd8b58fa8db3b9d46cb9bd9cb4a2855fdfd07dc4515321c08639fc14378a2159347387aefa767f1e77f05b1af3a35ba64a288 languageName: node linkType: hard @@ -1601,27 +2446,19 @@ __metadata: linkType: hard "@coinbase/wallet-sdk@npm:^3.6.6": - version: 3.7.2 - resolution: "@coinbase/wallet-sdk@npm:3.7.2" + version: 3.9.3 + resolution: "@coinbase/wallet-sdk@npm:3.9.3" dependencies: - "@metamask/safe-event-emitter": "npm:2.0.0" - "@solana/web3.js": "npm:^1.70.1" - bind-decorator: "npm:^1.0.11" - bn.js: "npm:^5.1.1" + bn.js: "npm:^5.2.1" buffer: "npm:^6.0.3" - clsx: "npm:^1.1.0" - eth-block-tracker: "npm:6.1.0" - eth-json-rpc-filters: "npm:5.1.0" - eth-rpc-errors: "npm:4.0.2" - json-rpc-engine: "npm:6.1.0" - keccak: "npm:^3.0.1" - preact: "npm:^10.5.9" - qs: "npm:^6.10.3" - rxjs: "npm:^6.6.3" + clsx: "npm:^1.2.1" + eth-block-tracker: "npm:^7.1.0" + eth-json-rpc-filters: "npm:^6.0.0" + eventemitter3: "npm:^5.0.1" + keccak: "npm:^3.0.3" + preact: "npm:^10.16.0" sha.js: "npm:^2.4.11" - stream-browserify: "npm:^3.0.0" - util: "npm:^0.12.4" - checksum: 10c0/0b76bc5b032e2ae39ba8f6e2c758c77c9cb366675822a50ab89d0d176e9b654b1a65a7f1363f9272fd04c8e01a01ad78523b8cac0ca95ef8f6e9a781e3fb20b6 + checksum: 10c0/a34b7f3e84f1d12f8235d57b3fd2e06d04e9ad9d999944b43bf0a3b0e79bc1cff336e9097f4555f85e7085ac7a1be2907732cda6a79cad1b60521d996f390b99 languageName: node linkType: hard @@ -2242,70 +3079,70 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/cdcwallet-extension@npm:^2.13.2": - version: 2.13.2 - resolution: "@cosmos-kit/cdcwallet-extension@npm:2.13.2" +"@cosmos-kit/cdcwallet-extension@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/cdcwallet-extension@npm:2.15.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/2c159f90a568ed1a94495950ddc9d5674249276e803eff784143c2b35986933b95a8a8735d6fcd670070651e8bf3c8de67013cd5f58e62dae95f488bfd1a85d9 + checksum: 10c0/c5e56f759539bc3b3f9026ed328396fdd53d43e93878c7fe9e14bf2a04041ebf46f0a7183b38fe24079963f94a70d5ab0f74b38b814aabacab189f2350b6af41 languageName: node linkType: hard -"@cosmos-kit/cdcwallet@npm:^2.13.2": - version: 2.13.2 - resolution: "@cosmos-kit/cdcwallet@npm:2.13.2" +"@cosmos-kit/cdcwallet@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/cdcwallet@npm:2.15.1" dependencies: - "@cosmos-kit/cdcwallet-extension": "npm:^2.13.2" - checksum: 10c0/d9d0d888a771810356154bc4fbfb1b4530cb97831ce7ff1e35c46a2b388864660dc9e0a7c7b76dff720c0a922645a519877e3f0e69180633f48e06ac0f8a5bf5 + "@cosmos-kit/cdcwallet-extension": "npm:^2.15.1" + checksum: 10c0/5793f05bb2dbdd5c4c20f0666be67de916f1449b110c23dd278ffbc04b234f1d0d692c9aaef9f24efe13cb7b812990a30bbc8c7a2aa4b87005d39a9b6c595026 languageName: node linkType: hard -"@cosmos-kit/coin98-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/coin98-extension@npm:2.12.2" +"@cosmos-kit/coin98-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/coin98-extension@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" cosmjs-types: "npm:>=0.9.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/1a1423dd45288f77b7cb615342fa9750a11cfd741d5047ef6737d258d6af115f5e2ef6eac4cc41b5ed7599db7d21d02fb7682e02b0f1b533625714a8316794da + checksum: 10c0/44b81ced4985cd2c3e9e94bac72570136bd0ac414a5cbb8b186efdcefcdd71a710bd9a68771da95dcf5820de96a58d57ce8416b004d61924e5f5e4f826d54a10 languageName: node linkType: hard -"@cosmos-kit/coin98@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/coin98@npm:2.11.2" +"@cosmos-kit/coin98@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/coin98@npm:2.13.1" dependencies: - "@cosmos-kit/coin98-extension": "npm:^2.12.2" - checksum: 10c0/7b9cf76b26e816743e17011eb3f1780bf9b49cbcdb7a8d2534322189c4e8e785212fe20794903ffbcfd11c532ab1828463d2527bba85b4a27f921bb8f63e1c9a + "@cosmos-kit/coin98-extension": "npm:^2.14.1" + checksum: 10c0/aabe8cb290cb3f9f765f4f768c1607e1fcfe147f354a6da6e6595a487668fd499a730f199893eddb1703e40c6bab4ebf0c06e73350c74cdbfba6d7c69a18737f languageName: node linkType: hard -"@cosmos-kit/compass-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/compass-extension@npm:2.11.2" +"@cosmos-kit/compass-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/compass-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/663087e375619b271e0a0c41e45679c5e45ba17d0c6bd12a354316471ad186454583d15ff5076c106660b9becd723ed6ad3645a502352309a453053955cea8cf + checksum: 10c0/12638b14627a75af9b2f81a46a690ce12247cd6698a00ef3a2b0248db4f52885455fc81aa11c2a0eba8d5ed60c190a3932e57ea6f18a744a01a474544d3f7ff1 languageName: node linkType: hard -"@cosmos-kit/compass@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/compass@npm:2.11.2" +"@cosmos-kit/compass@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/compass@npm:2.13.1" dependencies: - "@cosmos-kit/compass-extension": "npm:^2.11.2" - checksum: 10c0/35fe8f1cfe889425cfd85ed41e8299839677a12a4fe3228b78cf2cf5e9389990aeb737b7cea3c9fb7b316a72abfa4bcd441fe07a4065f14e7f59b96d108b7ffe + "@cosmos-kit/compass-extension": "npm:^2.13.1" + checksum: 10c0/dcaec805c224efd83966ad9315bba1b5d812885fa3c82620945b3d5305378916d7a21ede0d89fb298b502f9c106b48b709d293c284ac22d2bea44ac505ede958 languageName: node linkType: hard @@ -2328,13 +3165,13 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/core@npm:^2.13.1, @cosmos-kit/core@npm:^2.8.9": - version: 2.13.1 - resolution: "@cosmos-kit/core@npm:2.13.1" +"@cosmos-kit/core@npm:^2.15.0, @cosmos-kit/core@npm:^2.8.9": + version: 2.15.0 + resolution: "@cosmos-kit/core@npm:2.15.0" dependencies: - "@chain-registry/client": "npm:^1.48.1" - "@chain-registry/keplr": "npm:^1.68.2" - "@chain-registry/types": "npm:^0.45.1" + "@chain-registry/client": "npm:^1.49.11" + "@chain-registry/keplr": "npm:^1.69.13" + "@chain-registry/types": "npm:^0.46.11" "@cosmjs/amino": "npm:^0.32.3" "@cosmjs/cosmwasm-stargate": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" @@ -2346,309 +3183,312 @@ __metadata: events: "npm:3.3.0" nock: "npm:13.5.4" uuid: "npm:^9.0.1" - checksum: 10c0/5295440b213fed8d1853023253888652dd57624ea7dee86720c04964f00209078fafc843359686daffac78fc8e52b68078fbbdf4552dd2e8903315f2ab0e22d5 + checksum: 10c0/d5af19c633a7ca7863c0e5a5e5a52c3bc41086844f93c814342d2f2fe32cd1dcce8aab9ab2c2df516ed1c90ac2231d6d17f0d407e0143f740ecc0c7e24c23193 languageName: node linkType: hard -"@cosmos-kit/cosmostation-extension@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/cosmostation-extension@npm:2.13.0" +"@cosmos-kit/cosmostation-extension@npm:^2.15.0": + version: 2.15.0 + resolution: "@cosmos-kit/cosmostation-extension@npm:2.15.0" dependencies: - "@chain-registry/cosmostation": "npm:^1.66.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/cosmostation": "npm:^1.67.13" + "@cosmos-kit/core": "npm:^2.15.0" cosmjs-types: "npm:^0.9.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/af0e4e250041a6ea75c208c791f20a2d8d78bd5d11fe6f3264ae03c340a2d1ef3133dff9fd997c0f08e8402f4b658c3b22c73a36f2fe48119b7329617ec1919f + checksum: 10c0/efc951a5fd0a73c9d842153e86304b8073c7908fb51d8288cb5e5bac82aaff4f3f3cf108b52cedae2d53c95b9bbd39218ad821f0c61ae77c3c500ed051b97b0c languageName: node linkType: hard -"@cosmos-kit/cosmostation-mobile@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/cosmostation-mobile@npm:2.11.2" +"@cosmos-kit/cosmostation-mobile@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/cosmostation-mobile@npm:2.13.0" dependencies: - "@chain-registry/cosmostation": "npm:1.66.2" - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" - checksum: 10c0/a52d1ae62b1797b809251715e3c88c74646053e34f9e9b96d9d170c252ecf18118bf55e58ca59a8fd50fa7503cd5aebd5a59546de1dabfa618f09733ff3c5439 + "@chain-registry/cosmostation": "npm:1.67.13" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" + checksum: 10c0/ff816262bab05455ad547de8da06bba525519b64e3f6a957027d381f4936e045715c2a777bd6c51077cd9954a50b8567e5a041d20a9553ae893ad07744a872a9 languageName: node linkType: hard -"@cosmos-kit/cosmostation@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/cosmostation@npm:2.12.0" +"@cosmos-kit/cosmostation@npm:^2.14.0": + version: 2.14.0 + resolution: "@cosmos-kit/cosmostation@npm:2.14.0" dependencies: - "@cosmos-kit/cosmostation-extension": "npm:^2.13.0" - "@cosmos-kit/cosmostation-mobile": "npm:^2.11.2" - checksum: 10c0/dd1ae4a8968557c16fc2c07c8e58df7d8ed22e68a3ae728f06d18eddb72eafccae00896fd574eb839ef44e0fcae159d0b5c75b3941b71013c4b372e57dc9e2e2 + "@cosmos-kit/cosmostation-extension": "npm:^2.15.0" + "@cosmos-kit/cosmostation-mobile": "npm:^2.13.0" + checksum: 10c0/d029149858baef6bdad0132b8dac0c0fc247e199f0e7654e1456cd0e8bd803ddc397230c58d1d3e2a77b2ef572a4edd12f42315e7cf80fd7c3017e72c2695934 languageName: node linkType: hard -"@cosmos-kit/exodus-extension@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/exodus-extension@npm:2.10.2" +"@cosmos-kit/exodus-extension@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/exodus-extension@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" react-icons: "npm:4.4.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/a6b7716472fd28a3172a99471d8e8f9c557344f0c9ea36e5e031f2424e9674ba5de16998fcb2bd0b72d5037a93bfae662f687d83f04268647042462707de3c6c + checksum: 10c0/c613f9c3ddea0cfcc0f5922aa77a59255f93d1ba76ad0c9191052c355c6c3335c94d1f89ea990c5db000c440f00ac64d25087fb3a8d4447f5004e5ef8ad83ef8 languageName: node linkType: hard -"@cosmos-kit/exodus@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/exodus@npm:2.10.2" +"@cosmos-kit/exodus@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/exodus@npm:2.12.0" dependencies: - "@cosmos-kit/exodus-extension": "npm:^2.10.2" - checksum: 10c0/5733c78fbf176824881124b97a0404d95faf366d39b13fa4e3eecc1119edc9932f7f1469bd2c66d7f7c41d28d70392bf66deaebc76ba3c0a6f353f6e7d557502 + "@cosmos-kit/exodus-extension": "npm:^2.12.0" + checksum: 10c0/0cae2118f444984d614d79af4bcc9017ad2da739ae0caafbe789f085d121d607488e9f974bcce9e862ec6fbcfc70be2741e8037dc2f0cd2c19911e73f29140c2 languageName: node linkType: hard -"@cosmos-kit/fin-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/fin-extension@npm:2.11.2" +"@cosmos-kit/fin-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/fin-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/314968c6c2c637fbc4d7785dd3fb2e12203ea9566583f7b8bc101833c59497d9ce3bd0216236b5dbcbb787d0492b80f9e501bd54d898f5a150b8f76fa46d4537 + checksum: 10c0/daf29837efc81ad552665f59aade1b553c268e42d3766e08e5bd91a84bc994498281e5de45d372e90bb2dc807d443526f924a82188246a63698b29771695fc20 languageName: node linkType: hard -"@cosmos-kit/fin@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/fin@npm:2.11.2" +"@cosmos-kit/fin@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/fin@npm:2.13.1" dependencies: - "@cosmos-kit/fin-extension": "npm:^2.11.2" - checksum: 10c0/f24e13e27baf5caf37f1bd18474dad022f4b987fd0213974c7fdd4510cfce3eab428d69ed73ed134115f3b91aa208ec29451ab92f71146660a510ea92f08a025 + "@cosmos-kit/fin-extension": "npm:^2.13.1" + checksum: 10c0/32b1ef95ef91e8873f37dfacbba00e58869f994be661da25e9693f0ec5c9b501603e1f000dad5403df7c5130b85cc6163af3a939b91ca289dc0342670b6a42fb languageName: node linkType: hard -"@cosmos-kit/frontier-extension@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/frontier-extension@npm:2.10.2" +"@cosmos-kit/frontier-extension@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/frontier-extension@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/ae6ceeaaded9367d0a46932d534c051c0ec8d49a76dd80144c61f8de5d9ddbf3cdfe03b682a2ea66756ce93e46e2e1142251a31174ffbc45f688a1aff9cc3155 + checksum: 10c0/cba46d7b502185da8f240f62c03916eff00a069e9fe946a3b5d9d45b89b4141267ad3cfc1d0fa32a8c7f66119b25d25483eb250c18b2ce471f7de3e4b75e9855 languageName: node linkType: hard -"@cosmos-kit/frontier@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/frontier@npm:2.10.2" +"@cosmos-kit/frontier@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/frontier@npm:2.12.0" dependencies: - "@cosmos-kit/frontier-extension": "npm:^2.10.2" - checksum: 10c0/617ed26dd6cecf960b511180f9a15b4a1360ae7293467ea165b25a4ce89e192d98dc47d77d4086af79abd7ca682a26d2311ac61c3c3cf164b0007a87bca994f5 + "@cosmos-kit/frontier-extension": "npm:^2.12.0" + checksum: 10c0/2f8a7ef4f994fc007cb2b88b4a44dc99e2fc1d1dd8830ef7e201d7b57a38d1794829ee9cb8964417680811ff646f3af0556551b3848aff18a007e5bb51c549b2 languageName: node linkType: hard -"@cosmos-kit/galaxy-station-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/galaxy-station-extension@npm:2.11.2" +"@cosmos-kit/galaxy-station-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/galaxy-station-extension@npm:2.13.0" dependencies: - "@chain-registry/types": "npm:0.45.1" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/types": "npm:0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" "@hexxagon/feather.js": "npm:^1.0.9-beta.8" "@hexxagon/station-connector": "npm:^1.0.17" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/6c481b17504935ed589583d18cda708a9d81efde41e66c589b16ee401b8ae72a887b016a106a3a0f2ce9afd12560244474ccd11f818143d342169cea769ca073 + checksum: 10c0/3931e875aef0527b695c9b39d18e91d02120cd1ac90fe0f7066ded8aba587b6f315baf5d5d4efcd6171975224ffdf8ad41a49c3c8480597c3fc73ac47f1e57d2 languageName: node linkType: hard -"@cosmos-kit/galaxy-station@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/galaxy-station@npm:2.10.2" +"@cosmos-kit/galaxy-station@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/galaxy-station@npm:2.12.0" dependencies: - "@cosmos-kit/galaxy-station-extension": "npm:^2.11.2" - checksum: 10c0/86721b41a710dae0c8ec22c0466def90ef8b61cd09505e648d145bcd48997413e996cda4330bfce96e2e788cfcd572bbed556ad1d4d8ef693a1e7a6a3cb765d4 + "@cosmos-kit/galaxy-station-extension": "npm:^2.13.0" + checksum: 10c0/655f76ad80b0ca1bf9d7f36b26ea6847404372be8dfc6604eb7033dfae91462fed433064ea204b6b2f4b40fb34b68bc267e5539bbedc0b2a9294bd308737cbe9 languageName: node linkType: hard -"@cosmos-kit/keplr-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/keplr-extension@npm:2.12.2" +"@cosmos-kit/keplr-extension@npm:^2.14.0": + version: 2.14.0 + resolution: "@cosmos-kit/keplr-extension@npm:2.14.0" dependencies: - "@chain-registry/keplr": "npm:^1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" "@keplr-wallet/provider-extension": "npm:^0.12.95" "@keplr-wallet/types": "npm:^0.12.95" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/679a71402b31a520dfe4a14ac18b7d3bc2aec75132760f4d3ad67ae91170a52e5c33587fb8208126ffec8ac911fe07413d37edf2d99c4637fec8d836d6338753 + checksum: 10c0/9ecd7d5e5f49d31122b2f604667b1e25c0bf4807b6db97fbf3cebd8b8bf4d2d7e884ef9d76c6619602b6f514aa2197beed00a55803d442643fd50ec15871f258 languageName: node linkType: hard -"@cosmos-kit/keplr-mobile@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/keplr-mobile@npm:2.12.2" +"@cosmos-kit/keplr-mobile@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/keplr-mobile@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/keplr-extension": "npm:^2.12.2" - "@cosmos-kit/walletconnect": "npm:^2.10.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/keplr-extension": "npm:^2.14.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" "@keplr-wallet/provider-extension": "npm:^0.12.95" "@keplr-wallet/wc-client": "npm:^0.12.95" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/9e8ece5399bd206089e796812018e36ba76be39282e6b397316cb8c102512ee3e866d7b297530067f1705aa808095e016ae785295f0f8cc5d3ae2b780c943090 + checksum: 10c0/66d20fb38347caa2b8b76d2eafbe6a2757401eaaa65bc26388abf3493848f820a0031f2d60c900b152db01127b5d40288fb91154ddec56ce3c5eedf99de1ed59 languageName: node linkType: hard -"@cosmos-kit/keplr@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/keplr@npm:2.12.2" +"@cosmos-kit/keplr@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/keplr@npm:2.14.1" dependencies: - "@cosmos-kit/keplr-extension": "npm:^2.12.2" - "@cosmos-kit/keplr-mobile": "npm:^2.12.2" - checksum: 10c0/7bc3c2f6b8c360ab0d8fedc02353341d2ad64351d4f309e2a8374484170975e2cdb1a6866af58a2edb1957cc5e4e28012b43f283d23e4e3e9f0478d2db2770ae + "@cosmos-kit/keplr-extension": "npm:^2.14.0" + "@cosmos-kit/keplr-mobile": "npm:^2.14.1" + checksum: 10c0/a0d695fb4daaf4667a42a6d121a7b2d4420b3a95c7220102171263b2365aa1d48b8357bd5c5cbda8329b3cfb63a1e6a46273b18cff1a96b2115eb257b4583aa0 languageName: node linkType: hard -"@cosmos-kit/leap-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/leap-extension@npm:2.12.2" +"@cosmos-kit/leap-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/leap-extension@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/5d7130cefbf5d29e05f7b792ac8f4d31ffd962088a25531d5be7cae5221309755a8a978982baf627d069d9ff315a6de592c527539657ee3dcf6f6957d205d223 + checksum: 10c0/bbf0cb9c5468be17be52848bbe14b6bf7bf0ddc12fe7ec9522180b921b0949006b0b7718de31c4b0cecd361e932e494305be3f011605e3453762e3163f89cc66 languageName: node linkType: hard -"@cosmos-kit/leap-metamask-cosmos-snap@npm:^0.12.2": - version: 0.12.2 - resolution: "@cosmos-kit/leap-metamask-cosmos-snap@npm:0.12.2" +"@cosmos-kit/leap-metamask-cosmos-snap@npm:^0.14.1": + version: 0.14.1 + resolution: "@cosmos-kit/leap-metamask-cosmos-snap@npm:0.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" "@leapwallet/cosmos-snap-provider": "npm:0.1.26" "@metamask/providers": "npm:^11.1.1" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" cosmjs-types: ">=0.9.0" - checksum: 10c0/123838d21fb83fce13f4635bf34c6484dd8f5e9f6d24d5ce674afd196e0a67c9f6e3e6068c873160060377c8c231d3089a40e5d93a51c9526eed1bd91d8a0080 + checksum: 10c0/69e2a7c2ed8423fcc0b8101dcc2fb05e25c7f2813b73b18a8457cb4ad4fc6d8a381cfe692f16523c7347a042be6d45460ec78fa0437dcfba4c9f32e510a048d3 languageName: node linkType: hard -"@cosmos-kit/leap-mobile@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/leap-mobile@npm:2.11.2" +"@cosmos-kit/leap-mobile@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/leap-mobile@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" - checksum: 10c0/b00131dcdf4155dd6fde16afc3233accf64b31a1dbfbc854b95d7b89642fe95c39d182477cbd102b335b59a59f659072238a29f84e970f3e126694ee22d74596 + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" + checksum: 10c0/195b6e084a5ce77146d1cde73d730e9cca75f174b8abc2fde71975a99c4eba6d689ba360c35e7b4826901172e82e713cb1f92d3e9daea48df6176ee0b79b79f7 languageName: node linkType: hard -"@cosmos-kit/leap@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/leap@npm:2.12.2" +"@cosmos-kit/leap@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/leap@npm:2.14.1" dependencies: - "@cosmos-kit/leap-extension": "npm:^2.12.2" - "@cosmos-kit/leap-metamask-cosmos-snap": "npm:^0.12.2" - "@cosmos-kit/leap-mobile": "npm:^2.11.2" - checksum: 10c0/cf146378bfd82c7ca84ed4dbd95371ab02b496cd98aa041e5047dfa529f7c9723aae57cc74811f810ebbd737902ea84ea4677d82d9099ab7b2d5c1df19c3a104 + "@cosmos-kit/leap-extension": "npm:^2.14.1" + "@cosmos-kit/leap-metamask-cosmos-snap": "npm:^0.14.1" + "@cosmos-kit/leap-mobile": "npm:^2.13.1" + checksum: 10c0/3e269494ae903fa5337cfdceed844abdd78888986051046cb008fd93c5c1bb624630133d0bed004fcb81499faf36431b6974a951b67c41f2cb0ef9224229a754 languageName: node linkType: hard -"@cosmos-kit/ledger@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/ledger@npm:2.11.2" +"@cosmos-kit/ledger@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/ledger@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" "@ledgerhq/hw-app-cosmos": "npm:^6.28.1" "@ledgerhq/hw-transport-webhid": "npm:^6.27.15" "@ledgerhq/hw-transport-webusb": "npm:^6.27.15" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/96bacf4e41569bb274d10871e1974d156bc2a58e2e3bdf7ae7ee1b73630d2267f6a852c114e9ee30cda03ddda9f7e3d74ed2b937e9c575f84f87919804f985ec + checksum: 10c0/05f7dd48b6e33cd0f4fd8958f89dc98253ec72f5ba7c5b8570f1a6578069b4ce9cd40ba0f1ab6f5643796a9b4b0dd646a8771be479a320c5516439ba8eb9b815 languageName: node linkType: hard -"@cosmos-kit/okxwallet-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/okxwallet-extension@npm:2.11.2" +"@cosmos-kit/okxwallet-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/okxwallet-extension@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/f2b2bd0067eed702f6a16cf8ef716e1c6a7aa42d8f263b90f4fb8e2346c41a275221a544c4fd42bb50a83d13c254de90d428e1f0b22c3591075e0daf37d069eb + checksum: 10c0/b4c4a45fc30d9c0f36f7e917d87d499054364b0bb1112e32937a9f469711bf02f8bd7e973acd34afe8fa59606057841b1b373bf619639652eaa8cc33dc2e8acc languageName: node linkType: hard -"@cosmos-kit/omni-mobile@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/omni-mobile@npm:2.10.2" +"@cosmos-kit/omni-mobile@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/omni-mobile@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/71a780a4f7a9ffa60be8c35c0515123c4e657a4f4495df23c0343d870838ebac64a65678a15748774b166f60cde5894075534213e354f54d4e12d09cbada3cf3 + checksum: 10c0/06a81c803ae3a189152bd93c248b1c886214c3d65f6be8883dae82424ebe1d985398d2a6e587c8ca54b8050157a7b07d6359dcccf0ca85f5c669e033d50f10e9 languageName: node linkType: hard -"@cosmos-kit/omni@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/omni@npm:2.10.2" +"@cosmos-kit/omni@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/omni@npm:2.12.0" dependencies: - "@cosmos-kit/omni-mobile": "npm:^2.10.2" - checksum: 10c0/d33c64f53f740cf4c50bbdf04a195c8f676d1acfb94aac82b996cd183afdd405602904ac1ff11c41daddcde2a56691f959d528259e7d26d0a57b18ce61d4807e + "@cosmos-kit/omni-mobile": "npm:^2.12.0" + checksum: 10c0/44bdc747d54327062fa9f3573dadbf4834a7f3b9185ef7c61c9b60762cc1e835ed9d9d46a8dd667ae2a4d701b36d5f7656abdd727fdfa9a91669a2eaf18da662 languageName: node linkType: hard -"@cosmos-kit/owallet-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/owallet-extension@npm:2.12.2" +"@cosmos-kit/owallet-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/owallet-extension@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" "@keplr-wallet/types": "npm:^0.12.90" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/c6e10fa9caff33c3a8788ec1be4a12ee2c25d906a4fb24b0b08c387d6ea6c6b6b3d0e2a77e980c0839513a42ef790db897a310327ba0354a0ed79987f98ca285 + checksum: 10c0/1a56ee0f2c30e52eda14412130d9d7f40dcbaffe8cada568c03e2e946f41806853415ca30d7061cff2479187e95fcf1aa9d99a793129cde68c04ef41798a52e7 languageName: node linkType: hard -"@cosmos-kit/owallet@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/owallet@npm:2.11.2" +"@cosmos-kit/owallet@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/owallet@npm:2.13.1" dependencies: - "@cosmos-kit/owallet-extension": "npm:^2.12.2" - checksum: 10c0/06d2a2b086d932ac18824a926674e6f102c99e4cd8ebfb79e5e0254d594c2ef82b2e44da550144ce56bd685c44a84b6c4cecc421b062b7a1ed07a07ae9f0e52a + "@cosmos-kit/owallet-extension": "npm:^2.14.1" + checksum: 10c0/a041da49fddb45419b8f77aec83432f31a936780cfb21d4d52ec9d1b2f7780d47f9af835fef96cbea6075d5558f8446c08aeadc42c89e068cdd6a3c41a520a45 languageName: node linkType: hard "@cosmos-kit/react-lite@npm:^2.6.9": - version: 2.6.9 - resolution: "@cosmos-kit/react-lite@npm:2.6.9" + version: 2.15.1 + resolution: "@cosmos-kit/react-lite@npm:2.15.1" dependencies: - "@chain-registry/types": "npm:0.17.0" - "@cosmos-kit/core": "npm:^2.8.9" + "@chain-registry/types": "npm:^0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" + "@dao-dao/cosmiframe": "npm:^0.1.0" peerDependencies: + "@types/react": ">= 17" + "@types/react-dom": ">= 17" react: ^18 react-dom: ^18 - checksum: 10c0/b71edf7380a53999e75bd6c736c083decd8a24701bd9512095ee67ea415a62020834db3a199012748b124403dcf1ecc2b4ba953546697777fd11573a613d8914 + checksum: 10c0/f7dd5370579e01fbf73737091f66400128bb01a989fb0fb1d2d19bc7a8d7259b18e9becb943283e481b8c46f145731e9b445e64ce7875a19e981be8acaf71f4f languageName: node linkType: hard @@ -2668,33 +3508,33 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/shell-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/shell-extension@npm:2.11.2" +"@cosmos-kit/shell-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/shell-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/c708c603aab2c7c289f8decfc8cb7b833595734e147f8905f8cd30a4bf288391f0c3366f2a8e4855041b12495ed70a40cb98470edd446a495277d00b4e91518c + checksum: 10c0/141f3277d9ac1dd660b61c914d90dbd8325987197a34cb8bf2c36df6587aa0d16d7493e855694751b9e08d4533885b9f2ea012e596da0c15d84b95c5819a3bd4 languageName: node linkType: hard -"@cosmos-kit/shell@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/shell@npm:2.11.2" +"@cosmos-kit/shell@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/shell@npm:2.13.1" dependencies: - "@cosmos-kit/shell-extension": "npm:^2.11.2" - checksum: 10c0/cc531070a980b4fa57a34ee96b54d070fe9782e4477ff9da997ae37e6f30d3ea5921ea523768bd70f72e0eddf46f67ba592e4b7fe75b99679bc7da562797ccf0 + "@cosmos-kit/shell-extension": "npm:^2.13.1" + checksum: 10c0/b381de609a4ec49e4b34c4f09807c8ed32c7bd02be7e280123ab7d534c5c2dd6a0978ab1f8605719ceec172239e6f64f79857eb83fadb4159072cf9641212526 languageName: node linkType: hard -"@cosmos-kit/station-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/station-extension@npm:2.11.2" +"@cosmos-kit/station-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/station-extension@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" "@terra-money/feather.js": "npm:^1.0.8" "@terra-money/station-connector": "npm:^1.1.0" "@terra-money/wallet-types": "npm:^3.11.2" @@ -2702,128 +3542,128 @@ __metadata: "@chain-registry/types": ">= 0.17" "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/0532961a303ab7cad2319f27c71c80f9662ec9f7a5d957f27dc49c8753417dbc94c4ec175010b9b616af1512e42dc09144a12c5c143a5ab64bb2015d0fc6768e + checksum: 10c0/9c868508c6fd0e5b1c87b9fb18e65ab1e905f262b8f3681af5f60455083f9824b8c6c7cbb8fb84ca853e9b11c9c1f3fb1aa033be112e5c7893936eaa9e687435 languageName: node linkType: hard -"@cosmos-kit/station@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/station@npm:2.10.2" +"@cosmos-kit/station@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/station@npm:2.12.0" dependencies: - "@cosmos-kit/station-extension": "npm:^2.11.2" - checksum: 10c0/1d0e1a05e9fd2528d1c105fba340244adff25460b536d75fcc2454f56f317efd6edced3eddee9cc8b9d897338114f9469af272fd1a5f7f1c317273acfc5f29b4 + "@cosmos-kit/station-extension": "npm:^2.13.0" + checksum: 10c0/055c326d33acf642dd7a58e90243718300ceeb6913768da03e501924ba780571b396cdbdb89f14c639cccad51baa24bb1cd54c47c8dfeda5269098fc7c23d065 languageName: node linkType: hard -"@cosmos-kit/tailwind-extension@npm:^1.5.2": - version: 1.5.2 - resolution: "@cosmos-kit/tailwind-extension@npm:1.5.2" +"@cosmos-kit/tailwind-extension@npm:^1.7.0": + version: 1.7.0 + resolution: "@cosmos-kit/tailwind-extension@npm:1.7.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" - checksum: 10c0/a8facdddc4df41814ae5048423b3c9da8c223503f16fb6728038238790fd143a2ebda727c813f9ae2c1190c0d0da07e942a8c0181ea2e1268f9580435550d2ed + "@cosmos-kit/core": "npm:^2.15.0" + checksum: 10c0/f146cceca975b6ddadaeb6ece7e30fae2a3f65f04b48fd3c7d397fd52dcd6663405efff5297f09950bb87e2375dba578700c5ba3183a28708d78734ed260ba22 languageName: node linkType: hard -"@cosmos-kit/tailwind@npm:^1.5.2": - version: 1.5.2 - resolution: "@cosmos-kit/tailwind@npm:1.5.2" +"@cosmos-kit/tailwind@npm:^1.7.0": + version: 1.7.0 + resolution: "@cosmos-kit/tailwind@npm:1.7.0" dependencies: - "@cosmos-kit/tailwind-extension": "npm:^1.5.2" - checksum: 10c0/79d9ce43765e90c990f52d72049d4705322d3fc9175214f80aec7d24cbce24460cf37aaab9baf424aa965ff2b9398e3c84c32f8ac2bb5c4a35370ebddefc4733 + "@cosmos-kit/tailwind-extension": "npm:^1.7.0" + checksum: 10c0/f18d5f3266aa23d3bd49af9de5651849ab317920eecd0a7e8015bafa210f52c8a6eeb47ec9b8c4459fb174e390354dfb808358ac861ec0cf2755a24cabd40768 languageName: node linkType: hard -"@cosmos-kit/trust-extension@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/trust-extension@npm:2.10.2" +"@cosmos-kit/trust-extension@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/trust-extension@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/4a56176642f984aa07a3b46f4dfed59113e4012350c45b854c4ea96cedd2dbf8cbf07e7c9a943ffaf85d624c0f8612d3eb6dd2518926ce82289a48a208859f13 + checksum: 10c0/bbc3ebe2e7bc43c4a41736ea8e2ac3bc41d8eb30ef52b935eb4da9f97a662fb2e211836443d41c2fc3a1f59281496cfd03f4e13af04ea68767bfdd2e587af22a languageName: node linkType: hard -"@cosmos-kit/trust-mobile@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/trust-mobile@npm:2.10.2" +"@cosmos-kit/trust-mobile@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/trust-mobile@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/6ed367a52d75355add3bddcbefc47e589110da9e1d42f7b65fdd7e02398786d083403f685539ea03a0b65f9a9813e1703d2c53a67aa834c091170e488b77205c + checksum: 10c0/e542a881a71ee5c879a63cba657be12f35e027f8999a7bf7b895d827659e78bc5ec9d1fc09a785ebc9df7be7b58a12e3ae76c52f7c613f1035e1f07ef4cae419 languageName: node linkType: hard -"@cosmos-kit/trust@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/trust@npm:2.11.2" +"@cosmos-kit/trust@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/trust@npm:2.13.0" dependencies: - "@cosmos-kit/trust-extension": "npm:^2.10.2" - "@cosmos-kit/trust-mobile": "npm:^2.10.2" - checksum: 10c0/68824bdab267de17b5ed0689a6b2a4881b06d5ec292bc1d12d9890552039229f6768eaf0e0ac8017633f67e9140a56da62df514f13f9aa6de09e7a55cc350132 + "@cosmos-kit/trust-extension": "npm:^2.12.0" + "@cosmos-kit/trust-mobile": "npm:^2.12.0" + checksum: 10c0/ee65807edf6ba32ed9cee964e9c25c8a05e95364c0f70782a18875fd429ebef195ae49925fd25b42c01f013185dd1378692d2c3f9fee506060efc91faa32f096 languageName: node linkType: hard -"@cosmos-kit/vectis-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/vectis-extension@npm:2.11.2" +"@cosmos-kit/vectis-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/vectis-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/d150dd1f8845073b98d4ebf1d59f8459881cfc3e7b954fe0cd1932852bc7cb1986da6c44cbea7d06ce57c971fd8a1d5b7daa7c27fb0d31abfb4b1fdc786bd2b4 + checksum: 10c0/4dfc0395a3881b0348da53d6a74fcc22e4c5a5095dd755d40940b55de53360dcee47e8ef08bee539b8d57c76839ddcbe85d822d7f6a5c3776a55d0eeaabb59c3 languageName: node linkType: hard -"@cosmos-kit/vectis@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/vectis@npm:2.11.2" +"@cosmos-kit/vectis@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/vectis@npm:2.13.1" dependencies: - "@cosmos-kit/vectis-extension": "npm:^2.11.2" - checksum: 10c0/e9baa032280d35fc6da13a771bb7e4180decede89f052d9297e702d9ea3aaed7ce92d98865e2bb3b60f8a86ae7770add714db8072d64c89fd8d00449887ddee7 + "@cosmos-kit/vectis-extension": "npm:^2.13.1" + checksum: 10c0/6ac2dd7e2acc4f81dfd8f2ad283b334bd789edd3c5a76d43622ce5f4fc386b4dc05b8b6954c48470703d2aff10589a790d3a34e3e286230a600b0375c0eb668a languageName: node linkType: hard -"@cosmos-kit/walletconnect@npm:^2.10.1": - version: 2.10.1 - resolution: "@cosmos-kit/walletconnect@npm:2.10.1" +"@cosmos-kit/walletconnect@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/walletconnect@npm:2.12.0" dependencies: "@cosmjs/proto-signing": "npm:^0.32.3" - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" "@walletconnect/sign-client": "npm:^2.9.0" "@walletconnect/utils": "npm:^2.9.0" events: "npm:3.3.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@walletconnect/types": 2.11.0 - checksum: 10c0/5940d33dfebb75f029b57cfa1de9206d2fc3c36e406cef29786ac5c0cd749cd0f5c06e5953d096bc522f45d8c1903cb1aa4429ee07425f261cc3167dcb6b35b6 + checksum: 10c0/2f38c52b5e689ed59018cde4f9a9ca9200e5436d1ec2dc3de0bee0ff9d44ea29ea4d39752354ffc4062ad523ffbac0efeeb605ea51a124444b75a7902c36804f languageName: node linkType: hard -"@cosmos-kit/xdefi-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/xdefi-extension@npm:2.11.2" +"@cosmos-kit/xdefi-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/xdefi-extension@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/73afc1fb1ed406c5fa44081baf2c0b3d0fd90e6d162427e66040f8319a10ef72c756bd180861400f0f1b51cdd8d54c4a4fdb56fb71eda1aef2003d3131a7404a + checksum: 10c0/37193ca50144f8db952ef46faae2ce9e5129ddc45211ce85b4a0318e3b40312660f9d48c4c9f5ef1c33da41c83c622b2933acd2d071c4afddec6315d0cccc883 languageName: node linkType: hard -"@cosmos-kit/xdefi@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/xdefi@npm:2.10.2" +"@cosmos-kit/xdefi@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/xdefi@npm:2.12.0" dependencies: - "@cosmos-kit/xdefi-extension": "npm:^2.11.2" - checksum: 10c0/a7dcb2a6234d4828f60fa835247627a6183fe000f4e2106f8c6a1e2bff5c2c842a887a5ddae188e2d500b807e1d4580fddfb318499683914f0abf6ffa2f72faa + "@cosmos-kit/xdefi-extension": "npm:^2.13.0" + checksum: 10c0/310ee781d1658e287cd4fa7635938642c1b113cb406f23beb94419d08cf5979968e0fce0e1f12899899bea5057be2dc08c0024c798da6c4bbac8678beb9b416d languageName: node linkType: hard @@ -2866,33 +3706,33 @@ __metadata: languageName: node linkType: hard -"@datadog/native-appsec@npm:7.1.0": - version: 7.1.0 - resolution: "@datadog/native-appsec@npm:7.1.0" +"@datadog/native-appsec@npm:7.1.1": + version: 7.1.1 + resolution: "@datadog/native-appsec@npm:7.1.1" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^3.9.0" - checksum: 10c0/961e5af948fe265bb1c8d05dbc75a899a61f55c424e1a0ec22a6cb5c0a73aa65bd487aa645d544ff5d6fbad626394a55adeeeafa80a91a4b23095ed0bc6909aa + checksum: 10c0/f7eaf00eb6199a4cf0077fe78f01ff33d90e25aa487bd4a645b537d03ee3fbf7e3b312a8cbff09edcee8558812f0843ae1c8b22bb8ffc9d8ce7b3de9f87322b8 languageName: node linkType: hard -"@datadog/native-iast-rewriter@npm:2.3.0": - version: 2.3.0 - resolution: "@datadog/native-iast-rewriter@npm:2.3.0" +"@datadog/native-iast-rewriter@npm:2.3.1": + version: 2.3.1 + resolution: "@datadog/native-iast-rewriter@npm:2.3.1" dependencies: lru-cache: "npm:^7.14.0" node-gyp-build: "npm:^4.5.0" - checksum: 10c0/3841fd370ff21ee6b39c629b24123b78453eefbd87bf2500616b9e9b8e7cfd0e649112cdef19dc98c1ebec27d428dfd15e4de41f1e32356bc0cbfa1853bdf4a0 + checksum: 10c0/3d33908828d9fe19ea1be7ed6ecaf07259928d4dfea22526f3de293493b61ee8cf6f10e940627fe28b0287daee64893aba705aa27b6ff3471fb28989c0d0ac43 languageName: node linkType: hard -"@datadog/native-iast-taint-tracking@npm:1.7.0": - version: 1.7.0 - resolution: "@datadog/native-iast-taint-tracking@npm:1.7.0" +"@datadog/native-iast-taint-tracking@npm:2.1.0": + version: 2.1.0 + resolution: "@datadog/native-iast-taint-tracking@npm:2.1.0" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^3.9.0" - checksum: 10c0/6eed1a0d018971ffd4d3fc6722446ce9eb5ebece583c3e29cbbbaa033b363740eda77fb359a5ec1f9b49966e818f7049a644a2c2b15de2d8c0ada43f29c859c9 + checksum: 10c0/3e978cb43dbd097cb7c2c4fab4a5083900f1b0568f458f16ae7312b81943eddec905f5257bf79b06b661ad8e2912e57504c862a10e5cfe2686d205358998383c languageName: node linkType: hard @@ -2922,9 +3762,9 @@ __metadata: linkType: hard "@datadog/sketches-js@npm:^2.1.0": - version: 2.1.0 - resolution: "@datadog/sketches-js@npm:2.1.0" - checksum: 10c0/6eae378c375e9df445b4d7190d713b3b1c975547293ba9190db2e35745764496e73576206d4fea1585a264bb4ed7d165a3b886ede8f5b225185e5499030620ac + version: 2.1.1 + resolution: "@datadog/sketches-js@npm:2.1.1" + checksum: 10c0/4b930240202e4e94ac49fc95298a7111202492566f76672e0ec43425a1710a0e3650a20f858a6358509ab08363d39fce5db210c88d94b4225f96b3bfe645cc5c languageName: node linkType: hard @@ -2936,63 +3776,26 @@ __metadata: linkType: hard "@emotion/hash@npm:^0.9.0": - version: 0.9.1 - resolution: "@emotion/hash@npm:0.9.1" - checksum: 10c0/cdafe5da63fc1137f3db6e232fdcde9188b2b47ee66c56c29137199642a4086f42382d866911cfb4833cae2cc00271ab45cad3946b024f67b527bb7fac7f4c9d - languageName: node - linkType: hard - -"@endo/base64@npm:0.2.31, @endo/base64@npm:^0.2.31": - version: 0.2.31 - resolution: "@endo/base64@npm:0.2.31" - checksum: 10c0/6fb87ef466ed97e7c676e6e52203434a2881f43bbd95609e44385e4002fcc0869ad6f5c673423a4c060298b2e90c26cb671f03463f287a347b37cdb079caed32 + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 languageName: node linkType: hard -"@endo/base64@npm:^0.2.35": +"@endo/base64@npm:^0.2.31, @endo/base64@npm:^0.2.32, @endo/base64@npm:^0.2.35": version: 0.2.35 resolution: "@endo/base64@npm:0.2.35" checksum: 10c0/5935cd609cbe3da91e9bdbc1c3a2be0460c58302d0b92ae63054e537aa9e2e5648a238810ec548d7367166c72094c38e2dbf0b16a37c6987c8d7353d1b0123a1 languageName: node linkType: hard -"@endo/base64@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/base64@npm:1.0.7" - checksum: 10c0/aab10f433f8ea588ebd1786188b6660c0be3a743c119ef2df52ee23afd4ce3844b1d954028952569a747f6657287aeced875afe8e136ea8bff4ba146a60578bd - languageName: node - linkType: hard - -"@endo/base64@npm:^1.0.9": +"@endo/base64@npm:^1.0.7, @endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9, @endo/base64@npm:latest": version: 1.0.9 resolution: "@endo/base64@npm:1.0.9" checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 languageName: node linkType: hard -"@endo/bundle-source@npm:2.5.2-upstream-rollup": - version: 2.5.2-upstream-rollup - resolution: "@endo/bundle-source@npm:2.5.2-upstream-rollup" - dependencies: - "@agoric/babel-generator": "npm:^7.17.4" - "@babel/parser": "npm:^7.17.3" - "@babel/traverse": "npm:^7.17.3" - "@endo/base64": "npm:^0.2.31" - "@endo/compartment-mapper": "npm:^0.8.4" - "@endo/init": "npm:^0.5.56" - "@endo/promise-kit": "npm:^0.2.56" - "@rollup/plugin-commonjs": "npm:^19.0.0" - "@rollup/plugin-node-resolve": "npm:^13.0.0" - acorn: "npm:^8.2.4" - jessie.js: "npm:^0.3.2" - rollup: "npm:^2.79.1" - source-map: "npm:^0.7.3" - bin: - bundle-source: src/tool.js - checksum: 10c0/223dceb6d95f826a377d1d376dfd4dd8906cc0efbdf34ad8e05afaae402180ddda0110d2eff18079ab4ceca1e5c2a1211212d66a570ad3adcd505db69552df98 - languageName: node - linkType: hard - "@endo/bundle-source@npm:^2.5.1": version: 2.8.0 resolution: "@endo/bundle-source@npm:2.8.0" @@ -3017,28 +3820,7 @@ __metadata: languageName: node linkType: hard -"@endo/bundle-source@npm:^3.4.0": - version: 3.4.0 - resolution: "@endo/bundle-source@npm:3.4.0" - dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/evasive-transform": "npm:^1.3.0" - "@endo/init": "npm:^1.1.4" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/where": "npm:^1.0.7" - "@rollup/plugin-commonjs": "npm:^19.0.0" - "@rollup/plugin-json": "npm:^6.1.0" - "@rollup/plugin-node-resolve": "npm:^13.0.0" - acorn: "npm:^8.2.4" - rollup: "npm:^2.79.1" - bin: - bundle-source: ./src/tool.js - checksum: 10c0/c21ee24b7beaf4e9b935c853f6917e42f2c22250697c02ceea97288cb142d8ba863491fd934c49c337a14cf94960d9edde84eb91355c679d27d303e89d429a46 - languageName: node - linkType: hard - -"@endo/bundle-source@npm:^3.5.0": +"@endo/bundle-source@npm:^3.4.0, @endo/bundle-source@npm:^3.4.2, @endo/bundle-source@npm:^3.5.0": version: 3.5.0 resolution: "@endo/bundle-source@npm:3.5.0" dependencies: @@ -3060,66 +3842,59 @@ __metadata: languageName: node linkType: hard -"@endo/captp@npm:3.1.1, @endo/captp@npm:^3.1.1": - version: 3.1.1 - resolution: "@endo/captp@npm:3.1.1" +"@endo/captp@npm:^3.1.1": + version: 3.1.5 + resolution: "@endo/captp@npm:3.1.5" dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/marshal": "npm:^0.8.5" - "@endo/nat": "npm:^4.1.27" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/45cbcd647843c4a22bc8ca2718a493afaae805c68cbbe959cb4d6828afd53c5714d6e13c0a7f327561f5c5e9fc3ee2fab0a228e6b4e4f74f1fb163af8a6adbdc + "@endo/eventual-send": "npm:^0.17.6" + "@endo/marshal": "npm:^0.8.9" + "@endo/nat": "npm:^4.1.31" + "@endo/promise-kit": "npm:^0.2.60" + checksum: 10c0/bbae2b1ef1d509bb91373c0a05426b1b93a56bcd7371532025f64e524ae2878cf48bd89f442c4524a61caea06f8ee91956df3ba29a357d4bdb2ec352821e74a7 languageName: node linkType: hard -"@endo/captp@npm:^4.3.0": - version: 4.3.0 - resolution: "@endo/captp@npm:4.3.0" +"@endo/captp@npm:^4.3.0, @endo/captp@npm:^4.4.2": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/87579ee6f6ccf6935361776f921c4de6476cb38144a99c7c2a0ef4c811748bf371296dc5c841351110ed3cb6262d4101a106608df015600699e1a470382eea98 + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/0647dd6acc39c7a54a42d9f168861d11dc28248321be72529dd8574b52989957be8f7a5ec9985fc76a24b37cd6b6d190e5bfbbc1481594e367c8517c31fce0e2 languageName: node linkType: hard -"@endo/check-bundle@npm:0.2.18, @endo/check-bundle@npm:^0.2.18": - version: 0.2.18 - resolution: "@endo/check-bundle@npm:0.2.18" +"@endo/check-bundle@npm:^0.2.18": + version: 0.2.22 + resolution: "@endo/check-bundle@npm:0.2.22" dependencies: - "@endo/base64": "npm:^0.2.31" - "@endo/compartment-mapper": "npm:^0.8.4" - checksum: 10c0/bf5c1a2974a790da3db158440686a6eec7cb67025082cd1382baf927f3744fd788be6c93aceed6dbe8cae1ff82b5412c3a8cbe331b488d552e5214888c128f98 + "@endo/base64": "npm:^0.2.35" + "@endo/compartment-mapper": "npm:^0.9.2" + checksum: 10c0/aae5081aff9e75391100ec6e436a5c0e1811e6406019b835491a4d9a4b0a0fa4b94dab8c92450ea98e2692e6563f4b0ccd62c2785cfeeead7e4b19859c95ed3b languageName: node linkType: hard -"@endo/check-bundle@npm:^1.0.9": - version: 1.0.9 - resolution: "@endo/check-bundle@npm:1.0.9" +"@endo/check-bundle@npm:^1.0.11, @endo/check-bundle@npm:^1.0.9": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/errors": "npm:^1.2.5" - checksum: 10c0/ae0072e258b8e6449dc96edb54edccdaff07607affcd28842c05764cfbd39e328b36aed510ad09a2354e446cc779c572887bec9dcd81fffe6dd1180e1e623183 + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + checksum: 10c0/73e146d9d4d5ee23936b0df368e51ebb3658eecc5efe308a1894f70339502e6de8fa065185e8518d1445bf8fbc4c5fae54fc7dab8794f02397f6694a7ab9af9c languageName: node linkType: hard -"@endo/cjs-module-analyzer@npm:^0.2.31, @endo/cjs-module-analyzer@npm:^0.2.35": +"@endo/cjs-module-analyzer@npm:^0.2.32, @endo/cjs-module-analyzer@npm:^0.2.35": version: 0.2.35 resolution: "@endo/cjs-module-analyzer@npm:0.2.35" checksum: 10c0/26d571803afe889ba327979c9208a037d8cbbb6e689cf20e10bd8d0658936a35b37d61b86180dbed6ac49ac284307177b16eeb10d6afe61c7674d4c6507913ab languageName: node linkType: hard -"@endo/cjs-module-analyzer@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/cjs-module-analyzer@npm:1.0.7" - checksum: 10c0/b7f93776dc83e44a3b346479efcd8749488ce1591aae4cefc832ec4280834cc8577d322bfb3ecdc7120dd2aa99509cb6ef1ac680b2dba4a4863483624a920ba6 - languageName: node - linkType: hard - "@endo/cjs-module-analyzer@npm:^1.0.9": version: 1.0.9 resolution: "@endo/cjs-module-analyzer@npm:1.0.9" @@ -3127,26 +3902,26 @@ __metadata: languageName: node linkType: hard -"@endo/common@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/common@npm:1.2.5" +"@endo/common@npm:^1.2.5, @endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/104ca2febd87d05b97a77037cb0f281157082b722a39f3fbfca94e36984ad8bc8622e900aeba861d7ed6e6b5d103971599ec2b804eb236537576d498f9ab1fe5 + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/c9465721095d9f06278b6550909a02c330c7a69223f11aff29759067586d41b86054127639fa2c2c0345d0d0aa43518e5b72d5c547b67bfe8e802cd21756d87b languageName: node linkType: hard -"@endo/compartment-mapper@npm:0.8.4, @endo/compartment-mapper@npm:^0.8.4": - version: 0.8.4 - resolution: "@endo/compartment-mapper@npm:0.8.4" +"@endo/compartment-mapper@npm:^0.8.4, @endo/compartment-mapper@npm:^0.8.5": + version: 0.8.5 + resolution: "@endo/compartment-mapper@npm:0.8.5" dependencies: - "@endo/cjs-module-analyzer": "npm:^0.2.31" - "@endo/static-module-record": "npm:^0.7.19" - "@endo/zip": "npm:^0.2.31" - ses: "npm:^0.18.4" - checksum: 10c0/08c1959c927d04983a4f150a9eb37175dcbe33a1f97b916ce7ebfe0df71f72578d9d0916555915017f647e51ab11c1ec13cfcbfa9c09f3f669b6642d43f2745d + "@endo/cjs-module-analyzer": "npm:^0.2.32" + "@endo/static-module-record": "npm:^0.7.20" + "@endo/zip": "npm:^0.2.32" + ses: "npm:^0.18.5" + checksum: 10c0/81e8c1c8052319ddd2d6328bc7f120e41593e01961a318192b71f12990a4fa5a014f56d5ef146f390c09a615118b61f4daae790972aa47530598b74189ead541 languageName: node linkType: hard @@ -3162,19 +3937,7 @@ __metadata: languageName: node linkType: hard -"@endo/compartment-mapper@npm:^1.2.2": - version: 1.2.2 - resolution: "@endo/compartment-mapper@npm:1.2.2" - dependencies: - "@endo/cjs-module-analyzer": "npm:^1.0.7" - "@endo/module-source": "npm:^1.0.2" - "@endo/zip": "npm:^1.0.7" - ses: "npm:^1.8.0" - checksum: 10c0/e16d6b19dbc273e72bb33e05b9fbcc7df38d8d43bc56b2e0af62b72d724d4a530468b81c1418163c54a4dff2645f5a04b58d1c3bc9e37845bbce959d651dece0 - languageName: node - linkType: hard - -"@endo/compartment-mapper@npm:^1.4.0": +"@endo/compartment-mapper@npm:^1.2.2, @endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": version: 1.4.0 resolution: "@endo/compartment-mapper@npm:1.4.0" dependencies: @@ -3194,51 +3957,31 @@ __metadata: languageName: node linkType: hard -"@endo/env-options@npm:^1.1.6": - version: 1.1.6 - resolution: "@endo/env-options@npm:1.1.6" - checksum: 10c0/0001b1cba6954cccfa40104f819378f2f5c8babc89103213a8a5da4f8f94248c8389bfa06ec37cecae81edabe570428558399313d649c64ad7c90743f563dea2 - languageName: node - linkType: hard - -"@endo/env-options@npm:^1.1.8": +"@endo/env-options@npm:^1.1.6, @endo/env-options@npm:^1.1.7, @endo/env-options@npm:^1.1.8": version: 1.1.8 resolution: "@endo/env-options@npm:1.1.8" checksum: 10c0/2f519f48a5b966dbd9e66134d4abc89ff02b9791d21146b49031ceb694584f3f41c6119125b6bb4eb0d347f5bcd846473b5f3c4ae6bae3dac19402fcaf522520 languageName: node linkType: hard -"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/errors@npm:1.2.5" +"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/errors@npm:1.2.8" dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/32eac3b332139ddec8a85a0013645482541e4f3cc0c484073dde430087f27bb683cde8b0a6e399c5b7f07af007c3b6aa589cf31935a8b8d69e5f869bf71a1662 + ses: "npm:^1.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 languageName: node linkType: hard "@endo/eslint-plugin@npm:^2.2.0": - version: 2.2.1 - resolution: "@endo/eslint-plugin@npm:2.2.1" + version: 2.2.3 + resolution: "@endo/eslint-plugin@npm:2.2.3" dependencies: requireindex: "npm:~1.1.0" - ts-api-utils: "npm:~1.0.1" tsutils: "npm:~3.21.0" - typescript: "npm:~5.6.1-rc" + typescript: "npm:~5.6.3" typescript-eslint: "npm:^7.3.1" - checksum: 10c0/87876a7ae461e5a358f085af51c8d1f7b52d685a0a3b3a700961449a8375905c65ad2bb63fac188cf1d5f5e482175c7e7f39de1d6629966de8db62c8dac7a206 - languageName: node - linkType: hard - -"@endo/evasive-transform@npm:^1.3.0": - version: 1.3.0 - resolution: "@endo/evasive-transform@npm:1.3.0" - dependencies: - "@agoric/babel-generator": "npm:^7.17.6" - "@babel/parser": "npm:^7.23.6" - "@babel/traverse": "npm:^7.23.6" - source-map-js: "npm:^1.2.0" - checksum: 10c0/caca5f99423f4dcd57bce5fe8dc197019bfcaca657929016b1e91a6d4efe7a6d73e8b7c16cff83f56c03b035ca16e08565996a3459d30a65a83b632ef7d8d0a3 + checksum: 10c0/7c0283b9969ec252b6166313ffb0036728ff18218f6d2f576fb6f6a1c7287f8bf9fa072b5f8c3d195db23aefa8d6dc1f2afca75e055fc84ebe9bcd383599a1c1 languageName: node linkType: hard @@ -3254,13 +3997,6 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:0.17.2": - version: 0.17.2 - resolution: "@endo/eventual-send@npm:0.17.2" - checksum: 10c0/e86fdd5a085d736b1840196dc9ee5b5bc1ed65bbaa4e2d7c9dcc1962e986f4e5385186fb4f2ab2a89577d5b929cb98962eb93c1d3bf7d62203e7dd03699faefb - languageName: node - linkType: hard - "@endo/eventual-send@npm:^0.17.2, @endo/eventual-send@npm:^0.17.5, @endo/eventual-send@npm:^0.17.6": version: 0.17.6 resolution: "@endo/eventual-send@npm:0.17.6" @@ -3270,16 +4006,7 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/eventual-send@npm:1.2.5" - dependencies: - "@endo/env-options": "npm:^1.1.6" - checksum: 10c0/7eaa30628582f768920659e4894b871c1056da4252b82b8ad70ed49a24c4559efb8d1655a6845984a0eae83d328179e4272b0917007a2f147dc8b15ecb0ecc52 - languageName: node - linkType: hard - -"@endo/eventual-send@npm:^1.2.8": +"@endo/eventual-send@npm:^1.2.5, @endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": version: 1.2.8 resolution: "@endo/eventual-send@npm:1.2.8" dependencies: @@ -3288,88 +4015,78 @@ __metadata: languageName: node linkType: hard -"@endo/exo@npm:^0.2.2": - version: 0.2.2 - resolution: "@endo/exo@npm:0.2.2" - dependencies: - "@endo/far": "npm:^0.2.18" - "@endo/patterns": "npm:^0.2.2" - checksum: 10c0/e54512d524b7bfc4c2bc88ec6ba64e5ddcd92a6cfc424230dbc936aed670a8932587301227918eee8315dcefe56e817faa9ab283bda6e66b3237fdeb512a9633 - languageName: node - linkType: hard - -"@endo/exo@npm:^1.5.3": - version: 1.5.3 - resolution: "@endo/exo@npm:1.5.3" +"@endo/exo@npm:^0.2.2": + version: 0.2.6 + resolution: "@endo/exo@npm:0.2.6" dependencies: - "@endo/common": "npm:^1.2.5" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/5510bc442730910ce2470c6ebdb6c04208c033e452cd60c8684e1769039453ad5f47de31b00629be3c6bf4183bee4a421bace142144e92740b606c591a839c72 + "@endo/env-options": "npm:^0.1.4" + "@endo/far": "npm:^0.2.22" + "@endo/pass-style": "npm:^0.1.7" + "@endo/patterns": "npm:^0.2.6" + checksum: 10c0/aad124b36e323eeb969df9572f9243ef64e28ca99bb37ef2700c050be3fc78140b0192b32cbeb6e1b52f4c04237a9bfeed6deb400ba2ade6c7ad01071fc1fed9 languageName: node linkType: hard -"@endo/far@npm:0.2.18, @endo/far@npm:^0.2.18": - version: 0.2.18 - resolution: "@endo/far@npm:0.2.18" +"@endo/exo@npm:^1.5.3, @endo/exo@npm:^1.5.6": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/pass-style": "npm:^0.1.3" - checksum: 10c0/0df1ab4e2f3969f1256c0f6323865b384db35565c11e6e97bd3e348f0e12b6d895fee7590439dd37d34f0e0aa980b9e4cc6e250e97c1d7cb2030df8468d5b985 + "@endo/common": "npm:^1.2.8" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/0193de0606a7f07f207f3dd8bb71ec6be0acfb0ff5ef570f03cbbcaed888db68e451082c34764de8ee301f8d2d175e6c5a5405e76367c27151d644536bdf57a4 languageName: node linkType: hard -"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/far@npm:1.1.5" +"@endo/far@npm:^0.2.18, @endo/far@npm:^0.2.22": + version: 0.2.22 + resolution: "@endo/far@npm:0.2.22" dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/pass-style": "npm:^1.4.3" - checksum: 10c0/8c50a28323ab1078d0cb6fce1d7fc6da4884247d76585f37f960a2a7134fc7f293075effaae34b41801b7508a1f75d32304c19db0597709727853c4a87eb4999 + "@endo/eventual-send": "npm:^0.17.6" + "@endo/pass-style": "npm:^0.1.7" + checksum: 10c0/bd30a168b47a26014cab296336a64aa2721975c386f7f87b6776dd33cf77f3e85ddb822e8422fbc2befb6920d72301e3b9b206fe71d970dce1870b708b09805d languageName: node linkType: hard -"@endo/import-bundle@npm:0.3.4, @endo/import-bundle@npm:^0.3.4": - version: 0.3.4 - resolution: "@endo/import-bundle@npm:0.3.4" +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.5, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" dependencies: - "@endo/base64": "npm:^0.2.31" - "@endo/compartment-mapper": "npm:^0.8.4" - checksum: 10c0/3d5b235867c210deb90b5981a309142010e2e63d3ee1492855676e182529e091fbf27282dff5756fefcdbc9ae86f42746701b66398754d094e486e06afa940fc + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + checksum: 10c0/e0d95743c25183b961aa1f11dd81c067739fd2fb3deeab58520e949961eacba9ed109bb01b9ed820d596e8a043b6721d650d9624abf0263296cca647e7286a2e languageName: node linkType: hard -"@endo/import-bundle@npm:^1.2.2": - version: 1.2.2 - resolution: "@endo/import-bundle@npm:1.2.2" +"@endo/import-bundle@npm:^0.3.4": + version: 0.3.5 + resolution: "@endo/import-bundle@npm:0.3.5" dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/errors": "npm:^1.2.5" - "@endo/where": "npm:^1.0.7" - ses: "npm:^1.8.0" - checksum: 10c0/fa4090554c8ed063090df5217a7e739edcec8b1707ebd7c80d034db7c07a1388531c8119e99c877851f1dd37d8c3c5a12780cd4dc26788e90c1c3d7265e24e6e + "@endo/base64": "npm:^0.2.32" + "@endo/compartment-mapper": "npm:^0.8.5" + checksum: 10c0/a86572e8fea258bb4c047c6ddc5e033f524f4885b304188405c5bf5f1234be128d3e97e62dfc45b7dfe7760194c8cfc67686d83004d9007f8bc68fbae651aded languageName: node linkType: hard -"@endo/init@npm:0.5.56, @endo/init@npm:^0.5.56": - version: 0.5.56 - resolution: "@endo/init@npm:0.5.56" +"@endo/import-bundle@npm:^1.2.2, @endo/import-bundle@npm:^1.3.1": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" dependencies: - "@endo/base64": "npm:^0.2.31" - "@endo/eventual-send": "npm:^0.17.2" - "@endo/lockdown": "npm:^0.1.28" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/f7e8b6b524de282683f601764d87bc72f0a82e63ed7d2fbe1c40c45f41eb10b25cde49a570c879fb46449e5dc28d0a288536847051dd1b4171bb0092c80a6403 + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/where": "npm:^1.0.9" + ses: "npm:^1.10.0" + checksum: 10c0/cc38bb7858c4b3a3d1cfbf70b0af3b05b527019452eb922313b4adf87e5590f5cacf4ff5dbd7a44c172d3c220de41edc3fa8895551f76071c85f1450ff94b09a languageName: node linkType: hard -"@endo/init@npm:^0.5.60": +"@endo/init@npm:^0.5.56, @endo/init@npm:^0.5.60": version: 0.5.60 resolution: "@endo/init@npm:0.5.60" dependencies: @@ -3381,19 +4098,7 @@ __metadata: languageName: node linkType: hard -"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.4": - version: 1.1.4 - resolution: "@endo/init@npm:1.1.4" - dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/lockdown": "npm:^1.0.10" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/9e915b3b888b7a9f1d563d532ad180dea987253d71e79eda1fcda8d287391611bcca369f2d9b89c59b9f24b3adc548816954e8eaefa4f7402c68585245a686a5 - languageName: node - linkType: hard - -"@endo/init@npm:^1.1.7": +"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.4, @endo/init@npm:^1.1.6, @endo/init@npm:^1.1.7": version: 1.1.7 resolution: "@endo/init@npm:1.1.7" dependencies: @@ -3405,16 +4110,7 @@ __metadata: languageName: node linkType: hard -"@endo/lockdown@npm:^0.1.28": - version: 0.1.28 - resolution: "@endo/lockdown@npm:0.1.28" - dependencies: - ses: "npm:^0.18.4" - checksum: 10c0/99ab7b0929159d1f4da7fef613e5c5b2fc468cd099040521dc09c2ee6843ade599b4915dfe93ee95048e7f75fcbf3557459aa431349765ce10edd152c580cc1b - languageName: node - linkType: hard - -"@endo/lockdown@npm:^0.1.32": +"@endo/lockdown@npm:^0.1.28, @endo/lockdown@npm:^0.1.32": version: 0.1.32 resolution: "@endo/lockdown@npm:0.1.32" dependencies: @@ -3423,16 +4119,7 @@ __metadata: languageName: node linkType: hard -"@endo/lockdown@npm:^1.0.10": - version: 1.0.10 - resolution: "@endo/lockdown@npm:1.0.10" - dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/94be0c1b14cacb2d8088dcc17998e901159a028c51170d78a8cc6a820ae76cabc7d2694f1a1956cb4eab70a8c9a0c8254d88ea4c3f3d9725b739aacf6db83d5b - languageName: node - linkType: hard - -"@endo/lockdown@npm:^1.0.13": +"@endo/lockdown@npm:^1.0.12, @endo/lockdown@npm:^1.0.13": version: 1.0.13 resolution: "@endo/lockdown@npm:1.0.13" dependencies: @@ -3441,18 +4128,6 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:0.8.5": - version: 0.8.5 - resolution: "@endo/marshal@npm:0.8.5" - dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/nat": "npm:^4.1.27" - "@endo/pass-style": "npm:^0.1.3" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/026e4738c7678d89c8c7658eb964c365126d159deec9bd0293a5c2120e53abfd4eeab05ff2b9e2085781ac31914e1aa399782fde385e34ff7d9a08a8283518fa - languageName: node - linkType: hard - "@endo/marshal@npm:^0.8.5, @endo/marshal@npm:^0.8.9": version: 0.8.9 resolution: "@endo/marshal@npm:0.8.9" @@ -3465,30 +4140,17 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:^1.5.2, @endo/marshal@npm:^1.5.3": - version: 1.5.3 - resolution: "@endo/marshal@npm:1.5.3" - dependencies: - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/05f4fceef7727971d3d2a1b8d87f4d9c6651772f9d231e2daa36c3ed0b0e13c3b8d26cb4828ecaadf4329bf77792a293507eadcff7a61df292d4e390936993d1 - languageName: node - linkType: hard - -"@endo/module-source@npm:^1.0.2": - version: 1.0.2 - resolution: "@endo/module-source@npm:1.0.2" +"@endo/marshal@npm:^1.5.3, @endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" dependencies: - "@agoric/babel-generator": "npm:^7.17.6" - "@babel/parser": "npm:^7.23.6" - "@babel/traverse": "npm:^7.23.6" - "@babel/types": "npm:^7.24.0" - ses: "npm:^1.8.0" - checksum: 10c0/137b8b798c854a024074c2e7c62eef8663b21cc96e3faab94a9836a57ba13224a21d2116c7da187d060a701f7dc7a3b15f540181576d54afafc287f430ad6c23 + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/bdb634a77c2147c1359792531822aabe642a5e4d39f496dd57bb97367617a2f2d72edaaa50c51ed6a2ec1f2c08deab6a571c3dd8ffa260d441d25f53606902b1 languageName: node linkType: hard @@ -3505,24 +4167,17 @@ __metadata: languageName: node linkType: hard -"@endo/nat@npm:4.1.27, @endo/nat@npm:^4.1.27": - version: 4.1.27 - resolution: "@endo/nat@npm:4.1.27" - checksum: 10c0/41407ce76ca14f1cd6919ca8017e587f0f15abf8afc4367213d77200e776397ac3a796039be2d45a70b9c75225fccf83f10bfe0f66aa01bf04705b71b3d325d9 - languageName: node - linkType: hard - -"@endo/nat@npm:^4.1.31": +"@endo/nat@npm:^4.1.27, @endo/nat@npm:^4.1.31": version: 4.1.31 resolution: "@endo/nat@npm:4.1.31" checksum: 10c0/d77f2663b6f22cf4912e71d9a7b9e3e8268519a46d95675197bb2eaf788cccfefda909e632db446d161701a77595d7bb481afc0b1fe026167cbbf245ed3ccdb8 languageName: node linkType: hard -"@endo/nat@npm:^5.0.10, @endo/nat@npm:^5.0.9": - version: 5.0.10 - resolution: "@endo/nat@npm:5.0.10" - checksum: 10c0/7ad2aa2d216d517409c771aebb465aceb6ea8b88ec808c2dc030d7ffc7fe7d601d8401572f3866384a63ff2aa74209a22f29e1561e773d91d7ad2d81fa13fc7e +"@endo/nat@npm:^5.0.10, @endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13, @endo/nat@npm:^5.0.9": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 languageName: node linkType: hard @@ -3537,29 +4192,19 @@ __metadata: languageName: node linkType: hard -"@endo/netstring@npm:^1.0.10": - version: 1.0.10 - resolution: "@endo/netstring@npm:1.0.10" - dependencies: - "@endo/init": "npm:^1.1.4" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/stream": "npm:^1.2.5" - ses: "npm:^1.8.0" - checksum: 10c0/518987df7a1bb31e5b0f643651aa49f991dcc3b1c96a5072f0209d609d07a945d6aff0eb264f5d1c24d55aa8d2cde03591aa74aa62f303c2ab0582bc4162f393 - languageName: node - linkType: hard - -"@endo/pass-style@npm:^0.1.3": - version: 0.1.3 - resolution: "@endo/pass-style@npm:0.1.3" +"@endo/netstring@npm:^1.0.10, @endo/netstring@npm:^1.0.12": + version: 1.0.13 + resolution: "@endo/netstring@npm:1.0.13" dependencies: - "@endo/promise-kit": "npm:^0.2.56" - "@fast-check/ava": "npm:^1.1.3" - checksum: 10c0/9d2667694a66d87f5ef45449fe426c94aa0a862a298c5f2694ec71bf3f500cae3499e96011e26d38ef02bebdc7f24b16809892694437e9dee6d40066d6507fcd + "@endo/init": "npm:^1.1.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + ses: "npm:^1.10.0" + checksum: 10c0/1d669ffca92609b3e179bd235c3660ef2fd36a808d4df523fdd6c276cd2a47e2177c43a4e37b4bfb8cacfd1b4e1657cec7d197518c795652c8c248997ee59948 languageName: node linkType: hard -"@endo/pass-style@npm:^0.1.7": +"@endo/pass-style@npm:^0.1.3, @endo/pass-style@npm:^0.1.7": version: 0.1.7 resolution: "@endo/pass-style@npm:0.1.7" dependencies: @@ -3569,53 +4214,44 @@ __metadata: languageName: node linkType: hard -"@endo/pass-style@npm:^1.4.3": - version: 1.4.3 - resolution: "@endo/pass-style@npm:1.4.3" +"@endo/pass-style@npm:^1.4.3, @endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/pass-style@npm:1.4.7" dependencies: - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/promise-kit": "npm:^1.1.5" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" "@fast-check/ava": "npm:^1.1.5" - checksum: 10c0/f24c528b1219f5aa122f9a04e80459dec3e9664e7849019b172ad8354870b849b643c8dfc79104857827457d66b2bb09bade9b2c6ea717a97e613ecf6d53c1f9 - languageName: node - linkType: hard - -"@endo/patterns@npm:^0.2.2": - version: 0.2.2 - resolution: "@endo/patterns@npm:0.2.2" - dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/marshal": "npm:^0.8.5" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/49a598115e23b7da5680288bceae2d77b425261128ac9963ea139917f1da46bd97894bc3a0981eea966877d6042f4d35583a1b6986d887a1cc48851c951ae33a + checksum: 10c0/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e languageName: node linkType: hard -"@endo/patterns@npm:^1.4.2, @endo/patterns@npm:^1.4.3": - version: 1.4.3 - resolution: "@endo/patterns@npm:1.4.3" +"@endo/patterns@npm:^0.2.2, @endo/patterns@npm:^0.2.6": + version: 0.2.6 + resolution: "@endo/patterns@npm:0.2.6" dependencies: - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/10aabc6459d1b5d26e8946ab1b88db23eda80231aa6a0b6c9835568eee1daf745d23c29fa7f202bf11859a7ae77d5f51071c3d863d34e259a62c382ec797bb03 + "@endo/eventual-send": "npm:^0.17.6" + "@endo/marshal": "npm:^0.8.9" + "@endo/promise-kit": "npm:^0.2.60" + checksum: 10c0/fa8f6bc1dcea4296486708d36baa1d306a0c7c5f7d88b0e2469e27aaef4e97f68a89c39dfe53a128888abbc568851a3ba3c63da78242b925a4811bd56912c133 languageName: node linkType: hard -"@endo/promise-kit@npm:0.2.56, @endo/promise-kit@npm:^0.2.56": - version: 0.2.56 - resolution: "@endo/promise-kit@npm:0.2.56" +"@endo/patterns@npm:^1.4.3, @endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" dependencies: - ses: "npm:^0.18.4" - checksum: 10c0/ceb59dae724681f0f88a863efbabbd25a142b536664c2c6cbdd8532bc45317f99bc70d837c77d8c54d39d7baeac8fd70fa9787304fd169d5f2a1f014f46b9498 + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/358720438a019847406dfad9f23fc9b565c955ffd86d75693cea994c492dd46efaf189502f04b04f8870e6d50ffcb44ffa1e1dd3a0d6b2dfbbe57edeb994b83b languageName: node linkType: hard -"@endo/promise-kit@npm:^0.2.60": +"@endo/promise-kit@npm:^0.2.56, @endo/promise-kit@npm:^0.2.60": version: 0.2.60 resolution: "@endo/promise-kit@npm:0.2.60" dependencies: @@ -3624,16 +4260,7 @@ __metadata: languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/promise-kit@npm:1.1.5" - dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/3a9fb59546507dbbb8c83ada4de664ca4f6085ffcb56c9e3e07789e002e717454b1ee5ae1273549935a7e77ac42be7ae8ddca94ff6d4f16914210d31159ce1a4 - languageName: node - linkType: hard - -"@endo/promise-kit@npm:^1.1.8": +"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.5, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": version: 1.1.8 resolution: "@endo/promise-kit@npm:1.1.8" dependencies: @@ -3642,29 +4269,20 @@ __metadata: languageName: node linkType: hard -"@endo/ses-ava@npm:0.2.40": - version: 0.2.40 - resolution: "@endo/ses-ava@npm:0.2.40" - dependencies: - ses: "npm:^0.18.4" - checksum: 10c0/5b11104107a1a43724a686cceb425bed4235aad9a8e2d5bf13e4848a08b1711b29ea40bd31aec4991c328578f3f4532975f26f99377392b026c39b851f8f0979 - languageName: node - linkType: hard - -"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/ses-ava@npm:1.2.5" +"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.5, @endo/ses-ava@npm:^1.2.7": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" dependencies: - "@endo/env-options": "npm:^1.1.6" - "@endo/init": "npm:^1.1.4" - ses: "npm:^1.8.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/init": "npm:^1.1.7" + ses: "npm:^1.10.0" peerDependencies: ava: ^5.3.0 || ^6.1.2 - checksum: 10c0/cabde169f565d9a61f5d41040599c43b5675f6220f66d4d6a56d351e1465434e94b52b1d664444fbd57d4b8700fa97ac9886fc806f5172552c3318269347c376 + checksum: 10c0/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf languageName: node linkType: hard -"@endo/static-module-record@npm:^0.7.19": +"@endo/static-module-record@npm:^0.7.20": version: 0.7.20 resolution: "@endo/static-module-record@npm:0.7.20" dependencies: @@ -3701,30 +4319,19 @@ __metadata: languageName: node linkType: hard -"@endo/stream-node@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/stream-node@npm:1.1.5" - dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/init": "npm:^1.1.4" - "@endo/stream": "npm:^1.2.5" - ses: "npm:^1.8.0" - checksum: 10c0/54fa69e1d334000df574ed9ebcaa82d88786a502ac28781caaab971aee18b700e1a6bf1e34fcf77a14d763f96eda61133f6e7091c0186001353b89727e84c0a8 - languageName: node - linkType: hard - -"@endo/stream@npm:^0.3.25": - version: 0.3.25 - resolution: "@endo/stream@npm:0.3.25" +"@endo/stream-node@npm:^1.1.5, @endo/stream-node@npm:^1.1.7": + version: 1.1.8 + resolution: "@endo/stream-node@npm:1.1.8" dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/promise-kit": "npm:^0.2.56" - ses: "npm:^0.18.4" - checksum: 10c0/3a572465c33d5a66da697780da9e236e3caa80d3f43c2e35af6aadd11b43d10968573125c876a6b24ec716866c090ad0782b2df59f0834873059294867d4752c + "@endo/errors": "npm:^1.2.8" + "@endo/init": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.8" + ses: "npm:^1.10.0" + checksum: 10c0/d07769acf381b4b5a904bfdae1b7aba0b7cb11f8ed1a38892a072b68e3dd8eb1954c77984a6eb7af09006ad5e707a8aa4e2c5d4424eb6898beae9ceb0015d8e3 languageName: node linkType: hard -"@endo/stream@npm:^0.3.29": +"@endo/stream@npm:^0.3.25, @endo/stream@npm:^0.3.29": version: 0.3.29 resolution: "@endo/stream@npm:0.3.29" dependencies: @@ -3735,14 +4342,14 @@ __metadata: languageName: node linkType: hard -"@endo/stream@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/stream@npm:1.2.5" +"@endo/stream@npm:^1.2.5, @endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" dependencies: - "@endo/eventual-send": "npm:^1.2.5" - "@endo/promise-kit": "npm:^1.1.5" - ses: "npm:^1.8.0" - checksum: 10c0/625fd9b8b485149c269a01673b76b33fadd0702d76eb37f136c9f7558252e3d51cc9602b2880f1b43971a00f41e5d3e3d2b3a6ebef6f0253bb314d9a144a2cf5 + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" + ses: "npm:^1.10.0" + checksum: 10c0/f435f7650020b32c10bb4cb139910b363b4d4f22bcf9e7a659d3d2eae694a3ea43c3af49c80370760a573370429e5fbe1619dec631251578d4c5eba9ff161613 languageName: node linkType: hard @@ -3760,13 +4367,6 @@ __metadata: languageName: node linkType: hard -"@endo/where@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/where@npm:1.0.7" - checksum: 10c0/a76306e670074b43c15a223e4118c500ad03851586516d6a0204d5d865e3b8eda161a86b54de503efe11aa70c04d7adbd9e5185a905c3a1a953a757f680d6a68 - languageName: node - linkType: hard - "@endo/where@npm:^1.0.9": version: 1.0.9 resolution: "@endo/where@npm:1.0.9" @@ -3774,28 +4374,14 @@ __metadata: languageName: node linkType: hard -"@endo/zip@npm:0.2.31, @endo/zip@npm:^0.2.31": - version: 0.2.31 - resolution: "@endo/zip@npm:0.2.31" - checksum: 10c0/6c3564be33ad7967678f7db2a942191ee12c43fe88868bba93e70ab882d3a650903597e2a85aaaf40aba86654bbc68d570970940440ea12ffe26a790c718d534 - languageName: node - linkType: hard - -"@endo/zip@npm:^0.2.35": +"@endo/zip@npm:^0.2.31, @endo/zip@npm:^0.2.32, @endo/zip@npm:^0.2.35": version: 0.2.35 resolution: "@endo/zip@npm:0.2.35" checksum: 10c0/bb81c085e47a5d67342dcc039b2f471e4679e08de95cea3cdba598e2644125ec0b2002e7a1d3ff9a10977380487a58688d7e2c4d1d5525c16e46fed4b735372d languageName: node linkType: hard -"@endo/zip@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/zip@npm:1.0.7" - checksum: 10c0/a1c0d155448ce877012b34c8fe8cd3a58de9eb807514c81cddeebb802ee8e552b27d8a9a40fab3f3e4c49e0cb7fea6902fa1dd12a23ff6f30b56161fc3edc1f8 - languageName: node - linkType: hard - -"@endo/zip@npm:^1.0.9": +"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.8, @endo/zip@npm:^1.0.9": version: 1.0.9 resolution: "@endo/zip@npm:1.0.9" checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc @@ -3813,9 +4399,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -3834,9 +4420,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -3855,9 +4441,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -3876,9 +4462,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -3897,9 +4483,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -3918,9 +4504,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3939,9 +4525,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3960,9 +4546,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3981,9 +4567,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -4002,9 +4588,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -4023,9 +4609,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -4044,9 +4630,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -4065,9 +4651,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -4086,9 +4672,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -4107,9 +4693,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -4128,9 +4714,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -4149,9 +4735,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -4170,9 +4756,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -4198,9 +4784,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -4219,9 +4805,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -4240,9 +4826,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -4261,9 +4847,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -4282,9 +4868,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4297,20 +4883,20 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard @@ -4338,6 +4924,48 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/common@npm:^3.2.0": + version: 3.2.0 + resolution: "@ethereumjs/common@npm:3.2.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + crc-32: "npm:^1.2.0" + checksum: 10c0/4e2256eb54cc544299f4d7ebc9daab7a3613c174de3981ea5ed84bd10c41a03d013d15b1abad292da62fd0c4b8ce5b220a258a25861ccffa32f2cc9a8a4b25d8 + languageName: node + linkType: hard + +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: 10c0/78379f288e9d88c584c2159c725c4a667a9742981d638bad760ed908263e0e36bdbd822c0a902003e0701195fd1cbde7adad621cd97fdfbf552c45e835ce022c + languageName: node + linkType: hard + +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": + version: 4.2.0 + resolution: "@ethereumjs/tx@npm:4.2.0" + dependencies: + "@ethereumjs/common": "npm:^3.2.0" + "@ethereumjs/rlp": "npm:^4.0.1" + "@ethereumjs/util": "npm:^8.1.0" + ethereum-cryptography: "npm:^2.0.0" + checksum: 10c0/f168303edf5970673db06d2469a899632c64ba0cd5d24480e97683bd0e19cc22a7b0a7bc7db3a49760f09826d4c77bed89b65d65252daf54857dd3d97324fb9a + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": "npm:^4.0.1" + ethereum-cryptography: "npm:^2.0.0" + micro-ftch: "npm:^0.3.1" + checksum: 10c0/4e6e0449236f66b53782bab3b387108f0ddc050835bfe1381c67a7c038fea27cb85ab38851d98b700957022f0acb6e455ca0c634249cfcce1a116bad76500160 + languageName: node + linkType: hard + "@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/abi@npm:5.7.0" @@ -4768,12 +5396,12 @@ __metadata: linkType: hard "@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.5.3": - version: 1.6.11 - resolution: "@floating-ui/dom@npm:1.6.11" + version: 1.6.12 + resolution: "@floating-ui/dom@npm:1.6.12" dependencies: "@floating-ui/core": "npm:^1.6.0" "@floating-ui/utils": "npm:^0.2.8" - checksum: 10c0/02ef34a75a515543c772880338eea7b66724997bd5ec7cd58d26b50325709d46d480a306b84e7d5509d734434411a4bcf23af5680c2e461e6e6a8bf45d751df8 + checksum: 10c0/c67b39862175b175c6ac299ea970f17a22c7482cfdf3b1bc79313407bf0880188b022b878953fa69d3ce166ff2bd9ae57c86043e5dd800c262b470d877591b7d languageName: node linkType: hard @@ -4790,8 +5418,8 @@ __metadata: linkType: hard "@floating-ui/react@npm:^0.26.4": - version: 0.26.24 - resolution: "@floating-ui/react@npm:0.26.24" + version: 0.26.28 + resolution: "@floating-ui/react@npm:0.26.28" dependencies: "@floating-ui/react-dom": "npm:^2.1.2" "@floating-ui/utils": "npm:^0.2.8" @@ -4799,7 +5427,7 @@ __metadata: peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/c5c3ac265802087673a69b0e08b3bea1ee02de9da4cdbc40bb1c9e06823be72628a82f1655b40d56a4383715b4ab3b6deddff4e69146f513970ee592e1dd8f92 + checksum: 10c0/a42df129e1e976fe8ba3f4c8efdda265a0196c1b66b83f2b9b27423d08dcc765406f893aeff9d830e70e3f14a9d4c490867eb4c32983317cbaa33863b0fae6f6 languageName: node linkType: hard @@ -4810,52 +5438,53 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:1.18.2": - version: 1.18.2 - resolution: "@formatjs/ecma402-abstract@npm:1.18.2" +"@formatjs/ecma402-abstract@npm:2.2.4": + version: 2.2.4 + resolution: "@formatjs/ecma402-abstract@npm:2.2.4" dependencies: - "@formatjs/intl-localematcher": "npm:0.5.4" - tslib: "npm:^2.4.0" - checksum: 10c0/87afb37dd937555e712ca85d5142a9083d617c491d1dddf8d660fdfb6186272d2bc75b78809b076388d26f016200c8bddbce73281fd707eb899da2bf3bc9b7ca + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/intl-localematcher": "npm:0.5.8" + tslib: "npm:2" + checksum: 10c0/3f262533fa704ea7a1a7a8107deee2609774a242c621f8cb5dd4bf4c97abf2fc12f5aeda3f4ce85be18147c484a0ca87303dca6abef53290717e685c55eabd2d languageName: node linkType: hard -"@formatjs/fast-memoize@npm:2.2.0": - version: 2.2.0 - resolution: "@formatjs/fast-memoize@npm:2.2.0" +"@formatjs/fast-memoize@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/fast-memoize@npm:2.2.3" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/ae88c5a93b96235aba4bd9b947d0310d2ec013687a99133413361b24122b5cdea8c9bf2e04a4a2a8b61f1f4ee5419ef6416ca4796554226b5050e05a9ce6ef49 + tslib: "npm:2" + checksum: 10c0/f1004c3b280de7e362bd37c5f48ff34c2ba1d6271d4a7b695fed561d1201a3379397824d8bffbf15fecee344d1e70398393bbb04297f242692310a305f12e75b languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.7.6": - version: 2.7.6 - resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6" +"@formatjs/icu-messageformat-parser@npm:2.9.4": + version: 2.9.4 + resolution: "@formatjs/icu-messageformat-parser@npm:2.9.4" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/icu-skeleton-parser": "npm:1.8.0" - tslib: "npm:^2.4.0" - checksum: 10c0/9fc72c2075333a969601e2be4260638940b1abefd1a5fc15b93b0b10d2319c9df5778aa51fc2a173ce66ca5e8a47b4b64caca85a32d0eb6095e16e8d65cb4b00 + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/icu-skeleton-parser": "npm:1.8.8" + tslib: "npm:2" + checksum: 10c0/f1ed14ece7ef0abc9fb62e323b78c994fc772d346801ad5aaa9555e1a7d5c0fda791345f4f2e53a3223f0b82c1a4eaf9a83544c1c20cb39349d1a39bedcf1648 languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.8.0": - version: 1.8.0 - resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0" +"@formatjs/icu-skeleton-parser@npm:1.8.8": + version: 1.8.8 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.8" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - tslib: "npm:^2.4.0" - checksum: 10c0/10956732d70cc67049d216410b5dc3ef048935d1ea2ae76f5755bb9d0243af37ddeabd5d140ddbf5f6c7047068c3d02a05f93c68a89cedfaf7488d5062885ea4 + "@formatjs/ecma402-abstract": "npm:2.2.4" + tslib: "npm:2" + checksum: 10c0/5ad78a5682e83b973e6fed4fca68660b944c41d1e941f0c84d69ff3d10ae835330062dc0a2cf0d237d2675ad3463405061a3963c14c2b9d8d1c1911f892b1a8d languageName: node linkType: hard -"@formatjs/intl-localematcher@npm:0.5.4": - version: 0.5.4 - resolution: "@formatjs/intl-localematcher@npm:0.5.4" +"@formatjs/intl-localematcher@npm:0.5.8": + version: 0.5.8 + resolution: "@formatjs/intl-localematcher@npm:0.5.8" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/c9ff5d34ca8b6fe59f8f303a3cc31a92d343e095a6987e273e5cc23f0fe99feb557a392a05da95931c7d24106acb6988e588d00ddd05b0934005aafd7fdbafe6 + tslib: "npm:2" + checksum: 10c0/7a660263986326b662d4cb537e8386331c34fda61fb830b105e6c62d49be58ace40728dae614883b27a41cec7b1df8b44f72f79e16e6028bfca65d398dc04f3b languageName: node linkType: hard @@ -4996,40 +5625,40 @@ __metadata: languageName: node linkType: hard -"@internationalized/date@npm:^3.5.5": - version: 3.5.5 - resolution: "@internationalized/date@npm:3.5.5" +"@internationalized/date@npm:^3.5.6": + version: 3.5.6 + resolution: "@internationalized/date@npm:3.5.6" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/fc17291c8923eaf413e4cb1c74570a8f78269d8b6a5ad74de6f4f45b4e9a84f4243a9c3f224526c36b024f77e4a2fae34df6b34b022ae1b068384e04ad32560e + checksum: 10c0/25d3150247175892705aeaf8e1a78295717d420c37cb3065a766c4058a1aed460a69dc5362f7073425c95095c27036c7ed65f0ce5fbb32b20f917132e8dc543f languageName: node linkType: hard -"@internationalized/message@npm:^3.1.4": - version: 3.1.4 - resolution: "@internationalized/message@npm:3.1.4" +"@internationalized/message@npm:^3.1.5": + version: 3.1.5 + resolution: "@internationalized/message@npm:3.1.5" dependencies: "@swc/helpers": "npm:^0.5.0" intl-messageformat: "npm:^10.1.0" - checksum: 10c0/29d2a2117381a2e50377a13cdc4379981403992b917997c477bc7bc82b59fcdd1252addf36d001edd4d30b2f496ad9c5a982732b52032e5559f0703e27521a9c + checksum: 10c0/81a2ef21154d0b00796fd2ecfb5365248fe50f64a7ad1616dbe4e491555e7e018557b061df145d0ab5b68cb1e757ac203d3892c42f791f169360b98d77fa5091 languageName: node linkType: hard -"@internationalized/number@npm:^3.5.3": - version: 3.5.3 - resolution: "@internationalized/number@npm:3.5.3" +"@internationalized/number@npm:^3.5.4": + version: 3.5.4 + resolution: "@internationalized/number@npm:3.5.4" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/dd1bb4e89c6468b97e8357e1ba0a60234bd2c8226f3241c4c7499e5b1791ba0574127ea6de0fd6c4158e2ceef564bba6531a8f5589e58b820df669e312500f99 + checksum: 10c0/d01a1845ad9815756ceb59eeb75792ee89105d073ce232350c0644453a3470e3ebaffc2b00ebd2dd8238957b0ae12d1551633308897fa9c332dda82f2af8c5cf languageName: node linkType: hard -"@internationalized/string@npm:^3.2.3": - version: 3.2.3 - resolution: "@internationalized/string@npm:3.2.3" +"@internationalized/string@npm:^3.2.4": + version: 3.2.4 + resolution: "@internationalized/string@npm:3.2.4" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/824d2972951823d0421babb7e03003228fcbd9966028264838b2dad1032d4142f159c82f730a0b8026b8c8c10f06afe7df634c8d0cc8a9b6362909c6f653440a + checksum: 10c0/5a03ff3d7bea1eb0e7ef8f7b00d148b6b8afa90600434db61389e6a8a83e3ca89e469c730eb02ef6284e7b559ce4be8f46cb446387e137931bc47acb8cbcd841 languageName: node linkType: hard @@ -5185,33 +5814,37 @@ __metadata: linkType: hard "@keplr-wallet/provider-extension@npm:^0.12.95": - version: 0.12.129 - resolution: "@keplr-wallet/provider-extension@npm:0.12.129" + version: 0.12.156 + resolution: "@keplr-wallet/provider-extension@npm:0.12.156" dependencies: - "@keplr-wallet/types": "npm:0.12.129" + "@keplr-wallet/types": "npm:0.12.156" deepmerge: "npm:^4.2.2" long: "npm:^4.0.0" - checksum: 10c0/28b4d66d247a7be7cc5634287474d719cb07f16fbd1fcc1f1a0962e70efd6e9a9096937e5cc39f8beef77b193ee52ac39b7ed74df1e371b69b61fa506291745c + peerDependencies: + starknet: ^6 + checksum: 10c0/859c1264cc8491e32f5fc1ac5481cc62e4e63b1d08af4368cee35848bed882531e897c3d07e6fe631d649b6d91bda818a8b31860bf9bfad9366d19c7bd66afe5 languageName: node linkType: hard -"@keplr-wallet/provider@npm:0.12.129": - version: 0.12.129 - resolution: "@keplr-wallet/provider@npm:0.12.129" +"@keplr-wallet/provider@npm:0.12.156": + version: 0.12.156 + resolution: "@keplr-wallet/provider@npm:0.12.156" dependencies: - "@keplr-wallet/router": "npm:0.12.129" - "@keplr-wallet/types": "npm:0.12.129" + "@keplr-wallet/router": "npm:0.12.156" + "@keplr-wallet/types": "npm:0.12.156" buffer: "npm:^6.0.3" deepmerge: "npm:^4.2.2" long: "npm:^4.0.0" - checksum: 10c0/75afee6485365b6eeece9aa93008d3b1327bc1e835c6a2725f5dadea64bdb01fa2fd0eb7ed48a6a9ed1fc43e67911289fb5d1d9f94f3103eae2dae534e271e27 + peerDependencies: + starknet: ^6 + checksum: 10c0/dea62070a735bcbe6c0a5bfc941931a887abafbae6475224ae3bbc0c69aab633cd7d851dca10f230112faabfd63d6fd6f9a83d3d5a1c40d3c85a4638a8fa3eff languageName: node linkType: hard -"@keplr-wallet/router@npm:0.12.129": - version: 0.12.129 - resolution: "@keplr-wallet/router@npm:0.12.129" - checksum: 10c0/8c2e316b0c68c47a2de557d3b759fe6ffb19249e241963ebbae54349fe423a4e54312f22854f5c9c31d37f43b2cdd43f109279c1521fbfbe74d80ab1cd55166a +"@keplr-wallet/router@npm:0.12.156": + version: 0.12.156 + resolution: "@keplr-wallet/router@npm:0.12.156" + checksum: 10c0/ef3e1ffce5b10a0a9f40e6c17835aa7460d15080cc8e2f147d8b5b8b344e41c47f88906da3aa5af336415883bd86dc806d1b3fa4d1b20a4b1467e6b46b1d9334 languageName: node linkType: hard @@ -5222,12 +5855,14 @@ __metadata: languageName: node linkType: hard -"@keplr-wallet/types@npm:0.12.129, @keplr-wallet/types@npm:^0.12.121, @keplr-wallet/types@npm:^0.12.90, @keplr-wallet/types@npm:^0.12.95": - version: 0.12.129 - resolution: "@keplr-wallet/types@npm:0.12.129" +"@keplr-wallet/types@npm:0.12.156, @keplr-wallet/types@npm:^0.12.121, @keplr-wallet/types@npm:^0.12.90, @keplr-wallet/types@npm:^0.12.95": + version: 0.12.156 + resolution: "@keplr-wallet/types@npm:0.12.156" dependencies: long: "npm:^4.0.0" - checksum: 10c0/64ebd2cc366e837540f681416e3270a2cb94c4bff99ae39891ff04efa2b5731b0a86429b1f70a5247da6950c664829d5f4dcc3e997bf5fb82972d68e56b8a71d + peerDependencies: + starknet: ^6 + checksum: 10c0/3f5d461922c4fd14c1fbefd8477eacc99140bb32fab2859c9f36d5eb26d5a7d30c2858d783a3ec8ced3617b1a517dc7d5080455c04d1ca30990c21d1e0b7ce00 languageName: node linkType: hard @@ -5252,18 +5887,19 @@ __metadata: linkType: hard "@keplr-wallet/wc-client@npm:^0.12.95": - version: 0.12.129 - resolution: "@keplr-wallet/wc-client@npm:0.12.129" + version: 0.12.156 + resolution: "@keplr-wallet/wc-client@npm:0.12.156" dependencies: - "@keplr-wallet/provider": "npm:0.12.129" - "@keplr-wallet/types": "npm:0.12.129" + "@keplr-wallet/provider": "npm:0.12.156" + "@keplr-wallet/types": "npm:0.12.156" buffer: "npm:^6.0.3" deepmerge: "npm:^4.2.2" long: "npm:^3 || ^4 || ^5" peerDependencies: "@walletconnect/sign-client": ^2 "@walletconnect/types": ^2 - checksum: 10c0/f5ccbf7e2dfc9e3d9df5e3588383d6f2d4fcb48356ad96b108077f7e050b40d72584dba35f8e6dcaedd2605c7d42e4b6a13ff70ccc78104e46560c2fec847ffd + starknet: ^6 + checksum: 10c0/c82e2d6a6cebef3095c013f1658e2ea87c96d4c426f7e3c6adcb695f31cc06774e4d47d795b911ade0de743b98b44c79ced00ac90c390e72b7a2d80f32a34425 languageName: node linkType: hard @@ -5383,69 +6019,69 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^8.2.2": - version: 8.2.2 - resolution: "@ledgerhq/devices@npm:8.2.2" +"@ledgerhq/devices@npm:^8.4.4": + version: 8.4.4 + resolution: "@ledgerhq/devices@npm:8.4.4" dependencies: - "@ledgerhq/errors": "npm:^6.16.3" + "@ledgerhq/errors": "npm:^6.19.1" "@ledgerhq/logs": "npm:^6.12.0" rxjs: "npm:^7.8.1" semver: "npm:^7.3.5" - checksum: 10c0/c9bd63858ac4ce37a8e8fa3523ec1ed343b381d9711404d4334ef89d8cc8898af85e951b48ad962dce9a9c98344f0942393b69e52627cc34ec6e1b0dc93a5bbd + checksum: 10c0/ea4c3dada124c5c0aad59837e1c399bf2f41f8b4da5c996aaf73bbf8719082598808947c505dc728266ff83fc5fea71170d3f0d18a9b5d59e6e2737ae8a38f39 languageName: node linkType: hard -"@ledgerhq/errors@npm:^6.16.3": - version: 6.16.3 - resolution: "@ledgerhq/errors@npm:6.16.3" - checksum: 10c0/12e8e39317aac45694ae0f01f20b870a933611cd31187fc6ff63f268154b58f99d34b02f5dc033cbe3aebbe6fbfcd6f19aea842b7de22b5d8e051aef2fb94f94 +"@ledgerhq/errors@npm:^6.19.1": + version: 6.19.1 + resolution: "@ledgerhq/errors@npm:6.19.1" + checksum: 10c0/5cfbd5ff5e4316afc88c456a74d3dc0e0032dafd88f656e80a5cb5b297a75ba6701c53ce38ef3f38a84a8591c499b0b9248cdf352ff34c97a550440cdaddd8d2 languageName: node linkType: hard "@ledgerhq/hw-app-cosmos@npm:^6.28.1": - version: 6.29.5 - resolution: "@ledgerhq/hw-app-cosmos@npm:6.29.5" + version: 6.30.4 + resolution: "@ledgerhq/hw-app-cosmos@npm:6.30.4" dependencies: - "@ledgerhq/errors": "npm:^6.16.3" - "@ledgerhq/hw-transport": "npm:^6.30.5" + "@ledgerhq/errors": "npm:^6.19.1" + "@ledgerhq/hw-transport": "npm:^6.31.4" bip32-path: "npm:^0.4.2" - checksum: 10c0/0b1988defdf762abe3cd8d160f1e5234056765d0c4d13459300cef1c524a5b925dd85cb8c0357288537c040b72f48cb7d20a797770fdd1d24631a65b6419e3e9 + checksum: 10c0/d446c7d2ab8a2a803ba728ff68401c61ff49f1070b949fea14d7223e8e795928bcbb5c295a4dc8f6fccb74fe25b8e30991125dae864edcd0d8a7ea4e0b1aa92d languageName: node linkType: hard "@ledgerhq/hw-transport-webhid@npm:^6.27.15": - version: 6.28.5 - resolution: "@ledgerhq/hw-transport-webhid@npm:6.28.5" + version: 6.29.4 + resolution: "@ledgerhq/hw-transport-webhid@npm:6.29.4" dependencies: - "@ledgerhq/devices": "npm:^8.2.2" - "@ledgerhq/errors": "npm:^6.16.3" - "@ledgerhq/hw-transport": "npm:^6.30.5" + "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/errors": "npm:^6.19.1" + "@ledgerhq/hw-transport": "npm:^6.31.4" "@ledgerhq/logs": "npm:^6.12.0" - checksum: 10c0/e9233f83b9f5ee4ab480ffd894c44251c85d6a11c2591665ee5b91ce0997316a822bbd52ca9129736f074df5d809df576c528fd009a309652c1cc1bb41fe4862 + checksum: 10c0/85db88aa9c9ca4911645b9421e1a1ce828c48c32b03b7ed15caed8f8e24749dc31007540ec4f0088603d1a315274dbc06d30e4cb71c86b57160b721a664fc8dd languageName: node linkType: hard "@ledgerhq/hw-transport-webusb@npm:^6.27.15": - version: 6.28.5 - resolution: "@ledgerhq/hw-transport-webusb@npm:6.28.5" + version: 6.29.4 + resolution: "@ledgerhq/hw-transport-webusb@npm:6.29.4" dependencies: - "@ledgerhq/devices": "npm:^8.2.2" - "@ledgerhq/errors": "npm:^6.16.3" - "@ledgerhq/hw-transport": "npm:^6.30.5" + "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/errors": "npm:^6.19.1" + "@ledgerhq/hw-transport": "npm:^6.31.4" "@ledgerhq/logs": "npm:^6.12.0" - checksum: 10c0/25ae085cf6f74202f7c4d089aca39058790d32fa287de9fb3e7ae982fd9e80c34988ad3b82249b856839db81165e0c94f02a0a3954866b83f2cf13c393e3a2ba + checksum: 10c0/cddd324c12de64e755422c6dc0d509bc344f2f048c2b743bc5737db9c097ffb6c201fc577d971543e196ccb34a72507450ed3262a2b6d39c753424d299fafc2f languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.30.5": - version: 6.30.5 - resolution: "@ledgerhq/hw-transport@npm:6.30.5" +"@ledgerhq/hw-transport@npm:^6.31.4": + version: 6.31.4 + resolution: "@ledgerhq/hw-transport@npm:6.31.4" dependencies: - "@ledgerhq/devices": "npm:^8.2.2" - "@ledgerhq/errors": "npm:^6.16.3" + "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/errors": "npm:^6.19.1" "@ledgerhq/logs": "npm:^6.12.0" events: "npm:^3.3.0" - checksum: 10c0/ef80bb7d5839e3f2dc278fc4aaa2a2e74766cce80cfc0c42958601ce231ce576e2cd318ead971aa09263e43592160a5256a945ccb31dc542a341ad26f871102f + checksum: 10c0/033acb802d991788efcda9223356528d0987a268e94c34cbafde499541722363e7cfa6e2734365ef3282c0a80a69f4964a6d728690ff7494662a650516530b02 languageName: node linkType: hard @@ -5457,9 +6093,9 @@ __metadata: linkType: hard "@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": - version: 1.2.0 - resolution: "@lit-labs/ssr-dom-shim@npm:1.2.0" - checksum: 10c0/016168cf6901ab343462c13fb168dda6d549f8b42680aa394e6b7cd0af7cce51271e00dbfa5bbbe388912bf89cbb8f941a21cc3ec9bf95d6a84b6241aa9e5a72 + version: 1.2.1 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1" + checksum: 10c0/75cecf2cc4c1a089c6984d9f45b8264e3b4947b4ebed96aef7eb201bd6b3f26caeaafedf457884ac38d4f2d99cddaf94a4b2414c02c61fbf1f64c0a0dade11f4 languageName: node linkType: hard @@ -5472,6 +6108,28 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-json-rpc-provider@npm:^1.0.0": + version: 1.0.1 + resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" + dependencies: + "@metamask/json-rpc-engine": "npm:^7.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + checksum: 10c0/842f999d7a1c49b625fd863b453d076f393ac9090a1b9c7531aa24ec033e7e844c98a1c433ac02f4e66a62262d68c0d37c218dc724123da4eea1abcc12a63492 + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.3.3 + resolution: "@metamask/json-rpc-engine@npm:7.3.3" + dependencies: + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: 10c0/6c3b55de01593bc841de1bf4daac46cc307ed7c3b759fec12cbda582527962bb0d909b024e6c56251c0644379634cec24f3d37cbf3443430e148078db9baece1 + languageName: node + linkType: hard + "@metamask/object-multiplex@npm:^1.1.0": version: 1.3.0 resolution: "@metamask/object-multiplex@npm:1.3.0" @@ -5502,7 +6160,17 @@ __metadata: languageName: node linkType: hard -"@metamask/safe-event-emitter@npm:2.0.0, @metamask/safe-event-emitter@npm:^2.0.0": +"@metamask/rpc-errors@npm:^6.2.1": + version: 6.4.0 + resolution: "@metamask/rpc-errors@npm:6.4.0" + dependencies: + "@metamask/utils": "npm:^9.0.0" + fast-safe-stringify: "npm:^2.0.6" + checksum: 10c0/eeca3a2316c97f2f0e8922fc3a0625a704f76a1dd3b0cc78ed54dcc3c4ca7f5c3f5c90880e74c748f09f075cc21f176f3498421ad75a5c323535e454a7896c21 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^2.0.0": version: 2.0.0 resolution: "@metamask/safe-event-emitter@npm:2.0.0" checksum: 10c0/a86b91f909834dc14de7eadd38b22d4975f6529001d265cd0f5c894351f69f39447f1ef41b690b9849c86dd2a25a39515ef5f316545d36aea7b3fc50ee930933 @@ -5510,68 +6178,110 @@ __metadata: linkType: hard "@metamask/safe-event-emitter@npm:^3.0.0": - version: 3.1.1 - resolution: "@metamask/safe-event-emitter@npm:3.1.1" - checksum: 10c0/4dd51651fa69adf65952449b20410acac7edad06f176dc6f0a5d449207527a2e85d5a21a864566e3d8446fb259f8840bd69fdb65932007a882f771f473a2b682 + version: 3.1.2 + resolution: "@metamask/safe-event-emitter@npm:3.1.2" + checksum: 10c0/ca59aada3e79bae9609d3be2569c25c22f9b1df05821a2fbebfbcc835a811347e814eabf9dbbddf342fef9dcadac903492a49fdc0c9bcac0aff980c0d38daab2 languageName: node linkType: hard -"@metamask/utils@npm:^3.0.1": - version: 3.6.0 - resolution: "@metamask/utils@npm:3.6.0" +"@metamask/superstruct@npm:^3.0.0, @metamask/superstruct@npm:^3.1.0": + version: 3.1.0 + resolution: "@metamask/superstruct@npm:3.1.0" + checksum: 10c0/8820e76582b3d735a2142c878ac4830d962f7a9c0776cb31bafdff646ff701657b9be192601d7f96834c3a8edd87677650f5bfa1a29d945e8dbc77a8d788b3fc + languageName: node + linkType: hard + +"@metamask/utils@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/utils@npm:5.0.2" dependencies: + "@ethereumjs/tx": "npm:^4.1.2" "@types/debug": "npm:^4.1.7" debug: "npm:^4.3.4" semver: "npm:^7.3.8" superstruct: "npm:^1.0.3" - checksum: 10c0/4efcdb04d65dabada1c6918a76a2b7ee226bea309a351670d46737e58bf8d9fb17dfe1b707eaee69f865ccc237dcd6df75b487ccdbe6dd77de52c4cd9ee08cf8 + checksum: 10c0/fa82d856362c3da9fa80262ffde776eeafb0e6f23c7e6d6401f824513a8b2641aa115c2eaae61c391950cdf4a56c57a10082c73a00a1840f8159d709380c4809 + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.3.0": + version: 8.5.0 + resolution: "@metamask/utils@npm:8.5.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.0.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10c0/037f463e3c6a512b21d057224b1e9645de5a86ba15c0d2140acd43fb7316bfdd9f2635ffdb98e970278eb4e0dd81080bb1855d08dff6a95280590379ad73a01b + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.0.0": + version: 9.3.0 + resolution: "@metamask/utils@npm:9.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10c0/8298d6f58d1cf8f5b3e057a4fdf364466f6d7d860e2950713690c5b4be3edb48d952f20982af66f83753596dc2bcd5b23cb53721b389ca134117b20ef0ebf04f languageName: node linkType: hard -"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/animation@npm:10.17.0" +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/animation@npm:10.18.0" dependencies: - "@motionone/easing": "npm:^10.17.0" - "@motionone/types": "npm:^10.17.0" - "@motionone/utils": "npm:^10.17.0" + "@motionone/easing": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" tslib: "npm:^2.3.1" - checksum: 10c0/51873c9532ccb9f2b8475e871ba3eeebff2171bb2bd88e76bcf1fdb5bc1a7150f319c148063d17c16597038a8993c68033d918cc73a9fec40bb1f78ee8a52764 + checksum: 10c0/83c01ab8ecf5fae221e5012116c4c49d4473ba88ba22197e1d8c1e39364c5c6b9c5271e57ae716fd21f92314d15c63788c48d0a30872ee8d72337e1d98b46834 languageName: node linkType: hard "@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": - version: 10.17.0 - resolution: "@motionone/dom@npm:10.17.0" + version: 10.18.0 + resolution: "@motionone/dom@npm:10.18.0" dependencies: - "@motionone/animation": "npm:^10.17.0" - "@motionone/generators": "npm:^10.17.0" - "@motionone/types": "npm:^10.17.0" - "@motionone/utils": "npm:^10.17.0" + "@motionone/animation": "npm:^10.18.0" + "@motionone/generators": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" hey-listen: "npm:^1.0.8" tslib: "npm:^2.3.1" - checksum: 10c0/bca972f6d60aa1462993ea1b36f0ba702c8c4644b602e460834d3a4ce88f3c7c1dcfec8810c6598e9cf502ad6d3af718a889ab1661c97ec162979fe9a0ff36ab + checksum: 10c0/3bd4b1015e88464c9effc170c23bc63bbc910cbb9ca84986ec19ca82e0e13335e63a1f0d12e265fbe93616fe864fc2aec4e952d51e07932894e148de6fac2111 languageName: node linkType: hard -"@motionone/easing@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/easing@npm:10.17.0" +"@motionone/easing@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/easing@npm:10.18.0" dependencies: - "@motionone/utils": "npm:^10.17.0" + "@motionone/utils": "npm:^10.18.0" tslib: "npm:^2.3.1" - checksum: 10c0/9e82cf970cb754c44bc8226fd660c4a546aa06bb6eabb0b8be3a1466fc07920da13195e76d09d81704d059411584ba66de3bfc0192acc585a6fe352bf3e3fe22 + checksum: 10c0/0adf9b7086b0f569d28886890cc0725a489285f2debfcaf27c1c15dfef5736c9f4207cfda14c71b3275f8163777320cb7ff48ad263c7f4ccd31e12a5afc1a952 languageName: node linkType: hard -"@motionone/generators@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/generators@npm:10.17.0" +"@motionone/generators@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/generators@npm:10.18.0" dependencies: - "@motionone/types": "npm:^10.17.0" - "@motionone/utils": "npm:^10.17.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" tslib: "npm:^2.3.1" - checksum: 10c0/b1a951d7c20474b34d31cb199907a3ee4ae5074ff2ab49e18e54a63f5eacba6662e179a76f9b64ed7eaac5922ae934eaeca567f2a48c5a1a3ebf59cc5a43fc9f + checksum: 10c0/7ed7dda5ac58cd3e8dd347b5539d242d96e02ee16fef921c8d14295a806e6bc429a15291461ec078977bd5f6162677225addd707ca79f808e65bc3599c45c0e9 languageName: node linkType: hard @@ -5585,21 +6295,21 @@ __metadata: languageName: node linkType: hard -"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/types@npm:10.17.0" - checksum: 10c0/9c91d887b368c93e860c1ff4b245d60d33966ec5bd2525ce91c4e2904c223f79333013fe06140feeab23f27ad9e8546a151e8357c5dc5218c5b658486bac3f82 +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.1": + version: 10.17.1 + resolution: "@motionone/types@npm:10.17.1" + checksum: 10c0/f7b16cd4f0feda0beac10173afa6de7384722f9f24767f78b7aa90f15b8a89d584073a64387b015a8e015a962fa4b47a8ce23621f47708a08676b12bb0d43bbb languageName: node linkType: hard -"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/utils@npm:10.17.0" +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/utils@npm:10.18.0" dependencies: - "@motionone/types": "npm:^10.17.0" + "@motionone/types": "npm:^10.17.1" hey-listen: "npm:^1.0.8" tslib: "npm:^2.3.1" - checksum: 10c0/a90dc772245fa379d522d752dcbe80b02b1fcb17da6a3f3ebc725ac0e99b7847d39f1f4a29f10cbf5e8b6157766191ba03e96c75b0fa8378e3a1c4cc8cad728a + checksum: 10c0/db57dbb6a131fab36dc1eb4e1f3a4575ca97563221663adce54c138de1e1a9eaf4a4a51ddf99fdab0341112159e0190b35cdeddfdbd08ba3ad1e35886a5324bb languageName: node linkType: hard @@ -5622,12 +6332,21 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.4.0": - version: 1.4.0 - resolution: "@noble/curves@npm:1.4.0" +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" dependencies: "@noble/hashes": "npm:1.4.0" - checksum: 10c0/31fbc370df91bcc5a920ca3f2ce69c8cf26dc94775a36124ed8a5a3faf0453badafd2ee4337061ffea1b43c623a90ee8b286a5a81604aaf9563bdad7ff795d18 + checksum: 10c0/65620c895b15d46e8087939db6657b46a1a15cd4e0e4de5cd84b97a0dfe0af85f33a431bb21ac88267e3dc508618245d4cb564213959d66a84d690fe18a63419 + languageName: node + linkType: hard + +"@noble/curves@npm:1.6.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.6.0": + version: 1.6.0 + resolution: "@noble/curves@npm:1.6.0" + dependencies: + "@noble/hashes": "npm:1.5.0" + checksum: 10c0/f3262aa4d39148e627cd82b5ac1c93f88c5bb46dd2566b5e8e52ffac3a0fc381ad30c2111656fd2bd3b0d37d43d540543e0d93a5ff96a6cb184bc3bfe10d1cd9 languageName: node linkType: hard @@ -5688,141 +6407,149 @@ __metadata: linkType: hard "@opentelemetry/api@npm:^1.0.0": - version: 1.8.0 - resolution: "@opentelemetry/api@npm:1.8.0" - checksum: 10c0/66d5504bfbf9c19a14ea549f5fca975a73a5e1e8a1e40a6dc2d662893c942b9ba66c009262816dee2b9ffd0267acd707ec692eba20db11a09d4ee114c00dc161 + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add languageName: node linkType: hard "@opentelemetry/core@npm:^1.14.0": - version: 1.22.0 - resolution: "@opentelemetry/core@npm:1.22.0" + version: 1.28.0 + resolution: "@opentelemetry/core@npm:1.28.0" dependencies: - "@opentelemetry/semantic-conventions": "npm:1.22.0" + "@opentelemetry/semantic-conventions": "npm:1.27.0" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.9.0" - checksum: 10c0/4850f6f407e4a4df72825d88b7dbe653e23f34a6dcba0b2d05725d0b497e1d44069909301b0efa1d4eac577225f10f5e86e09cb5338aacf28e2467b6d7d4c3b1 + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/4f87318ca59bc4c2f4302decfdbc3b3672604e4bbc7cb40d09f0ecbbe9e5a8b7db527a1c7ee17a93c3f9ca69c1dd88cc24cb07398b7828efc30ea9fcb8adbc4d languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.22.0": - version: 1.22.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.22.0" - checksum: 10c0/35d4aae14111fd65becf667fb935aef673f820dba0e160cdf02dfee19b8eb169a8ba3f7db4db8a40d82a15989f465faf085b4ba41895ba2c89f8e631f5e53f08 +"@opentelemetry/semantic-conventions@npm:1.27.0": + version: 1.27.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.27.0" + checksum: 10c0/b859773ba06b7e53dd9c6b45a171bf3000e405733adbf462ae91004ed011bc80edb5beecb817fb344a085adfd06045ab5b729c9bd0f1479650ad377134fb798c languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-android-arm64@npm:2.4.1" +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-darwin-arm64@npm:2.4.1" +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-darwin-x64@npm:2.4.1" +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-freebsd-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-freebsd-x64@npm:2.4.1" +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.1" +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.1" +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.1" +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.1" +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.1" +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard "@parcel/watcher-wasm@npm:^2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-wasm@npm:2.4.1" + version: 2.5.0 + resolution: "@parcel/watcher-wasm@npm:2.5.0" dependencies: is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" napi-wasm: "npm:^1.1.0" - checksum: 10c0/30a0d4e618c4867a5990025df56dff3a31a01f78b2d108b31e6ed7fabf123a13fd79ee292f547b572e439d272a6157c2ba9fb8e527456951c14283f872bdc16f + checksum: 10c0/8aad14aa21d460d7f8d407a9d8859b8372317e03bc53a154aefb9394ae51ab0fac27fdf546ec4da27307ad8219945128a19646f8e637a0200b0c6b39fbccd3d8 languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-arm64@npm:2.4.1" +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-ia32@npm:2.4.1" +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-x64@npm:2.4.1" +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@parcel/watcher@npm:^2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher@npm:2.4.1" - dependencies: - "@parcel/watcher-android-arm64": "npm:2.4.1" - "@parcel/watcher-darwin-arm64": "npm:2.4.1" - "@parcel/watcher-darwin-x64": "npm:2.4.1" - "@parcel/watcher-freebsd-x64": "npm:2.4.1" - "@parcel/watcher-linux-arm-glibc": "npm:2.4.1" - "@parcel/watcher-linux-arm64-glibc": "npm:2.4.1" - "@parcel/watcher-linux-arm64-musl": "npm:2.4.1" - "@parcel/watcher-linux-x64-glibc": "npm:2.4.1" - "@parcel/watcher-linux-x64-musl": "npm:2.4.1" - "@parcel/watcher-win32-arm64": "npm:2.4.1" - "@parcel/watcher-win32-ia32": "npm:2.4.1" - "@parcel/watcher-win32-x64": "npm:2.4.1" + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" detect-libc: "npm:^1.0.3" is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" @@ -5839,6 +6566,8 @@ __metadata: optional: true "@parcel/watcher-linux-arm-glibc": optional: true + "@parcel/watcher-linux-arm-musl": + optional: true "@parcel/watcher-linux-arm64-glibc": optional: true "@parcel/watcher-linux-arm64-musl": @@ -5853,7 +6582,7 @@ __metadata: optional: true "@parcel/watcher-win32-x64": optional: true - checksum: 10c0/33b7112094b9eb46c234d824953967435b628d3d93a0553255e9910829b84cab3da870153c3a870c31db186dc58f3b2db81382fcaee3451438aeec4d786a6211 + checksum: 10c0/9bad727d8b11e5d150ec47459254544c583adaa47d047b8ef65e1c74aede1a0767dc7fc6b8997649dae07318d6ef39caba6a1c405d306398d5bcd47074ec5d29 languageName: node linkType: hard @@ -5975,739 +6704,763 @@ __metadata: languageName: node linkType: hard -"@react-aria/breadcrumbs@npm:^3.5.16": - version: 3.5.16 - resolution: "@react-aria/breadcrumbs@npm:3.5.16" +"@react-aria/breadcrumbs@npm:^3.5.18": + version: 3.5.18 + resolution: "@react-aria/breadcrumbs@npm:3.5.18" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/link": "npm:^3.7.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/breadcrumbs": "npm:^3.7.7" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/breadcrumbs": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d1a13954ce9760dbba2d9e2d02269ffff5823c473014c57c6c558c43bc826fff75b0313fd51fc491e45c2688c9a1d7ad5b9760fc15db2a3e7dbb7c07a5d14a09 + checksum: 10c0/33e50a04c1d2b8efb91194ecac6f087051f4138c13fd182675eab311175bb637c09aa1f7ee1fedaf87e24b7b601b7d5d3ff4bb23d87d70c776eeff84006d5388 languageName: node linkType: hard -"@react-aria/button@npm:^3.9.8": - version: 3.9.8 - resolution: "@react-aria/button@npm:3.9.8" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/button@npm:^3.10.1": + version: 3.10.1 + resolution: "@react-aria/button@npm:3.10.1" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/759027e13f00d3c3c1ccf06f72b9a2f7f100177f48495539de4db6dd47435bba2d3c3274c811e67875b3e19cbc36dd765c75c7684812c4840dc784710cb7b68a + checksum: 10c0/9d35405c008043a7e7314d79c23805642d96742f32e464c05d3bf5417c04e8d70cc395e675dd4133849e08939fdd42eb757168124b0f8a713800eca501c22809 languageName: node linkType: hard -"@react-aria/calendar@npm:^3.5.11": - version: 3.5.11 - resolution: "@react-aria/calendar@npm:3.5.11" +"@react-aria/calendar@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-aria/calendar@npm:3.5.13" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/calendar": "npm:^3.5.4" - "@react-types/button": "npm:^3.9.6" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/calendar": "npm:^3.5.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/c6261e9cae5bfc8a6f727bfd125ada9cacdd1f7b51e4049d37017981765ac4ea9e1764fd7cb3611ed4ec0258f7f7a9a8ac81462d65f37ca4fd1612bbfd07c742 + checksum: 10c0/10f30f6cfdf81d38b48cb40368b141b50cc270ed39bf0240e501b207433bd7324293123bd8d0f49e868e51702b6eed9fc6da9601eb90354bb5e2db631c7089d9 languageName: node linkType: hard -"@react-aria/checkbox@npm:^3.14.6": - version: 3.14.6 - resolution: "@react-aria/checkbox@npm:3.14.6" - dependencies: - "@react-aria/form": "npm:^3.0.8" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/toggle": "npm:^3.10.7" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/checkbox": "npm:^3.6.8" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/checkbox@npm:^3.14.8": + version: 3.14.8 + resolution: "@react-aria/checkbox@npm:3.14.8" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/toggle": "npm:^3.10.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/fafef71bb96a121060616f098e0195a0f1b723c6aecb5fe7b0dff4bf6c6ce740eb61dc6617a5cc06c6dfa14af33f4c0b2c21de36497d432c63af2f3526637ab1 + checksum: 10c0/96ac21b5c6ede1ce0545e27dbefb20df88cd06f24c0ed2c2fb44383bcf632aa33096c70ffca59f8bc68c7e5e4f71293a975e6bd5dc65077ca70991f651a56992 languageName: node linkType: hard -"@react-aria/combobox@npm:^3.10.3": - version: 3.10.3 - resolution: "@react-aria/combobox@npm:3.10.3" - dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/listbox": "npm:^3.13.3" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/menu": "npm:^3.15.3" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/combobox": "npm:^3.9.2" - "@react-stately/form": "npm:^3.0.5" - "@react-types/button": "npm:^3.9.6" - "@react-types/combobox": "npm:^3.12.1" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/color@npm:^3.0.1": + version: 3.0.1 + resolution: "@react-aria/color@npm:3.0.1" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7f05b21d84e4587e570563002efb9a0b13bfef78559ee243d6ff50359871191ebb24e88113c127037ca4e4fa6cf7f8d7981e62eb0de2304bcd266cacde68b866 - languageName: node - linkType: hard - -"@react-aria/datepicker@npm:^3.11.2": - version: 3.11.2 - resolution: "@react-aria/datepicker@npm:3.11.2" - dependencies: - "@internationalized/date": "npm:^3.5.5" - "@internationalized/number": "npm:^3.5.3" - "@internationalized/string": "npm:^3.2.3" - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/form": "npm:^3.0.8" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/spinbutton": "npm:^3.6.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/datepicker": "npm:^3.10.2" - "@react-stately/form": "npm:^3.0.5" - "@react-types/button": "npm:^3.9.6" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/datepicker": "npm:^3.8.2" - "@react-types/dialog": "npm:^3.5.12" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/ee4969e6f28a765abee0ba519ad9c77b9910d76ec3c327403d8b901db750ed4daa32be2d1ea62d760f0e4dc4f51aa02c02c0481f4b00a40380d4dccf7a895a38 + languageName: node + linkType: hard + +"@react-aria/combobox@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/combobox@npm:3.10.5" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10c0/420c3de273014e4de38f823b0e7415f8eb648b97293e7169967ffce35133a37eca94288bd2adc636f892ed2da42150bc5b41d85b97a6a545c141cf2ad8ca1cbc + languageName: node + linkType: hard + +"@react-aria/datepicker@npm:^3.11.4": + version: 3.11.4 + resolution: "@react-aria/datepicker@npm:3.11.4" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/2bd8971c5bae8cafa3b4dce3aa6f6482436b31073f5f6f1ebbe88dbf2ac6abcb49efde12f485160cfbc6f0ac56b84e012a50d7820a6108bf072355a26b7244ff + checksum: 10c0/4df110dcc84f22948210dc0d996569593283017857fa848c553a7848849609922c6ba34e44698390fe192a29f9c6bf428c8beb49f449c83640c62442b86014cd languageName: node linkType: hard -"@react-aria/dialog@npm:^3.5.17": - version: 3.5.17 - resolution: "@react-aria/dialog@npm:3.5.17" +"@react-aria/dialog@npm:^3.5.19": + version: 3.5.19 + resolution: "@react-aria/dialog@npm:3.5.19" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/dialog": "npm:^3.5.12" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/46d30780c080c6e7c564ede769e9ccda763c54051501bc7149383f26f74e0162a0a46003d558bf30e56aabaa958333a158fd41c2dbc691f5fe17b68365c7bf5f + checksum: 10c0/a93699d76c0756fe9723f86a5b4db3af10f2bd042e769c5907cca430e49eee0ccac56859c61736eead8a67d0c8a254f0244d29a5773d603ef6bb53f5bf92fba6 languageName: node linkType: hard -"@react-aria/dnd@npm:^3.7.2": - version: 3.7.2 - resolution: "@react-aria/dnd@npm:3.7.2" - dependencies: - "@internationalized/string": "npm:^3.2.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/dnd": "npm:^3.4.2" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/dnd@npm:^3.7.4": + version: 3.7.4 + resolution: "@react-aria/dnd@npm:3.7.4" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/2cfa3072bed8b26a6bcb128d537b64ff6f7b8ad2837476b9d35722bda8c36d5d3ee74bcfef0d9496ce921396c63e08b9811d8ca736cca25b2ebe57f486f0b5f1 + checksum: 10c0/2c3619b2297d4f3f2974565835a15b853d9fe8631d6c02db664d3bad21e3b6126026999541fc98dc8f253684747406fcb55ac28f4ab3acac6f18de152ae4c1c6 languageName: node linkType: hard -"@react-aria/focus@npm:^3.18.2": - version: 3.18.2 - resolution: "@react-aria/focus@npm:3.18.2" +"@react-aria/focus@npm:^3.18.4": + version: 3.18.4 + resolution: "@react-aria/focus@npm:3.18.4" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/378178278effdc8342ac08a198f7479fb6955e8b6c85ff238e1cb47b81fcae88e8fa9b6c14cb00f1e6cc8952a01eff9581b32022e5e631aceaa8dd63d59706a3 + checksum: 10c0/141f8ef80060c5b58384af4af9446c0792618671e9f963942c3edc29bb15b7eb0ebb62cbe118135c7379c2732e86071aa7d7c890903a0ae411be07f2ec854e6a languageName: node linkType: hard -"@react-aria/form@npm:^3.0.8": - version: 3.0.8 - resolution: "@react-aria/form@npm:3.0.8" +"@react-aria/form@npm:^3.0.10": + version: 3.0.10 + resolution: "@react-aria/form@npm:3.0.10" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/form": "npm:^3.0.5" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a4e442505de7bcc41d6f3683f430521b2643b42ec54ca998ad5475ff88d1729712357990757fc5722c7622f61b484190b82a2764dda35feda2fd3ba99a67e5e1 - languageName: node - linkType: hard - -"@react-aria/grid@npm:^3.10.3": - version: 3.10.3 - resolution: "@react-aria/grid@npm:3.10.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/grid": "npm:^3.9.2" - "@react-stately/selection": "npm:^3.16.2" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/31ed3c2a2eb8340f38e9164bf2730ece07563178975aaff55c2e58ed307943071b105dd0503bf31a9fe17e085ef3db52f935636b04365e26194649f0c87f8c5e + languageName: node + linkType: hard + +"@react-aria/grid@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/grid@npm:3.10.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/351dd76078278f805c48f97b5249cdebd85cc428bc3a751fb33034d46bb8d9b1ad3b81cd9782944afd22063c91057b63882a07badc4f1f0170b5077b29aa06ec + checksum: 10c0/d85110a3df794a8df38ea1b52b7f575c1a4e31a4f4f6989c80c25099e6a020e1a290436febc846dbd0397db42b55a5d1e4028341808a9cbc82e92401acde5973 languageName: node linkType: hard -"@react-aria/gridlist@npm:^3.9.3": - version: 3.9.3 - resolution: "@react-aria/gridlist@npm:3.9.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/grid": "npm:^3.10.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/tree": "npm:^3.8.4" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/gridlist@npm:^3.9.5": + version: 3.9.5 + resolution: "@react-aria/gridlist@npm:3.9.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/ff5c7af71025de816a3f064af89520454e893ff224003f1b8e22cddaefa56ca8c09020411eed19eb11212d7b20810d1addb1c6dba2b75854d8b306228331ed79 + checksum: 10c0/d9ceb8df29f9d6f9cae123b6227313915aea9fd40543afb83ddee3f8a31fc5bceae4eb28a64fa5345dc7285b64adcc1dddfc60c28cc071782e681adf717b7879 languageName: node linkType: hard -"@react-aria/i18n@npm:^3.12.2": - version: 3.12.2 - resolution: "@react-aria/i18n@npm:3.12.2" +"@react-aria/i18n@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-aria/i18n@npm:3.12.3" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@internationalized/message": "npm:^3.1.4" - "@internationalized/number": "npm:^3.5.3" - "@internationalized/string": "npm:^3.2.3" - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@internationalized/message": "npm:^3.1.5" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6969cdafa899fa66b8a88eb80335e90d9ff31505d9814d3120e981c1ce5ccb6422be321ecab214d42b1ba935bef0172cbc71e639e47436e37899af84426feb15 + checksum: 10c0/98210abb15d598a6e4a35eae6df1d70ae6376ef9a5e1c3d298e03f4cc006df696785006323fa97ac57ce14c5b5c8d108690a5c2b187624cad5956778ffc25ca9 languageName: node linkType: hard -"@react-aria/interactions@npm:^3.22.2": - version: 3.22.2 - resolution: "@react-aria/interactions@npm:3.22.2" +"@react-aria/interactions@npm:^3.22.4": + version: 3.22.4 + resolution: "@react-aria/interactions@npm:3.22.4" dependencies: - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f5e1b3e8ea040cc2d32b35fcd749ba32d63069a31d407ac4fe08808d32a458a4a76ed7d630e88a38f0ba7cbea315908c020059ea21284b6003b106417da40e7a + checksum: 10c0/8455a68540a4085b71ed034cad5c349a7e756e44cd30d69d340d7f7a66ce1886882021fbcc8049a5d8aeba54b47cd2ca49a7bc4e6910aab2d13b41703d55c7a5 languageName: node linkType: hard -"@react-aria/label@npm:^3.7.11": - version: 3.7.11 - resolution: "@react-aria/label@npm:3.7.11" +"@react-aria/label@npm:^3.7.12": + version: 3.7.12 + resolution: "@react-aria/label@npm:3.7.12" dependencies: - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1072a6b0f4a0f9f594aea1bddf44ac6ea99b63ba1049b55de851c7a6692e5ed0cc8df0a05dae2c781dcb71fb10bf49c2fb4c0a2e6b4fb6e5c19d633f13607f0d + checksum: 10c0/28a8a04c788df9fb776565974a1c20bf01067d3d9a1f6cbeb184859c7e8893a64809bbcd1af9d765039ee30da96ecbce75c7d2d37bddb54cf4e709ab2d7afcca languageName: node linkType: hard -"@react-aria/link@npm:^3.7.4": - version: 3.7.4 - resolution: "@react-aria/link@npm:3.7.4" +"@react-aria/link@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-aria/link@npm:3.7.6" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/link": "npm:^3.5.7" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f3d5133967194e237c16ba9568bb6c85cb2114dba0d779f9ee51e46a2ed327c3d357f8bdf7d1062f11be6ea928c105a48549785cbdbe729659682fcc6abe4c70 + checksum: 10c0/81e3f3b53648ac4223e3c673a13c592c24895202b39255bb16bd2b39bcc9dff4b5ad2f6ed69029228ada20941eefd89060fe1761e6658eefcdbb28019fa1818a languageName: node linkType: hard -"@react-aria/listbox@npm:^3.13.3": - version: 3.13.3 - resolution: "@react-aria/listbox@npm:3.13.3" +"@react-aria/listbox@npm:^3.13.5": + version: 3.13.5 + resolution: "@react-aria/listbox@npm:3.13.5" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/list": "npm:^3.10.8" - "@react-types/listbox": "npm:^3.5.1" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-types/listbox": "npm:^3.5.2" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b4c48310ede8905cab5a4705c3514870f29ddad79a634a450f3ad00469efdead42b6e25f2bf433ea12a56290ed70531646fb7bd2fd3c5e9a6a5e8ec5f831e369 + checksum: 10c0/877c86bfe63b4b75a3bf75db7c275006d7341a4933b37dc57f996d1c9f230c4ca0a6f68960938b445bb5ed3af23787b1f7a818d783d4e7188a0b891b74215bdc languageName: node linkType: hard -"@react-aria/live-announcer@npm:^3.3.4": - version: 3.3.4 - resolution: "@react-aria/live-announcer@npm:3.3.4" +"@react-aria/live-announcer@npm:^3.4.0": + version: 3.4.0 + resolution: "@react-aria/live-announcer@npm:3.4.0" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/69c86b75686a2c4108da3f959da4c5739b0130ff370468c6d8ea3aaf594315c6ac1577c5b7bdb56629073ad19852d2bef18e412fd7acfd6c390201291ac9dcf9 - languageName: node - linkType: hard - -"@react-aria/menu@npm:^3.15.3": - version: 3.15.3 - resolution: "@react-aria/menu@npm:3.15.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/menu": "npm:^3.8.2" - "@react-stately/tree": "npm:^3.8.4" - "@react-types/button": "npm:^3.9.6" - "@react-types/menu": "npm:^3.9.11" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/d4815bbe453765013042299c295cba362147fe7634d4bdcfecffc3f7efbe84b83c820e9737ac90e127b4f8980aaea16f7f9876de516a6c05a42de0b5bf606b92 + languageName: node + linkType: hard + +"@react-aria/menu@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/menu@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b61b9fe943e47ad4db30c38b12b5c5529c3d460c357ffd7a26452b99751d53f9600d6bf1e87231342363f615f70296a0858d36ae82ab5c7e52945b54056f213b + checksum: 10c0/466bfeb1e76056556c502b274bd69637fb06b02f43c28c076b47476e4289eeb30d1120a17d41fe11bdcb972cc4c1119b7f0efb1aad28efc570dc7524fc7c8b59 languageName: node linkType: hard -"@react-aria/meter@npm:^3.4.16": - version: 3.4.16 - resolution: "@react-aria/meter@npm:3.4.16" +"@react-aria/meter@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/meter@npm:3.4.17" dependencies: - "@react-aria/progress": "npm:^3.4.16" - "@react-types/meter": "npm:^3.4.3" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/progress": "npm:^3.4.17" + "@react-types/meter": "npm:^3.4.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/ced05ef75d5731323ff22e50449ef3625b726200d942f3cb46664ac4f03f2221bc9f3f46db2696941728a49b3127cee1167353d4217f368ebbfbaa96bf4a5e57 + checksum: 10c0/d5b648664416f50448c34567df5f6c0c706014ab3d487869958e9f9b8d4a4fae5f5bc173edf4dd734d91ea9f6b7f7e853679baaf48926326d96ff8be2150ba0c languageName: node linkType: hard -"@react-aria/numberfield@npm:^3.11.6": - version: 3.11.6 - resolution: "@react-aria/numberfield@npm:3.11.6" +"@react-aria/numberfield@npm:^3.11.8": + version: 3.11.8 + resolution: "@react-aria/numberfield@npm:3.11.8" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/spinbutton": "npm:^3.6.8" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/numberfield": "npm:^3.9.6" - "@react-types/button": "npm:^3.9.6" - "@react-types/numberfield": "npm:^3.8.5" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/numberfield": "npm:^3.8.6" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d3eee1334e96311e9c4ae8205c4a004c0d58b99a750524e0a768add6073ff042096d92dcd69df03fb184eb3613b49c60b2f1e533127fb01c5d3cf40435f9abbc + checksum: 10c0/a1f6e5d90e150f40902546212687850a9c50889726db0f28f0ec73a1fd8f427048f464677b389d620350817749e5d96b90e51bca639705ff141543adbe3b82e3 languageName: node linkType: hard -"@react-aria/overlays@npm:^3.20.0, @react-aria/overlays@npm:^3.23.2": - version: 3.23.2 - resolution: "@react-aria/overlays@npm:3.23.2" +"@react-aria/overlays@npm:^3.20.0, @react-aria/overlays@npm:^3.23.4": + version: 3.23.4 + resolution: "@react-aria/overlays@npm:3.23.4" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/button": "npm:^3.9.6" - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/button": "npm:^3.10.0" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4ec179c1074183ba553d235387ef1ee9aef1463dcef41cd45f48410c9a46aa148b83f562dce78a5d0767060a4b7362ae9e2b2877886931c41a2385b9d249b722 + checksum: 10c0/174c8ef7d52123e8d979044dd36373314328086b2dc37a8b4f1fab8344be74c77925595dca86f720fd661eeffd5b632261f9a57e813d0f91460d1f08a090504e languageName: node linkType: hard -"@react-aria/progress@npm:^3.4.16": - version: 3.4.16 - resolution: "@react-aria/progress@npm:3.4.16" +"@react-aria/progress@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/progress@npm:3.4.17" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/progress": "npm:^3.5.6" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/progress": "npm:^3.5.7" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/9cfa814a67c08f902b3b8fe6df0df0fb9a740298c2183bff3c0a6c937292e8317713f9a3c27c6a8247736be629ce734ab87c7541c109439285fa2e598f4735f7 + checksum: 10c0/5eae2b0693cbb349242993bee9bcc82b59bf53b9429a5101736695ae64ab55be6b37e38fb26ac7288fb12e6ec2436da0a0aaddb2e11ffd3b3f06348a43edd5c4 languageName: node linkType: hard -"@react-aria/radio@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-aria/radio@npm:3.10.7" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/form": "npm:^3.0.8" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/radio": "npm:^3.10.7" - "@react-types/radio": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/radio@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/radio@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/radio": "npm:^3.10.8" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a852e7d7fcadbe24ee6cdca5309171e0e67893804494bb512e47329b1e1ef0d77fb9530b7d05fe485c6282aff6a59b7565a1c5bb075c559567a6f0e2ad49a47d + checksum: 10c0/1b6251b8c020f16b8d4ce0710323f52efd4bbc408789757a54dde2cd59fe5601b76c571b8f1f5b00e7680457e2f6766e1a3f55d4153685c4880e09b5933e63a0 languageName: node linkType: hard -"@react-aria/searchfield@npm:^3.7.8": - version: 3.7.8 - resolution: "@react-aria/searchfield@npm:3.7.8" - dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/searchfield": "npm:^3.5.6" - "@react-types/button": "npm:^3.9.6" - "@react-types/searchfield": "npm:^3.5.8" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/searchfield@npm:^3.7.10": + version: 3.7.10 + resolution: "@react-aria/searchfield@npm:3.7.10" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/searchfield": "npm:^3.5.9" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e2038d9dcc921447f3c2e481bce569666acd56e2174206f94f26e499c2dd4d381e1cad5edb5c3adbb47dbbb7c50e79996931c60cdb2e34601b1a6713d903aab0 - languageName: node - linkType: hard - -"@react-aria/select@npm:^3.14.9": - version: 3.14.9 - resolution: "@react-aria/select@npm:3.14.9" - dependencies: - "@react-aria/form": "npm:^3.0.8" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/listbox": "npm:^3.13.3" - "@react-aria/menu": "npm:^3.15.3" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-stately/select": "npm:^3.6.7" - "@react-types/button": "npm:^3.9.6" - "@react-types/select": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/1ae7fab9f6bc473ccc8d2762c4d07ffbbdd45366b1fe7fa282c14354eac8e427bebb0dde20e1cb92e4a2cd769f9f3872a5712c53763706b6414d024fa5275732 + languageName: node + linkType: hard + +"@react-aria/select@npm:^3.14.11": + version: 3.14.11 + resolution: "@react-aria/select@npm:3.14.11" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/select": "npm:^3.6.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/80c69f8cde15ca86d89e84ab222ba0ff34da13fb29b2966e3278ac8984bfc3511c1c6100410369a7f82c6fe226924f9b49d4deb42d93572dabb853c175c53c19 + checksum: 10c0/b8c2e24a2713367938514c1d47817943bf1677bf4a29e5f5f695e1e9e708a93dde465de8d06babf276bc7face7938b280fd603af4b77d1068e9ce5b85a7cefd6 languageName: node linkType: hard -"@react-aria/selection@npm:^3.19.3": - version: 3.19.3 - resolution: "@react-aria/selection@npm:3.19.3" +"@react-aria/selection@npm:^3.20.1": + version: 3.20.1 + resolution: "@react-aria/selection@npm:3.20.1" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/selection": "npm:^3.16.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/8642ac94780b580ade6f8571b97fdeba7ab28203a86f5d6170f69ea39c0b8c1553c6e4648a0666c2819e5a6f9d5475685a12c61df2463ae5524434c8186cc08d + checksum: 10c0/44e10f4e4952e5fbb15071bbaa1ccafcb91b6168a8ac6eb1e0f4e1036014527ea3c0e363a7f552ca923b6929f9a5e2495bb454ad9cd4c64003d650115b5e637a languageName: node linkType: hard -"@react-aria/separator@npm:^3.4.2": - version: 3.4.2 - resolution: "@react-aria/separator@npm:3.4.2" +"@react-aria/separator@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-aria/separator@npm:3.4.3" dependencies: - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6914fc36e40e7313a21e479db6a51dac02dfa261b3e3f133c469900bdbab3c1731ccc8694f42ba76fb97c0a12bf700100ab5ca0e2e0db27e27739777da23ec5c + checksum: 10c0/322b7135944d0a941e65cc5756153e8e0aa60af102572f988d14add4cdfd7e727a133f0c3a86b69333f08da2f606f03d6d590483e986b79e649562f46cdb4836 languageName: node linkType: hard -"@react-aria/slider@npm:^3.7.11": - version: 3.7.11 - resolution: "@react-aria/slider@npm:3.7.11" +"@react-aria/slider@npm:^3.7.13": + version: 3.7.13 + resolution: "@react-aria/slider@npm:3.7.13" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/slider": "npm:^3.5.7" - "@react-types/shared": "npm:^3.24.1" - "@react-types/slider": "npm:^3.7.5" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/slider": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/dbfe7bc712aeb5e9172571e639be63d232e8d3ffdf92687146c81b695c7f971ee39d7af89bdc1e1e0a685f279a3d918b0c9b256998dd98a7a263d8d709342be1 + checksum: 10c0/6256790404e7ab67ea64c613b491fad3e9cd4315a6fe2fa72b2271eb5f0254bb39c5cbd5f9896119714fcb94f515c33c3c6ca8195aaf3b0fd5e5f6d49d7c8bd3 languageName: node linkType: hard -"@react-aria/spinbutton@npm:^3.6.8": - version: 3.6.8 - resolution: "@react-aria/spinbutton@npm:3.6.8" +"@react-aria/spinbutton@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/spinbutton@npm:3.6.9" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a910eca9755929e73975a266595f4dca5a6e11de877fa5e70b7a0ee042848a3005db50344fe4ea559f811a9203cea3b3d69e7bbdb76d7aa380e87e5ccbf3ad4d + checksum: 10c0/c15434d8c7c058ca39634b9a2350915967cf8d59e19101fc5e243f6a0b3b6971e9bb265aee07b3bbfb68ce207a3affea8924db2bd850705a7b2163f946d82f34 languageName: node linkType: hard -"@react-aria/ssr@npm:^3.9.5": - version: 3.9.5 - resolution: "@react-aria/ssr@npm:3.9.5" +"@react-aria/ssr@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-aria/ssr@npm:3.9.6" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e28d3e366b77c77276bd74c8d906ccccc9a5f72c00e65c82c9f35584c3bb2467513429e87facc4e6ede756a2870dddb1645073a6b9afb00b3f28f20a1b0f2d36 + checksum: 10c0/be52f2909035e093d3f72cccde15b66b4eef2dc30c71dac46a1ea43d3847dace1a709114640bfa3e9aa72ba716749635fb72116f4da16f7d80248ca348146456 languageName: node linkType: hard -"@react-aria/switch@npm:^3.6.7": - version: 3.6.7 - resolution: "@react-aria/switch@npm:3.6.7" +"@react-aria/switch@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/switch@npm:3.6.9" dependencies: - "@react-aria/toggle": "npm:^3.10.7" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/shared": "npm:^3.24.1" - "@react-types/switch": "npm:^3.5.5" + "@react-aria/toggle": "npm:^3.10.9" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/switch": "npm:^3.5.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/0c8fd8efacfc1be66ecff7c570493bd54dfff0b99e1c1cc4533d8ed793dc619b33e4dc14da28c64201b2248e3c0dc48af4c7ef144968d0d4a33146b8cc42c7f7 - languageName: node - linkType: hard - -"@react-aria/table@npm:^3.15.3": - version: 3.15.3 - resolution: "@react-aria/table@npm:3.15.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/grid": "npm:^3.10.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/flags": "npm:^3.0.3" - "@react-stately/table": "npm:^3.12.2" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" - "@react-types/table": "npm:^3.10.1" + checksum: 10c0/94000e6527b3889433d96571f8d7ce32a64b978fc7640d2a8f43ee38cebd3a13149a66512d54485c5f7c8769d5a7de2d4847ffc6130655f37cc7fbd70bd99bc0 + languageName: node + linkType: hard + +"@react-aria/table@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/table@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/table": "npm:^3.12.3" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6f482f0b299bdcdc3ace6f7eb37bdf3c3c0bcc7a52d6e2c6f5701af0a4d661e800b6384932e0c236be45b7cbdbfcf20ea2870e2208e3964ace1872b24e2c999e + checksum: 10c0/54a8794f9842082aef5ce9b36e21cb125b02e6792c38c40d1a65f25ba62362c4adc17a7db220672e1b65f515aedfe1a55eb9b70b7ce7d9c0fb75f4da16e4a8eb languageName: node linkType: hard -"@react-aria/tabs@npm:^3.9.5": - version: 3.9.5 - resolution: "@react-aria/tabs@npm:3.9.5" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/tabs": "npm:^3.6.9" - "@react-types/shared": "npm:^3.24.1" - "@react-types/tabs": "npm:^3.3.9" +"@react-aria/tabs@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-aria/tabs@npm:3.9.7" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4e2b994c3093cc996a7eb052815b95dc9715f93ad1bff8be186dd75d2a10a08a04c73377e20cda8ffce6c0134b9ce60b104d6eca0c4d392ca61a83b595609691 + checksum: 10c0/0e079c0e803b94efcb5f30444a888322d614e577c462eb2e7a4a0170aa92fea6e21cdbf041d5efdfab0b0c50ec287dc8032afe4b52b4f77489fa9ec4866837a2 languageName: node linkType: hard -"@react-aria/tag@npm:^3.4.5": - version: 3.4.5 - resolution: "@react-aria/tag@npm:3.4.5" +"@react-aria/tag@npm:^3.4.7": + version: 3.4.7 + resolution: "@react-aria/tag@npm:3.4.7" dependencies: - "@react-aria/gridlist": "npm:^3.9.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/list": "npm:^3.10.8" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/list": "npm:^3.11.0" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/595fb4eb9fae91b77d53b98a806d4de5e98c0d691960a5fbeec7ff332ca975d2ff461497f69dad74f417f41418c318461cf098ba2ea52652136cb7e2a60e41c2 + checksum: 10c0/869e26288a2d3c90cc8027342f70dc1ec0146d6ec5ebe62c7b06eb48390e1d1a71083ca6de7147353764bc566a7f6dfad2666e6d378afa6cf53acb586e1019b1 languageName: node linkType: hard -"@react-aria/textfield@npm:^3.14.8": - version: 3.14.8 - resolution: "@react-aria/textfield@npm:3.14.8" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/form": "npm:^3.0.8" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" - "@react-types/textfield": "npm:^3.9.6" +"@react-aria/textfield@npm:^3.14.10": + version: 3.14.10 + resolution: "@react-aria/textfield@npm:3.14.10" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e74cf7cfa2f791472e7603b323f9c75d08bbadc5ddd9dd705b13be305e787f5e3021c1bc03c8e6a0d11ae9e900c05a27bcff032ebefb9ece0028fc4e16796757 + checksum: 10c0/91b4d6ae47c6bf355ae9ff53626d6195afc3fe5852a7aa930b286fbe0804c13b79649ff1b220706cc7808b0e8c4ad3f4f1c04261b4a90abb79f3bb83c033c5e5 languageName: node linkType: hard -"@react-aria/toggle@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-aria/toggle@npm:3.10.7" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/toggle@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/toggle@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4db82eaa7ec69e313e313b39dfa39c2bd8ec2222e6534f7fca05e1184e5c1124335d07507bdb227058aac2712b84a0f5b3c62d9dd17f40a90acc03b467648f44 + checksum: 10c0/057302ef08413cc7bfdde96102da734610294aef19c91d6bae8accf2dfc3ffd976dd531c5d42c6aa955e44da92b46f51667488ae0a48718370d449b6dc0f84e4 languageName: node linkType: hard -"@react-aria/tooltip@npm:^3.7.7": - version: 3.7.7 - resolution: "@react-aria/tooltip@npm:3.7.7" +"@react-aria/tooltip@npm:^3.7.9": + version: 3.7.9 + resolution: "@react-aria/tooltip@npm:3.7.9" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/tooltip": "npm:^3.4.12" - "@react-types/shared": "npm:^3.24.1" - "@react-types/tooltip": "npm:^3.4.11" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tooltip": "npm:^3.4.12" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/858b95d3d0ec905e96314d8a554a192c520842a350d7791204374bb97caadfa9f8b5d0fe09070bf492be562003055881d9cd5cb412e563ae44cc9619076fdaf6 + checksum: 10c0/1db345fe35462ddce880ea28bf0dcf6d320ed5e7ce96d0b836a8d3a00c35a88eef037e0e9e1601bdf516ae8c5c6ea0e9190b849499ee9146b7de9b70062f8d13 languageName: node linkType: hard -"@react-aria/utils@npm:^3.21.1, @react-aria/utils@npm:^3.25.2": - version: 3.25.2 - resolution: "@react-aria/utils@npm:3.25.2" +"@react-aria/utils@npm:^3.21.1, @react-aria/utils@npm:^3.25.3": + version: 3.25.3 + resolution: "@react-aria/utils@npm:3.25.3" dependencies: - "@react-aria/ssr": "npm:^3.9.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/ssr": "npm:^3.9.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/9e190a954d6e068439b90ef29ebd95193f8f50b9326b626985b6cb2ed72dd0d85b63c91505ddfc179a58b66940c598d2d9ef047e2dfd81b38c0878e550b2e22e + checksum: 10c0/dc86ea48c24232f5c51d0b5317d947c4ccf01a8afb3bdc89cb880a7b0a695a04c8a7c615fb190664f4f3c7da8669ab2bd2f7cdfb2861339f5816cbd600249a84 languageName: node linkType: hard -"@react-aria/visually-hidden@npm:^3.8.15": - version: 3.8.15 - resolution: "@react-aria/visually-hidden@npm:3.8.15" +"@react-aria/visually-hidden@npm:^3.8.17": + version: 3.8.17 + resolution: "@react-aria/visually-hidden@npm:3.8.17" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f274fd3142997f3841e1a33b4057c024f53cebd3ec1398cbf2a3212df247704f3b38eb4d6276785ac0820ea9908cb129a6cd5150368a7640e537a298083daeca + checksum: 10c0/411699c167686509583debc659e734ec3c123198570104abbd4fe74a5a60d93a305d73f6d761ec67846c672d1076d8f089a6f90d2e2653e1a334fe7344088bd5 languageName: node linkType: hard @@ -6720,640 +7473,672 @@ __metadata: languageName: node linkType: hard -"@react-stately/calendar@npm:^3.5.4": - version: 3.5.4 - resolution: "@react-stately/calendar@npm:3.5.4" +"@react-stately/calendar@npm:^3.5.5": + version: 3.5.5 + resolution: "@react-stately/calendar@npm:3.5.5" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e5b5e8cda088fb46c6073e2330b7e9fcd4c0fa834a1a8cdb954036b5c405a7d88b81907da37be43f6e58a7d79609072c4b0cc3b0fe19bf45df175d42def772de + checksum: 10c0/ff38c8fb4178d965db8569980756d864e9a0341fca60bccc76d4fe34645375a2ed32a533097426f9f1892fe99bce32d5ec00a3e8ce9acbdfc6b7f2e82012d4de languageName: node linkType: hard -"@react-stately/checkbox@npm:^3.6.8": - version: 3.6.8 - resolution: "@react-stately/checkbox@npm:3.6.8" +"@react-stately/checkbox@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-stately/checkbox@npm:3.6.9" dependencies: - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/87e93c2259ea490cc968aab51e5cf21d1df2d7db8b7b2d0bc09dd3a3964946c5b912deca86483f61d49a8a8f2d6220d31d5ef1f3948b86ff12de7b275d0584af + checksum: 10c0/068be8d5c743b0ac3f0a96863568401027035b20a32caaa220600172f6ed0f93a49d58cfc4a960befd4762aa1eab18e2c30bd3656157729b4e3944156aeebd6c languageName: node linkType: hard -"@react-stately/collections@npm:^3.10.9": - version: 3.10.9 - resolution: "@react-stately/collections@npm:3.10.9" +"@react-stately/collections@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/collections@npm:3.11.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/726fb28ee15b3c115caef3b39513b70672c9a6c6e4de88d0c13572d449e95f5bd188bc2eac0ebd147fef78b4e008eefb20149e63c37b3c9bdf126dc98a237d2b + checksum: 10c0/aba7d2194f4db8ee1ad5ad708a34d9bb336d3fd1fcb837cb237c6b63e1537003592eb6d33d80d1a6a313613e594d8d4a9da779c00d7fa3470f4adb5ff227150f languageName: node linkType: hard -"@react-stately/combobox@npm:^3.9.2": - version: 3.9.2 - resolution: "@react-stately/combobox@npm:3.9.2" +"@react-stately/color@npm:^3.8.0": + version: 3.8.0 + resolution: "@react-stately/color@npm:3.8.0" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/overlays": "npm:^3.6.10" - "@react-stately/select": "npm:^3.6.7" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/combobox": "npm:^3.12.1" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/600f4d2fba00478ef6e7f9ac04b45bebff1ddca9eb2d60838c0048136d084c2e4db79e46575231fda8f42bab9126dcef394520529268f2a4dec7b38ecab9a54e + checksum: 10c0/cb0acc88713c9a4271a1445c963c11a8d6cfaa2127894dc810783bc04cc288f1d143679a3b10612abf3cbb1a9871115f4e51745d707825879a454df2c7114609 languageName: node linkType: hard -"@react-stately/data@npm:^3.11.6": - version: 3.11.6 - resolution: "@react-stately/data@npm:3.11.6" +"@react-stately/combobox@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-stately/combobox@npm:3.10.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b81e229ef2ca8b0bc80a35a47695a1fbf1dd1c15f1728411e2440b398439024ce405cba963cbff267bf0a6235650f06744b719e6764fa21f6f490307c98783e1 + checksum: 10c0/a9ce1a4fd03d40d43f4914c8d079b1bfc40a73643067ca57c8fbc84faa5818217df2c842e4c5e94bfb79c014ba55fc185c92c7b359fbfe84ff4078104361fab7 languageName: node linkType: hard -"@react-stately/datepicker@npm:^3.10.2": - version: 3.10.2 - resolution: "@react-stately/datepicker@npm:3.10.2" - dependencies: - "@internationalized/date": "npm:^3.5.5" - "@internationalized/string": "npm:^3.2.3" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/overlays": "npm:^3.6.10" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/datepicker": "npm:^3.8.2" - "@react-types/shared": "npm:^3.24.1" +"@react-stately/data@npm:^3.11.7": + version: 3.11.7 + resolution: "@react-stately/data@npm:3.11.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10c0/bd5d81e62a251501d71ed87c1e2869d22fb0fbe80d617e70fdba4755eea79c6f51a2f9aafacf99145a2a0bbac8f5aa082096e08b930f63a7196e83c18dab3d99 + languageName: node + linkType: hard + +"@react-stately/datepicker@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-stately/datepicker@npm:3.10.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/string": "npm:^3.2.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/49583dfb0f5ca1f9208f132fd951ea828cf411f06321dd25ffdc892314d14269108c22c0efdeea5bbdbae6dc361ff9b39a9e5aefd045e5f6146d458d906ef750 + checksum: 10c0/74fa89a4b9d80343dc07a7bbabcf88962ea0afbddcfb5e24b5c97fffcb9596ec097fa4ddaf7c534c8ba96c83101f88237413d2b6f65a979653007c463c8e09c0 languageName: node linkType: hard -"@react-stately/dnd@npm:^3.4.2": - version: 3.4.2 - resolution: "@react-stately/dnd@npm:3.4.2" +"@react-stately/dnd@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-stately/dnd@npm:3.4.3" dependencies: - "@react-stately/selection": "npm:^3.16.2" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/91b8e21844faa7db1ed51c0f2d1372c8a2b1f7720e19ea968be828ea261aa91ee9d12692856a2fa62b2783a7f10233b3ee363bb252d8cfcbe70fa10604539a87 + checksum: 10c0/06356b2f1c9e1e4f77135d79a00a7ddbceed6b09bf6d1681ddf710c88aab0063f1ca96afc814693f049e2f4e38b5c4071d1a47cde6e2b7ef676c0a0e838b74ea languageName: node linkType: hard -"@react-stately/flags@npm:^3.0.3": - version: 3.0.3 - resolution: "@react-stately/flags@npm:3.0.3" +"@react-stately/flags@npm:^3.0.4": + version: 3.0.4 + resolution: "@react-stately/flags@npm:3.0.4" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/314a5885e2060dc56a32d1bae892af1f7644e14e66aa3ae3f6c0b1b4a6a1a8ded0e03adcea24bcfb9df3b87cd77f2139fde8a3d1098a0e3ba3604c3c8916385e + checksum: 10c0/363aacb4c8a9c091689a4fba2e1f0c0ca9040c9c722dae6388cbfde1952db0c808fe98e4ada6ecea89a9bf6288cf351f3f1cd54434fa6a8dccf8903e8b2085b9 languageName: node linkType: hard -"@react-stately/form@npm:^3.0.5": - version: 3.0.5 - resolution: "@react-stately/form@npm:3.0.5" +"@react-stately/form@npm:^3.0.6": + version: 3.0.6 + resolution: "@react-stately/form@npm:3.0.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e85c2e4635b56b29d0aaf636e6c4d9df9c8a2877db2cfb3a0d0a4ecb4fa54f028a24a606a495152d83c8b350a97dda199c572f1413a2d49ce9dd8ebcf577a51f + checksum: 10c0/ba8439dfb606abeedf4b90e0f3fa77d05ae1f0a898d800af419a3aaaf0b388259d09d109c138dbf6768120213870a63f6e604886fc6c11233f8da1668c086b22 languageName: node linkType: hard -"@react-stately/grid@npm:^3.9.2": - version: 3.9.2 - resolution: "@react-stately/grid@npm:3.9.2" +"@react-stately/grid@npm:^3.9.3": + version: 3.9.3 + resolution: "@react-stately/grid@npm:3.9.3" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/selection": "npm:^3.16.2" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/04806e5cf9d66440f374c1bf12445ba5c7d271583083ecb2675a236c77883909b12118205188f97f5b39dcf2c78c9d89544f57f6f70c283484d1627b610b7ab5 + checksum: 10c0/cc8d420f1148dda47ed12b9cc318f4633c252abd99d88c75294ba6c4641dd5c39b3ccd8e21350768629b942d8762e08052d8b23ab80fbe5e1ed248faa719a647 languageName: node linkType: hard -"@react-stately/list@npm:^3.10.8": - version: 3.10.8 - resolution: "@react-stately/list@npm:3.10.8" +"@react-stately/list@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/list@npm:3.11.0" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/cf4754f9eaac86785720fa05c93972387247ed62226ce3580c10a820e75e173594f215d949747569ae52d4ce055b047ac854946368dbed94f1ac236be9010431 + checksum: 10c0/64731450c5d93997c8b1ce51b3eedc1fc9b1eb7814324d56fc459bf708dbb4e052f880bb02d116af6c0544ff4e9f1c347acd99878efa501614e74fd910409a32 languageName: node linkType: hard -"@react-stately/menu@npm:^3.8.2": - version: 3.8.2 - resolution: "@react-stately/menu@npm:3.8.2" +"@react-stately/menu@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-stately/menu@npm:3.8.3" dependencies: - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/menu": "npm:^3.9.11" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/52713bfbf6343d459be80a4fb7949ea3b25db125412a1ddc3775e64aa7d2af22f0362000104fa35a12b142ca3b631368859b85d1171161e77d4b01493f223a47 + checksum: 10c0/b222962aa9fb9935032756d2d3406ccfb56391a70d2bc2d968b06cab2d1a838443c8e6779032e197f2628bb5183d67851a0020ae70ef0cb74e1f7096bbd82fdf languageName: node linkType: hard -"@react-stately/numberfield@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-stately/numberfield@npm:3.9.6" +"@react-stately/numberfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-stately/numberfield@npm:3.9.7" dependencies: - "@internationalized/number": "npm:^3.5.3" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/numberfield": "npm:^3.8.5" + "@internationalized/number": "npm:^3.5.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/numberfield": "npm:^3.8.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/5f9f45d6d1056769b2b4b08a418852bb5e302ebdc638af596415a87e50fb4d2cc6112e0831d69bedfb014d109a7c0f6fecd792518e69c4e92ca3d3ea2a341754 + checksum: 10c0/f956674792c5bb6a893d15c45b3ca4c2d0757e09a3acc4ee90efae179d6e6245d1dedd23125030f5e07f1edf7ced547a988c7d233a2eb4fcc8ea673cd4bfe942 languageName: node linkType: hard -"@react-stately/overlays@npm:^3.6.10": - version: 3.6.10 - resolution: "@react-stately/overlays@npm:3.6.10" +"@react-stately/overlays@npm:^3.6.11": + version: 3.6.11 + resolution: "@react-stately/overlays@npm:3.6.11" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/overlays": "npm:^3.8.9" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/overlays": "npm:^3.8.10" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/3bc5a97fe34a53cacd7fdf73e6dec30abf961c9ab8bf83af8fe1c8df8ccc2f39dacceb4834bd08b77cb823d83e213e855d5ebaa50f2c77a98eeecdb422bede28 + checksum: 10c0/559efc68bdb4512b8049f31a83e15404f7a306e960763570d876a08aee165656fdfbef4533251709e0576b1a7d6fd1f4e575ebfabc93738deb686c52571d36f9 languageName: node linkType: hard -"@react-stately/radio@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-stately/radio@npm:3.10.7" +"@react-stately/radio@npm:^3.10.8": + version: 3.10.8 + resolution: "@react-stately/radio@npm:3.10.8" dependencies: - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/radio": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/908f0c5eb6a0726b279ab365f7062dea90efd68e4f187a2c151235b10cc5ebfdc8d43a6b835839d0d9816461eefa2fd37e1a6a295b48f25f0afdf15f95ee2369 + checksum: 10c0/c918b134af1cb336dd687f92143df06c66b38ada10e9def7c5738e1ff0490f31563a8c20471d70d83eb8c5ad99757a7669a4d250f4f144821641b1670e6cb57d languageName: node linkType: hard -"@react-stately/searchfield@npm:^3.5.6": - version: 3.5.6 - resolution: "@react-stately/searchfield@npm:3.5.6" +"@react-stately/searchfield@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-stately/searchfield@npm:3.5.7" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/searchfield": "npm:^3.5.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/searchfield": "npm:^3.5.9" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e7ea3bb886c9b043bc473a74e164419c5cecb3d416ecdd0232e152d61300bc87ed6a5356baf3c0a11af212400f3c27799e917f1641dbe0954e90c52861ba7a8f + checksum: 10c0/855457c63a684d724bcaea19d043c0e99a1fb91c6587e9dc263ee4d6ce2f7a7ded2c5cb1cb957063c141323775cf490e93b20004ae19940d5036c1744641d0ba languageName: node linkType: hard -"@react-stately/select@npm:^3.6.7": - version: 3.6.7 - resolution: "@react-stately/select@npm:3.6.7" +"@react-stately/select@npm:^3.6.8": + version: 3.6.8 + resolution: "@react-stately/select@npm:3.6.8" dependencies: - "@react-stately/form": "npm:^3.0.5" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/select": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6fb434004996bb15f85172f2ad571f5a6cfe82e48f29405da515fbe4d36e0903966daaad8d055e9be8dfb358bcb530fd81c15866c451c28645f7a5b83c2ca48c + checksum: 10c0/2d76055fb4f7130224e1a746e43a37f0f70700fb0dd07c7a404b255a62a148ec704e9ddf9bbcc2188096dae231216738147b11587c68933a9234153b9497bde3 languageName: node linkType: hard -"@react-stately/selection@npm:^3.16.2": - version: 3.16.2 - resolution: "@react-stately/selection@npm:3.16.2" +"@react-stately/selection@npm:^3.17.0": + version: 3.17.0 + resolution: "@react-stately/selection@npm:3.17.0" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4928bec77ab6f51f79948f2f19f6177d16def6c509e5a142eccc3406fec6e16832a50fd157aff1005f313a815c95dd3a0fa1503443c8fbff8dc1982c57f56297 + checksum: 10c0/3d0cac8fa729ca9b2d083d305e533ebdc229808d34505a52e1791d916fbe08d32413216efa3ae1c322da1cf9e59024bf9b2d9b7b68e3cb0d7d30fd4da4f0be42 languageName: node linkType: hard -"@react-stately/slider@npm:^3.5.7": - version: 3.5.7 - resolution: "@react-stately/slider@npm:3.5.7" +"@react-stately/slider@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-stately/slider@npm:3.5.8" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" - "@react-types/slider": "npm:^3.7.5" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e895a4c942cfbe6e07532c9e482b55d3d61fb59e4e9a0832ec9f51b84fd09c3d26b83e17827520ee45bdcfa81f412b13e662ef77ac0b1ff21619b5824d91087f + checksum: 10c0/47a8887a4732a5a0503632cc83c36f61793bd34893989e0f23d15268b8776b30754de43559e2e962ac60125dc1816d297c09e15ec7ecadd78595b1e05ac4c5cc languageName: node linkType: hard -"@react-stately/table@npm:^3.12.2": - version: 3.12.2 - resolution: "@react-stately/table@npm:3.12.2" +"@react-stately/table@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-stately/table@npm:3.12.3" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/flags": "npm:^3.0.3" - "@react-stately/grid": "npm:^3.9.2" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" - "@react-types/table": "npm:^3.10.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/3c46d4b02eb948e40a83d50e5a51614d00970db261ef046c4061e2a12f3784bd41e0c9598d4ed663104c377fb110aaffbe954439864448e956761e589a709b6e + checksum: 10c0/736f62ed831416212f836525408ad17ce396633620136786025cff47571461b97e047f9321ebfd8db889b02cda73a401b76108529314b74e7b88e44bd2909f59 languageName: node linkType: hard -"@react-stately/tabs@npm:^3.6.9": - version: 3.6.9 - resolution: "@react-stately/tabs@npm:3.6.9" +"@react-stately/tabs@npm:^3.6.10": + version: 3.6.10 + resolution: "@react-stately/tabs@npm:3.6.10" dependencies: - "@react-stately/list": "npm:^3.10.8" - "@react-types/shared": "npm:^3.24.1" - "@react-types/tabs": "npm:^3.3.9" + "@react-stately/list": "npm:^3.11.0" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f36a930e4900e4aecd49fbffb9bd013ba34c310188501ccb61a914d0cfe2291f198ea02ee8c12968afea77ad0c8e98b5015d8e0eac84b8b2d9cb6cfdb68fb055 + checksum: 10c0/308521c0810c7653b6015bfd4c6c2393dee1ef7780718e9322dc42a670a195b940440ecaed8acceccccf720d05e67efef789a12929778549f93697bd263540fb languageName: node linkType: hard -"@react-stately/toggle@npm:^3.7.7": - version: 3.7.7 - resolution: "@react-stately/toggle@npm:3.7.7" +"@react-stately/toggle@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-stately/toggle@npm:3.7.8" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/checkbox": "npm:^3.8.3" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/eb7757e5df8f442229c857b9d8da9bf29f22f1fc197273473360433ee4cf5321a4137a3967b934eaf5ddf211ef7f48918eecbcafee76da0f997e9729973c544e + checksum: 10c0/765bb5e0c40a999b4a49babdcabf9cc9be81f9c967ee80345607ae77dc606cfb4ae730ea71af18298f636c5edb334801d2d3e2e6b123655cba67b4751d00e492 languageName: node linkType: hard -"@react-stately/tooltip@npm:^3.4.12": - version: 3.4.12 - resolution: "@react-stately/tooltip@npm:3.4.12" +"@react-stately/tooltip@npm:^3.4.13": + version: 3.4.13 + resolution: "@react-stately/tooltip@npm:3.4.13" dependencies: - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/tooltip": "npm:^3.4.11" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/tooltip": "npm:^3.4.12" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/370be423cfca5e4e24991f0d3626a51e715683c1bbaa99151c422ea24c0641f26f3241885a650173c46cf7ce0be1d532363f2b78cd65a0cfc446277a6ef76b8b + checksum: 10c0/b4322cf62ad87888898676e4cf19a75d56594851a2ca8035421e69d45b02486ea36bd7b977b7596621165b771f47c4fe1a7b23d785771f26afcd16fecad1ab8b languageName: node linkType: hard -"@react-stately/tree@npm:^3.8.4": - version: 3.8.4 - resolution: "@react-stately/tree@npm:3.8.4" +"@react-stately/tree@npm:^3.8.5": + version: 3.8.5 + resolution: "@react-stately/tree@npm:3.8.5" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/58cfc6bd6d5b989e344fae04d735b9f7d0fd9b1c22f76a00d84d02ed4aaaf7056e3f5b77a3860e097d425803332b4757e71e0f7c5ef43079015a62d26cff9a3f + checksum: 10c0/6df95aa9c75ef87fed004641f73e1889950724fdd521e2447310d645b666da79ed7a67dd80b5db6c5b75903b03aa61b1ac3f84d39117d2951c115b9b19aae03f languageName: node linkType: hard -"@react-stately/utils@npm:^3.10.3": - version: 3.10.3 - resolution: "@react-stately/utils@npm:3.10.3" +"@react-stately/utils@npm:^3.10.4": + version: 3.10.4 + resolution: "@react-stately/utils@npm:3.10.4" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/5ab34ed32c49281e01b08d87d1564bae880b68b8d25faf2b3babf825eb75e7029b73fd6469a9567e03a0e152bfaf130700e1c9fb4949d1db62fac5cd33af951e + checksum: 10c0/875c11424fadf4419caceeee13e5bfdee2b0c330fe0220c0ea9d68d570cc9a34525f2f124d977e519b397a738cd2f8e36b7b03a046e3e7da99460e99282977a4 languageName: node linkType: hard -"@react-types/breadcrumbs@npm:^3.7.7": - version: 3.7.7 - resolution: "@react-types/breadcrumbs@npm:3.7.7" +"@react-types/breadcrumbs@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-types/breadcrumbs@npm:3.7.8" dependencies: - "@react-types/link": "npm:^3.5.7" - "@react-types/shared": "npm:^3.24.1" + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/9deaac78acfd4ccf9d821bdf3bed8701e933b1e106f9ff55ca890cb6e75eaf5e3432d631ac61f02829078305c00bc54123c82d0405511b83b171ca1f64d8e48c + checksum: 10c0/886f7c3b9e7196d8516814dcf8dfcaa437107c4e2e7d6db1b83adadbdab16fb3a12edb9e1b01b6f0524307394735766487d1129b1c8d4172e50eb8e3e0bae31a languageName: node linkType: hard -"@react-types/button@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-types/button@npm:3.9.6" +"@react-types/button@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-types/button@npm:3.10.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b041a3922d8fa0a41ae4ca4f1e229b8ded70397057b1d6c6cd62e619978530c04cb283578a0c21afb83246169bfa0a71fb065071d12b58fa5d8c5e36c39abf1c + checksum: 10c0/89395334f286f1a97a584715bbb87e7bb017d7366aa73ce0cec36ec8cb59059dec1f5afe3ab44f3972e0c50f44daeb2d531b10191d6f2b7f70c3ce7d3c94c0da languageName: node linkType: hard -"@react-types/calendar@npm:^3.4.9": - version: 3.4.9 - resolution: "@react-types/calendar@npm:3.4.9" +"@react-types/calendar@npm:^3.4.10": + version: 3.4.10 + resolution: "@react-types/calendar@npm:3.4.10" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/611a5890464de326d5f8e7f97c442d81d8d7da0f792cab1ee1819d4230f5444ee3c38d2bf524152c3cad19904a4f5795c0e1a6776812c039d339f30eeb88722e + checksum: 10c0/e4768b09c86739724f7fbdde41496859bfc6ba1d09071667da82f8914e8a5eef50cd168dc79d44782b8f2143547ea1326b476f0cce1cbbf667acecf5500bce95 languageName: node linkType: hard -"@react-types/checkbox@npm:^3.8.3": - version: 3.8.3 - resolution: "@react-types/checkbox@npm:3.8.3" +"@react-types/checkbox@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/checkbox@npm:3.8.4" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/cc968b449857022a3b6a51ca7882ba6a7bc17a4878457c94eec93fcaf482cb02611b471c4fdb2c5060422bc6a2e6f4a10db011e48eb64bcece8d17934707cde6 + checksum: 10c0/e2970200658c2035f3fd8d82e805ddd5cf402cf523e293a76a7e181c0b4234e657471c34c9eb0d4f421ed494e98214160efedc8c358d9bfa63ae4b3012d73b6e languageName: node linkType: hard -"@react-types/combobox@npm:^3.12.1": - version: 3.12.1 - resolution: "@react-types/combobox@npm:3.12.1" +"@react-types/color@npm:^3.0.0": + version: 3.0.0 + resolution: "@react-types/color@npm:3.0.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/714dde84ce0effba879744bb4ae914a13215621d8b46692b09fbe71238143067163f9d07bcf2ea252aeb893118db57ceb32994746523852dd8d216a28ce3384b + checksum: 10c0/77e69841a7b3d692c4b71594f58a3b0184ca1e1bc34d3e9a7a1d58e66ee2c4a93109977739fd19c8aca80edbf667b4fd3f8be03d9c6f2eb5587ee6550509cfbc languageName: node linkType: hard -"@react-types/datepicker@npm:^3.8.2": - version: 3.8.2 - resolution: "@react-types/datepicker@npm:3.8.2" +"@react-types/combobox@npm:^3.13.0": + version: 3.13.0 + resolution: "@react-types/combobox@npm:3.13.0" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b8da4a90df3e3ecb5494e97c4b40abe74c5f8b3565c50cac3775a85e5268d04846d86e504a71d57943fc92bf3068c5499a4b273d269a441cba75dca77ee83eeb + checksum: 10c0/0eb33769279d76d2043833d2bbc36d3357d5dd92a00807980d95d5c4198060d06e3146355f31287c6b678c8b5d80c8e57084a55de71ab5174a8e8794e4702dfe languageName: node linkType: hard -"@react-types/dialog@npm:^3.5.12": - version: 3.5.12 - resolution: "@react-types/dialog@npm:3.5.12" +"@react-types/datepicker@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-types/datepicker@npm:3.8.3" dependencies: - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/75991c5be8a28323936baa2461db4cb4dc877a9f210a9d4f11f667d7b0e1eca2f90090fbaf335bb4be71c905216286177721fd7e9ba3ae084b1a272b2e8da6cb + checksum: 10c0/c6b3c2c6757329d1fd636e40b0024a20875bf7f2c895e521d9941b9469b5a8ca19b2773ae8bd1adc35b1a5f9f9946b04cfc2032cd7e4fd99cbf2947f86a06d51 languageName: node linkType: hard -"@react-types/grid@npm:^3.2.8": - version: 3.2.8 - resolution: "@react-types/grid@npm:3.2.8" +"@react-types/dialog@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-types/dialog@npm:3.5.13" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1c2c456f89b2984fc330f9ddacd4d45c8aaf1afbaec8444e753a84dceea4381325c07d153b28942959b369ad7667575ae9bae08bd7c11a1ee22e908dd658498c + checksum: 10c0/9cb9043694a1e48fbf0221effd28da602c314c64d653455d5616d8384adf93c78c87453a5b210ff587a221836adb5e2e7f9cb5b3f9a04c3522ad35dadba5d39a languageName: node linkType: hard -"@react-types/link@npm:^3.5.7": - version: 3.5.7 - resolution: "@react-types/link@npm:3.5.7" +"@react-types/grid@npm:^3.2.9": + version: 3.2.9 + resolution: "@react-types/grid@npm:3.2.9" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/cc8c526ff1fcacab28647f7355a96ba21b858444d53ff5eb236636fc88da9e3fb91e784aa5cf2d112cdbf7be8fdea5067a975be6c1c113cd7e5dc3bf4fc8499c + checksum: 10c0/2645c4dafef3d10fe866a2a2ee9c17bce6fef9bf166bdf98e1de5bb6ed4cefc390eda87ea79ed8846cc94a9f57eb530577122d6063a14747ff3df2a08ec700cb languageName: node linkType: hard -"@react-types/listbox@npm:^3.5.1": - version: 3.5.1 - resolution: "@react-types/listbox@npm:3.5.1" +"@react-types/link@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-types/link@npm:3.5.8" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/fa1d0ec7e70a4b9a2a2e379899016dd81d9172f9065f6626436ab956f166f73e0062c2c73f8122b993096d8936f8433e85d6ecebeae67b54980e571ec30d688e + checksum: 10c0/39ac4827bb791d481bcf394429effc53dd446cf7e260ee1900c09327581b36650aa68f573d5002ac7d9e39ac5dbbb08e0d39cf0eeb408c2a3bfc2c8ce77a5cb7 languageName: node linkType: hard -"@react-types/menu@npm:^3.9.11": - version: 3.9.11 - resolution: "@react-types/menu@npm:3.9.11" +"@react-types/listbox@npm:^3.5.2": + version: 3.5.2 + resolution: "@react-types/listbox@npm:3.5.2" dependencies: - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e0bae8eb7c19900512a32d0d4d2909b7537c28be30cb58c9c8ff0de621828bdf14030fbe17cd8addf919844aa3d462182b2c81a0b3eba864f7144c9edbec3add + checksum: 10c0/a4145e0290e79c7ac0ae97f64384949f5156e75f4f05b1db17c36c1c31233dbfa7bc8509601dbb8782c24f77142a625db9e087b8a911acd385742f23d3d931bd languageName: node linkType: hard -"@react-types/meter@npm:^3.4.3": - version: 3.4.3 - resolution: "@react-types/meter@npm:3.4.3" +"@react-types/menu@npm:^3.9.12": + version: 3.9.12 + resolution: "@react-types/menu@npm:3.9.12" dependencies: - "@react-types/progress": "npm:^3.5.6" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e06d845e33b6cd0d3dee783ea68927187409896db963be1b7356e6ab63f909fbb3deaed6f95ce8f2b8855cd2d4f8138b4c54a5ab7e6fb8898d324a177302e16d + checksum: 10c0/c0f5be96e7fce99143ee564bf2debfc61c43ce5459dc4dc60118d4d873877cae9796c736dea88a1da892ea633fadd179c156c37b070a44eb4060f85a3007eb81 languageName: node linkType: hard -"@react-types/numberfield@npm:^3.8.5": - version: 3.8.5 - resolution: "@react-types/numberfield@npm:3.8.5" +"@react-types/meter@npm:^3.4.4": + version: 3.4.4 + resolution: "@react-types/meter@npm:3.4.4" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/progress": "npm:^3.5.7" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/842c6cbb6c68c48764b1498103b1c40e940285366a8b342c3e259c48b518e9c986d9e358e7f0f6af0aaddbb48d709681c4fd4dcd3bb9b553a5be20d7548ce068 + checksum: 10c0/0fa94ee35264e3d600e424aba3b21dd6b0896c6877d723381ea5a34c7594e8079b81ce3b2115d6420695ed0004d7251e4d5dc93b6ad8c06c8de8fb30c085ee45 languageName: node linkType: hard -"@react-types/overlays@npm:^3.8.9": - version: 3.8.9 - resolution: "@react-types/overlays@npm:3.8.9" +"@react-types/numberfield@npm:^3.8.6": + version: 3.8.6 + resolution: "@react-types/numberfield@npm:3.8.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/8719684bd606e119f3a20db73cecf1e36e7c2d8158b996e9308495e5b78252689c459ce394a798f03ebb0c7303eac67093ce9345eb45e5bb4e1ae55451dcf4b3 + checksum: 10c0/f15d30246d8e33e360f4c3398ffc287aa8bb9e133e7b3368cd3c05a80c18df4cbf46fe4dbaafd7cb18bb268632a291030e7e71d1c4ea794d366afb7a75512c32 languageName: node linkType: hard -"@react-types/progress@npm:^3.5.6": - version: 3.5.6 - resolution: "@react-types/progress@npm:3.5.6" +"@react-types/overlays@npm:^3.8.10": + version: 3.8.10 + resolution: "@react-types/overlays@npm:3.8.10" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/dfd6e957148fef5014e3b3ca761f38ef9927dfad78bdbe194eb08fa747718903397d973170f91a4f98c6c703217996e60c76217c0601f71015c43a6332dc6aae + checksum: 10c0/753fd637dab9e189403cab8567a88fce183de8013dcec705fe3ed813facaa7a95fa754af5a45f364787c4351132d27ebaf3184e0e14955c47bf80b82560c3539 languageName: node linkType: hard -"@react-types/radio@npm:^3.8.3": - version: 3.8.3 - resolution: "@react-types/radio@npm:3.8.3" +"@react-types/progress@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-types/progress@npm:3.5.7" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b110d915a11747897781bf635fc1f1b86be892f8bd01ce38e2e8e229d9ab82e46b37980540bd930e71124ccc02081d143c513440994da127f9ed2d34a75912ee + checksum: 10c0/8780f97a5e3400e2381ed6659511a74fdfa8a3aa21499c8fe1fcd92386460569c56032d60297dd0786744d460cd515ebf4f663ea4b1a1f57e717e2da977dd581 languageName: node linkType: hard -"@react-types/searchfield@npm:^3.5.8": - version: 3.5.8 - resolution: "@react-types/searchfield@npm:3.5.8" +"@react-types/radio@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/radio@npm:3.8.4" dependencies: - "@react-types/shared": "npm:^3.24.1" - "@react-types/textfield": "npm:^3.9.6" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7ddf33358f76b8652aecdd6fec95c891890dcdf97a9c8bafa19f67e049f308ce3aefa0f230c8b3276bba1dd52a1c49f4dbbb03d7cb0ab01bf72308cb117bb85b + checksum: 10c0/2a7395f07810b3ae128c329f31d00f0bda3ecc03a8203e17cda7fbc0be019bb01113b8af6d0f73334168ae2fd13763ef4d1138c3f8b3d49ef2c858e33df2f3ae languageName: node linkType: hard -"@react-types/select@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-types/select@npm:3.9.6" +"@react-types/searchfield@npm:^3.5.9": + version: 3.5.9 + resolution: "@react-types/searchfield@npm:3.5.9" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10c0/5e7d644e86a6ffb41c6230ef57e2ccdcfc1ad045a035a1c88aeb476054854fdc0542bfd62a8b3d23d4f19adf7e117c90ca9d8afd5726d7b039ed52f9ebed0639 + languageName: node + linkType: hard + +"@react-types/select@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/select@npm:3.9.7" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/10495da46af019a1f2a5473740f4dcf84cd03c4aee9aa19dba2a8867f521efc33d4587c02ef762619c903ef8426cd887b89957efe3c91c96acd9e07a60f19af8 + checksum: 10c0/438a23b9be9469d81f2c0da0904ac76ce163ea41b03ca05c744a0d96b323837f1f0270b58dde83303970b2755202cc6dbbc109d8c9cce9c69100c56dfca967ab languageName: node linkType: hard -"@react-types/shared@npm:^3.24.1": - version: 3.24.1 - resolution: "@react-types/shared@npm:3.24.1" +"@react-types/shared@npm:^3.25.0": + version: 3.25.0 + resolution: "@react-types/shared@npm:3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/34ef83cf5d945963208beb724d54468e5371fd7361024f6f42a29cdc6d4a9516aa4d82804cdecbcf01c16d82c96aacb511418d7c839e1ea4579b20411e565ed4 + checksum: 10c0/d168f6b404c345928ef8ead94f0cecd3831d8f6df708dbe897ac62d566949a0931c3b0d95ef6dd02bc5af05b183781b531e6f041ffd1d320bc2cab7697fd27d0 languageName: node linkType: hard -"@react-types/slider@npm:^3.7.5": - version: 3.7.5 - resolution: "@react-types/slider@npm:3.7.5" +"@react-types/slider@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-types/slider@npm:3.7.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7566c726c2b4a0639130c4bb0730dc66bb17cacdfba39af95fbe64ef30544805ac2eb00af69d2689fc86529a0b7beea544e4c2d7f6fc91f1e3633921d0e9feff + checksum: 10c0/06efeb2076380eafe0ac2b20d72fa4c2072f1dd85346a49388bd7fae76fd78d143c457fd1732c5dbccd34e2e16593d1672a76b51fa986554343319cfc996042e languageName: node linkType: hard -"@react-types/switch@npm:^3.5.5": - version: 3.5.5 - resolution: "@react-types/switch@npm:3.5.5" +"@react-types/switch@npm:^3.5.6": + version: 3.5.6 + resolution: "@react-types/switch@npm:3.5.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b7d865c49d213af0048fd36d29991779021c3a6bc9a8e57eabe10f05be42b122c49fc3d2ba287bf3fd33b65fc00442905c9f3784d2524a333c931c782c55e2eb + checksum: 10c0/9c32a3306adf1afd103b3187e01be475f6e3f42391a2fe652312eb5fd89cc83087ceb6b9ea510f9f894593a695cb70ce00063aba6d808f6bc1cbbaa93f47f38b languageName: node linkType: hard -"@react-types/table@npm:^3.10.1": - version: 3.10.1 - resolution: "@react-types/table@npm:3.10.1" +"@react-types/table@npm:^3.10.2": + version: 3.10.2 + resolution: "@react-types/table@npm:3.10.2" dependencies: - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1f3d2390f421ed9053816ba40b41744c5168d8f3b926c29d565e5588420a133315f1d2301db16c33ffff5d0689fad014b388385fd5876a7c365873e21b02189d + checksum: 10c0/e25e393192a2d272b5a35a864b566c0f86ad923b5420df37c161d5f8e39b333f0759caaa6e94fb166fadd22ddf07a3da57f57f8e47843ce1f5fc296be305e879 languageName: node linkType: hard -"@react-types/tabs@npm:^3.3.9": - version: 3.3.9 - resolution: "@react-types/tabs@npm:3.3.9" +"@react-types/tabs@npm:^3.3.10": + version: 3.3.10 + resolution: "@react-types/tabs@npm:3.3.10" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/53416d3060c911e3c1416e5fe749cffff5eca30ed1a101bb012b9c89726cea818fd1f16650230410bec0dd7d2626dc1581c53106d7a0660101174a242f6ae458 + checksum: 10c0/f0da42c6334b4b7715bed6c555d6866c03c8c8bbedd014d886c869baa1572b4b14012f1b62a25906ab09061c1d332326c9e56e10ca5278f415918be381a2e544 languageName: node linkType: hard -"@react-types/textfield@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-types/textfield@npm:3.9.6" +"@react-types/textfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/textfield@npm:3.9.7" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/3d3744eae4efe7138151373c74df38aecb143a1c745e1ac1479af54273024ed35b55306852b32a941daf6f2b549680cd3f5bdf5fe05086791c2e11d28996a73e + checksum: 10c0/e547b784c295f842f106652ef1ba301c335c05cfe6fc1367c3870d3b0e51eed8e5cd04572d3b1f056fa74f32bb23f4c75d2e821be3729313ff64a9989e4f5ff9 languageName: node linkType: hard -"@react-types/tooltip@npm:^3.4.11": - version: 3.4.11 - resolution: "@react-types/tooltip@npm:3.4.11" +"@react-types/tooltip@npm:^3.4.12": + version: 3.4.12 + resolution: "@react-types/tooltip@npm:3.4.12" dependencies: - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/76bfaeb25c9c06668e85e451bd527e0e15249f025a12fe4c710e8cb4d6ae2643f9fad065729646205c87b7be571c5d8baadb43ab7bc44946dc7e73402aae7f98 + checksum: 10c0/cc1dd4effeddeb768b256537e8b7ed492d77ac10245d936eac0a2d1e202c36a179c194bd50188fdee2c3caaf502dbc3c7861886746a12a1795f5ee26b8935180 languageName: node linkType: hard @@ -7489,129 +8274,143 @@ __metadata: linkType: hard "@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": - version: 5.1.2 - resolution: "@rollup/pluginutils@npm:5.1.2" + version: 5.1.3 + resolution: "@rollup/pluginutils@npm:5.1.3" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" - picomatch: "npm:^2.3.1" + picomatch: "npm:^4.0.2" peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 10c0/30f4a98e91a8699b6666b64ecdc665439bd53dddbe964bbeca56da81ff889cfde3a3e059144b80c5a2d9b48aa158df18a45e9a847a33b757d3e8336b278b8836 + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.4" +"@rollup/rollup-android-arm-eabi@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.27.3" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-android-arm64@npm:4.22.4" +"@rollup/rollup-android-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-android-arm64@npm:4.27.3" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-darwin-arm64@npm:4.22.4" +"@rollup/rollup-darwin-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.27.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-darwin-x64@npm:4.22.4" +"@rollup/rollup-darwin-x64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.27.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4" +"@rollup/rollup-freebsd-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.3" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-freebsd-x64@npm:4.27.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.4" +"@rollup/rollup-linux-arm-musleabihf@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.27.3" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.4" +"@rollup/rollup-linux-arm64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.27.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.4" +"@rollup/rollup-linux-arm64-musl@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.27.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.4" +"@rollup/rollup-linux-riscv64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.27.3" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.4" +"@rollup/rollup-linux-s390x-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.27.3" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.4" +"@rollup/rollup-linux-x64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.27.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.4" +"@rollup/rollup-linux-x64-musl@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.27.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.4" +"@rollup/rollup-win32-arm64-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.27.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.4" +"@rollup/rollup-win32-ia32-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.27.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.4" +"@rollup/rollup-win32-x64-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.27.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7624,12 +8423,12 @@ __metadata: linkType: hard "@safe-global/safe-apps-provider@npm:^0.18.1": - version: 0.18.2 - resolution: "@safe-global/safe-apps-provider@npm:0.18.2" + version: 0.18.4 + resolution: "@safe-global/safe-apps-provider@npm:0.18.4" dependencies: - "@safe-global/safe-apps-sdk": "npm:^9.0.0" + "@safe-global/safe-apps-sdk": "npm:^9.1.0" events: "npm:^3.3.0" - checksum: 10c0/599cc714acdb008d57f341e86298d05dd390ded2622dec8171293cb9877be9d36c2877c930e2b935f2f12eda1e11223fa6aaf277673eaccb471bbae51b652def + checksum: 10c0/612c9816b75b86b73b95b5df35529f4d48da1a3a59b2b999f6ef836b28b10cda2142e159dbc97f0298fa8f5b76df82a1e08e34034fdf12f148e9fd4af2f72134 languageName: node linkType: hard @@ -7643,27 +8442,27 @@ __metadata: languageName: node linkType: hard -"@safe-global/safe-apps-sdk@npm:^9.0.0": - version: 9.0.0 - resolution: "@safe-global/safe-apps-sdk@npm:9.0.0" +"@safe-global/safe-apps-sdk@npm:^9.1.0": + version: 9.1.0 + resolution: "@safe-global/safe-apps-sdk@npm:9.1.0" dependencies: "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" - viem: "npm:^1.6.0" - checksum: 10c0/04f50e68fe8f9fff513b8c5dcf0455c8636b54bb5677a7ff7b96c3d718c948fbc4d5da11112e69da83b811fdfae285d25ad07f88d2111d7e55d68085cb59692e + viem: "npm:^2.1.1" + checksum: 10c0/13af12122a6b1388e7960a76c3c421ea5ed97197646cd1f720b9fc9364fad0cc8f21cda23773130cd6bf57935a36f9e93f5222569cc80382709430b5cad26fda languageName: node linkType: hard "@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": - version: 3.21.1 - resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.21.1" - checksum: 10c0/7eebf7b07d7c8bfc78e9760b119f6623e0343264ac88a366a63db13c24ae9c8691054d2c2ed5bc1e28b4ce6a43b36ce38ec0f80cead478fcae62c7c85f2f0a3f + version: 3.22.2 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.22.2" + checksum: 10c0/4c61c6bc1e720ceb98e7812ef060e40120e130c385f1ac8012a99155179b0651e12f608e053c9e4d1d7917881920e9e3b15c3c90805f9bbb7f28d80b13d04381 languageName: node linkType: hard -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": - version: 1.1.6 - resolution: "@scure/base@npm:1.1.6" - checksum: 10c0/237a46a1f45391fc57719154f14295db936a0b1562ea3e182dd42d7aca082dbb7062a28d6c49af16a7e478b12dae8a0fe678d921ea5056bcc30238d29eb05c55 +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.7, @scure/base@npm:~1.1.8": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 10c0/77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8 languageName: node linkType: hard @@ -7678,6 +8477,28 @@ __metadata: languageName: node linkType: hard +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" + dependencies: + "@noble/curves": "npm:~1.4.0" + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10c0/6849690d49a3bf1d0ffde9452eb16ab83478c1bc0da7b914f873e2930cd5acf972ee81320e3df1963eb247cf57e76d2d975b5f97093d37c0e3f7326581bf41bd + languageName: node + linkType: hard + +"@scure/bip32@npm:1.5.0, @scure/bip32@npm:^1.5.0": + version: 1.5.0 + resolution: "@scure/bip32@npm:1.5.0" + dependencies: + "@noble/curves": "npm:~1.6.0" + "@noble/hashes": "npm:~1.5.0" + "@scure/base": "npm:~1.1.7" + checksum: 10c0/3319beda59e7f129d770cbe49709a2d1742f2deb6989b12e37aa1a47cd128a8c943bdd9286c6a5513ef4539307c4bca8f89f9aa91f294cac4598cbf95fa0c01d + languageName: node + linkType: hard + "@scure/bip39@npm:1.2.1": version: 1.2.1 resolution: "@scure/bip39@npm:1.2.1" @@ -7688,6 +8509,26 @@ __metadata: languageName: node linkType: hard +"@scure/bip39@npm:1.3.0": + version: 1.3.0 + resolution: "@scure/bip39@npm:1.3.0" + dependencies: + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10c0/1ae1545a7384a4d9e33e12d9e9f8824f29b0279eb175b0f0657c0a782c217920054f9a1d28eb316a417dfc6c4e0b700d6fbdc6da160670107426d52fcbe017a8 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.4.0, @scure/bip39@npm:^1.4.0": + version: 1.4.0 + resolution: "@scure/bip39@npm:1.4.0" + dependencies: + "@noble/hashes": "npm:~1.5.0" + "@scure/base": "npm:~1.1.8" + checksum: 10c0/dcdceeac348ed9c0f545c1a7ef8854ef62d6eb4e7b7aaafa4e2ef27f7e1c5744b0cd26292afd04e1ee59ae035b19abdd65174a444b8db8c238ccc662f6b90eac + languageName: node + linkType: hard + "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -7702,38 +8543,6 @@ __metadata: languageName: node linkType: hard -"@solana/buffer-layout@npm:^4.0.1": - version: 4.0.1 - resolution: "@solana/buffer-layout@npm:4.0.1" - dependencies: - buffer: "npm:~6.0.3" - checksum: 10c0/6535f3908cf6dfc405b665795f0c2eaa0482a8c6b1811403945cf7b450e7eb7b40acce3e8af046f2fcc3eea1a15e61d48c418315d813bee4b720d56b00053305 - languageName: node - linkType: hard - -"@solana/web3.js@npm:^1.70.1": - version: 1.91.8 - resolution: "@solana/web3.js@npm:1.91.8" - dependencies: - "@babel/runtime": "npm:^7.24.5" - "@noble/curves": "npm:^1.4.0" - "@noble/hashes": "npm:^1.4.0" - "@solana/buffer-layout": "npm:^4.0.1" - agentkeepalive: "npm:^4.5.0" - bigint-buffer: "npm:^1.1.5" - bn.js: "npm:^5.2.1" - borsh: "npm:^0.7.0" - bs58: "npm:^4.0.1" - buffer: "npm:6.0.3" - fast-stable-stringify: "npm:^1.0.0" - jayson: "npm:^4.1.0" - node-fetch: "npm:^2.7.0" - rpc-websockets: "npm:^7.11.0" - superstruct: "npm:^0.14.2" - checksum: 10c0/fd5178c25c7074631867006647161ac7f0f0f6b71a9720688510fe5e74bdd10f78df26f70096ee59f87bf97b71c81a89cee0aabe7920fce7691da9e6b8262da1 - languageName: node - linkType: hard - "@stablelib/aead@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/aead@npm:1.0.1" @@ -7854,7 +8663,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": +"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": version: 1.0.2 resolution: "@stablelib/random@npm:1.0.2" dependencies: @@ -7893,7 +8702,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/x25519@npm:^1.0.3": +"@stablelib/x25519@npm:1.0.3, @stablelib/x25519@npm:^1.0.3": version: 1.0.3 resolution: "@stablelib/x25519@npm:1.0.3" dependencies: @@ -7905,11 +8714,11 @@ __metadata: linkType: hard "@swc/helpers@npm:^0.5.0": - version: 0.5.8 - resolution: "@swc/helpers@npm:0.5.8" + version: 0.5.15 + resolution: "@swc/helpers@npm:0.5.15" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/53a52b3654edb1b22ab317feb4ab7fa805eb368082530d2835647e5d0cc497f5c3aa8e16d568df6eee301982aac532674345acbaaa45354ffb58043768d4db36 + tslib: "npm:^2.8.0" + checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4 languageName: node linkType: hard @@ -7969,21 +8778,21 @@ __metadata: linkType: hard "@tanstack/react-virtual@npm:^3.0.0-beta.60": - version: 3.10.8 - resolution: "@tanstack/react-virtual@npm:3.10.8" + version: 3.10.9 + resolution: "@tanstack/react-virtual@npm:3.10.9" dependencies: - "@tanstack/virtual-core": "npm:3.10.8" + "@tanstack/virtual-core": "npm:3.10.9" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/b7aec88ef48f604d3e7245b9996ba42f06e6ee2c1a45146cb96814cb3873a4c888bf86d26d10284c847a5ed97e16dc9430c380387abc1231c2e43c00f6ebadff + checksum: 10c0/a854b6fb2bdccec9e581442def5ed6ee568fd2b12178e70450c03d9e60a1e5794be71c4ad3f385af717872c039e569ff88c52adb11a2ddf2c02ded3f83bc851d languageName: node linkType: hard -"@tanstack/virtual-core@npm:3.10.8": - version: 3.10.8 - resolution: "@tanstack/virtual-core@npm:3.10.8" - checksum: 10c0/ddb97cd03d84b343b38a2c14d85e33c788f4af622fccc0fdf997caf4e83e47e8f67b099b854c7dc4337d7662f647625ab3247cd8aa1bc9d4dda701bda83245f6 +"@tanstack/virtual-core@npm:3.10.9": + version: 3.10.9 + resolution: "@tanstack/virtual-core@npm:3.10.9" + checksum: 10c0/960cde330235daff5403e0da23837ac30a0f95a02c8866692f8382d03b675d6802e129436b0b3e7e737d8a5347ef2cadec448ba4c0878462228c094440d0207b languageName: node linkType: hard @@ -8027,15 +8836,14 @@ __metadata: linkType: hard "@terra-money/station-connector@npm:^1.1.0": - version: 1.1.0 - resolution: "@terra-money/station-connector@npm:1.1.0" + version: 1.1.4 + resolution: "@terra-money/station-connector@npm:1.1.4" dependencies: bech32: "npm:^2.0.0" peerDependencies: "@cosmjs/amino": ^0.31.0 - "@terra-money/feather.js": ^3.0.0-beta.1 axios: ^0.27.2 - checksum: 10c0/9749876044357bc0f28ceeb15a1535b8201e6fa3eb09e95c0374ecba04b87d85388a4d5c491b2a89cc3b02ad24c8fa055e69240ae937c16f5bee196416263898 + checksum: 10c0/34c3b5ed099ca79394d4f37fbf4275b3b3c047420f005a3999b685a1c2ba985947713a9a91a0dbe2cafd32d205491074ad6610c6cf6aa88beb0c0ae63c25b3b4 languageName: node linkType: hard @@ -8134,20 +8942,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 10c0/033abcb2f4c084ad33e30c3efaad82161240f351e3c71b6154ed289946b33b363696c0fbd42502b68e4582a87413c418321f40eb1ea863e34fe525641345e05b - languageName: node - linkType: hard - -"@types/connect@npm:^3.4.33": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 languageName: node linkType: hard @@ -8160,7 +8959,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a @@ -8174,13 +8973,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d - languageName: node - linkType: hard - "@types/fs-extra@npm:^11": version: 11.0.4 resolution: "@types/fs-extra@npm:11.0.4" @@ -8230,12 +9022,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:20.16.8, @types/node@npm:>=13.7.0": - version: 20.16.8 - resolution: "@types/node@npm:20.16.8" +"@types/node@npm:*, @types/node@npm:>=13.7.0, @types/node@npm:^22.9.0": + version: 22.9.1 + resolution: "@types/node@npm:22.9.1" dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/3b3bd96885cbbe49e5f701be91f9a69b904a60b23fd4812083b053a802a03e38227919ff800aff2961fd11147b471a1a4fc09f1df171f372698f16d39859aebf + undici-types: "npm:~6.19.8" + checksum: 10c0/ea489ae603aa8874e4e88980aab6f2dad09c755da779c88dd142983bfe9609803c89415ca7781f723072934066f63daf2b3339ef084a8ad1a8079cf3958be243 languageName: node linkType: hard @@ -8246,19 +9038,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^12.12.54": - version: 12.20.55 - resolution: "@types/node@npm:12.20.55" - checksum: 10c0/3b190bb0410047d489c49bbaab592d2e6630de6a50f00ba3d7d513d59401d279972a8f5a598b5bb8ddc1702f8a2f4ec57a65d93852f9c329639738e7053637d1 - languageName: node - linkType: hard - -"@types/node@npm:^22.9.0": - version: 22.9.0 - resolution: "@types/node@npm:22.9.0" +"@types/node@npm:20.16.8": + version: 20.16.8 + resolution: "@types/node@npm:20.16.8" dependencies: - undici-types: "npm:~6.19.8" - checksum: 10c0/3f46cbe0a49bab4ba30494025e4c8a6e699b98ac922857aa1f0209ce11a1313ee46e6808b8f13fe5b8b960a9d7796b77c8d542ad4e9810e85ef897d5593b5d51 + undici-types: "npm:~6.19.2" + checksum: 10c0/3b3bd96885cbbe49e5f701be91f9a69b904a60b23fd4812083b053a802a03e38227919ff800aff2961fd11147b471a1a4fc09f1df171f372698f16d39859aebf languageName: node linkType: hard @@ -8270,21 +9055,21 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.2.19": - version: 18.3.0 - resolution: "@types/react-dom@npm:18.3.0" + version: 18.3.1 + resolution: "@types/react-dom@npm:18.3.1" dependencies: "@types/react": "npm:*" - checksum: 10c0/6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b + checksum: 10c0/8b416551c60bb6bd8ec10e198c957910cfb271bc3922463040b0d57cf4739cdcd24b13224f8d68f10318926e1ec3cd69af0af79f0291b599a992f8c80d47f1eb languageName: node linkType: hard "@types/react@npm:*, @types/react@npm:^18.2.56": - version: 18.3.9 - resolution: "@types/react@npm:18.3.9" + version: 18.3.12 + resolution: "@types/react@npm:18.3.12" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/a92b8e061d0c833e096254782c56a802316593f4a907fb834b557cabe848a0829b9eb6056404ea239eb4d5ec5ac7b7724309761516c0a7a277916fa04dd4f805 + checksum: 10c0/8bae8d9a41619804561574792e29112b413044eb0d53746dde2b9720c1f9a59f71c895bbd7987cd8ce9500b00786e53bc032dced38cddf42910458e145675290 languageName: node linkType: hard @@ -8319,18 +9104,9 @@ __metadata: linkType: hard "@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/unist@npm:3.0.2" - checksum: 10c0/39f220ce184a773c55c18a127062bfc4d0d30c987250cd59bab544d97be6cfec93717a49ef96e81f024b575718f798d4d329eb81c452fc57d6d051af8b043ebf - languageName: node - linkType: hard - -"@types/ws@npm:^7.4.4": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/f1f53febd8623a85cef2652949acd19d83967e350ea15a851593e3033501750a1e04f418552e487db90a3d48611a1cff3ffcf139b94190c10f2fd1e1dc95ff10 + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 languageName: node linkType: hard @@ -8498,8 +9274,8 @@ __metadata: linkType: hard "@vanilla-extract/css@npm:^1.14.1": - version: 1.15.5 - resolution: "@vanilla-extract/css@npm:1.15.5" + version: 1.16.0 + resolution: "@vanilla-extract/css@npm:1.16.0" dependencies: "@emotion/hash": "npm:^0.9.0" "@vanilla-extract/private": "npm:^1.0.6" @@ -8513,7 +9289,7 @@ __metadata: media-query-parser: "npm:^2.0.2" modern-ahocorasick: "npm:^1.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/85b8c710b5fbc7ac73494e97be152327ff52a81397ca424622df126cd664638127ba67ada9cddb9a80a57be3f732da382d538a346675e9c497d6b71d60c57555 + checksum: 10c0/f25de438e400f18b128b29ba954d646173b8c98cc2cb5c1358a4f3e020646e8e7b9d8c4b236e00f8f1ea4eed6e62b758369e8e19836890182b5d07c703ddb150 languageName: node linkType: hard @@ -8588,17 +9364,17 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^4.2.1": - version: 4.2.1 - resolution: "@vitejs/plugin-react@npm:4.2.1" + version: 4.3.3 + resolution: "@vitejs/plugin-react@npm:4.3.3" dependencies: - "@babel/core": "npm:^7.23.5" - "@babel/plugin-transform-react-jsx-self": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx-source": "npm:^7.23.3" + "@babel/core": "npm:^7.25.2" + "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.14.0" + react-refresh: "npm:^0.14.2" peerDependencies: vite: ^4.2.0 || ^5.0.0 - checksum: 10c0/de1eec44d703f32e5b58e776328ca20793657fe991835d15b290230b19a2a08be5d31501d424279ae13ecfed28044c117b69d746891c8d9b92c69e8a8907e989 + checksum: 10c0/b370c25fb47bb96f0cc51f3aadbbcfce54e40f95a4de67cf932e5ec526f139648da703725c6ea2c71a1b525eb3dd6e3e8ff877da143627cd2575de5ec4f00aa3 languageName: node linkType: hard @@ -8667,28 +9443,28 @@ __metadata: languageName: node linkType: hard -"@walletconnect/core@npm:2.11.3": - version: 2.11.3 - resolution: "@walletconnect/core@npm:2.11.3" +"@walletconnect/core@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/core@npm:2.17.2" dependencies: - "@walletconnect/heartbeat": "npm:1.2.1" - "@walletconnect/jsonrpc-provider": "npm:1.0.13" - "@walletconnect/jsonrpc-types": "npm:1.0.3" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/jsonrpc-ws-connection": "npm:1.0.14" - "@walletconnect/keyvaluestorage": "npm:^1.1.1" - "@walletconnect/logger": "npm:^2.0.1" - "@walletconnect/relay-api": "npm:^1.0.9" - "@walletconnect/relay-auth": "npm:^1.0.4" - "@walletconnect/safe-json": "npm:^1.0.2" - "@walletconnect/time": "npm:^1.0.2" - "@walletconnect/types": "npm:2.11.3" - "@walletconnect/utils": "npm:2.11.3" - events: "npm:^3.3.0" - isomorphic-unfetch: "npm:3.1.0" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" + "@walletconnect/window-getters": "npm:1.0.1" + events: "npm:3.3.0" lodash.isequal: "npm:4.5.0" - uint8arrays: "npm:^3.1.0" - checksum: 10c0/364a793f35f758d5fa2be32b9456d6c4fcc7bf980db5d67bd5547a44f86ff8d1cb83a06dffee316a7d0b218cf08814bcdf59140e3d0c83b3608b4dcd71c881fd + uint8arrays: "npm:3.1.0" + checksum: 10c0/6124b81892a4e5e9350cfff22a7ce3a23a66c9589221411bd8bfd411fc392b6b343fae1634b32000d4275ba11b1a0f732cf6b7ba5da35b388854c7e7b4f2764d languageName: node linkType: hard @@ -8744,7 +9520,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/events@npm:^1.0.1": +"@walletconnect/events@npm:1.0.1, @walletconnect/events@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/events@npm:1.0.1" dependencies: @@ -8765,6 +9541,17 @@ __metadata: languageName: node linkType: hard +"@walletconnect/heartbeat@npm:1.2.2": + version: 1.2.2 + resolution: "@walletconnect/heartbeat@npm:1.2.2" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + events: "npm:^3.3.0" + checksum: 10c0/a97b07764c397fe3cd26e8ea4233ecc8a26049624df7edc05290d286266bc5ba1de740d12c50dc1b7e8605198c5974e34e2d5318087bd4e9db246e7b273f4592 + languageName: node + linkType: hard + "@walletconnect/jsonrpc-http-connection@npm:^1.0.4, @walletconnect/jsonrpc-http-connection@npm:^1.0.7": version: 1.0.8 resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.8" @@ -8788,7 +9575,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": +"@walletconnect/jsonrpc-provider@npm:1.0.14, @walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": version: 1.0.14 resolution: "@walletconnect/jsonrpc-provider@npm:1.0.14" dependencies: @@ -8799,7 +9586,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": +"@walletconnect/jsonrpc-types@npm:1.0.3": version: 1.0.3 resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" dependencies: @@ -8809,6 +9596,16 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-types@npm:1.0.4, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.4 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.4" + dependencies: + events: "npm:^3.3.0" + keyvaluestorage-interface: "npm:^1.0.0" + checksum: 10c0/752978685b0596a4ba02e1b689d23873e464460e4f376c97ef63e6b3ab273658ca062de2bfcaa8a498d31db0c98be98c8bbfbe5142b256a4b3ef425e1707f353 + languageName: node + linkType: hard + "@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.4, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": version: 1.0.8 resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" @@ -8832,7 +9629,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/keyvaluestorage@npm:^1.0.2, @walletconnect/keyvaluestorage@npm:^1.1.1": +"@walletconnect/keyvaluestorage@npm:1.1.1, @walletconnect/keyvaluestorage@npm:^1.0.2, @walletconnect/keyvaluestorage@npm:^1.1.1": version: 1.1.1 resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" dependencies: @@ -8918,13 +9715,13 @@ __metadata: languageName: node linkType: hard -"@walletconnect/logger@npm:^2.0.1": - version: 2.0.1 - resolution: "@walletconnect/logger@npm:2.0.1" +"@walletconnect/logger@npm:2.1.2, @walletconnect/logger@npm:^2.0.1": + version: 2.1.2 + resolution: "@walletconnect/logger@npm:2.1.2" dependencies: + "@walletconnect/safe-json": "npm:^1.0.2" pino: "npm:7.11.0" - tslib: "npm:1.14.1" - checksum: 10c0/1778686f608f03bc8a67fb560a2694e8aef74b392811508e98cc158d1839a1bb0a0256eb2ed719c4ee17e65a11543ddc4f9059d3bdd5dddcca6359ba1bab18bd + checksum: 10c0/c66e835d33f737f48d6269f151650f6d7bb85bd8b59580fb8116f94d460773820968026e666ddf4a1753f28fceb3c54aae8230a445108a116077cb13a293842f languageName: node linkType: hard @@ -8937,6 +9734,15 @@ __metadata: languageName: node linkType: hard +"@walletconnect/modal-core@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-core@npm:2.7.0" + dependencies: + valtio: "npm:1.11.2" + checksum: 10c0/84b11735c005e37e661aa0f08b2e8c8098db3b2cacd957c4a73f4d3de11b2d5e04dd97ab970f8d22fc3e8269fea3297b9487e177343bbab8dd69b3b917fb7f60 + languageName: node + linkType: hard + "@walletconnect/modal-ui@npm:2.6.2": version: 2.6.2 resolution: "@walletconnect/modal-ui@npm:2.6.2" @@ -8949,7 +9755,19 @@ __metadata: languageName: node linkType: hard -"@walletconnect/modal@npm:2.6.2, @walletconnect/modal@npm:^2.4.3": +"@walletconnect/modal-ui@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-ui@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + lit: "npm:2.8.0" + motion: "npm:10.16.2" + qrcode: "npm:1.5.3" + checksum: 10c0/b717f1fc9854b7d14a4364720fce2d44167f547533340704644ed2fdf9d861b3798ffd19a3b51062a366a8bc39f84b9a8bb3dd04e9e33da742192359be00b051 + languageName: node + linkType: hard + +"@walletconnect/modal@npm:2.6.2": version: 2.6.2 resolution: "@walletconnect/modal@npm:2.6.2" dependencies: @@ -8959,6 +9777,16 @@ __metadata: languageName: node linkType: hard +"@walletconnect/modal@npm:^2.4.3": + version: 2.7.0 + resolution: "@walletconnect/modal@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + "@walletconnect/modal-ui": "npm:2.7.0" + checksum: 10c0/2f3074eebbca41a46e29680dc2565bc762133508774f05db0075a82b0b66ecc8defca40a94ad63669676090a7e3ef671804592b10e91636ab1cdeac014a1eb11 + languageName: node + linkType: hard + "@walletconnect/randombytes@npm:^1.0.3": version: 1.0.3 resolution: "@walletconnect/randombytes@npm:1.0.3" @@ -8971,17 +9799,16 @@ __metadata: languageName: node linkType: hard -"@walletconnect/relay-api@npm:^1.0.9": - version: 1.0.9 - resolution: "@walletconnect/relay-api@npm:1.0.9" +"@walletconnect/relay-api@npm:1.0.11, @walletconnect/relay-api@npm:^1.0.9": + version: 1.0.11 + resolution: "@walletconnect/relay-api@npm:1.0.11" dependencies: "@walletconnect/jsonrpc-types": "npm:^1.0.2" - tslib: "npm:1.14.1" - checksum: 10c0/e5994c63619b89cae45428108857389536f3c7e43a92f324a8ef305f351cf125dcfafeb9c480f23798c162ca2cad7b8f91828bae28a84cf869c3e7ee1dcca9dd + checksum: 10c0/2595d7e68d3a93e7735e0b6204811762898b0ce1466e811d78be5bcec7ac1cde5381637615a99104099165bf63695da5ef9381d6ded29924a57a71b10712a91d languageName: node linkType: hard -"@walletconnect/relay-auth@npm:^1.0.4": +"@walletconnect/relay-auth@npm:1.0.4, @walletconnect/relay-auth@npm:^1.0.4": version: 1.0.4 resolution: "@walletconnect/relay-auth@npm:1.0.4" dependencies: @@ -8995,7 +9822,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": +"@walletconnect/safe-json@npm:1.0.2, @walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": version: 1.0.2 resolution: "@walletconnect/safe-json@npm:1.0.2" dependencies: @@ -9022,23 +9849,23 @@ __metadata: linkType: hard "@walletconnect/sign-client@npm:^2.9.0": - version: 2.11.3 - resolution: "@walletconnect/sign-client@npm:2.11.3" + version: 2.17.2 + resolution: "@walletconnect/sign-client@npm:2.17.2" dependencies: - "@walletconnect/core": "npm:2.11.3" - "@walletconnect/events": "npm:^1.0.1" - "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/core": "npm:2.17.2" + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-utils": "npm:1.0.8" - "@walletconnect/logger": "npm:^2.0.1" - "@walletconnect/time": "npm:^1.0.2" - "@walletconnect/types": "npm:2.11.3" - "@walletconnect/utils": "npm:2.11.3" - events: "npm:^3.3.0" - checksum: 10c0/6d8c24d7c75d0664fcb7b536f61d75c5ec041fee16fb0a7ea02b2ae920ae4e3dab2d207948b436d2e2b3c5487791d3664046e356994dea095181a7b9a9b319e3 + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" + events: "npm:3.3.0" + checksum: 10c0/0acbda4ea34be209b1436134804e72641ca377e2bb6823b7d94177b30e50b8e6de28dfdad6ff64dac61a1305e7b6f281df2357488382c88e440a79b817d377a8 languageName: node linkType: hard -"@walletconnect/time@npm:^1.0.2": +"@walletconnect/time@npm:1.0.2, @walletconnect/time@npm:^1.0.2": version: 1.0.2 resolution: "@walletconnect/time@npm:1.0.2" dependencies: @@ -9089,17 +9916,17 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.11.3": - version: 2.11.3 - resolution: "@walletconnect/types@npm:2.11.3" +"@walletconnect/types@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/types@npm:2.17.2" dependencies: - "@walletconnect/events": "npm:^1.0.1" - "@walletconnect/heartbeat": "npm:1.2.1" - "@walletconnect/jsonrpc-types": "npm:1.0.3" - "@walletconnect/keyvaluestorage": "npm:^1.1.1" - "@walletconnect/logger": "npm:^2.0.1" - events: "npm:^3.3.0" - checksum: 10c0/3e53ea10e9da801a9062be214c1ad3c927cceb5a80b2dc045685c75f091a6ce6fdb38554d16f09178731180a17818960f8706ffbecb6747dd6068264a3ea1409 + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + events: "npm:3.3.0" + checksum: 10c0/95bd3e4f4f2ef181ea69691800a0a06be2c4fa900ae972539851c5817a0f01b4ba9f381161d044df4db004f431bc416548ec6eca0ac523fc1fb06014386accac languageName: node linkType: hard @@ -9164,29 +9991,35 @@ __metadata: languageName: node linkType: hard -"@walletconnect/utils@npm:2.11.3, @walletconnect/utils@npm:^2.9.0": - version: 2.11.3 - resolution: "@walletconnect/utils@npm:2.11.3" +"@walletconnect/utils@npm:2.17.2, @walletconnect/utils@npm:^2.9.0": + version: 2.17.2 + resolution: "@walletconnect/utils@npm:2.17.2" dependencies: + "@ethersproject/hash": "npm:5.7.0" + "@ethersproject/transactions": "npm:5.7.0" "@stablelib/chacha20poly1305": "npm:1.0.1" "@stablelib/hkdf": "npm:1.0.1" - "@stablelib/random": "npm:^1.0.2" + "@stablelib/random": "npm:1.0.2" "@stablelib/sha256": "npm:1.0.1" - "@stablelib/x25519": "npm:^1.0.3" - "@walletconnect/relay-api": "npm:^1.0.9" - "@walletconnect/safe-json": "npm:^1.0.2" - "@walletconnect/time": "npm:^1.0.2" - "@walletconnect/types": "npm:2.11.3" - "@walletconnect/window-getters": "npm:^1.0.1" - "@walletconnect/window-metadata": "npm:^1.0.1" + "@stablelib/x25519": "npm:1.0.3" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/window-getters": "npm:1.0.1" + "@walletconnect/window-metadata": "npm:1.0.1" detect-browser: "npm:5.3.0" + elliptic: "npm:6.6.0" query-string: "npm:7.1.3" - uint8arrays: "npm:^3.1.0" - checksum: 10c0/0050c38bbb47b267fe79f5b60052e7053796f997a50d4adc609d0bb0d67adb1e2525ba96ddfacdfe7573746d8f265c7a3cfeb87a1112b97d16ecde839b9dbf8e + uint8arrays: "npm:3.1.0" + checksum: 10c0/b44c0025be12301a28715a204c037328eae4fa432f0ee1730da08b3b6583e07aeaf59efd9dcc52209f6a61b50b31c84e555028b97067dfdf9f5efe1211378fc8 languageName: node linkType: hard -"@walletconnect/window-getters@npm:^1.0.1": +"@walletconnect/window-getters@npm:1.0.1, @walletconnect/window-getters@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/window-getters@npm:1.0.1" dependencies: @@ -9195,7 +10028,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/window-metadata@npm:^1.0.1": +"@walletconnect/window-metadata@npm:1.0.1, @walletconnect/window-metadata@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/window-metadata@npm:1.0.1" dependencies: @@ -9205,18 +10038,6 @@ __metadata: languageName: node linkType: hard -"JSONStream@npm:^1.3.5": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: "npm:^1.2.0" - through: "npm:>=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 10c0/0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 - languageName: node - linkType: hard - "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -9252,12 +10073,27 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.9.0": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" +"abitype@npm:1.0.6, abitype@npm:^1.0.6": + version: 1.0.6 + resolution: "abitype@npm:1.0.6" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 10c0/30ca97010bbf34b9aaed401858eeb6bc30419f7ff11eb34adcb243522dd56c9d8a9d3d406aa5d4f60a7c263902f5136043005698e3f073ea882a4922d43a2929 + languageName: node + linkType: hard + +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" peerDependencies: acorn: ^8 - checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d languageName: node linkType: hard @@ -9279,12 +10115,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 languageName: node linkType: hard @@ -9311,15 +10147,6 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.5.0": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: "npm:^1.2.1" - checksum: 10c0/394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 - languageName: node - linkType: hard - "aggregate-error@npm:3.0.0": version: 3.0.0 resolution: "aggregate-error@npm:3.0.0" @@ -9382,42 +10209,42 @@ __metadata: linkType: hard "agoric@npm:^0.22.0-u17.1": - version: 0.22.0-upgrade-17-dev-ec448b0.0 - resolution: "agoric@npm:0.22.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/access-token": "npm:0.4.22-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cache": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/casting": "npm:0.4.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/governance": "npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/inter-protocol": "npm:0.17.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/smart-wallet": "npm:0.5.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" + version: 0.22.0-upgrade-18-dev-bf39b10.0 + resolution: "agoric@npm:0.22.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/access-token": "npm:0.4.22-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/cache": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/cosmic-proto": "npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/inter-protocol": "npm:0.17.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/network": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/smart-wallet": "npm:0.5.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" "@confio/relayer": "npm:^0.11.3" "@cosmjs/crypto": "npm:^0.32.3" "@cosmjs/encoding": "npm:^0.32.3" "@cosmjs/math": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" "@cosmjs/stargate": "npm:^0.32.3" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/zip": "npm:^1.0.7" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/compartment-mapper": "npm:^1.3.1" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/zip": "npm:^1.0.8" "@iarna/toml": "npm:^2.2.3" anylogger: "npm:^0.21.0" chalk: "npm:^5.2.0" @@ -9431,7 +10258,7 @@ __metadata: bin: agops: src/bin-agops.js agoric: src/entrypoint.js - checksum: 10c0/d1c65f1179134b156fb41c89812766a39feb4b3b17fe3f4267599c514cc4a64b5035123cc78ac0893443f30dee4eb0880f2f040651c3600776c51604dc6ca5a2 + checksum: 10c0/52e7a996a47d43ca9d529f632b05207f8b9b22a99e41f2c17e2f0fbac905b5a9d6bdf47c4a0a8b8f274be384156f29161bd9fd921f4d0395f99f101b93f3c5a8 languageName: node linkType: hard @@ -9467,14 +10294,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.1": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - fast-deep-equal: "npm:^3.1.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 languageName: node linkType: hard @@ -9502,18 +10329,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc languageName: node linkType: hard @@ -9585,12 +10403,10 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 +"aria-query@npm:^5.3.0, aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e languageName: node linkType: hard @@ -9611,7 +10427,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -9748,9 +10564,9 @@ __metadata: linkType: hard "async@npm:^3.1.0": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 10c0/1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 languageName: node linkType: hard @@ -9769,20 +10585,20 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.17": - version: 10.4.19 - resolution: "autoprefixer@npm:10.4.19" + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" dependencies: - browserslist: "npm:^4.23.0" - caniuse-lite: "npm:^1.0.30001599" + browserslist: "npm:^4.23.3" + caniuse-lite: "npm:^1.0.30001646" fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" + picocolors: "npm:^1.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10c0/fe0178eb8b1da4f15c6535cd329926609b22d1811e047371dccce50563623f8075dd06fb167daff059e4228da651b0bdff6d9b44281541eaf0ce0b79125bfd19 + checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 languageName: node linkType: hard @@ -9853,21 +10669,21 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:=4.7.0": - version: 4.7.0 - resolution: "axe-core@npm:4.7.0" - checksum: 10c0/89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba +"axe-core@npm:^4.10.0": + version: 4.10.2 + resolution: "axe-core@npm:4.10.2" + checksum: 10c0/0e20169077de96946a547fce0df39d9aeebe0077f9d3eeff4896518b96fde857f80b98f0d4279274a7178791744dd5a54bb4f322de45b4f561ffa2586ff9a09d languageName: node linkType: hard "axios-retry@npm:^4.0.0": - version: 4.1.0 - resolution: "axios-retry@npm:4.1.0" + version: 4.5.0 + resolution: "axios-retry@npm:4.5.0" dependencies: is-retry-allowed: "npm:^2.2.0" peerDependencies: axios: 0.x || 1.x - checksum: 10c0/381ae8b03f2edf444e426a4be3c94e31b0b66c45bac30ce0dcf3aff48d9f2ed9607c826fa32d4a8cf0d40ae0cb9369449bb69837abe478d8821ce3375f34d73a + checksum: 10c0/574e7b1bf24aad99b560042d232a932d51bfaa29b5a6d4612d748ed799a6f11a5afb2582792492c55d95842200cbdfbe3454027a8c1b9a2d3e895d13c3d03c10 languageName: node linkType: hard @@ -9893,12 +10709,10 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^3.2.1": - version: 3.2.1 - resolution: "axobject-query@npm:3.2.1" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/f7debc2012e456139b57d888c223f6d3cb4b61eb104164a85e3d346273dd6ef0bc9a04b6660ca9407704a14a8e05fa6b6eb9d55f44f348c7210de7ffb350c3a7 +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 languageName: node linkType: hard @@ -9910,11 +10724,11 @@ __metadata: linkType: hard "base-x@npm:^3.0.2": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" + version: 3.0.10 + resolution: "base-x@npm:3.0.10" dependencies: safe-buffer: "npm:^5.0.1" - checksum: 10c0/e6bbeae30b24f748b546005affb710c5fbc8b11a83f6cd0ca999bd1ab7ad3a22e42888addc40cd145adc4edfe62fcfab4ebc91da22e4259aae441f95a77aee1a + checksum: 10c0/a13a34b71439ee5381667efa630b3bf640cf17f632c5ba01990483367592e72f247d7fb4f8c6d0e3ff8c0fb7224b3ac682ff5be09b87063a45b3968f0457e563 languageName: node linkType: hard @@ -9975,16 +10789,6 @@ __metadata: languageName: node linkType: hard -"bigint-buffer@npm:^1.1.5": - version: 1.1.5 - resolution: "bigint-buffer@npm:1.1.5" - dependencies: - bindings: "npm:^1.3.0" - node-gyp: "npm:latest" - checksum: 10c0/aa41e53d38242a2f05f85b08eaf592635f92e5328822784cda518232b1644efdbf29ab3664951b174cc645848add4605488e25c9439bcc749660c885b4ff6118 - languageName: node - linkType: hard - "bignumber.js@npm:*, bignumber.js@npm:9.1.2, bignumber.js@npm:^9.1.1, bignumber.js@npm:^9.1.2": version: 9.1.2 resolution: "bignumber.js@npm:9.1.2" @@ -10013,13 +10817,6 @@ __metadata: languageName: node linkType: hard -"bind-decorator@npm:^1.0.11": - version: 1.0.11 - resolution: "bind-decorator@npm:1.0.11" - checksum: 10c0/265f1d5cc110075898b0c5f671bb06a05fb3193ee8899e4b66d48bc620248918cf24b14f798cf230ef717063458dc306dbf801268c45989f8546299a541a60fe - languageName: node - linkType: hard - "bindings@npm:^1.3.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -10086,30 +10883,19 @@ __metadata: linkType: hard "bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: 10c0/b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 languageName: node linkType: hard -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": +"bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": version: 5.2.1 resolution: "bn.js@npm:5.2.1" checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa languageName: node linkType: hard -"borsh@npm:^0.7.0": - version: 0.7.0 - resolution: "borsh@npm:0.7.0" - dependencies: - bn.js: "npm:^5.2.0" - bs58: "npm:^4.0.0" - text-encoding-utf-8: "npm:^1.0.2" - checksum: 10c0/513b3e51823d2bf5be77cec27742419d2b0427504825dd7ceb00dedb820f246a4762f04b83d5e3aa39c8e075b3cbaeb7ca3c90bd1cbeecccb4a510575be8c581 - languageName: node - linkType: hard - "bowser@npm:2.11.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" @@ -10136,12 +10922,12 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 languageName: node linkType: hard @@ -10173,7 +10959,7 @@ __metadata: languageName: node linkType: hard -"browserify-cipher@npm:^1.0.0": +"browserify-cipher@npm:^1.0.1": version: 1.0.1 resolution: "browserify-cipher@npm:1.0.1" dependencies: @@ -10197,16 +10983,17 @@ __metadata: linkType: hard "browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" + version: 4.1.1 + resolution: "browserify-rsa@npm:4.1.1" dependencies: - bn.js: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a + bn.js: "npm:^5.2.1" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0 languageName: node linkType: hard -"browserify-sign@npm:^4.0.0": +"browserify-sign@npm:^4.2.3": version: 4.2.3 resolution: "browserify-sign@npm:4.2.3" dependencies: @@ -10224,21 +11011,21 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.0, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + caniuse-lite: "npm:^1.0.30001669" + electron-to-chromium: "npm:^1.5.41" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + checksum: 10c0/d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a languageName: node linkType: hard -"bs58@npm:^4.0.0, bs58@npm:^4.0.1": +"bs58@npm:^4.0.0": version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: @@ -10265,16 +11052,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.2.1" - checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 - languageName: node - linkType: hard - "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -10285,7 +11062,17 @@ __metadata: languageName: node linkType: hard -"bufferutil@npm:^4.0.1, bufferutil@npm:^4.0.3": +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + +"bufferutil@npm:^4.0.3": version: 4.0.8 resolution: "bufferutil@npm:4.0.8" dependencies: @@ -10343,9 +11130,9 @@ __metadata: linkType: hard "callsites@npm:^4.0.0": - version: 4.1.0 - resolution: "callsites@npm:4.1.0" - checksum: 10c0/91700844127a6dcd4792d231a12dd8e9ec10525eb9962180a8558417d7e3f443e52a4f14746ad2838eaf14f79431ee1539d13bd188da280f720a06a91bd1157a + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 languageName: node linkType: hard @@ -10363,10 +11150,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": - version: 1.0.30001605 - resolution: "caniuse-lite@npm:1.0.30001605" - checksum: 10c0/ceb96a0ecfdaee6510c00aebaaa63db20aaeafab03450d4e3b214e009cb632f87385a70c299cdd1ca4c17e1473883d8fa2051c5b2d083a454338c0c779b25cbc +"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001680 + resolution: "caniuse-lite@npm:1.0.30001680" + checksum: 10c0/11a4e7f6f5d5f965cfd4b7dc4aef34e12a26e99647f02b5ac9fd7f7670845473b95ada416a785473237e4b1b67281f7b043c8736c85b77097f6b697e8950b15f languageName: node linkType: hard @@ -10389,18 +11176,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -10486,12 +11262,12 @@ __metadata: linkType: hard "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" + version: 1.0.5 + resolution: "cipher-base@npm:1.0.5" dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/064a7f9323ba5416c8f4ab98bd0fca7234f05b39b0784b8131429e84ac5c735e7fc9f87e2bd39b278a0121d833ca20fa9f5b4dd11fbe289191e7d29471bb3f5b languageName: node linkType: hard @@ -10505,9 +11281,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.2.2": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 10c0/0de9a9c3fad03a46804c0d38e7b712fb282584a9c7ef1ed44cae22fb71d9bb600309d66a9711ac36a596fd03422f5bb03e021e8f369c12a39fa1786ae531baab + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc languageName: node linkType: hard @@ -10612,7 +11388,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.1.0, clsx@npm:^1.2.1": +"clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 @@ -10635,7 +11411,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": +"color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -10727,13 +11503,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.3": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -10785,6 +11554,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + "confusing-browser-globals@npm:^1.0.10": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" @@ -10813,10 +11589,10 @@ __metadata: languageName: node linkType: hard -"cookie-es@npm:^1.0.0": - version: 1.1.0 - resolution: "cookie-es@npm:1.1.0" - checksum: 10c0/27f1057b05eb42dca539a80cf45b8f9d5bacf35482690d756025447810dcd669e0cd13952a063a43e47a4e6fd7400745defedc97479a4254019f0bdb5c200341 +"cookie-es@npm:^1.2.2": + version: 1.2.2 + resolution: "cookie-es@npm:1.2.2" + checksum: 10c0/210eb67cd40a53986fda99d6f47118cfc45a69c4abc03490d15ab1b83ac978d5518356aecdd7a7a4969292445e3063c2302deda4c73706a67edc008127608638 languageName: node linkType: hard @@ -10864,34 +11640,43 @@ __metadata: linkType: hard "cosmos-kit@npm:^2.19.0": - version: 2.19.0 - resolution: "cosmos-kit@npm:2.19.0" - dependencies: - "@cosmos-kit/cdcwallet": "npm:^2.13.2" - "@cosmos-kit/coin98": "npm:^2.11.2" - "@cosmos-kit/compass": "npm:^2.11.2" - "@cosmos-kit/cosmostation": "npm:^2.12.0" - "@cosmos-kit/exodus": "npm:^2.10.2" - "@cosmos-kit/fin": "npm:^2.11.2" - "@cosmos-kit/frontier": "npm:^2.10.2" - "@cosmos-kit/galaxy-station": "npm:^2.10.2" - "@cosmos-kit/keplr": "npm:^2.12.2" - "@cosmos-kit/leap": "npm:^2.12.2" - "@cosmos-kit/ledger": "npm:^2.11.2" - "@cosmos-kit/okxwallet-extension": "npm:^2.11.2" - "@cosmos-kit/omni": "npm:^2.10.2" - "@cosmos-kit/owallet": "npm:^2.11.2" - "@cosmos-kit/shell": "npm:^2.11.2" - "@cosmos-kit/station": "npm:^2.10.2" - "@cosmos-kit/tailwind": "npm:^1.5.2" - "@cosmos-kit/trust": "npm:^2.11.2" - "@cosmos-kit/vectis": "npm:^2.11.2" - "@cosmos-kit/xdefi": "npm:^2.10.2" - checksum: 10c0/caa14c1c2cf0cde555e7296fc2b463d4c4183d7ee5d9c834c48e5b6399227229e343cc4ea66d722ae64b15ebc1e13d45559f695674b579f937eeb7004167170e - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.0": + version: 2.21.1 + resolution: "cosmos-kit@npm:2.21.1" + dependencies: + "@cosmos-kit/cdcwallet": "npm:^2.15.1" + "@cosmos-kit/coin98": "npm:^2.13.1" + "@cosmos-kit/compass": "npm:^2.13.1" + "@cosmos-kit/cosmostation": "npm:^2.14.0" + "@cosmos-kit/exodus": "npm:^2.12.0" + "@cosmos-kit/fin": "npm:^2.13.1" + "@cosmos-kit/frontier": "npm:^2.12.0" + "@cosmos-kit/galaxy-station": "npm:^2.12.0" + "@cosmos-kit/keplr": "npm:^2.14.1" + "@cosmos-kit/leap": "npm:^2.14.1" + "@cosmos-kit/ledger": "npm:^2.13.0" + "@cosmos-kit/okxwallet-extension": "npm:^2.13.0" + "@cosmos-kit/omni": "npm:^2.12.0" + "@cosmos-kit/owallet": "npm:^2.13.1" + "@cosmos-kit/shell": "npm:^2.13.1" + "@cosmos-kit/station": "npm:^2.12.0" + "@cosmos-kit/tailwind": "npm:^1.7.0" + "@cosmos-kit/trust": "npm:^2.13.0" + "@cosmos-kit/vectis": "npm:^2.13.1" + "@cosmos-kit/xdefi": "npm:^2.12.0" + checksum: 10c0/21f1acbbca5c1182ef38e1218bc50c76d7c433555e0acdbdc0586a6c3502476f30e11e1ab3df618820dd0e1eec72b2460b1e049aa23cab9de2e4c310f4a3b3cf + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: 10c0/11dcf4a2e77ee793835d49f2c028838eae58b44f50d1ff08394a610bfd817523f105d6ae4d9b5bef0aad45510f633eb23c903e9902e4409bed1ce70cb82b9bf0 + languageName: node + linkType: hard + +"create-ecdh@npm:^4.0.4": version: 4.0.4 resolution: "create-ecdh@npm:4.0.4" dependencies: @@ -10914,7 +11699,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -10945,44 +11730,42 @@ __metadata: linkType: hard "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 languageName: node linkType: hard -"crossws@npm:^0.2.0, crossws@npm:^0.2.2": - version: 0.2.4 - resolution: "crossws@npm:0.2.4" - peerDependencies: - uWebSockets.js: "*" - peerDependenciesMeta: - uWebSockets.js: - optional: true - checksum: 10c0/b950c64d36f3f11fdb8e0faf3107598660d89d77eb860e68b535fe6acba9f0f2f0507cc7250bd219a3ef2fe08718db91b591e6912b7324fcfc8fd1b8d9f78c96 +"crossws@npm:>=0.2.0 <0.4.0": + version: 0.3.1 + resolution: "crossws@npm:0.3.1" + dependencies: + uncrypto: "npm:^0.1.3" + checksum: 10c0/37dc72074ee61ee999ec79e061a0ddab870e061a88cd9b83f479c5c4130c6742ce6b308c38968ee4be9073246c32b0cb0adaed50f1e448b988c3b3172c4ce2e0 languageName: node linkType: hard "crypto-browserify@npm:^3.12.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" + version: 3.12.1 + resolution: "crypto-browserify@npm:3.12.1" dependencies: - browserify-cipher: "npm:^1.0.0" - browserify-sign: "npm:^4.0.0" - create-ecdh: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - create-hmac: "npm:^1.1.0" - diffie-hellman: "npm:^5.0.0" - inherits: "npm:^2.0.1" - pbkdf2: "npm:^3.0.3" - public-encrypt: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - randomfill: "npm:^1.0.3" - checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 + browserify-cipher: "npm:^1.0.1" + browserify-sign: "npm:^4.2.3" + create-ecdh: "npm:^4.0.4" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + diffie-hellman: "npm:^5.0.3" + hash-base: "npm:~3.0.4" + inherits: "npm:^2.0.4" + pbkdf2: "npm:^3.1.2" + public-encrypt: "npm:^4.0.3" + randombytes: "npm:^2.1.0" + randomfill: "npm:^1.0.4" + checksum: 10c0/184a2def7b16628e79841243232ab5497f18d8e158ac21b7ce90ab172427d0a892a561280adc08f9d4d517bce8db2a5b335dc21abb970f787f8e874bd7b9db7d languageName: node linkType: hard @@ -11057,14 +11840,14 @@ __metadata: linkType: hard "daisyui@npm:^4.12.10": - version: 4.12.10 - resolution: "daisyui@npm:4.12.10" + version: 4.12.14 + resolution: "daisyui@npm:4.12.14" dependencies: css-selector-tokenizer: "npm:^0.8" culori: "npm:^3" picocolors: "npm:^1" postcss-js: "npm:^4" - checksum: 10c0/f677d9717d6241d6c829141645ff15a5d6aaa9e279a90e1acb248613c9cc25d7d0b9fcac55ec572537f6bc472e1ab5f0bed7797a1815b6fde9a644be62f357d0 + checksum: 10c0/8b665e285cea4fa8775428ea6b6ca5f86b41077ac37db2faae9566bc97c9dc4fc637243791a795ba3db17fe62beeef01fb02092d26323cab90e93ce2768b7d14 languageName: node linkType: hard @@ -11080,12 +11863,14 @@ __metadata: resolution: "dapp-agoric-orca-contract@workspace:contract" dependencies: "@agoric/async-flow": "npm:^0.1.1-u17.1" + "@agoric/cosmic-proto": "npm:latest" "@agoric/deploy-script-support": "npm:^0.10.4-u17.1" "@agoric/ertp": "npm:^0.16.3-u17.1" "@agoric/eslint-config": "npm:^0.4.1-u17.1" "@agoric/governance": "npm:^0.10.4-u17.1" "@agoric/inter-protocol": "npm:^0.17.0-u17.1" "@agoric/internal": "npm:^0.4.0-u17.1" + "@agoric/network": "npm:0.1.1-dev-d1562a1.0" "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch" "@agoric/smart-wallet": "npm:^0.5.4-u17.1" "@agoric/store": "npm:^0.9.3-u17.1" @@ -11094,20 +11879,22 @@ __metadata: "@agoric/vats": "npm:^0.16.0-u17.1" "@agoric/vow": "npm:^0.2.0-u17.1" "@agoric/zoe": "npm:^0.26.3-u17.1" - "@agoric/zone": "npm:^0.3.0-u17.1" + "@agoric/zone": "npm:latest" "@ava/typescript": "npm:^5.0.0" "@cosmjs/proto-signing": "npm:^0.32.3" + "@endo/base64": "npm:latest" "@endo/bundle-source": "npm:^3.5.0" "@endo/errors": "npm:^1.2.4" "@endo/eslint-plugin": "npm:^2.2.0" "@endo/far": "npm:^1.1.4" "@endo/init": "npm:^1.1.3" - "@endo/marshal": "npm:^1.5.2" + "@endo/marshal": "npm:^1.6.1" "@endo/nat": "npm:^5.0.9" - "@endo/patterns": "npm:^1.4.2" + "@endo/patterns": "npm:^1.4.6" "@endo/promise-kit": "npm:^1.1.4" "@endo/ses-ava": "npm:^1.2.2" "@jessie.js/eslint-plugin": "npm:^0.4.1" + "@noble/hashes": "npm:latest" "@rollup/plugin-commonjs": "npm:^25.0.8" "@rollup/plugin-json": "npm:^6.1.0" "@rollup/plugin-node-resolve": "npm:^15.2.3" @@ -11231,19 +12018,19 @@ __metadata: linkType: hard "dc-polyfill@npm:^0.1.4": - version: 0.1.4 - resolution: "dc-polyfill@npm:0.1.4" - checksum: 10c0/5ab07dc2f2e6e9b5949577c0be0df1d8c1be3d5cc389cea0fac97558f944dd0029689092b144eaf46c3f179c93d02075e3414705b9b6b32b7d9394d72f1fa032 + version: 0.1.6 + resolution: "dc-polyfill@npm:0.1.6" + checksum: 10c0/bf717f68a7e95dd9118072274613cb4010bfc7bc7946c46f6395bb3c76356a5d0196e121a1c2218f83483ed025f7db6db98604d33c2b7afb37d26bbb669efec6 languageName: node linkType: hard "dd-trace@npm:^3.3.0": - version: 3.54.0 - resolution: "dd-trace@npm:3.54.0" + version: 3.58.0 + resolution: "dd-trace@npm:3.58.0" dependencies: - "@datadog/native-appsec": "npm:7.1.0" - "@datadog/native-iast-rewriter": "npm:2.3.0" - "@datadog/native-iast-taint-tracking": "npm:1.7.0" + "@datadog/native-appsec": "npm:7.1.1" + "@datadog/native-iast-rewriter": "npm:2.3.1" + "@datadog/native-iast-taint-tracking": "npm:2.1.0" "@datadog/native-metrics": "npm:^2.0.0" "@datadog/pprof": "npm:5.2.0" "@datadog/sketches-js": "npm:^2.1.0" @@ -11252,7 +12039,7 @@ __metadata: crypto-randomuuid: "npm:^1.0.0" dc-polyfill: "npm:^0.1.4" ignore: "npm:^5.2.4" - import-in-the-middle: "npm:^1.7.3" + import-in-the-middle: "npm:^1.7.4" int64-buffer: "npm:^0.1.9" ipaddr.js: "npm:^2.1.0" istanbul-lib-coverage: "npm:3.2.0" @@ -11273,7 +12060,7 @@ __metadata: semver: "npm:^7.5.4" shell-quote: "npm:^1.8.1" tlhunter-sorted-set: "npm:^0.1.0" - checksum: 10c0/16878dd1fd0acba6a94f46536d99c14765bdf990f69a85fbacc377a2108c3a36800169f4fca8f0a430f474fc46d4675662af407ff910d88d1a4cbaee8bf5c726 + checksum: 10c0/b705e55dc390edd2e3fa59f3344642419fe16a3f25566e7d2c351518ace7d112ad45db408f29be479f015286b01e3cf375fea5eeccc8d000b270134710987928 languageName: node linkType: hard @@ -11408,7 +12195,7 @@ __metadata: languageName: node linkType: hard -"defu@npm:^6.1.3, defu@npm:^6.1.4": +"defu@npm:^6.1.4": version: 6.1.4 resolution: "defu@npm:6.1.4" checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5 @@ -11436,7 +12223,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 @@ -11529,7 +12316,7 @@ __metadata: languageName: node linkType: hard -"diffie-hellman@npm:^5.0.0": +"diffie-hellman@npm:^5.0.3": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" dependencies: @@ -11600,10 +12387,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.724 - resolution: "electron-to-chromium@npm:1.4.724" - checksum: 10c0/bc7a3f153d952325bac09c1e67325bfc6d686130541550d1b7429cf72a1202256eed09299c4d8010684aa3683332336f05324acf03bc0be7c7060f4e0820c267 +"electron-to-chromium@npm:^1.5.41": + version: 1.5.63 + resolution: "electron-to-chromium@npm:1.5.63" + checksum: 10c0/fe1b175805309b04e5a2242c3168f22543e5369aed01fceedfe0f0eafe3931e8609d8a140e527394b314cfe64d581913aba6f1d3c72c23069c7d8241e5dfa4ef languageName: node linkType: hard @@ -11618,13 +12405,28 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 + checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 + languageName: node + linkType: hard + +"elliptic@npm:6.6.0": + version: 6.6.0 + resolution: "elliptic@npm:6.6.0" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/42eb3492e218017bf8923a5d14a86f414952f2f771361805b3ae9f380923b5da53e203d0d92be95cb0a248858a78db7db5934a346e268abb757e6fe561d401c9 languageName: node linkType: hard -"elliptic@npm:^6.4.0, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5": - version: 6.5.5 - resolution: "elliptic@npm:6.5.5" +"elliptic@npm:^6.4.0, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5, elliptic@npm:^6.5.7": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" dependencies: bn.js: "npm:^4.11.9" brorand: "npm:^1.1.0" @@ -11633,7 +12435,7 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/3e591e93783a1b66f234ebf5bd3a8a9a8e063a75073a35a671e03e3b25253b6e33ac121f7efe9b8808890fffb17b40596cc19d01e6e8d1fa13b9a56ff65597c8 + checksum: 10c0/8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 languageName: node linkType: hard @@ -11713,9 +12515,9 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": + version: 1.23.5 + resolution: "es-abstract@npm:1.23.5" dependencies: array-buffer-byte-length: "npm:^1.0.1" arraybuffer.prototype.slice: "npm:^1.0.3" @@ -11732,7 +12534,7 @@ __metadata: function.prototype.name: "npm:^1.1.6" get-intrinsic: "npm:^1.2.4" get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" + globalthis: "npm:^1.0.4" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.2" has-proto: "npm:^1.0.3" @@ -11748,10 +12550,10 @@ __metadata: is-string: "npm:^1.0.7" is-typed-array: "npm:^1.1.13" is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" + object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" + regexp.prototype.flags: "npm:^1.5.3" safe-array-concat: "npm:^1.1.2" safe-regex-test: "npm:^1.0.3" string.prototype.trim: "npm:^1.2.9" @@ -11763,7 +12565,7 @@ __metadata: typed-array-length: "npm:^1.0.6" unbox-primitive: "npm:^1.0.2" which-typed-array: "npm:^1.1.15" - checksum: 10c0/d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + checksum: 10c0/1f6f91da9cf7ee2c81652d57d3046621d598654d1d1b05c1578bafe5c4c2d3d69513901679bdca2de589f620666ec21de337e4935cec108a4ed0871d5ef04a5d languageName: node linkType: hard @@ -11783,28 +12585,6 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.15": - version: 1.0.19 - resolution: "es-iterator-helpers@npm:1.0.19" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.3" - es-errors: "npm:^1.3.0" - es-set-tostringtag: "npm:^2.0.3" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - globalthis: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.7" - iterator.prototype: "npm:^1.1.2" - safe-array-concat: "npm:^1.1.2" - checksum: 10c0/ae8f0241e383b3d197383b9842c48def7fce0255fb6ed049311b686ce295595d9e389b466f6a1b7d4e7bb92d82f5e716d6fae55e20c1040249bf976743b038c5 - languageName: node - linkType: hard - "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -11845,22 +12625,6 @@ __metadata: languageName: node linkType: hard -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 10c0/2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: "npm:^4.0.3" - checksum: 10c0/23284c6a733cbf7842ec98f41eac742c9f288a78753c4fe46652bae826446ced7615b9e8a5c5f121a08812b1cd478ea58630f3e1c3d70835bd5dcd69c7cd75c9 - languageName: node - linkType: hard - "esbuild@npm:^0.18.10": version: 0.18.20 resolution: "esbuild@npm:0.18.20" @@ -11938,33 +12702,33 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.20.1": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -12014,7 +12778,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/66398f9fb2c65e456a3e649747b39af8a001e47963b25e86d9c09d2a48d61aa641b27da0ce5cad63df95ad246105e1d83e7fee0e1e22a0663def73b1c5101112 + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de languageName: node linkType: hard @@ -12101,10 +12865,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 languageName: node linkType: hard @@ -12182,15 +12946,15 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.9.0": - version: 2.11.1 - resolution: "eslint-module-utils@npm:2.11.1" +"eslint-module-utils@npm:^2.12.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10c0/d1c23397eddc42a7824de08348095483bc270a4a3222bc0d54a76382c6411111c33e44a0a1819489e1e209d9e4721de2a8438e7ca4e6fe6be32ff818af9b11b4 + checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 languageName: node linkType: hard @@ -12213,13 +12977,13 @@ __metadata: linkType: hard "eslint-plugin-escompat@npm:^3.3.3": - version: 3.4.0 - resolution: "eslint-plugin-escompat@npm:3.4.0" + version: 3.11.4 + resolution: "eslint-plugin-escompat@npm:3.11.4" dependencies: - browserslist: "npm:^4.21.0" + browserslist: "npm:^4.23.1" peerDependencies: eslint: ">=5.14.1" - checksum: 10c0/df981270d3e7059caf739cbab94c837304381bd23192a001f137bd53f713fc8d3300aba1c301e54553b0e87355bfdbe649283395306e5ee3b6d0bc86aa189783 + checksum: 10c0/c434905e223ebba150b5cd604221c64180a8786bdfd99037a7d620b6ac75f58daee83cd1f6cf9f0670abf057bfe017fe33d4874e0c450fa441199aae8d0efddc languageName: node linkType: hard @@ -12288,8 +13052,8 @@ __metadata: linkType: hard "eslint-plugin-import@npm:^2.25.2, eslint-plugin-import@npm:^2.29.1": - version: 2.30.0 - resolution: "eslint-plugin-import@npm:2.30.0" + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" dependencies: "@rtsao/scc": "npm:^1.1.0" array-includes: "npm:^3.1.8" @@ -12299,7 +13063,7 @@ __metadata: debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.9.0" + eslint-module-utils: "npm:^2.12.0" hasown: "npm:^2.0.2" is-core-module: "npm:^2.15.1" is-glob: "npm:^4.0.3" @@ -12308,10 +13072,11 @@ __metadata: object.groupby: "npm:^1.0.3" object.values: "npm:^1.2.0" semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" tsconfig-paths: "npm:^3.15.0" peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10c0/4c9dcb1f27505c4d5dd891d2b551f56c70786d136aa3992a77e785bdc67c9f60200a2c7fb0ce55b7647fe550b12bc433d5dfa59e2c00ab44227791c5ab86badf + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a languageName: node linkType: hard @@ -12335,35 +13100,34 @@ __metadata: linkType: hard "eslint-plugin-jsx-a11y@npm:^6.7.1": - version: 6.8.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: - "@babel/runtime": "npm:^7.23.2" - aria-query: "npm:^5.3.0" - array-includes: "npm:^3.1.7" + aria-query: "npm:^5.3.2" + array-includes: "npm:^3.1.8" array.prototype.flatmap: "npm:^1.3.2" ast-types-flow: "npm:^0.0.8" - axe-core: "npm:=4.7.0" - axobject-query: "npm:^3.2.1" + axe-core: "npm:^4.10.0" + axobject-query: "npm:^4.1.0" damerau-levenshtein: "npm:^1.0.8" emoji-regex: "npm:^9.2.2" - es-iterator-helpers: "npm:^1.0.15" - hasown: "npm:^2.0.0" + hasown: "npm:^2.0.2" jsx-ast-utils: "npm:^3.3.5" language-tags: "npm:^1.0.9" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.7" - object.fromentries: "npm:^2.0.7" + object.fromentries: "npm:^2.0.8" + safe-regex-test: "npm:^1.0.3" + string.prototype.includes: "npm:^2.0.1" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10c0/d93354e03b0cf66f018d5c50964e074dffe4ddf1f9b535fa020d19c4ae45f89c1a16e9391ca61ac3b19f7042c751ac0d361a056a65cbd1de24718a53ff8daa6e languageName: node linkType: hard "eslint-plugin-no-only-tests@npm:^3.0.0": - version: 3.1.0 - resolution: "eslint-plugin-no-only-tests@npm:3.1.0" - checksum: 10c0/c710ae04094cfa4695c44efe8d5036eb881893157accf3564b96f3ee5626edef855c93ec1801557e888e390e1892775da79d9564e1a33b83941fba994725b9cd + version: 3.3.0 + resolution: "eslint-plugin-no-only-tests@npm:3.3.0" + checksum: 10c0/a04425d9d3bcd745267168782eb12a3a712b8357264ddd4e204204318975c2c21e2c1efe68113181de908548a85762205b61d8f92ec9dc5e0a5ae54c0240a24d languageName: node linkType: hard @@ -12388,20 +13152,20 @@ __metadata: linkType: hard "eslint-plugin-react-hooks@npm:^4.6.0": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10c0/58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65 + checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc languageName: node linkType: hard "eslint-plugin-react-refresh@npm:^0.4.5": - version: 0.4.6 - resolution: "eslint-plugin-react-refresh@npm:0.4.6" + version: 0.4.14 + resolution: "eslint-plugin-react-refresh@npm:0.4.14" peerDependencies: eslint: ">=7" - checksum: 10c0/931d5623c7c694526e9d34f61af856bb1949a0b9b9b509da29cba6c3c68fd4e1e7e36d8a340f6aecfd22329d0425c7fbb2388dd7d24b0d05218067747f5d6fe3 + checksum: 10c0/427108008ffcc2e0be36897398e61a2fae54c5bf092af0171bc4cf1927080d40619bb07be02ecd7c515372210228cf849023997cfa0252d37115f9b0c0debcd2 languageName: node linkType: hard @@ -12440,7 +13204,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -12566,28 +13330,29 @@ __metadata: languageName: node linkType: hard -"eth-block-tracker@npm:6.1.0": - version: 6.1.0 - resolution: "eth-block-tracker@npm:6.1.0" +"eth-block-tracker@npm:^7.1.0": + version: 7.1.0 + resolution: "eth-block-tracker@npm:7.1.0" dependencies: - "@metamask/safe-event-emitter": "npm:^2.0.0" - "@metamask/utils": "npm:^3.0.1" + "@metamask/eth-json-rpc-provider": "npm:^1.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" json-rpc-random-id: "npm:^1.0.1" pify: "npm:^3.0.0" - checksum: 10c0/31cee76eeab18e68363aafbc1687f496f21e6e1a3aab9efe2582abc1885f77c37191006809f1819c81611019512375f9987f9fcae1ed4ac4650fb1582387fdcf + checksum: 10c0/86a5cabef7fa8505c27b5fad1b2f0100c21fda11ad64a701f76eb4224f8c7edab706181fd0934e106a71f5465d57278448af401eb3e584b3529d943ddd4d7dfb languageName: node linkType: hard -"eth-json-rpc-filters@npm:5.1.0": - version: 5.1.0 - resolution: "eth-json-rpc-filters@npm:5.1.0" +"eth-json-rpc-filters@npm:^6.0.0": + version: 6.0.1 + resolution: "eth-json-rpc-filters@npm:6.0.1" dependencies: - "@metamask/safe-event-emitter": "npm:^2.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" async-mutex: "npm:^0.2.6" eth-query: "npm:^2.1.2" json-rpc-engine: "npm:^6.1.0" pify: "npm:^5.0.0" - checksum: 10c0/70598749ed369e1ae2013d7f48421a82636f3dc803976f5e7a4a7109e8df6ef0532010a635645e5f83fa8ed8054b5338d4dbd4901d41392155eec91c69df5492 + checksum: 10c0/69699460fd7837e13e42c1c74fbbfc44c01139ffd694e50235c78773c06059988be5c83dbe3a14d175ecc2bf3e385c4bfd3d6ab5d2d4714788b0b461465a3f56 languageName: node linkType: hard @@ -12601,15 +13366,6 @@ __metadata: languageName: node linkType: hard -"eth-rpc-errors@npm:4.0.2": - version: 4.0.2 - resolution: "eth-rpc-errors@npm:4.0.2" - dependencies: - fast-safe-stringify: "npm:^2.0.6" - checksum: 10c0/e777788481945e7cfa1068bbf2e6368dfa2c65e0b8e50d15ea902369cc9509d7c157c8e384341ddfcd7e7d045a5f0d8e28cac7c6d0d4dffe94c35342e78f7e3f - languageName: node - linkType: hard - "eth-rpc-errors@npm:^4.0.2": version: 4.0.3 resolution: "eth-rpc-errors@npm:4.0.3" @@ -12619,6 +13375,18 @@ __metadata: languageName: node linkType: hard +"ethereum-cryptography@npm:^2.0.0": + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" + dependencies: + "@noble/curves": "npm:1.4.2" + "@noble/hashes": "npm:1.4.0" + "@scure/bip32": "npm:1.4.0" + "@scure/bip39": "npm:1.3.0" + checksum: 10c0/c6c7626d393980577b57f709878b2eb91f270fe56116044b1d7afb70d5c519cddc0c072e8c05e4a335e05342eb64d9c3ab39d52f78bb75f76ad70817da9645ef + languageName: node + linkType: hard + "ethers@npm:5.7.2, ethers@npm:^5.7.1, ethers@npm:^5.7.2": version: 5.7.2 resolution: "ethers@npm:5.7.2" @@ -12664,6 +13432,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:5.0.1, eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10c0/4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -12707,8 +13482,8 @@ __metadata: linkType: hard "execa@npm:^9.2.0": - version: 9.4.0 - resolution: "execa@npm:9.4.0" + version: 9.5.1 + resolution: "execa@npm:9.5.1" dependencies: "@sindresorhus/merge-streams": "npm:^4.0.0" cross-spawn: "npm:^7.0.3" @@ -12722,7 +13497,7 @@ __metadata: signal-exit: "npm:^4.1.0" strip-final-newline: "npm:^4.0.0" yoctocolors: "npm:^2.0.0" - checksum: 10c0/6ad06c627b5d7bb007bc7b6cc35d7e32b5a3365375ffc8ddbcc12d2423651fa9928ba0c447cc9e60079e505e9b24fbe0a57f80371511d7d20302c04c2d3ce95e + checksum: 10c0/1a628d535c5a088f9e17a735bb3143efc4198095392b319ba877b2975d5c3c57724536dccb6f68f1cd9b3af331c5a9e8c1aeb338d52ab316b1e008ff453374a7 languageName: node linkType: hard @@ -12760,19 +13535,12 @@ __metadata: languageName: node linkType: hard -"eyes@npm:^0.1.8": - version: 0.1.8 - resolution: "eyes@npm:0.1.8" - checksum: 10c0/4c79a9cbf45746d8c9f48cc957e35ad8ea336add1c7b8d5a0e002efc791a7a62b27b2188184ef1a1eea7bc3cd06b161791421e0e6c5fe78309705a162c53eea8 - languageName: node - linkType: hard - "fast-check@npm:^3.0.0": - version: 3.17.1 - resolution: "fast-check@npm:3.17.1" + version: 3.23.1 + resolution: "fast-check@npm:3.23.1" dependencies: pure-rand: "npm:^6.1.0" - checksum: 10c0/60e653035bf8e15976ee668772771998306c0f1894a64d6fea664ca285ec8b4d1a2829082e23bffa5933e23f697d224218a57e13e3862eeb242585e1e13f968c + checksum: 10c0/d61ee4a7a2e1abc5126bf2f1894413f532f686b3d1fc15c67fefb60dcca66024934b69a6454d3eba92e6568ac1abbb9882080e212d255865c3b3bbe52c5bf702 languageName: node linkType: hard @@ -12790,7 +13558,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": +"fast-glob@npm:3, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -12838,10 +13606,10 @@ __metadata: languageName: node linkType: hard -"fast-stable-stringify@npm:^1.0.0": - version: 1.0.0 - resolution: "fast-stable-stringify@npm:1.0.0" - checksum: 10c0/1d773440c7a9615950577665074746c2e92edafceefa789616ecb6166229e0ccc6dae206ca9b9f7da0d274ba5779162aab2d07940a0f6e52a41a4e555392eb3b +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 languageName: node linkType: hard @@ -12912,12 +13680,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard @@ -12970,9 +13738,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 languageName: node linkType: hard @@ -12984,21 +13752,21 @@ __metadata: linkType: hard "focus-trap@npm:^7.5.4": - version: 7.5.4 - resolution: "focus-trap@npm:7.5.4" + version: 7.6.2 + resolution: "focus-trap@npm:7.6.2" dependencies: tabbable: "npm:^6.2.0" - checksum: 10c0/c09e12b957862b2608977ff90de782645f99c3555cc5d93977240c179befa8723b9b1183e93890b4ad9d364d52a1af36416e63a728522ecce656a447d9ddd945 + checksum: 10c0/8d7a5a2bcd53b52392712b9abe7ea349476747cb89afb93ac551d91e9cdc066c6befe2a2d7d76b06d8a7696f4086afcf8b0b2e76e2fa103b5b830f551047f7b4 languageName: node linkType: hard "follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f languageName: node linkType: hard @@ -13022,13 +13790,13 @@ __metadata: linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.1 + resolution: "form-data@npm:4.0.1" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" mime-types: "npm:^2.1.12" - checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + checksum: 10c0/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 languageName: node linkType: hard @@ -13108,7 +13876,7 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": +"function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" dependencies: @@ -13253,6 +14021,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.0": + version: 11.0.0 + resolution: "glob@npm:11.0.0" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/419866015d8795258a8ac51de5b9d1a99c72634fc3ead93338e4da388e89773ab21681e494eac0fbc4250b003451ca3110bb4f1c9393d15d14466270094fdb4e + languageName: node + linkType: hard + "glob@npm:^7.1.3, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -13296,7 +14080,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.1, globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -13341,9 +14125,9 @@ __metadata: linkType: hard "google-protobuf@npm:^3.17.3": - version: 3.21.2 - resolution: "google-protobuf@npm:3.21.2" - checksum: 10c0/df20b41aad9eba4d842d69c717a4d73ac6d321084c12f524ad5eb79a47ad185323bd1b477c19565a15fd08b6eef29e475c8ac281dbc6fe547b81d8b6b99974f5 + version: 3.21.4 + resolution: "google-protobuf@npm:3.21.4" + checksum: 10c0/28f2800f7fe1a8fc55eb58ba76e158268407bfb3b90646eaf8a177dd92a2e522459b773f8132ae546e60ac3b6f5947557a1cf3d963a05bb594f43bcde640f54f languageName: node linkType: hard @@ -13370,21 +14154,21 @@ __metadata: languageName: node linkType: hard -"h3@npm:^1.10.2, h3@npm:^1.11.1": - version: 1.11.1 - resolution: "h3@npm:1.11.1" +"h3@npm:^1.12.0, h3@npm:^1.13.0": + version: 1.13.0 + resolution: "h3@npm:1.13.0" dependencies: - cookie-es: "npm:^1.0.0" - crossws: "npm:^0.2.2" + cookie-es: "npm:^1.2.2" + crossws: "npm:>=0.2.0 <0.4.0" defu: "npm:^6.1.4" destr: "npm:^2.0.3" - iron-webcrypto: "npm:^1.0.0" - ohash: "npm:^1.1.3" - radix3: "npm:^1.1.0" - ufo: "npm:^1.4.0" + iron-webcrypto: "npm:^1.2.1" + ohash: "npm:^1.1.4" + radix3: "npm:^1.1.2" + ufo: "npm:^1.5.4" uncrypto: "npm:^0.1.3" - unenv: "npm:^1.9.0" - checksum: 10c0/bd02bfae536a0facb9ddcd85bd51ad16264ea6fd331a548540a0846e426348449fcbcb10b0fa08673cd1d9c60e6ff5d8f56e7ec2e1ee43fda460d8c16866cbfa + unenv: "npm:^1.10.0" + checksum: 10c0/d2e91d44c7133c31c62e39288961be28fb9f2c75f91d83a4a0416e29ff408b3207b79e46ba25a2652e13aea78a3e6f10d12c53d746feb00e91b864e1f4b21302 languageName: node linkType: hard @@ -13395,13 +14179,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -13452,7 +14229,7 @@ __metadata: languageName: node linkType: hard -"hash-base@npm:~3.0": +"hash-base@npm:~3.0, hash-base@npm:~3.0.4": version: 3.0.4 resolution: "hash-base@npm:3.0.4" dependencies: @@ -13547,23 +14324,14 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: "npm:^2.0.0" - checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a - languageName: node - linkType: hard - "i18n-js@npm:^4.3.2": - version: 4.4.3 - resolution: "i18n-js@npm:4.4.3" + version: 4.5.0 + resolution: "i18n-js@npm:4.5.0" dependencies: bignumber.js: "npm:*" lodash: "npm:*" make-plural: "npm:*" - checksum: 10c0/545ce16b5fe9323d1a92637c91c6cd503c1065577fcbe96dabb34cae822a9da6642e2953eeb0e9e610a912b92f98c885c4c9717163e351593aaf0c2e5695442d + checksum: 10c0/d316b38dc6f8203d9f744cbcf9e627b056fe33e869e4c72de27ee71487b5fe416c9a666b58ec561184e3e8f72552e2565cb7072ecaf0f4f02614dee6079db567 languageName: node linkType: hard @@ -13616,9 +14384,9 @@ __metadata: linkType: hard "ignore@npm:^5.0.5, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -13639,15 +14407,15 @@ __metadata: languageName: node linkType: hard -"import-in-the-middle@npm:^1.7.3": - version: 1.7.3 - resolution: "import-in-the-middle@npm:1.7.3" +"import-in-the-middle@npm:^1.7.4": + version: 1.11.2 + resolution: "import-in-the-middle@npm:1.11.2" dependencies: acorn: "npm:^8.8.2" - acorn-import-assertions: "npm:^1.9.0" + acorn-import-attributes: "npm:^1.9.5" cjs-module-lexer: "npm:^1.2.2" module-details-from-path: "npm:^1.0.3" - checksum: 10c0/68a904ba5893670a212a9e6b651fb535feab274cdd86b38a095a2a9ff3d344306fa6a1b4aa2dc21bfa3206f81912ad1b633b5da5e81ddfbbce4a5d62900bf65f + checksum: 10c0/9bf95a68c6678b7b2361da73f9047575dee9a3ed932c055ac3376a94580808e3ccfd05a7e38d8fcfea7f805a7e4ac0bea915653627074dc6cb1d800c8319d5f1 languageName: node linkType: hard @@ -13696,7 +14464,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -13752,14 +14520,14 @@ __metadata: linkType: hard "intl-messageformat@npm:^10.1.0": - version: 10.5.11 - resolution: "intl-messageformat@npm:10.5.11" + version: 10.7.7 + resolution: "intl-messageformat@npm:10.7.7" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.6" - tslib: "npm:^2.4.0" - checksum: 10c0/423f1c879ce2d0e7b9e0b4c1787a81ead7fe4d1734e0366a20fef56b06c09146e7ca3618e2e78b4f8b8f2b59cafe6237ceed21530fe0c16cfb47d915fc80222d + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/icu-messageformat-parser": "npm:2.9.4" + tslib: "npm:2" + checksum: 10c0/691895fb6a73a2feb2569658706e0d452861441de184dd1c9201e458a39fb80fc80080dd40d3d370400a52663f87de7a6d5a263c94245492f7265dd760441a95 languageName: node linkType: hard @@ -13783,16 +14551,16 @@ __metadata: linkType: hard "ipaddr.js@npm:^2.1.0": - version: 2.1.0 - resolution: "ipaddr.js@npm:2.1.0" - checksum: 10c0/9aa43ff99771e3d14ab3683df3909b3b033fe81337646bc63780b00ec9bc51d4a696a047c0b261c05867c0a25086ab03f0ce32ea444a6b39e10fac1315d53cab + version: 2.2.0 + resolution: "ipaddr.js@npm:2.2.0" + checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 languageName: node linkType: hard -"iron-webcrypto@npm:^1.0.0": - version: 1.1.0 - resolution: "iron-webcrypto@npm:1.1.0" - checksum: 10c0/58c783a3f18128e37918f83c8cd2703b2494ccec9316a0de5194b0b52282d9eac12a5a0a8c18da6b55940c3f9957a5ae10b786616692a1e5a12caaa019dde8de +"iron-webcrypto@npm:^1.2.1": + version: 1.2.1 + resolution: "iron-webcrypto@npm:1.2.1" + checksum: 10c0/5cf27c6e2bd3ef3b4970e486235fd82491ab8229e2ed0ac23307c28d6c80d721772a86ed4e9fe2a5cabadd710c2f024b706843b40561fb83f15afee58f809f66 languageName: node linkType: hard @@ -13830,15 +14598,6 @@ __metadata: languageName: node linkType: hard -"is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 - languageName: node - linkType: hard - "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -13901,7 +14660,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": +"is-date-object@npm:^1.0.1": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -13933,15 +14692,6 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -13956,7 +14706,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -13999,13 +14749,6 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.3": - version: 2.0.3 - resolution: "is-map@npm:2.0.3" - checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc - languageName: node - linkType: hard - "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" @@ -14100,13 +14843,6 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.3": - version: 2.0.3 - resolution: "is-set@npm:2.0.3" - checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 - languageName: node - linkType: hard - "is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" @@ -14192,13 +14928,6 @@ __metadata: languageName: node linkType: hard -"is-weakmap@npm:^2.0.2": - version: 2.0.2 - resolution: "is-weakmap@npm:2.0.2" - checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 - languageName: node - linkType: hard - "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -14208,16 +14937,6 @@ __metadata: languageName: node linkType: hard -"is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a - languageName: node - linkType: hard - "is-wsl@npm:^3.1.0": version: 3.1.0 resolution: "is-wsl@npm:3.1.0" @@ -14264,16 +14983,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-unfetch@npm:3.1.0": - version: 3.1.0 - resolution: "isomorphic-unfetch@npm:3.1.0" - dependencies: - node-fetch: "npm:^2.6.1" - unfetch: "npm:^4.2.0" - checksum: 10c0/d3b61fca06304db692b7f76bdfd3a00f410e42cfa7403c3b250546bf71589d18cf2f355922f57198e4cc4a9872d3647b20397a5c3edf1a347c90d57c83cf2a89 - languageName: node - linkType: hard - "isomorphic-ws@npm:^4.0.1": version: 4.0.1 resolution: "isomorphic-ws@npm:4.0.1" @@ -14292,6 +15001,15 @@ __metadata: languageName: node linkType: hard +"isows@npm:1.0.6": + version: 1.0.6 + resolution: "isows@npm:1.0.6" + peerDependencies: + ws: "*" + checksum: 10c0/f89338f63ce2f497d6cd0f86e42c634209328ebb43b3bdfdc85d8f1589ee75f02b7e6d9e1ba274101d0f6f513b1b8cbe6985e6542b4aaa1f0c5fd50d9c1be95c + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:3.2.0": version: 3.2.0 resolution: "istanbul-lib-coverage@npm:3.2.0" @@ -14299,19 +15017,6 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" - dependencies: - define-properties: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - reflect.getprototypeof: "npm:^1.0.4" - set-function-name: "npm:^2.0.1" - checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 - languageName: node - linkType: hard - "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -14325,25 +15030,12 @@ __metadata: languageName: node linkType: hard -"jayson@npm:^4.1.0": - version: 4.1.0 - resolution: "jayson@npm:4.1.0" +"jackspeak@npm:^4.0.1": + version: 4.0.2 + resolution: "jackspeak@npm:4.0.2" dependencies: - "@types/connect": "npm:^3.4.33" - "@types/node": "npm:^12.12.54" - "@types/ws": "npm:^7.4.4" - JSONStream: "npm:^1.3.5" - commander: "npm:^2.20.3" - delay: "npm:^5.0.0" - es6-promisify: "npm:^5.0.0" - eyes: "npm:^0.1.8" - isomorphic-ws: "npm:^4.0.1" - json-stringify-safe: "npm:^5.0.1" - uuid: "npm:^8.3.2" - ws: "npm:^7.4.5" - bin: - jayson: bin/jayson.js - checksum: 10c0/1b3a642eab65e7c07be45d6b9c08c1713348ed71454e37536f479400eb6c7257061fab74430d4677d1cedbed18db8fe8370202f0b52fac87d9c7af1140aa293d + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10c0/b26039d11c0163a95b1e58851b9ac453cce64ad6d1eb98a00b303ad5eeb761b29d33c9419d1e16c016d3f7151c8edf7df223e6cf93a1907655fd95d6ce85c0de languageName: node linkType: hard @@ -14365,12 +15057,21 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.21.0": - version: 1.21.0 - resolution: "jiti@npm:1.21.0" +"jiti@npm:^1.21.6": + version: 1.21.6 + resolution: "jiti@npm:1.21.6" bin: jiti: bin/jiti.js - checksum: 10c0/7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f + checksum: 10c0/05b9ed58cd30d0c3ccd3c98209339e74f50abd9a17e716f65db46b6a35812103f6bde6e134be7124d01745586bca8cc5dae1d0d952267c3ebe55171949c32e56 + languageName: node + linkType: hard + +"jiti@npm:^2.1.2": + version: 2.4.0 + resolution: "jiti@npm:2.4.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/f97365a83169e0544b0a6e7f415f1ee69ca9c0bdd55e336035490b4b7a6ff99b63b9df89c70babfc49e924247dfbdc730f9eb0c5ed4771d3db989ac70e49bf18 languageName: node linkType: hard @@ -14449,6 +15150,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -14456,7 +15166,7 @@ __metadata: languageName: node linkType: hard -"json-rpc-engine@npm:6.1.0, json-rpc-engine@npm:^6.1.0": +"json-rpc-engine@npm:^6.1.0": version: 6.1.0 resolution: "json-rpc-engine@npm:6.1.0" dependencies: @@ -14544,13 +15254,6 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.2.1 - resolution: "jsonc-parser@npm:3.2.1" - checksum: 10c0/ada66dec143d7f9cb0e2d0d29c69e9ce40d20f3a4cb96b0c6efb745025ac7f9ba647d7ac0990d0adfc37a2d2ae084a12009a9c833dbdbeadf648879a99b9df89 - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -14571,13 +15274,6 @@ __metadata: languageName: node linkType: hard -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 10c0/89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 - languageName: node - linkType: hard - "jsx-ast-utils@npm:^3.3.2, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -14601,7 +15297,7 @@ __metadata: languageName: node linkType: hard -"keccak@npm:^3.0.1, keccak@npm:^3.0.2": +"keccak@npm:^3.0.2, keccak@npm:^3.0.3": version: 3.0.4 resolution: "keccak@npm:3.0.4" dependencies: @@ -14644,9 +15340,9 @@ __metadata: linkType: hard "language-subtag-registry@npm:^0.3.20": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 10c0/d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c languageName: node linkType: hard @@ -14669,35 +15365,35 @@ __metadata: languageName: node linkType: hard -"libsodium-sumo@npm:^0.7.13": - version: 0.7.13 - resolution: "libsodium-sumo@npm:0.7.13" - checksum: 10c0/8159205cc36cc4bdf46ee097e5f998d5cac7d11612be7406a8396ca3ee31560871ac17daa69e47ff0e8407eeae9f49313912ea95dbc8715875301b004c28ef5b +"libsodium-sumo@npm:^0.7.15": + version: 0.7.15 + resolution: "libsodium-sumo@npm:0.7.15" + checksum: 10c0/5a1437ccff03c72669e7b49da702034e171df9ff6a4e65698297ab63ad0bf8f889d3dd51494e29418c643143526d8d7f08cbba3929d220334cddbe3e74a1560e languageName: node linkType: hard "libsodium-wrappers-sumo@npm:^0.7.11": - version: 0.7.13 - resolution: "libsodium-wrappers-sumo@npm:0.7.13" + version: 0.7.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" dependencies: - libsodium-sumo: "npm:^0.7.13" - checksum: 10c0/51a151d0f73418632dcf9cf0184b14d8eb6e16b9a3f01a652c7401c6d1bf8ead4f5ce40a4f00bd4754c5719a7a5fb71d6125691896aeb7a9c1abcfe4b73afc02 + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 languageName: node linkType: hard "libsodium-wrappers@npm:^0.7.6": - version: 0.7.13 - resolution: "libsodium-wrappers@npm:0.7.13" + version: 0.7.15 + resolution: "libsodium-wrappers@npm:0.7.15" dependencies: - libsodium: "npm:^0.7.13" - checksum: 10c0/3de2c09a41991832333b379f4eefadd3113abb216c5be8d141eb053bbe904a4d529c01a4bbb8f46c1e2a987c3de1fb9adbb0cf7980155822e06504a38dc16cbb + libsodium: "npm:^0.7.15" + checksum: 10c0/852c4879f3b3c48332fe704454c4dfc2a1387f9f3930faf84d8626c9670f93365e56aa186d14e2995e5d352f08af07c99c06a2c26d5f44818039f1014d404171 languageName: node linkType: hard -"libsodium@npm:^0.7.13": - version: 0.7.13 - resolution: "libsodium@npm:0.7.13" - checksum: 10c0/91a65df81e123d8374b1dcfc1214970203139b4ac75c8032cc2ca390c6173f456d15dbdbf8b79115337086fc2f5a3faa8f96625d909a788125b6ead5894cd5f5 +"libsodium@npm:^0.7.15": + version: 0.7.15 + resolution: "libsodium@npm:0.7.15" + checksum: 10c0/7bdb529681f30be0533f33921509c36823d18f6fc158d66842e50d33cd9635ebb0dd02eb1fe3b51e192996ff173949f846793e10103371c8b179e5c29525556c languageName: node linkType: hard @@ -14709,9 +15405,9 @@ __metadata: linkType: hard "lilconfig@npm:^3.0.0": - version: 3.1.1 - resolution: "lilconfig@npm:3.1.1" - checksum: 10c0/311b559794546894e3fe176663427326026c1c644145be9e8041c58e268aa9328799b8dfe7e4dd8c6a4ae305feae95a1c9e007db3569f35b42b6e1bc8274754c + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe languageName: node linkType: hard @@ -14729,32 +15425,32 @@ __metadata: languageName: node linkType: hard -"listhen@npm:^1.7.2": - version: 1.7.2 - resolution: "listhen@npm:1.7.2" +"listhen@npm:^1.9.0": + version: 1.9.0 + resolution: "listhen@npm:1.9.0" dependencies: "@parcel/watcher": "npm:^2.4.1" "@parcel/watcher-wasm": "npm:^2.4.1" citty: "npm:^0.1.6" clipboardy: "npm:^4.0.0" consola: "npm:^3.2.3" - crossws: "npm:^0.2.0" + crossws: "npm:>=0.2.0 <0.4.0" defu: "npm:^6.1.4" get-port-please: "npm:^3.1.2" - h3: "npm:^1.10.2" + h3: "npm:^1.12.0" http-shutdown: "npm:^1.2.2" - jiti: "npm:^1.21.0" - mlly: "npm:^1.6.1" + jiti: "npm:^2.1.2" + mlly: "npm:^1.7.1" node-forge: "npm:^1.3.1" pathe: "npm:^1.1.2" std-env: "npm:^3.7.0" - ufo: "npm:^1.4.0" + ufo: "npm:^1.5.4" untun: "npm:^0.1.3" uqr: "npm:^0.1.2" bin: listen: bin/listhen.mjs listhen: bin/listhen.mjs - checksum: 10c0/cd4d0651686b88c61a5bd5d5afc03feb99e352eb7862260112010655cf7997fb3356e61317f09555e2b7412175ae05265fc9e97458aa014586bf9fa4ab22bd5a + checksum: 10c0/b13e732eec48a49017121013853bb0f184c6f40dc9839a8ccad03b57a50a29186a57edafe5807e892cf65b49cb710026ba95d064bdcf294e135b95c6553fe36b languageName: node linkType: hard @@ -14896,9 +15592,9 @@ __metadata: languageName: node linkType: hard -"logform@npm:^2.2.0, logform@npm:^2.3.2": - version: 2.6.0 - resolution: "logform@npm:2.6.0" +"logform@npm:^2.2.0, logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" dependencies: "@colors/colors": "npm:1.6.0" "@types/triple-beam": "npm:^1.3.2" @@ -14906,7 +15602,7 @@ __metadata: ms: "npm:^2.1.1" safe-stable-stringify: "npm:^2.3.1" triple-beam: "npm:^1.3.0" - checksum: 10c0/6e02f8617a03155b2fce451bacf777a2c01da16d32c4c745b3ec85be6c3f2602f2a4953a8bd096441cb4c42c447b52318541d6b6bc335dce903cb9ad77a1749f + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f languageName: node linkType: hard @@ -14942,6 +15638,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: 10c0/c993b8e06ead0b24b969c1dbb5b301716aed66e320e9014a80012f5febe280b438f28ff50046b2c55ff404e889351ccb332ff91f8dd175a21f5eae80e3fb155f + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -14968,11 +15671,11 @@ __metadata: linkType: hard "magic-string@npm:^0.30.3": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" + version: 0.30.13 + resolution: "magic-string@npm:0.30.13" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/b9eb370773d0bd90ca11a848753409d8e5309b1ad56d2a1aa49d6649da710a6d2fe7237ad1a643c5a5d3800de2b9946ed9690acdfc00e6cc1aeafff3ab1752c4 + checksum: 10c0/a275faeca1564c545019b4742c38a42ca80226c8c9e0805c32d1a1cc58b0e6ff7bbd914ed885fd10043858a7da0f732cb8f49c8975c3ecebde9cad4b57db5115 languageName: node linkType: hard @@ -15049,8 +15752,8 @@ __metadata: linkType: hard "mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-from-markdown@npm:2.0.0" + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" dependencies: "@types/mdast": "npm:^4.0.0" "@types/unist": "npm:^3.0.0" @@ -15064,7 +15767,7 @@ __metadata: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/fb66e917f66e33fc60d6964264c4abd519fd8829a4a58ff9c61b2ba5c337554fb954b9ec31ca1c34e83c1163a73f310c39072d656f9a2d3184fe39c87cbba65a + checksum: 10c0/76eb2bd2c6f7a0318087c73376b8af6d7561c1e16654e7667e640f391341096c56142618fd0ff62f6d39e5ab4895898b9789c84cd7cec2874359a437a0e1ff15 languageName: node linkType: hard @@ -15117,6 +15820,13 @@ __metadata: languageName: node linkType: hard +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: 10c0/b87d35a52aded13cf2daca8d4eaa84e218722b6f83c75ddd77d74f32cc62e699a672e338e1ee19ceae0de91d19cc24dcc1a7c7d78c81f51042fe55f01b196ed3 + languageName: node + linkType: hard + "micro-spelling-correcter@npm:^1.1.1": version: 1.1.1 resolution: "micro-spelling-correcter@npm:1.1.1" @@ -15125,8 +15835,8 @@ __metadata: linkType: hard "micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-core-commonmark@npm:2.0.2" dependencies: decode-named-character-reference: "npm:^1.0.0" devlop: "npm:^1.0.0" @@ -15144,200 +15854,200 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/a0b280b1b6132f600518e72cb29a4dd1b2175b85f5ed5b25d2c5695e42b876b045971370daacbcfc6b4ce8cf7acbf78dd3a0284528fb422b450144f4b3bebe19 + checksum: 10c0/87c7a75cd339189eb6f1d6323037f7d108d1331d953b84fe839b37fd385ee2292b27222327c1ceffda46ba5d5d4dee703482475e5ee8744be40c9e308d8acb77 languageName: node linkType: hard "micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/b73492f687d41a6a379159c2f3acbf813042346bcea523d9041d0cc6124e6715f0779dbb2a0b3422719e9764c3b09f9707880aa159557e3cb4aeb03b9d274915 + checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c languageName: node linkType: hard "micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" dependencies: devlop: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/8ffad00487a7891941b1d1f51d53a33c7a659dcf48617edb7a4008dad7aff67ec316baa16d55ca98ae3d75ce1d81628dbf72fedc7c6f108f740dec0d5d21c8ee + checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 languageName: node linkType: hard "micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/103ca954dade963d4ff1d2f27d397833fe855ddc72590205022832ef68b775acdea67949000cee221708e376530b1de78c745267b0bf8366740840783eb37122 + checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb languageName: node linkType: hard "micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2b2188e7a011b1b001faf8c860286d246d5c3485ef8819270c60a5808f4c7613e49d4e481dbdff62600ef7acdba0f5100be2d125cbd2a15e236c26b3668a8ebd + checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 languageName: node linkType: hard "micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/4e91baab0cc71873095134bd0e225d01d9786cde352701402d71b72d317973954754e8f9f1849901f165530e6421202209f4d97c460a27bb0808ec5a3fc3148c + checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 languageName: node linkType: hard "micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fc37a76aaa5a5138191ba2bef1ac50c36b3bcb476522e98b1a42304ab4ec76f5b036a746ddf795d3de3e7004b2c09f21dd1bad42d161f39b8cfc0acd067e6373 + checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 languageName: node linkType: hard "micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/043b5f2abc8c13a1e2e4c378ead191d1a47ed9e0cd6d0fa5a0a430b2df9e17ada9d5de5a20688a000bbc5932507e746144acec60a9589d9a79fa60918e029203 + checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 languageName: node linkType: hard "micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2bf5fa5050faa9b69f6c7e51dbaaf02329ab70fabad8229984381b356afbbf69db90f4617bec36d814a7d285fb7cad8e3c4e38d1daf4387dc9e240aa7f9a292a + checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 languageName: node linkType: hard "micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" dependencies: micromark-util-chunked: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/cd4c8d1a85255527facb419ff3b3cc3d7b7f27005c5ef5fa7ef2c4d0e57a9129534fc292a188ec2d467c2c458642d369c5f894bc8a9e142aed6696cc7989d3ea + checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 languageName: node linkType: hard "micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/3f6d684ee8f317c67806e19b3e761956256cb936a2e0533aad6d49ac5604c6536b2041769c6febdd387ab7175b7b7e551851bf2c1f78da943e7a3671ca7635ac + checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df languageName: node linkType: hard "micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" dependencies: decode-named-character-reference: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-decode-numeric-character-reference: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/f5413bebb21bdb686cfa1bcfa7e9c93093a523d1b42443ead303b062d2d680a94e5e8424549f57b8ba9d786a758e5a26a97f56068991bbdbca5d1885b3aa7227 + checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb languageName: node linkType: hard "micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 10c0/ebdaafff23100bbf4c74e63b4b1612a9ddf94cd7211d6a076bc6fb0bc32c1b48d6fb615aa0953e607c62c97d849f97f1042260d3eb135259d63d372f401bbbb2 + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a languageName: node linkType: hard "micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: 10c0/988aa26367449bd345b627ae32cf605076daabe2dc1db71b578a8a511a47123e14af466bcd6dcbdacec60142f07bc2723ec5f7a0eed0f5319ce83b5e04825429 + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 languageName: node linkType: hard "micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/93bf8789b8449538f22cf82ac9b196363a5f3b2f26efd98aef87c4c1b1f8c05be3ef6391ff38316ff9b03c1a6fd077342567598019ddd12b9bd923dacc556333 + checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd languageName: node linkType: hard "micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" dependencies: micromark-util-types: "npm:^2.0.0" - checksum: 10c0/3b912e88453dcefe728a9080c8934a75ac4732056d6576ceecbcaf97f42c5d6fa2df66db8abdc8427eb167c5ffddefe26713728cfe500bc0e314ed260d6e2746 + checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-encode: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 + checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c languageName: node linkType: hard "micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" + version: 2.0.3 + resolution: "micromark-util-subtokenize@npm:2.0.3" dependencies: devlop: "npm:^1.0.0" micromark-util-chunked: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/000cefde827db129f4ed92b8fbdeb4866c5f9c93068c0115485564b0426abcb9058080aa257df9035e12ca7fa92259d66623ea750b9eb3bcdd8325d3fb6fc237 + checksum: 10c0/75501986ecb02a6f06c0f3e58b584ae3ff3553b520260e8ce27d2db8c79b8888861dd9d3b26e30f5c6084fddd90f96dc3ff551f02c2ac4d669ebe920e483b6d6 languageName: node linkType: hard "micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: 10c0/4e76186c185ce4cefb9cea8584213d9ffacd77099d1da30c0beb09fa21f46f66f6de4c84c781d7e34ff763fe3a06b530e132fa9004882afab9e825238d0aa8b3 + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 languageName: node linkType: hard "micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 10c0/d74e913b9b61268e0d6939f4209e3abe9dada640d1ee782419b04fd153711112cfaaa3c4d5f37225c9aee1e23c3bb91a1f5223e1e33ba92d33e83956a53e61de + version: 2.0.1 + resolution: "micromark-util-types@npm:2.0.1" + checksum: 10c0/872ec9334bb42afcc91c5bed8b7ee03b75654b36c6f221ab4d2b1bb0299279f00db948bf38ec6bc1ec03d0cf7842c21ab805190bf676157ba587eb0386d38b71 languageName: node linkType: hard "micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" + version: 4.0.1 + resolution: "micromark@npm:4.0.1" dependencies: "@types/debug": "npm:^4.0.0" debug: "npm:^4.0.0" @@ -15356,17 +16066,17 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/7e91c8d19ff27bc52964100853f1b3b32bb5b2ece57470a34ba1b2f09f4e2a183d90106c4ae585c9f2046969ee088576fed79b2f7061cba60d16652ccc2c64fd + checksum: 10c0/b5d950c84664ce209575e5a54946488f0a1e1240d080544e657b65074c9b08208a5315d9db066b93cbc199ec05f68552ba8b09fd5e716c726f4a4712275a7c5c languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - braces: "npm:^3.0.2" + braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 languageName: node linkType: hard @@ -15453,12 +16163,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:6 || 7 || 8 || 9, minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" +"minimatch@npm:6 || 7 || 8 || 9 || 10, minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + checksum: 10c0/e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d languageName: node linkType: hard @@ -15480,6 +16190,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + "minimist@npm:1, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -15596,22 +16315,22 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.2.0, mlly@npm:^1.6.1": - version: 1.6.1 - resolution: "mlly@npm:1.6.1" +"mlly@npm:^1.7.1, mlly@npm:^1.7.2": + version: 1.7.3 + resolution: "mlly@npm:1.7.3" dependencies: - acorn: "npm:^8.11.3" + acorn: "npm:^8.14.0" pathe: "npm:^1.1.2" - pkg-types: "npm:^1.0.3" - ufo: "npm:^1.3.2" - checksum: 10c0/a7bf26b3d4f83b0f5a5232caa3af44be08b464f562f31c11d885d1bc2d43b7d717137d47b0c06fdc69e1b33ffc09f902b6d2b18de02c577849d40914e8785092 + pkg-types: "npm:^1.2.1" + ufo: "npm:^1.5.4" + checksum: 10c0/b530887fe95a6e3458c1b24e9775dc61c167d402126f2f5f13a13845a3fb77c3db8d79cb32077c98679a392d8ecfdc4e5df3d6925bf650d807dc2dfe8cc35b53 languageName: node linkType: hard "mobx@npm:^6.1.7": - version: 6.12.3 - resolution: "mobx@npm:6.12.3" - checksum: 10c0/33e1d27d33adea0ceb4de32eb66b4384e81a249be5e01baa6bf556f458fd62a83d23bfa0cf8ba9e87c28f0d810ae301ee0e7322fd48a3bf47db33ffb08d5826c + version: 6.13.5 + resolution: "mobx@npm:6.13.5" + checksum: 10c0/43691c836363aa1f13c44e43c86ab89fc8f4b83ef408bc6c68d799260e74b4ff08ebba2ef16bda447c6b7bca3558768e15927c0b21ffbb10e99b610783f28859 languageName: node linkType: hard @@ -15643,14 +16362,7 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.2.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -15697,18 +16409,18 @@ __metadata: linkType: hard "n-readlines@npm:^1.0.0": - version: 1.0.1 - resolution: "n-readlines@npm:1.0.1" - checksum: 10c0/a2ba1c74e365ac5b8b2dde03301ddcb193c81edb0d3691dd71b3d9a1c71b3dde30b86c32483578efbc3161d295b272123668de11533b02a99bd93704d637f83e + version: 1.0.3 + resolution: "n-readlines@npm:1.0.3" + checksum: 10c0/436c27ac071409314093da35dc3a4c5198c94fb10ad12b1c4d2b3e44bdb634da0a7a8ab0c107c1f4815788cbf5e0c7c180e3037ba3d974f34637cab363a95a74 languageName: node linkType: hard "nan@npm:^2.13.2": - version: 2.19.0 - resolution: "nan@npm:2.19.0" + version: 2.22.0 + resolution: "nan@npm:2.22.0" dependencies: node-gyp: "npm:latest" - checksum: 10c0/b8d05d75f92ee9d94affa50d0aa41b6c698254c848529452d7ab67c2e0d160a83f563bfe2cbd53e077944eceb48c757f83c93634c7c9ff404c9ec1ed4e5ced1a + checksum: 10c0/d5d31aefdb218deba308d44867c5f432b4d3aabeb57c70a2b236d62652e9fee7044e5d5afd380d9fef022fe7ebb2f2d6c85ca3cbcac5031aaca3592c844526bb languageName: node linkType: hard @@ -15729,9 +16441,9 @@ __metadata: linkType: hard "napi-wasm@npm:^1.1.0": - version: 1.1.0 - resolution: "napi-wasm@npm:1.1.0" - checksum: 10c0/074df6b5b72698f07b39ca3c448a3fcbaf8e6e78521f0cb3aefd8c2f059d69eae0e3bfe367b4aa3df1976c25e351e4e52a359f22fb2c379eb6781bfa042f582b + version: 1.1.3 + resolution: "napi-wasm@npm:1.1.3" + checksum: 10c0/7c365ab9dc59e6f20d7b7886279ecc03ffc7c3d502ed66d32652e3681c3a56c372f00f29b110aefd9b074a6bab6a997e9b602968c18622e2586818f417e41a5d languageName: node linkType: hard @@ -15743,9 +16455,9 @@ __metadata: linkType: hard "negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea languageName: node linkType: hard @@ -15761,11 +16473,11 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.57.0 - resolution: "node-abi@npm:3.57.0" + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/8d78542e39a3c49ac476d12c70ef0366f26a40a215af44498656e75fc85e5646309765a3277e1cbb2ec40283a9e86f7aefcdd699e30576c582f6bb931e6c802b + checksum: 10c0/dbd0792ea729329cd9d099f28a5681ff9e8a6db48cf64e1437bf6a7fd669009d1e758a784619a1c4cc8bfd1ed17162f042c787654edf19a1f64b5018457c9c1f languageName: node linkType: hard @@ -15804,15 +16516,15 @@ __metadata: linkType: hard "node-addon-api@npm:^7.0.0": - version: 7.1.0 - resolution: "node-addon-api@npm:7.1.0" + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" dependencies: node-gyp: "npm:latest" - checksum: 10c0/2e096ab079e3c46d33b0e252386e9c239c352f7cc6d75363d9a3c00bdff34c1a5da170da861917512843f213c32d024ced9dc9552b968029786480d18727ec66 + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 languageName: node linkType: hard -"node-fetch-native@npm:^1.6.1, node-fetch-native@npm:^1.6.2, node-fetch-native@npm:^1.6.3": +"node-fetch-native@npm:^1.6.4": version: 1.6.4 resolution: "node-fetch-native@npm:1.6.4" checksum: 10c0/78334dc6def5d1d95cfe87b33ac76c4833592c5eb84779ad2b0c23c689f9dd5d1cfc827035ada72d6b8b218f717798968c5a99aeff0a1a8bf06657e80592f9c3 @@ -15866,13 +16578,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0, node-gyp-build@npm:^4.4.0, node-gyp-build@npm:^4.5.0": - version: 4.8.0 - resolution: "node-gyp-build@npm:4.8.0" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10c0/85324be16f81f0235cbbc42e3eceaeb1b5ab94c8d8f5236755e1435b4908338c65a4e75f66ee343cbcb44ddf9b52a428755bec16dcd983295be4458d95c8e1ad + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 languageName: node linkType: hard @@ -15896,10 +16608,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 languageName: node linkType: hard @@ -15968,10 +16680,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 languageName: node linkType: hard @@ -16004,7 +16716,7 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.5, object.entries@npm:^1.1.7": +"object.entries@npm:^1.1.5": version: 1.1.8 resolution: "object.entries@npm:1.1.8" dependencies: @@ -16015,7 +16727,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": +"object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -16049,21 +16761,21 @@ __metadata: languageName: node linkType: hard -"ofetch@npm:^1.3.3": - version: 1.3.4 - resolution: "ofetch@npm:1.3.4" +"ofetch@npm:^1.4.1": + version: 1.4.1 + resolution: "ofetch@npm:1.4.1" dependencies: destr: "npm:^2.0.3" - node-fetch-native: "npm:^1.6.3" - ufo: "npm:^1.5.3" - checksum: 10c0/39855005c3f8aa11c11d3a3b0c4366b67d316da58633f4cf5d4a5af0a61495fd68699f355e70deda70355ead25f27b41c3bde2fdd1d24ce3f85ac79608dd8677 + node-fetch-native: "npm:^1.6.4" + ufo: "npm:^1.5.4" + checksum: 10c0/fd712e84058ad5058a5880fe805e9bb1c2084fb7f9c54afa99a2c7e84065589b4312fa6e2dcca4432865e44ad1ec13fcd055c1bf7977ced838577a45689a04fa languageName: node linkType: hard -"ohash@npm:^1.1.3": - version: 1.1.3 - resolution: "ohash@npm:1.1.3" - checksum: 10c0/928f5bdbd8cd73f90cf544c0533dbda8e0a42d9b8c7454ab89e64e4d11bc85f85242830b4e107426ce13dc4dd3013286f8f5e0c84abd8942a014b907d9692540 +"ohash@npm:^1.1.4": + version: 1.1.4 + resolution: "ohash@npm:1.1.4" + checksum: 10c0/73c3bcab2891ee2155ed62bb4c2906f622bf2204a3c9f4616ada8a6a76276bb6b4b4180eaf273b7c7d6232793e4d79d486aab436ebfc0d06d92a997f07122864 languageName: node linkType: hard @@ -16127,16 +16839,16 @@ __metadata: linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": "npm:^1.2.3" deep-is: "npm:^0.1.3" fast-levenshtein: "npm:^2.0.6" levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - checksum: 10c0/66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 languageName: node linkType: hard @@ -16171,6 +16883,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.1.2": + version: 0.1.2 + resolution: "ox@npm:0.1.2" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9d0615e9a95c316063587fe08dc268476e67429eea897598b2f69cb1509ac66739f888b0b9bc1cfd0b4bd2f1a3fd0af4d3e81d40ba0bf3abd53e36a6f5b21323 + languageName: node + linkType: hard + "p-defer@npm:^1.0.0": version: 1.0.0 resolution: "p-defer@npm:1.0.0" @@ -16274,9 +17006,9 @@ __metadata: linkType: hard "package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b languageName: node linkType: hard @@ -16376,10 +17108,20 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c + languageName: node + linkType: hard + "path-to-regexp@npm:^0.1.2": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 + version: 0.1.11 + resolution: "path-to-regexp@npm:0.1.11" + checksum: 10c0/8ad06c6ac418cde34db4b0792204a628667a67141dc197cb85b5ad9f35810cbee34bd1aed336f960876dbd47326df30c8c5774fedf501cd67de87fb08384cfdf languageName: node linkType: hard @@ -16390,14 +17132,14 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": +"pathe@npm:^1.1.1, pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 languageName: node linkType: hard -"pbkdf2@npm:^3.0.3, pbkdf2@npm:^3.1.2": +"pbkdf2@npm:^3.1.2": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" dependencies: @@ -16410,10 +17152,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1, picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 +"picocolors@npm:^1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard @@ -16424,6 +17166,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + "pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" @@ -16509,14 +17258,14 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.0.3": - version: 1.0.3 - resolution: "pkg-types@npm:1.0.3" +"pkg-types@npm:^1.2.1": + version: 1.2.1 + resolution: "pkg-types@npm:1.2.1" dependencies: - jsonc-parser: "npm:^3.2.0" - mlly: "npm:^1.2.0" - pathe: "npm:^1.1.0" - checksum: 10c0/7f692ff2005f51b8721381caf9bdbc7f5461506ba19c34f8631660a215c8de5e6dca268f23a319dd180b8f7c47a0dc6efea14b376c485ff99e98d810b8f786c4 + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.2" + pathe: "npm:^1.1.2" + checksum: 10c0/4aef765c039e3ec3ca55171bb8ad776cf060d894c45ddf92b9d680b3fdb1817c8d1c428f74ea6aae144493fa1d6a97df6b8caec6dc31e418f1ce1f728d38014e languageName: node linkType: hard @@ -16536,6 +17285,13 @@ __metadata: languageName: node linkType: hard +"pony-cause@npm:^2.1.10": + version: 2.1.11 + resolution: "pony-cause@npm:2.1.11" + checksum: 10c0/d5db6489ec42f8fcce0fd9ad2052be98cd8f63814bf32819694ec1f4c6a01bc3be6181050d83bc79e95272174a5b9776d1c2af1fa79ef51e0ccc0f97c22b1420 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -16567,7 +17323,7 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^4.0.1": +"postcss-load-config@npm:^4.0.2": version: 4.0.2 resolution: "postcss-load-config@npm:4.0.2" dependencies: @@ -16585,24 +17341,24 @@ __metadata: languageName: node linkType: hard -"postcss-nested@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-nested@npm:6.0.1" +"postcss-nested@npm:^6.2.0": + version: 6.2.0 + resolution: "postcss-nested@npm:6.2.0" dependencies: - postcss-selector-parser: "npm:^6.0.11" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.2.14 - checksum: 10c0/2a50aa36d5d103c2e471954830489f4c024deed94fa066169101db55171368d5f80b32446b584029e0471feee409293d0b6b1d8ede361f6675ba097e477b3cbd + checksum: 10c0/7f9c3f2d764191a39364cbdcec350f26a312431a569c9ef17408021424726b0d67995ff5288405e3724bb7152a4c92f73c027e580ec91e798800ed3c52e2bc6e languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11": - version: 6.0.16 - resolution: "postcss-selector-parser@npm:6.0.16" +"postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/0e11657cb3181aaf9ff67c2e59427c4df496b4a1b6a17063fae579813f80af79d444bf38f82eeb8b15b4679653fd3089e66ef0283f9aab01874d885e6cf1d2cf + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e languageName: node linkType: hard @@ -16613,14 +17369,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.23, postcss@npm:^8.4.27, postcss@npm:^8.4.35, postcss@npm:^8.4.38": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:^8.4.27, postcss@npm:^8.4.35, postcss@npm:^8.4.43, postcss@npm:^8.4.47": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.2.0" - checksum: 10c0/955407b8f70cf0c14acf35dab3615899a2a60a26718a63c848cf3c29f2467b0533991b985a2b994430d890bd7ec2b1963e36352b0774a19143b5f591540f7c06 + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 languageName: node linkType: hard @@ -16631,10 +17387,10 @@ __metadata: languageName: node linkType: hard -"preact@npm:^10.12.0, preact@npm:^10.5.9": - version: 10.21.0 - resolution: "preact@npm:10.21.0" - checksum: 10c0/1f3cfcb5ca83b780b53593bcb917ae2e8d10a37405c32fb6774be1b5f1f3167d2156bd22c058627388330acc54da35fe8d4bbe7d38ae567a10e5d8fd943a1a06 +"preact@npm:^10.12.0, preact@npm:^10.16.0": + version: 10.24.3 + resolution: "preact@npm:10.24.3" + checksum: 10c0/c863df6d7be6a660480189762d8a8f2d4148733fc2bb9efbd9d2fd27315d2c7ede850a16077d716c91666c915c0349bd3c9699733e4f08457226a0519f408761 languageName: node linkType: hard @@ -16690,8 +17446,8 @@ __metadata: linkType: hard "prettier-plugin-tailwindcss@npm:^0.5.11": - version: 0.5.13 - resolution: "prettier-plugin-tailwindcss@npm:0.5.13" + version: 0.5.14 + resolution: "prettier-plugin-tailwindcss@npm:0.5.14" peerDependencies: "@ianvs/prettier-plugin-sort-imports": "*" "@prettier/plugin-pug": "*" @@ -16740,7 +17496,7 @@ __metadata: optional: true prettier-plugin-svelte: optional: true - checksum: 10c0/017e85276952c0110a11c5bf114781c006f1335be29944daa7c5210d81168467efc9d1d212d6ac13ff7a30b2ec30de90619dbe0bf96f61d9b0dd510bf5841a02 + checksum: 10c0/9857873cb8cb0d9b7b895806e7f6265617a08805691125d282767dffb1cb3d2c4c662f2b9168ef391edc40dff1b81beb99eee488f96544e01b8924db694f2299 languageName: node linkType: hard @@ -16763,11 +17519,11 @@ __metadata: linkType: hard "pretty-ms@npm:^9.0.0": - version: 9.1.0 - resolution: "pretty-ms@npm:9.1.0" + version: 9.2.0 + resolution: "pretty-ms@npm:9.2.0" dependencies: parse-ms: "npm:^4.0.0" - checksum: 10c0/fd111aad8800a04dfd654e6016da69bdaa6fc6a4c280f8e727cffd8b5960558e94942f1a94d4aa6e4d179561a0fbb0366a9ebe0ccefbbb0f8ff853b129cdefb9 + checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb languageName: node linkType: hard @@ -16891,7 +17647,7 @@ __metadata: languageName: node linkType: hard -"public-encrypt@npm:^4.0.0": +"public-encrypt@npm:^4.0.3": version: 4.0.3 resolution: "public-encrypt@npm:4.0.3" dependencies: @@ -16906,12 +17662,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: 10c0/bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f languageName: node linkType: hard @@ -16943,7 +17699,7 @@ __metadata: languageName: node linkType: hard -"qrcode@npm:1.5.3, qrcode@npm:^1.5.1": +"qrcode@npm:1.5.3": version: 1.5.3 resolution: "qrcode@npm:1.5.3" dependencies: @@ -16957,12 +17713,16 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.3": - version: 6.12.1 - resolution: "qs@npm:6.12.1" +"qrcode@npm:^1.5.1": + version: 1.5.4 + resolution: "qrcode@npm:1.5.4" dependencies: - side-channel: "npm:^1.0.6" - checksum: 10c0/439e6d7c6583e7c69f2cab2c39c55b97db7ce576e4c7c469082b938b7fc8746e8d547baacb69b4cd2b6666484776c3f4840ad7163a4c5326300b0afa0acdd84b + dijkstrajs: "npm:^1.0.1" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10c0/ae1d57c9cff6099639a590b432c71b15e3bd3905ce4353e6d00c95dee6bb769a8f773f6a7575ecc1b8ed476bf79c5138a4a65cb380c682de3b926d7205d34d10 languageName: node linkType: hard @@ -17004,7 +17764,7 @@ __metadata: languageName: node linkType: hard -"radix3@npm:^1.1.0": +"radix3@npm:^1.1.2": version: 1.1.2 resolution: "radix3@npm:1.1.2" checksum: 10c0/d4a295547f71af079868d2c2ed3814a9296ee026c5488212d58c106e6b4797c6eaec1259b46c9728913622f2240c9a944bfc8e2b3b5f6e4a5045338b1609f1e4 @@ -17030,7 +17790,7 @@ __metadata: languageName: node linkType: hard -"randomfill@npm:^1.0.3": +"randomfill@npm:^1.0.4": version: 1.0.4 resolution: "randomfill@npm:1.0.4" dependencies: @@ -17055,50 +17815,51 @@ __metadata: linkType: hard "react-aria@npm:^3.29.1": - version: 3.34.3 - resolution: "react-aria@npm:3.34.3" - dependencies: - "@internationalized/string": "npm:^3.2.3" - "@react-aria/breadcrumbs": "npm:^3.5.16" - "@react-aria/button": "npm:^3.9.8" - "@react-aria/calendar": "npm:^3.5.11" - "@react-aria/checkbox": "npm:^3.14.6" - "@react-aria/combobox": "npm:^3.10.3" - "@react-aria/datepicker": "npm:^3.11.2" - "@react-aria/dialog": "npm:^3.5.17" - "@react-aria/dnd": "npm:^3.7.2" - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/gridlist": "npm:^3.9.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/link": "npm:^3.7.4" - "@react-aria/listbox": "npm:^3.13.3" - "@react-aria/menu": "npm:^3.15.3" - "@react-aria/meter": "npm:^3.4.16" - "@react-aria/numberfield": "npm:^3.11.6" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/progress": "npm:^3.4.16" - "@react-aria/radio": "npm:^3.10.7" - "@react-aria/searchfield": "npm:^3.7.8" - "@react-aria/select": "npm:^3.14.9" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/separator": "npm:^3.4.2" - "@react-aria/slider": "npm:^3.7.11" - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/switch": "npm:^3.6.7" - "@react-aria/table": "npm:^3.15.3" - "@react-aria/tabs": "npm:^3.9.5" - "@react-aria/tag": "npm:^3.4.5" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/tooltip": "npm:^3.7.7" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-types/shared": "npm:^3.24.1" + version: 3.35.1 + resolution: "react-aria@npm:3.35.1" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/breadcrumbs": "npm:^3.5.18" + "@react-aria/button": "npm:^3.10.1" + "@react-aria/calendar": "npm:^3.5.13" + "@react-aria/checkbox": "npm:^3.14.8" + "@react-aria/color": "npm:^3.0.1" + "@react-aria/combobox": "npm:^3.10.5" + "@react-aria/datepicker": "npm:^3.11.4" + "@react-aria/dialog": "npm:^3.5.19" + "@react-aria/dnd": "npm:^3.7.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/meter": "npm:^3.4.17" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/progress": "npm:^3.4.17" + "@react-aria/radio": "npm:^3.10.9" + "@react-aria/searchfield": "npm:^3.7.10" + "@react-aria/select": "npm:^3.14.11" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/separator": "npm:^3.4.3" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/switch": "npm:^3.6.9" + "@react-aria/table": "npm:^3.15.5" + "@react-aria/tabs": "npm:^3.9.7" + "@react-aria/tag": "npm:^3.4.7" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/tooltip": "npm:^3.7.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/69f801d70d93a0da399723c86f3c67259896bc42062ef838a51f467154b907e11376f508d8ccb63286761fb37f22a28b090c9cb4f384c6de9ba48dbd9751d6b0 + checksum: 10c0/2211d5bf2b10d25d929dfeea589e4bb38aa2a1854afbeeeb2c57c6989fb94ff2006384b5cfd45af4974c61d81d0eeb553855f7e738ae23fb54e70989bf7bd846 languageName: node linkType: hard @@ -17112,14 +17873,14 @@ __metadata: linkType: hard "react-daisyui@npm:^5.0.0": - version: 5.0.0 - resolution: "react-daisyui@npm:5.0.0" + version: 5.0.5 + resolution: "react-daisyui@npm:5.0.5" peerDependencies: - daisyui: ^4.4.6 + daisyui: ^4.12.10 react: ">=16" react-dom: ">=16" tailwindcss: ">=3.2.7" - checksum: 10c0/8f1034fe54da0a81a76b1662b504e5f2034d2ffcef93eab5310dfd7e5289b11d0c81f2fca7e9ace5388c833aee075d209384dd9d470d012f355ab7e05e5fc5d8 + checksum: 10c0/2dc3dcf3a3fa55ecae76d05613964ee48ee3d0b2800fe47dcb12fd87ab21fbeb917c2cb1f35f2cdef27e3e229d39988de3c0720ca84cacd8ba0b65dfd29c0e2b languageName: node linkType: hard @@ -17156,10 +17917,10 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.14.0": - version: 0.14.0 - resolution: "react-refresh@npm:0.14.0" - checksum: 10c0/b8ae07ad153357d77830928a7f1fc2df837aabefee907fa273ba04c7643f3b860e986f1d4b7ada9b721c8d79b8c24b5b911a314a1a2398b105f1b13d19ea2b8d +"react-refresh@npm:^0.14.2": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: 10c0/875b72ef56b147a131e33f2abd6ec059d1989854b3ff438898e4f9310bfcc73acff709445b7ba843318a953cb9424bcc2c05af2b3d80011cee28f25aef3e2ebb languageName: node linkType: hard @@ -17199,35 +17960,36 @@ __metadata: linkType: hard "react-stately@npm:^3.27.1": - version: 3.32.2 - resolution: "react-stately@npm:3.32.2" - dependencies: - "@react-stately/calendar": "npm:^3.5.4" - "@react-stately/checkbox": "npm:^3.6.8" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/combobox": "npm:^3.9.2" - "@react-stately/data": "npm:^3.11.6" - "@react-stately/datepicker": "npm:^3.10.2" - "@react-stately/dnd": "npm:^3.4.2" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/menu": "npm:^3.8.2" - "@react-stately/numberfield": "npm:^3.9.6" - "@react-stately/overlays": "npm:^3.6.10" - "@react-stately/radio": "npm:^3.10.7" - "@react-stately/searchfield": "npm:^3.5.6" - "@react-stately/select": "npm:^3.6.7" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/slider": "npm:^3.5.7" - "@react-stately/table": "npm:^3.12.2" - "@react-stately/tabs": "npm:^3.6.9" - "@react-stately/toggle": "npm:^3.7.7" - "@react-stately/tooltip": "npm:^3.4.12" - "@react-stately/tree": "npm:^3.8.4" - "@react-types/shared": "npm:^3.24.1" + version: 3.33.0 + resolution: "react-stately@npm:3.33.0" + dependencies: + "@react-stately/calendar": "npm:^3.5.5" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/data": "npm:^3.11.7" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/radio": "npm:^3.10.8" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/table": "npm:^3.12.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-stately/toggle": "npm:^3.7.8" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e331c0391115438623b1f9890634882b47436a69fbcfd453a2e2e37c992bd0e8339c470356ed66a3457d57c45f0437c3b53c497084041dbc3cf930e83f09437e + checksum: 10c0/c5be8c2fa2ec76ca5fc1778f274ce0cda184ef03cf10e5a2676f0fc5f22559a8db70aac4fc4c2ce4b44d912a35f75714b6c47f7cd8e12e1f36cf2b0d6e89692f languageName: node linkType: hard @@ -17290,7 +18052,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -17324,21 +18086,6 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.6 - resolution: "reflect.getprototypeof@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.1" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - globalthis: "npm:^1.0.3" - which-builtin-type: "npm:^1.1.3" - checksum: 10c0/baf4ef8ee6ff341600f4720b251cf5a6cb552d6a6ab0fdc036988c451bf16f920e5feb0d46bd4f530a5cce568f1f7aca2d77447ca798920749cfc52783c39b55 - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.14.0": version: 0.14.1 resolution: "regenerator-runtime@npm:0.14.1" @@ -17346,15 +18093,15 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 + set-function-name: "npm:^2.0.2" + checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 languageName: node linkType: hard @@ -17416,7 +18163,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.4": +"resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -17429,7 +18176,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -17495,6 +18242,18 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^6.0.1": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" + dependencies: + glob: "npm:^11.0.0" + package-json-from-dist: "npm:^1.0.0" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/b30b6b072771f0d1e73b4ca5f37bb2944ee09375be9db5f558fcd3310000d29dfcfa93cf7734d75295ad5a7486dc8e40f63089ced1722a664539ffc0c3ece8c6 + languageName: node + linkType: hard + "ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": version: 2.0.2 resolution: "ripemd160@npm:2.0.2" @@ -17506,8 +18265,8 @@ __metadata: linkType: hard "rollup@npm:^2.79.1": - version: 2.79.1 - resolution: "rollup@npm:2.79.1" + version: 2.79.2 + resolution: "rollup@npm:2.79.2" dependencies: fsevents: "npm:~2.3.2" dependenciesMeta: @@ -17515,13 +18274,13 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/421418687f5dcd7324f4387f203c6bfc7118b7ace789e30f5da022471c43e037a76f5fd93837052754eeeae798a4fb266ac05ccee1e594406d912a59af98dde9 + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 languageName: node linkType: hard "rollup@npm:^3.27.1": - version: 3.29.4 - resolution: "rollup@npm:3.29.4" + version: 3.29.5 + resolution: "rollup@npm:3.29.5" dependencies: fsevents: "npm:~2.3.2" dependenciesMeta: @@ -17529,31 +18288,33 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/65eddf84bf389ea8e4d4c1614b1c6a298d08f8ae785c0c087e723a879190c8aaddbab4aa3b8a0524551b9036750c9f8bfea27b377798accfd2ba5084ceff5aaa - languageName: node - linkType: hard - -"rollup@npm:^4.13.0, rollup@npm:^4.18.0": - version: 4.22.4 - resolution: "rollup@npm:4.22.4" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.22.4" - "@rollup/rollup-android-arm64": "npm:4.22.4" - "@rollup/rollup-darwin-arm64": "npm:4.22.4" - "@rollup/rollup-darwin-x64": "npm:4.22.4" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.22.4" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.22.4" - "@rollup/rollup-linux-arm64-gnu": "npm:4.22.4" - "@rollup/rollup-linux-arm64-musl": "npm:4.22.4" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.22.4" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.22.4" - "@rollup/rollup-linux-s390x-gnu": "npm:4.22.4" - "@rollup/rollup-linux-x64-gnu": "npm:4.22.4" - "@rollup/rollup-linux-x64-musl": "npm:4.22.4" - "@rollup/rollup-win32-arm64-msvc": "npm:4.22.4" - "@rollup/rollup-win32-ia32-msvc": "npm:4.22.4" - "@rollup/rollup-win32-x64-msvc": "npm:4.22.4" - "@types/estree": "npm:1.0.5" + checksum: 10c0/a1fa26f21f0d6cf93b6d05ea284ad5854905b585f28a14c27d439b0f9b859cba13ea25f376303d86770e59b4686bedc52b4706e57442514f0414c6fd3c5b8e71 + languageName: node + linkType: hard + +"rollup@npm:^4.18.0, rollup@npm:^4.20.0": + version: 4.27.3 + resolution: "rollup@npm:4.27.3" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.27.3" + "@rollup/rollup-android-arm64": "npm:4.27.3" + "@rollup/rollup-darwin-arm64": "npm:4.27.3" + "@rollup/rollup-darwin-x64": "npm:4.27.3" + "@rollup/rollup-freebsd-arm64": "npm:4.27.3" + "@rollup/rollup-freebsd-x64": "npm:4.27.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.27.3" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.27.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.27.3" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.27.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-s390x-gnu": "npm:4.27.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-x64-musl": "npm:4.27.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.27.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.27.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.27.3" + "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -17564,6 +18325,10 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true "@rollup/rollup-linux-arm-musleabihf": @@ -17592,25 +18357,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/4c96b6e2e0c5dbe73b4ba899cea894a05115ab8c65ccff631fbbb944e2b3a9f2eb3b99c2dce3dd91b179647df1892ffc44ecee29381ccf155ba8000b22712a32 - languageName: node - linkType: hard - -"rpc-websockets@npm:^7.11.0": - version: 7.11.0 - resolution: "rpc-websockets@npm:7.11.0" - dependencies: - bufferutil: "npm:^4.0.1" - eventemitter3: "npm:^4.0.7" - utf-8-validate: "npm:^5.0.2" - uuid: "npm:^8.3.2" - ws: "npm:^8.5.0" - dependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/d643c050e914147a214ee167afb04ee145bfec888f771265cc3ec90acfc1c84cdcb18f802f359f142fdb18ed8e529bd64829ba6523f3db235e5b4bbd52370c21 + checksum: 10c0/789885d3f852ed7ca45bed14194a2ac7a2cf16b6b62b54f691c79e27d5557d31a2d612d3680c26c527a1957e0bd6811806ddd765e0dae589404cf24544ff2838 languageName: node linkType: hard @@ -17630,15 +18377,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^6.6.3": - version: 6.6.7 - resolution: "rxjs@npm:6.6.7" - dependencies: - tslib: "npm:^1.9.0" - checksum: 10c0/e556a13a9aa89395e5c9d825eabcfa325568d9c9990af720f3f29f04a888a3b854f25845c2b55875d875381abcae2d8100af9cacdc57576e7ed6be030a01d2fe - languageName: node - linkType: hard - "rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" @@ -17686,9 +18424,9 @@ __metadata: linkType: hard "safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 10c0/81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 languageName: node linkType: hard @@ -17699,16 +18437,7 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd - languageName: node - linkType: hard - -"scheduler@npm:^0.23.2": +"scheduler@npm:^0.23.0, scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" dependencies: @@ -17725,14 +18454,14 @@ __metadata: linkType: hard "secp256k1@npm:^4.0.2": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" + version: 4.0.4 + resolution: "secp256k1@npm:4.0.4" dependencies: - elliptic: "npm:^6.5.4" - node-addon-api: "npm:^2.0.0" + elliptic: "npm:^6.5.7" + node-addon-api: "npm:^5.0.0" node-gyp: "npm:latest" node-gyp-build: "npm:^4.2.0" - checksum: 10c0/de0a0e525a6f8eb2daf199b338f0797dbfe5392874285a145bb005a72cabacb9d42c0197d0de129a1a0f6094d2cc4504d1f87acb6a8bbfb7770d4293f252c401 + checksum: 10c0/cf7a74343566d4774c64332c07fc2caf983c80507f63be5c653ff2205242143d6320c50ee4d793e2b714a56540a79e65a8f0056e343b25b0cdfed878bc473fd8 languageName: node linkType: hard @@ -17763,13 +18492,6 @@ __metadata: languageName: node linkType: hard -"ses@npm:^0.18.4": - version: 0.18.4 - resolution: "ses@npm:0.18.4" - checksum: 10c0/d0d3e296bed05eb6cfc0afee7b41f78b85d599cb1c9a8decc77ada79c6fafdf766e7e0085f8112776de59d62b6a774db6fc85d5049778e596e3c9841a8c003bf - languageName: node - linkType: hard - "ses@npm:^0.18.5, ses@npm:^0.18.8": version: 0.18.8 resolution: "ses@npm:0.18.8" @@ -17779,7 +18501,7 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.10.0": +"ses@npm:^1.10.0, ses@npm:^1.8.0": version: 1.10.0 resolution: "ses@npm:1.10.0" dependencies: @@ -17788,15 +18510,6 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.8.0": - version: 1.8.0 - resolution: "ses@npm:1.8.0" - dependencies: - "@endo/env-options": "npm:^1.1.6" - checksum: 10c0/4b2114e586a547dd2a71477e0a42e8ea5d0ea9c3ff135d0dbfb63569eeda19c7152db76b82bcad12a2969d3f5fb09e5fa52e921b5a2831560e6876ca1f9ba207 - languageName: node - linkType: hard - "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -17818,7 +18531,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -17865,7 +18578,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": +"side-channel@npm:^1.0.4": version: 1.0.6 resolution: "side-channel@npm:1.0.6" dependencies: @@ -18008,10 +18721,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard @@ -18054,9 +18767,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.17 - resolution: "spdx-license-ids@npm:3.0.17" - checksum: 10c0/ddf9477b5afc70f1a7d3bf91f0b8e8a1c1b0fa65d2d9a8b5c991b1a2ba91b693d8b9749700119d5ce7f3fbf307ac421087ff43d321db472605e98a5804f80eac + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c languageName: node linkType: hard @@ -18119,19 +18832,9 @@ __metadata: linkType: hard "std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10c0/60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e - languageName: node - linkType: hard - -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: "npm:~2.0.4" - readable-stream: "npm:^3.5.0" - checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10c0/f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 languageName: node linkType: hard @@ -18171,6 +18874,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.9": version: 1.2.9 resolution: "string.prototype.trim@npm:1.2.9" @@ -18276,7 +18990,7 @@ __metadata: languageName: node linkType: hard -"sucrase@npm:^3.32.0": +"sucrase@npm:^3.35.0": version: 3.35.0 resolution: "sucrase@npm:3.35.0" dependencies: @@ -18294,13 +19008,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^0.14.2": - version: 0.14.2 - resolution: "superstruct@npm:0.14.2" - checksum: 10c0/e5518f6701524fb8cbae504a84dc9c304bf3fe01616230a5eb4e14af9bfc4e3518b94bfe457e57a5d1b99a2b54f82881b4a39e0b266caa6053f84aa294613b94 - languageName: node - linkType: hard - "superstruct@npm:^1.0.3": version: 1.0.4 resolution: "superstruct@npm:1.0.4" @@ -18320,15 +19027,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -18371,12 +19069,12 @@ __metadata: linkType: hard "synckit@npm:^0.9.1": - version: 0.9.1 - resolution: "synckit@npm:0.9.1" + version: 0.9.2 + resolution: "synckit@npm:0.9.2" dependencies: "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: 10c0/d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e + checksum: 10c0/e0c262817444e5b872708adb6f5ad37951ba33f6b2d1d4477d45db1f57573a784618ceed5e6614e0225db330632b1f6b95bb74d21e4d013e45ad4bde03d0cb59 languageName: node linkType: hard @@ -18408,35 +19106,35 @@ __metadata: linkType: hard "tailwindcss@npm:^3.4.1": - version: 3.4.3 - resolution: "tailwindcss@npm:3.4.3" + version: 3.4.15 + resolution: "tailwindcss@npm:3.4.15" dependencies: "@alloc/quick-lru": "npm:^5.2.0" arg: "npm:^5.0.2" - chokidar: "npm:^3.5.3" + chokidar: "npm:^3.6.0" didyoumean: "npm:^1.2.2" dlv: "npm:^1.1.3" - fast-glob: "npm:^3.3.0" + fast-glob: "npm:^3.3.2" glob-parent: "npm:^6.0.2" is-glob: "npm:^4.0.3" - jiti: "npm:^1.21.0" + jiti: "npm:^1.21.6" lilconfig: "npm:^2.1.0" - micromatch: "npm:^4.0.5" + micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" object-hash: "npm:^3.0.0" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.23" + picocolors: "npm:^1.1.1" + postcss: "npm:^8.4.47" postcss-import: "npm:^15.1.0" postcss-js: "npm:^4.0.1" - postcss-load-config: "npm:^4.0.1" - postcss-nested: "npm:^6.0.1" - postcss-selector-parser: "npm:^6.0.11" - resolve: "npm:^1.22.2" - sucrase: "npm:^3.32.0" + postcss-load-config: "npm:^4.0.2" + postcss-nested: "npm:^6.2.0" + postcss-selector-parser: "npm:^6.1.2" + resolve: "npm:^1.22.8" + sucrase: "npm:^3.35.0" bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 10c0/11e5546494f2888f693ebaa271b218b3a8e52fe59d7b629e54f2dffd6eaafd5ded2e9f0c37ad04e6a866dffb2b116d91becebad77e1441beee8bf016bb2392f9 + checksum: 10c0/709058837c5adf0b7e1386ba353983dcf2af3d390e8822fac8d53ecaaad0f6f040fd3050b1db636e2abd46ae775317a89b350ce925477ea96cca8f6c56d901df languageName: node linkType: hard @@ -18495,13 +19193,6 @@ __metadata: languageName: node linkType: hard -"text-encoding-utf-8@npm:^1.0.2": - version: 1.0.2 - resolution: "text-encoding-utf-8@npm:1.0.2" - checksum: 10c0/87a64b394c850e8387c2ca7fc6929a26ce97fb598f1c55cd0fdaec4b8e2c3ed6770f65b2f3309c9175ef64ac5e403c8e48b53ceeb86d2897940c5e19cc00bb99 - languageName: node - linkType: hard - "text-hex@npm:1.0.x": version: 1.0.0 resolution: "text-hex@npm:1.0.0" @@ -18543,7 +19234,7 @@ __metadata: languageName: node linkType: hard -"through@npm:>=2.2.7 <3, through@npm:^2.3.6": +"through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc @@ -18558,8 +19249,8 @@ __metadata: linkType: hard "tiny-secp256k1@npm:^1.1.3": - version: 1.1.6 - resolution: "tiny-secp256k1@npm:1.1.6" + version: 1.1.7 + resolution: "tiny-secp256k1@npm:1.1.7" dependencies: bindings: "npm:^1.3.0" bn.js: "npm:^4.11.8" @@ -18567,7 +19258,7 @@ __metadata: elliptic: "npm:^6.4.0" nan: "npm:^2.13.2" node-gyp: "npm:latest" - checksum: 10c0/b47ceada38f6fa65190906e8a98b58d1584b0640383f04db8196a7098c726e926cfba6271a53e97d98d4c67e2b364618d7b3d7e402f63e44f0e07a4aca82ac8b + checksum: 10c0/3e2abe9e77676be0e233042f101cedef44da167290b12c4130489b6c6f7f52c497d8a13c39119fa15ed68411e5de02afa4a0f2e678958b6936576c422acc7c74 languageName: node linkType: hard @@ -18594,13 +19285,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -18639,20 +19323,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" - peerDependencies: - typescript: ">=4.2.0" - checksum: 10c0/f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c - languageName: node - linkType: hard - -"ts-api-utils@npm:~1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.4.0 + resolution: "ts-api-utils@npm:1.4.0" peerDependencies: typescript: ">=4.2.0" - checksum: 10c0/9408338819c3aca2a709f0bc54e3f874227901506cacb1163612a6c8a43df224174feb965a5eafdae16f66fc68fd7bfee8d3275d0fa73fbb8699e03ed26520c9 + checksum: 10c0/1b2bfa50ea52771d564bb143bb69010d25cda03ed573095fbac9b86f717012426443af6647e00e3db70fca60360482a30c1be7cf73c3521c321f6bf5e3594ea0 languageName: node linkType: hard @@ -18711,8 +19386,8 @@ __metadata: linkType: hard "tsconfck@npm:^3.0.3": - version: 3.0.3 - resolution: "tsconfck@npm:3.0.3" + version: 3.1.4 + resolution: "tsconfck@npm:3.1.4" peerDependencies: typescript: ^5.0.0 peerDependenciesMeta: @@ -18720,7 +19395,7 @@ __metadata: optional: true bin: tsconfck: bin/tsconfck.js - checksum: 10c0/d45009230c4caa5fc765bdded96f3b8703a7cdd44a1d63024914b0fb1c4dabf9e94d28cc9f9edccaef9baa7b99adc963502d34943d82fcb07b92e1161ee03c56 + checksum: 10c0/5120e91b3388574b449d57d08f45d05d9966cf4b9d6aa1018652c1fff6d7d37b1ed099b07e6ebf6099aa40b8a16968dd337198c55b7274892849112b942861ed languageName: node linkType: hard @@ -18737,34 +19412,34 @@ __metadata: linkType: hard "tsimp@npm:^2.0.10": - version: 2.0.11 - resolution: "tsimp@npm:2.0.11" + version: 2.0.12 + resolution: "tsimp@npm:2.0.12" dependencies: "@isaacs/cached": "npm:^1.0.1" "@isaacs/catcher": "npm:^1.0.4" foreground-child: "npm:^3.1.1" mkdirp: "npm:^3.0.1" pirates: "npm:^4.0.6" - rimraf: "npm:^5.0.5" + rimraf: "npm:^6.0.1" signal-exit: "npm:^4.1.0" sock-daemon: "npm:^1.4.2" - walk-up-path: "npm:^3.0.1" + walk-up-path: "npm:^4.0.0" peerDependencies: typescript: ^5.1.0 bin: tsimp: dist/esm/bin.mjs - checksum: 10c0/20743dc21ce31678050582903bfcd2d600fa17305f70162cb4127f2fd208116354549a921574f6c26cdfca5cb07c24526094e5519bb294f2ddd13c06cd2f43eb + checksum: 10c0/c56c03a6a4df3ab5ebcefcc0b473992cbb7150173c331be6bda01670d5ae3965e65f30c42757cd391100a1c21485e167a05a350d875f41826b35c45008e5fac8 languageName: node linkType: hard -"tslib@npm:1 || 2, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb +"tslib@npm:1 || 2, tslib@npm:2, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.6.2, tslib@npm:^2.8.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard -"tslib@npm:1.14.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0": +"tslib@npm:1.14.1, tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 @@ -18783,8 +19458,8 @@ __metadata: linkType: hard "tsx@npm:^4.19.1": - version: 4.19.1 - resolution: "tsx@npm:4.19.1" + version: 4.19.2 + resolution: "tsx@npm:4.19.2" dependencies: esbuild: "npm:~0.23.0" fsevents: "npm:~2.3.3" @@ -18794,7 +19469,7 @@ __metadata: optional: true bin: tsx: dist/cli.mjs - checksum: 10c0/cbea9baf57e7406fa0ecc2c03b9bb2501ee740dc28c938f949180a646a28e5d65e7cccbfba340508923bfd45e90320ef9eef7f815cae4515b6ef2ee429edc7ee + checksum: 10c0/63164b889b1d170403e4d8753a6755dec371f220f5ce29a8e88f1f4d6085a784a12d8dc2ee669116611f2c72757ac9beaa3eea5c452796f541bdd2dc11753721 languageName: node linkType: hard @@ -18816,30 +19491,31 @@ __metadata: languageName: node linkType: hard -"type-coverage-core@npm:^2.28.1": - version: 2.28.1 - resolution: "type-coverage-core@npm:2.28.1" +"type-coverage-core@npm:^2.29.7": + version: 2.29.7 + resolution: "type-coverage-core@npm:2.29.7" dependencies: fast-glob: "npm:3" - minimatch: "npm:6 || 7 || 8 || 9" + minimatch: "npm:6 || 7 || 8 || 9 || 10" normalize-path: "npm:3" tslib: "npm:1 || 2" tsutils: "npm:3" peerDependencies: typescript: 2 || 3 || 4 || 5 - checksum: 10c0/b4a90e401be263d426d03b7b95173f3554a6bfdcb8bf098a66d31f94637ee2988db56ffbb50a81e61b3741ea3d43ac2ba6698499efb8679a913d7924308c5e88 + checksum: 10c0/bc13f773b1931fe5afde432c9531d6a0cad3a26fad2c3f4765cf975f1f286b8130e7dffc7dfc2a819d91f7f8238370d5e75dc64d5e94d4804d0119b050e35aad languageName: node linkType: hard "type-coverage@npm:^2.26.3": - version: 2.28.2 - resolution: "type-coverage@npm:2.28.2" + version: 2.29.7 + resolution: "type-coverage@npm:2.29.7" dependencies: + chalk: "npm:4.1.2" minimist: "npm:1" - type-coverage-core: "npm:^2.28.1" + type-coverage-core: "npm:^2.29.7" bin: type-coverage: bin/type-coverage - checksum: 10c0/215665a2b205bc04b2f35e40ede73dd0d19eeecdc01fc3dc67b7c5497498abc9583965930b0a4c573132180ed253c2fe72b833d91c5cdb095209a052ac11df7c + checksum: 10c0/96f701bad0c48f40cc8f976327de047823be9a72f6340def0347fbbdecc1ca497586f04b016cf14a30e22927c4a74ee98c536007f59eb855968e54de42458be5 languageName: node linkType: hard @@ -18948,7 +19624,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.2.2, typescript@npm:^5.5.2, typescript@npm:^5.6.3, typescript@npm:~5.6.3": version: 5.6.3 resolution: "typescript@npm:5.6.3" bin: @@ -18958,17 +19634,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": - version: 5.6.2 - resolution: "typescript@npm:5.6.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/3ed8297a8c7c56b7fec282532503d1ac795239d06e7c4966b42d4330c6cf433a170b53bcf93a130a7f14ccc5235de5560df4f1045eb7f3550b46ebed16d3c5e5 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": +"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin, typescript@patch:typescript@npm%3A~5.6.3#optional!builtin": version: 5.6.3 resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" bin: @@ -18978,27 +19644,28 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": - version: 5.6.2 - resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=74658d" +"ua-parser-js@npm:^1.0.35": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/e6c1662e4852e22fe4bbdca471dca3e3edc74f6f1df043135c44a18a7902037023ccb0abdfb754595ca9028df8920f2f8492c00fc3cbb4309079aae8b7de71cd + ua-parser-js: script/cli.js + checksum: 10c0/c6452b0c683000f10975cb0a7e74cb1119ea95d4522ae85f396fa53b0b17884358a24ffdd86a66030c6b2981bdc502109a618c79fdaa217ee9032c9e46fcc78a languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: 10c0/dac8cf82a55b2e097bd2286954e01454c4cfcf23c9d9b56961ce94bda3cec5a38ca536e6e84c20a4000a9d4b4a4abcbd98ec634ccebe21be36595ea3069126e4 +"ufo@npm:^1.5.4": + version: 1.5.4 + resolution: "ufo@npm:1.5.4" + checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 languageName: node linkType: hard -"ufo@npm:^1.3.2, ufo@npm:^1.4.0, ufo@npm:^1.5.3": - version: 1.5.3 - resolution: "ufo@npm:1.5.3" - checksum: 10c0/1df10702582aa74f4deac4486ecdfd660e74be057355f1afb6adfa14243476cf3d3acff734ccc3d0b74e9bfdefe91d578f3edbbb0a5b2430fe93cd672370e024 +"uint8arrays@npm:3.1.0": + version: 3.1.0 + resolution: "uint8arrays@npm:3.1.0" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 10c0/e54e64593a76541330f0fea97b1b5dea6becbbec3572b9bb88863d064f2630bede4d42eafd457f19c6ef9125f50bfc61053d519c4d71b59c3b7566a0691e3ba2 languageName: node linkType: hard @@ -19037,23 +19704,16 @@ __metadata: languageName: node linkType: hard -"unenv@npm:^1.9.0": - version: 1.9.0 - resolution: "unenv@npm:1.9.0" +"unenv@npm:^1.10.0": + version: 1.10.0 + resolution: "unenv@npm:1.10.0" dependencies: consola: "npm:^3.2.3" - defu: "npm:^6.1.3" + defu: "npm:^6.1.4" mime: "npm:^3.0.0" - node-fetch-native: "npm:^1.6.1" - pathe: "npm:^1.1.1" - checksum: 10c0/d00012badc83731c07f08d5129c702c49c0212375eb3732b27aae89ace3c67162dbaea4496965676f18fc06b0ec445d91385e283f5fd3e4540dda8b0b5424f81 - languageName: node - linkType: hard - -"unfetch@npm:^4.2.0": - version: 4.2.0 - resolution: "unfetch@npm:4.2.0" - checksum: 10c0/a5c0a896a6f09f278b868075aea65652ad185db30e827cb7df45826fe5ab850124bf9c44c4dafca4bf0c55a0844b17031e8243467fcc38dd7a7d435007151f1b + node-fetch-native: "npm:^1.6.4" + pathe: "npm:^1.1.2" + checksum: 10c0/354180647e21204b6c303339e7364b920baadb2672b540a88af267bc827636593e0bf79f59753dcc6b7ab5d4c83e71d69a9171a3596befb8bf77e0bb3c7612b9 languageName: node linkType: hard @@ -19099,33 +19759,33 @@ __metadata: linkType: hard "unstorage@npm:^1.9.0": - version: 1.10.2 - resolution: "unstorage@npm:1.10.2" + version: 1.13.1 + resolution: "unstorage@npm:1.13.1" dependencies: anymatch: "npm:^3.1.3" chokidar: "npm:^3.6.0" + citty: "npm:^0.1.6" destr: "npm:^2.0.3" - h3: "npm:^1.11.1" - listhen: "npm:^1.7.2" - lru-cache: "npm:^10.2.0" - mri: "npm:^1.2.0" - node-fetch-native: "npm:^1.6.2" - ofetch: "npm:^1.3.3" - ufo: "npm:^1.4.0" + h3: "npm:^1.13.0" + listhen: "npm:^1.9.0" + lru-cache: "npm:^10.4.3" + node-fetch-native: "npm:^1.6.4" + ofetch: "npm:^1.4.1" + ufo: "npm:^1.5.4" peerDependencies: - "@azure/app-configuration": ^1.5.0 - "@azure/cosmos": ^4.0.0 + "@azure/app-configuration": ^1.7.0 + "@azure/cosmos": ^4.1.1 "@azure/data-tables": ^13.2.2 - "@azure/identity": ^4.0.1 - "@azure/keyvault-secrets": ^4.8.0 - "@azure/storage-blob": ^12.17.0 - "@capacitor/preferences": ^5.0.7 - "@netlify/blobs": ^6.5.0 || ^7.0.0 - "@planetscale/database": ^1.16.0 - "@upstash/redis": ^1.28.4 + "@azure/identity": ^4.5.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.25.0 + "@capacitor/preferences": ^6.0.2 + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 "@vercel/kv": ^1.0.1 idb-keyval: ^6.2.1 - ioredis: ^5.3.2 + ioredis: ^5.4.1 peerDependenciesMeta: "@azure/app-configuration": optional: true @@ -19153,7 +19813,7 @@ __metadata: optional: true ioredis: optional: true - checksum: 10c0/89d61e6b2165ddc78005b8a4a340576877b56b70ec0b318f7cf2e74ee7ab19006036267ba28587100fa7256c573db3bd720700daf6586bbdcad4ed60b64c4284 + checksum: 10c0/809f79b76d8fe0e72579dfee1e17b5fb9faec476d02d5b9ab664b9f6eb8822ddeb14aa1aa6a2bfa8e58cda9db133995d487aaa201882e2d83f703df5c7fc4e73 languageName: node linkType: hard @@ -19170,17 +19830,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.0" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 languageName: node linkType: hard @@ -19249,7 +19909,7 @@ __metadata: languageName: node linkType: hard -"utf-8-validate@npm:^5.0.2, utf-8-validate@npm:^5.0.5": +"utf-8-validate@npm:^5.0.5": version: 5.0.10 resolution: "utf-8-validate@npm:5.0.10" dependencies: @@ -19266,7 +19926,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.4, util@npm:^0.12.5": +"util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -19286,15 +19946,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - "uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" @@ -19350,7 +20001,7 @@ __metadata: languageName: node linkType: hard -"viem@npm:^1.0.0, viem@npm:^1.6.0": +"viem@npm:^1.0.0": version: 1.21.4 resolution: "viem@npm:1.21.4" dependencies: @@ -19371,6 +20022,28 @@ __metadata: languageName: node linkType: hard +"viem@npm:^2.1.1": + version: 2.21.48 + resolution: "viem@npm:2.21.48" + dependencies: + "@noble/curves": "npm:1.6.0" + "@noble/hashes": "npm:1.5.0" + "@scure/bip32": "npm:1.5.0" + "@scure/bip39": "npm:1.4.0" + abitype: "npm:1.0.6" + isows: "npm:1.0.6" + ox: "npm:0.1.2" + webauthn-p256: "npm:0.0.10" + ws: "npm:8.18.0" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/e9b2799535263a859bddda25d962b13d2c76aec191e1849dd0f268c32a43eb65932a05cc5be270c92e19d79aafda73884690c0b0fbdb9311266a01ea3f659082 + languageName: node + linkType: hard + "vite-tsconfig-paths@npm:^4.2.0": version: 4.3.2 resolution: "vite-tsconfig-paths@npm:4.3.2" @@ -19388,8 +20061,8 @@ __metadata: linkType: hard "vite@npm:^4.3.2": - version: 4.5.3 - resolution: "vite@npm:4.5.3" + version: 4.5.5 + resolution: "vite@npm:4.5.5" dependencies: esbuild: "npm:^0.18.10" fsevents: "npm:~2.3.2" @@ -19423,23 +20096,24 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/caeb1eecc0a8e0865782899e2f83d2993a9816562badc1c8291316d80d49b82f12038abd8cb8b8c627b6f369f58dfb25972ef4517d5e6e1b6e1bf7ee5b63a8a6 + checksum: 10c0/cde5a1d80ae61b2c0b2e2a04938e10aa8821a4c2c625f1dcd6eff179f0c9ce98a5b3c8fd62b54a81299568f7747fff4d35ffecc0e7f7ff34d76124d94a24ce9b languageName: node linkType: hard "vite@npm:^5.1.4": - version: 5.2.7 - resolution: "vite@npm:5.2.7" + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: - esbuild: "npm:^0.20.1" + esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.38" - rollup: "npm:^4.13.0" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -19455,6 +20129,8 @@ __metadata: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -19463,7 +20139,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/ca927a8df388f75df194d5a5ba2be4ee46dc1d99d5be277f13c6d1ed4a4df833cc953741ef8e984061ea38b531df84e15e2a9f5deea1626317bcbec63c8ca01c + checksum: 10c0/d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 languageName: node linkType: hard @@ -19488,10 +20164,10 @@ __metadata: languageName: node linkType: hard -"walk-up-path@npm:^3.0.1": - version: 3.0.1 - resolution: "walk-up-path@npm:3.0.1" - checksum: 10c0/3184738e0cf33698dd58b0ee4418285b9c811e58698f52c1f025435a85c25cbc5a63fee599f1a79cb29ca7ef09a44ec9417b16bfd906b1a37c305f7aa20ee5bc +"walk-up-path@npm:^4.0.0": + version: 4.0.0 + resolution: "walk-up-path@npm:4.0.0" + checksum: 10c0/fabe344f91387d1d41df230af962ef18bf703dd4178006d55cd6412caacd187b54440002d4d53a982d4f7f0455567dcffb6d3884533c8b2268928eca3ebd8a19 languageName: node linkType: hard @@ -19504,7 +20180,24 @@ __metadata: languageName: node linkType: hard -"webextension-polyfill@npm:>=0.10.0 <1.0, webextension-polyfill@npm:^0.10.0": +"webauthn-p256@npm:0.0.10": + version: 0.0.10 + resolution: "webauthn-p256@npm:0.0.10" + dependencies: + "@noble/curves": "npm:^1.4.0" + "@noble/hashes": "npm:^1.4.0" + checksum: 10c0/27d836d81a1fec24a31d2d9b652f8ff6876b51940d1003bbd14dc5cfa57c58d84223b5a4eece229516522fd997bc0bc7be618ac42b129fb5fa42fa530060b16d + languageName: node + linkType: hard + +"webextension-polyfill@npm:>=0.10.0 <1.0": + version: 0.12.0 + resolution: "webextension-polyfill@npm:0.12.0" + checksum: 10c0/5ace2aaaf6a203515bdd2fb948622f186a5fbb50099b539ce9c0ad54896f9cc1fcc3c0e2a71d1f7071dd7236d7daebba1e0cbcf43bfdfe54361addf0333ee7d1 + languageName: node + linkType: hard + +"webextension-polyfill@npm:^0.10.0": version: 0.10.0 resolution: "webextension-polyfill@npm:0.10.0" checksum: 10c0/6a45278f1fed8fbd5355f9b19a7b0b3fadc91fa3a6eef69125a1706bb3efa2181235eefbfb3f538443bb396cfcb97512361551888ce8465c08914431cb2d5b6d @@ -19548,38 +20241,6 @@ __metadata: languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" - dependencies: - function.prototype.name: "npm:^1.1.5" - has-tostringtag: "npm:^1.0.0" - is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.0.5" - is-finalizationregistry: "npm:^1.0.2" - is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.1.4" - is-weakref: "npm:^1.0.2" - isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.0.2" - which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.9" - checksum: 10c0/2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4 - languageName: node - linkType: hard - -"which-collection@npm:^1.0.1": - version: 1.0.2 - resolution: "which-collection@npm:1.0.2" - dependencies: - is-map: "npm:^2.0.3" - is-set: "npm:^2.0.3" - is-weakmap: "npm:^2.0.2" - is-weakset: "npm:^2.0.3" - checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 - languageName: node - linkType: hard - "which-module@npm:^2.0.0": version: 2.0.1 resolution: "which-module@npm:2.0.1" @@ -19587,7 +20248,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" dependencies: @@ -19632,13 +20293,13 @@ __metadata: linkType: hard "winston-transport@npm:^4.4.0": - version: 4.7.0 - resolution: "winston-transport@npm:4.7.0" + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" dependencies: - logform: "npm:^2.3.2" - readable-stream: "npm:^3.6.0" + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" triple-beam: "npm:^1.3.0" - checksum: 10c0/cd16f3d0ab56697f93c4899e0eb5f89690f291bb6cf309194819789326a7c7ed943ef00f0b2fab513b114d371314368bde1a7ae6252ad1516181a79f90199cd2 + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 languageName: node linkType: hard @@ -19659,6 +20320,13 @@ __metadata: languageName: node linkType: hard +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -19739,33 +20407,33 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.2.0, ws@npm:^7.4.5, ws@npm:^7.5.1, ws@npm:^7.5.9": - version: 7.5.9 - resolution: "ws@npm:7.5.9" +"ws@npm:8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 10c0/aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 languageName: node linkType: hard -"ws@npm:^8.5.0": - version: 8.17.0 - resolution: "ws@npm:8.17.0" +"ws@npm:^7, ws@npm:^7.2.0, ws@npm:^7.5.1, ws@npm:^7.5.9": + version: 7.5.10 + resolution: "ws@npm:7.5.10" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 10c0/55241ec93a66fdfc4bf4f8bc66c8eb038fda2c7a4ee8f6f157f2ca7dc7aa76aea0c0da0bf3adb2af390074a70a0e45456a2eaf80e581e630b75df10a64b0a990 + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d languageName: node linkType: hard @@ -19815,11 +20483,11 @@ __metadata: linkType: hard "yaml@npm:^2.3.4": - version: 2.4.1 - resolution: "yaml@npm:2.4.1" + version: 2.6.1 + resolution: "yaml@npm:2.6.1" bin: yaml: bin.mjs - checksum: 10c0/816057dbaea16a7dfb0b868ace930f143dece96bbb4c4fbb6f38aa389166f897240d9fa535dbfd6b1b0d9442416f4abcc698e63f82394d0c67b329aa6c2be576 + checksum: 10c0/aebf07f61c72b38c74d2b60c3a3ccf89ee4da45bcd94b2bfb7899ba07a5257625a7c9f717c65a6fc511563d48001e01deb1d9e55f0133f3e2edf86039c8c1be7 languageName: node linkType: hard @@ -19889,9 +20557,9 @@ __metadata: linkType: hard "yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 10c0/856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 languageName: node linkType: hard From d7091c93ecb337c10455ada3e41083883a366e6b Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 15:17:25 +0500 Subject: [PATCH 14/31] fixup! files relocation --- contract/,tx.json | 182 --------- contract/Makefile | 4 +- contract/rollup.config.mjs | 2 +- contract/src/auto-stake-it.contract.js | 4 +- contract/src/builder/init-orca.js | 2 +- contract/src/cosmos-api.ts | 350 ++++++++++++++++++ contract/src/exos/chain-hub.js | 2 +- .../src/exos/cosmos-orchestration-account.js | 8 +- contract/src/exos/exo-interfaces.ts | 2 +- contract/src/exos/ica-account-kit.js | 4 +- contract/src/exos/icq-connection-kit.js | 2 +- .../src/exos/local-orchestration-account.js | 8 +- .../{orca.contract.ts => orca.contract.js} | 48 ++- contract/src/{orca.flows.ts => orca.flows.js} | 41 +- contract/src/orca.proposal.js | 2 +- contract/src/orchestration-api.ts | 282 ++++++++++++++ contract/src/utils/address.js | 103 ------ contract/src/utils/amounts.js | 59 --- contract/src/utils/cosmos.js | 82 ---- contract/src/utils/denomHash.js | 22 -- contract/src/utils/orc.js | 38 -- contract/src/utils/orchestrationAccount.js | 40 -- contract/src/utils/packet.js | 112 ------ contract/src/utils/registry.js | 130 ------- contract/src/utils/start-helper.js | 214 ----------- contract/src/utils/time.js | 48 --- contract/src/utils/zcf-tools.js | 35 -- contract/src/utils/zoe-tools.js | 186 ---------- contract/test/auto-stake-it.contract.test.ts | 2 +- contract/test/bundle-source.test.js | 2 +- contract/test/old_network-fakes.js | 268 -------------- contract/test/orca-contract.test.js | 4 +- contract/tools/ibc-mocks.ts | 2 +- contract/utils/address.js | 2 +- contract/utils/start-helper.js | 16 +- contract/utils/zcf-tools.js | 2 +- 36 files changed, 722 insertions(+), 1588 deletions(-) delete mode 100644 contract/,tx.json create mode 100644 contract/src/cosmos-api.ts rename contract/src/{orca.contract.ts => orca.contract.js} (77%) rename contract/src/{orca.flows.ts => orca.flows.js} (69%) create mode 100644 contract/src/orchestration-api.ts delete mode 100644 contract/src/utils/address.js delete mode 100644 contract/src/utils/amounts.js delete mode 100644 contract/src/utils/cosmos.js delete mode 100644 contract/src/utils/denomHash.js delete mode 100644 contract/src/utils/orc.js delete mode 100644 contract/src/utils/orchestrationAccount.js delete mode 100644 contract/src/utils/packet.js delete mode 100644 contract/src/utils/registry.js delete mode 100644 contract/src/utils/start-helper.js delete mode 100644 contract/src/utils/time.js delete mode 100644 contract/src/utils/zcf-tools.js delete mode 100644 contract/src/utils/zoe-tools.js delete mode 100644 contract/test/old_network-fakes.js diff --git a/contract/,tx.json b/contract/,tx.json deleted file mode 100644 index 3614dd03..00000000 --- a/contract/,tx.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "height": "1007", - "txhash": "13E7554F159251539A014512706124416E5A14781CB4C64497F0BB137372CF96", - "codespace": "", - "code": 0, - "data": "12260A242F636F736D6F732E62616E6B2E763162657461312E4D736753656E64526573706F6E7365", - "raw_log": "[{\"msg_index\":0,\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk\"},{\"key\":\"amount\",\"value\":\"1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl\"},{\"key\":\"amount\",\"value\":\"1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/cosmos.bank.v1beta1.MsgSend\"},{\"key\":\"sender\",\"value\":\"agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk\"},{\"key\":\"sender\",\"value\":\"agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl\"},{\"key\":\"amount\",\"value\":\"1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA\"}]}]}]", - "logs": [ - { - "msg_index": 0, - "log": "", - "events": [ - { - "type": "coin_received", - "attributes": [ - { - "key": "receiver", - "value": "agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk" - }, - { - "key": "amount", - "value": "1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA" - } - ] - }, - { - "type": "coin_spent", - "attributes": [ - { - "key": "spender", - "value": "agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl" - }, - { - "key": "amount", - "value": "1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA" - } - ] - }, - { - "type": "message", - "attributes": [ - { "key": "action", "value": "/cosmos.bank.v1beta1.MsgSend" }, - { - "key": "sender", - "value": "agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl" - }, - { "key": "module", "value": "bank" } - ] - }, - { - "type": "transfer", - "attributes": [ - { - "key": "recipient", - "value": "agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk" - }, - { - "key": "sender", - "value": "agoric1estsewt6jqsx77pwcxkn5ah0jqgu8rhgflwfdl" - }, - { - "key": "amount", - "value": "1000000000ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA" - } - ] - } - ] - } - ], - "info": "", - "gas_wanted": "93980", - "gas_used": "75297", - "tx": null, - "timestamp": "", - "events": [ - { - "type": "tx", - "attributes": [ - { "key": "ZmVl", "value": "", "index": true }, - { - "key": "ZmVlX3BheWVy", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - } - ] - }, - { - "type": "tx", - "attributes": [ - { - "key": "YWNjX3NlcQ==", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRsLzU3", - "index": true - } - ] - }, - { - "type": "tx", - "attributes": [ - { - "key": "c2lnbmF0dXJl", - "value": "Vks3cTlTN09BSUt3eEhnNnhyR2p6WEwvcGNiWUZQTlBITmd0Z0draVBnZzZSaDY2bXljVFA3M2traERmTzhuMVFkajB4TEh2WnhWekpjWTRZcTRaekE9PQ==", - "index": true - } - ] - }, - { - "type": "message", - "attributes": [ - { - "key": "YWN0aW9u", - "value": "L2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZA==", - "index": true - } - ] - }, - { - "type": "coin_spent", - "attributes": [ - { - "key": "c3BlbmRlcg==", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - }, - { - "key": "YW1vdW50", - "value": "MTAwMDAwMDAwMGliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZB", - "index": true - } - ] - }, - { - "type": "coin_received", - "attributes": [ - { - "key": "cmVjZWl2ZXI=", - "value": "YWdvcmljMXJ3d2xleTU1MGs5bW1rNnVxNm1tNno0dWRyZzhreXV5dmZzempr", - "index": true - }, - { - "key": "YW1vdW50", - "value": "MTAwMDAwMDAwMGliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZB", - "index": true - } - ] - }, - { - "type": "transfer", - "attributes": [ - { - "key": "cmVjaXBpZW50", - "value": "YWdvcmljMXJ3d2xleTU1MGs5bW1rNnVxNm1tNno0dWRyZzhreXV5dmZzempr", - "index": true - }, - { - "key": "c2VuZGVy", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - }, - { - "key": "YW1vdW50", - "value": "MTAwMDAwMDAwMGliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZB", - "index": true - } - ] - }, - { - "type": "message", - "attributes": [ - { - "key": "c2VuZGVy", - "value": "YWdvcmljMWVzdHNld3Q2anFzeDc3cHdjeGtuNWFoMGpxZ3U4cmhnZmx3ZmRs", - "index": true - } - ] - }, - { - "type": "message", - "attributes": [{ "key": "bW9kdWxl", "value": "YmFuaw==", "index": true }] - } - ] -} diff --git a/contract/Makefile b/contract/Makefile index 02f3c517..0340cb49 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -254,9 +254,9 @@ build: buildc: kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn build:deployer" deployc: - kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn node scripts/deploy-contract.js --install src/orca.contract.ts --eval src/orca.proposal.js" + kubectl exec -i agoriclocal-genesis-0 -c validator -- bash -c "yarn node scripts/deploy-contract.js --install src/orca.contract.js --eval src/orca.proposal.js" deploy: - yarn node scripts/deploy-contract.js --install src/orca.contract.ts --eval src/orca.proposal.js + yarn node scripts/deploy-contract.js --install src/orca.contract.js --eval src/orca.proposal.js test-orca: yarn test ./test/orca-contract.test.js diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index bffb741a..7c5f8836 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -38,7 +38,7 @@ import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js const config1 = ({ name, coreEntry = `./src/${name}.proposal.js`, - contractEntry = `./src/${name}.contract.ts`, + contractEntry = `./src/${name}.contract.js`, coreScript = `bundles/deploy-${name}.js`, coreScriptOptions = undefined, permitFile = `deploy-${name}-permit.json`, diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js index a78f7bb5..7a365c07 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/auto-stake-it.contract.js @@ -5,13 +5,13 @@ import { import { M } from '@endo/patterns'; import { prepareChainHubAdmin } from './exos/chain-hub-admin.js'; import { preparePortfolioHolder } from './exos/portfolio-holder-kit.js'; -import { withOrchestration } from './utils/start-helper.js'; +import { withOrchestration } from '../utils/start-helper.js'; import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; import * as flows from './auto-stake-it.flows.js'; /** * @import {Zone} from '@agoric/zone'; - * @import {OrchestrationPowers, OrchestrationTools} from './utils/start-helper.js'; + * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; * @import { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; */ diff --git a/contract/src/builder/init-orca.js b/contract/src/builder/init-orca.js index 2aed4f23..7d701a95 100644 --- a/contract/src/builder/init-orca.js +++ b/contract/src/builder/init-orca.js @@ -48,7 +48,7 @@ export const defaultProposalBuilder = async ( getManifestForOrca.name, { installKeys: { - orca: publishRef(install('../../src/orca.contract.ts')), + orca: publishRef(install('../../src/orca.contract.js')), }, chainDetails, }, diff --git a/contract/src/cosmos-api.ts b/contract/src/cosmos-api.ts new file mode 100644 index 00000000..83d97c9e --- /dev/null +++ b/contract/src/cosmos-api.ts @@ -0,0 +1,350 @@ +import type { AnyJson, TypedJson, JsonSafe } from '@agoric/cosmic-proto'; +import type { + Delegation, + DelegationResponse, + Redelegation, + RedelegationResponse, + UnbondingDelegation, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; +import type { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import type { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; +import type { FungibleTokenPacketData } from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; +import type { + State as IBCChannelState, + Order, +} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import type { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; +import type { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import type { Brand, Purse, Payment, Amount } from '@agoric/ertp/src/types.js'; +import type { Port } from '@agoric/network'; +import type { + IBCChannelID, + IBCConnectionID, + VTransferIBCEvent, +} from '@agoric/vats'; +import type { + TargetApp, + TargetRegistration, +} from '@agoric/vats/src/bridge-target.js'; +import type { + LocalIbcAddress, + RemoteIbcAddress, +} from '@agoric/vats/tools/ibc-utils.js'; +import type { QueryDelegationTotalRewardsResponse } from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; +import type { AmountArg, ChainAddress, Denom, DenomAmount } from './types.js'; + +/** An address for a validator on some blockchain, e.g., cosmos, eth, etc. */ +export type CosmosValidatorAddress = ChainAddress & { + // infix for Validator Operator https://docs.cosmos.network/main/learn/beginner/accounts#addresses + value: `${string}valoper${string}`; + encoding: 'bech32'; +}; + +/** Represents an IBC Connection between two chains, which can contain multiple Channels. */ +export interface IBCConnectionInfo { + id: IBCConnectionID; // e.g. connection-0 + client_id: string; // '07-tendermint-0' + state: IBCConnectionState; + counterparty: { + client_id: string; + connection_id: IBCConnectionID; + }; + transferChannel: { + portId: string; + channelId: IBCChannelID; + counterPartyPortId: string; + counterPartyChannelId: IBCChannelID; + ordering: Order; + state: IBCChannelState; + version: string; // e.eg. 'ics20-1' + }; +} + +/** + * https://github.com/cosmos/chain-registry/blob/master/assetlist.schema.json + */ +export interface CosmosAssetInfo extends Record { + base: Denom; + name: string; + display: string; + symbol: string; + denom_units: Array<{ denom: Denom; exponent: number }>; + traces?: Array<{ + type: 'ibc'; + counterparty: { + chain_name: string; + base_denom: Denom; + channel_id: IBCChannelID; + }; + chain: { + channel_id: IBCChannelID; + path: string; + }; + }>; +} + +/** + * Info for a Cosmos-based chain. + */ +export type CosmosChainInfo = Readonly<{ + /** can be used to lookup chainInfo (chainId) from an address value */ + bech32Prefix?: string; + chainId: string; + + connections?: Record; // chainId or wellKnownName + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled?: boolean; + + /** + * cf https://github.com/cosmos/chain-registry/blob/master/chain.schema.json#L117 + */ + stakingTokens?: Readonly>; +}>; + +// #region Orchestration views on Cosmos response types +// Naming scheme: Cosmos for the chain system, Rewards b/c getRewards function, +// and Response because it's the return value. + +/** @see {QueryDelegationTotalRewardsResponse} */ +export interface CosmosRewardsResponse { + rewards: { validator: CosmosValidatorAddress; reward: DenomAmount[] }[]; + total: DenomAmount[]; +} + +/** @see {DelegationResponse} */ +export interface CosmosDelegationResponse { + delegator: ChainAddress; + validator: CosmosValidatorAddress; + amount: DenomAmount; +} +// #endregion + +/** + * Queries for the staking properties of an account. + * + * @see {@link https://docs.cosmos.network/main/build/modules/staking#messages x/staking messages} + * {@link https://cosmos.github.io/cosmjs/latest/stargate/interfaces/StakingExtension.html StakingExtension} in cosmjs + */ +export interface StakingAccountQueries { + /** + * @returns all active delegations from the account to any validator (or [] if none) + */ + getDelegations: () => Promise; + + /** + * @returns the active delegation from the account to a specific validator. Return an + * empty Delegation if there is no delegation. + */ + getDelegation: ( + validator: CosmosValidatorAddress, + ) => Promise; + + /** + * @returns the unbonding delegations from the account to any validator (or [] if none) + */ + getUnbondingDelegations: () => Promise; + + /** + * @returns the unbonding delegations from the account to a specific validator (or [] if none) + */ + getUnbondingDelegation: ( + validator: CosmosValidatorAddress, + ) => Promise; + + getRedelegations: () => Promise; + + /** + * Get the pending rewards for the account. + * @returns the amounts of the account's rewards pending from all validators + */ + getRewards: () => Promise; + + /** + * Get the rewards pending with a specific validator. + * @param validator - the validator address to query for + * @returns the amount of the account's rewards pending from a specific validator + */ + getReward: (validator: CosmosValidatorAddress) => Promise; +} + +/** + * Transactions for doing staking operations on an individual account. + * + * @see {@link https://docs.cosmos.network/main/build/modules/staking#messages x/staking messages} and + * {@link https://cosmos.github.io/cosmjs/latest/stargate/interfaces/StakingExtension.html StakingExtension} in cosmjs + */ +export interface StakingAccountActions { + /** + * Delegate an amount to a validator. The promise settles when the delegation is complete. + * @param validator - the validator to delegate to + * @param amount - the amount to delegate + * @returns void + */ + delegate: ( + validator: CosmosValidatorAddress, + amount: AmountArg, + ) => Promise; + + /** + * Redelegate from one delegator to another. + * Settles when the redelegation is established, not 21 days later. + * @param srcValidator - the current validator for the delegation. + * @param dstValidator - the validator that will receive the delegation. + * @param amount - how much to redelegate. + * @returns + */ + redelegate: ( + srcValidator: CosmosValidatorAddress, + dstValidator: CosmosValidatorAddress, + amount: AmountArg, + ) => Promise; + + /** + * Undelegate multiple delegations (concurrently). To delegate independently, pass an array with one item. + * Resolves when the undelegation is complete and the tokens are no longer bonded. Note it may take weeks. + * The unbonding time is padded by 10 minutes to account for clock skew. + * @param delegations - the delegation to undelegate + */ + undelegate: ( + delegations: { + amount: AmountArg; + delegator?: ChainAddress; + validator: CosmosValidatorAddress; + }[], + ) => Promise; + + /** + * Withdraw rewards from all validators. The promise settles when the rewards are withdrawn. + * @returns The total amounts of rewards withdrawn + */ + withdrawRewards: () => Promise; + + /** + * Withdraw rewards from a specific validator. The promise settles when the rewards are withdrawn. + * @param validator - the validator to withdraw rewards from + * @returns + */ + withdrawReward: (validator: CosmosValidatorAddress) => Promise; +} + +/** + * Low level methods from IcaAccount that we pass through to CosmosOrchestrationAccount + */ + +export interface IcaAccountMethods { + /** + * Submit a transaction on behalf of the remote account for execution on the remote chain. + * @param msgs - records for the transaction + * @param [opts] - optional parameters for the Tx, like `timeoutHeight` and `memo` + * @returns acknowledgement string + */ + executeEncodedTx: ( + msgs: AnyJson[], + opts?: Partial>, + ) => Promise; + /** + * Deactivates the ICA account by closing the ICA channel. The `Port` is + * persisted so holders can always call `.reactivate()` to re-establish a new + * channel with the same chain address. + * CAVEAT: Does not retrieve assets so they may be lost if left. + * @throws {Error} if connection is not available or already deactivated + */ + deactivate: () => Promise; + /** + * Reactivates the ICA account by re-establishing a new channel with the + * original Port and requested address. + * If a channel is closed for an unexpected reason, such as a packet timeout, + * an automatic attempt to re will be made and the holder should not need + * to call `.reactivate()`. + * @throws {Error} if connection is currently active + */ + reactivate: () => Promise; +} + +/** + * Low level object that supports queries and operations for an account on a remote chain. + */ +export interface IcaAccount extends IcaAccountMethods { + /** + * @returns the address of the account on the remote chain + */ + getAddress: () => ChainAddress; + + /** + * Submit a transaction on behalf of the remote account for execution on the remote chain. + * @param msgs - records for the transaction + * @returns acknowledgement string + */ + executeTx: (msgs: TypedJson[]) => Promise; + /** @returns the address of the remote channel */ + getRemoteAddress: () => RemoteIbcAddress; + /** @returns the address of the local channel */ + getLocalAddress: () => LocalIbcAddress; + /** @returns the port the ICA channel is bound to */ + getPort: () => Port; +} + +/** Methods on chains that support Liquid Staking */ +export interface LiquidStakingMethods { + liquidStake: (amount: AmountArg) => Promise; +} + +// TODO support StakingAccountQueries +/** Methods supported only on Agoric chain accounts */ +export interface LocalAccountMethods extends StakingAccountActions { + /** deposit payment (from zoe, for example) to the account */ + deposit: (payment: Payment<'nat'>) => Promise>; + /** withdraw a Payment from the account */ + withdraw: (amount: Amount<'nat'>) => Promise>; + /** + * Register a handler that receives an event each time ICS-20 transfers are + * sent or received by the underlying account. + * + * Handler includes {@link VTransferIBCEvent} and + * {@link FungibleTokenPacketData} that can be used for application logic. + * + * Each account may be associated with at most one handler at a given time. + * + * Does not grant the handler the ability to intercept a transfer. For a + * blocking handler, aka 'IBC Hooks', leverage `registerActiveTap` from + * `transferMiddleware` directly. + * + * @param tap + */ + monitorTransfers: (tap: TargetApp) => Promise; +} + +/** + * Options for {@link OrchestrationAccountI} `transfer` method. + * + * @see {@link https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures ICS 20 Data Structures} + */ +export interface IBCMsgTransferOptions { + timeoutHeight?: MsgTransfer['timeoutHeight']; + timeoutTimestamp?: MsgTransfer['timeoutTimestamp']; + memo?: string; +} + +/** + * Cosmos-specific methods to extend `OrchestrationAccountI`, parameterized + * by `CosmosChainInfo`. + * + * In particular, if the chain info includes a staking token, {@link StakingAccountActions} + * are available. + * + * @see {OrchestrationAccountI} + */ +export type CosmosChainAccountMethods = + IcaAccountMethods & + (CCI extends { + stakingTokens: {}; + } + ? StakingAccountActions & StakingAccountQueries + : {}); + +export type ICQQueryFunction = ( + msgs: JsonSafe[], +) => Promise[]>; diff --git a/contract/src/exos/chain-hub.js b/contract/src/exos/chain-hub.js index 368ce240..a7a31472 100644 --- a/contract/src/exos/chain-hub.js +++ b/contract/src/exos/chain-hub.js @@ -9,7 +9,7 @@ import { CosmosChainInfoShape, IBCConnectionInfoShape, } from '../typeGuards.js'; -import { getBech32Prefix } from '../utils/address.js'; +import { getBech32Prefix } from '../../utils/address.js'; /** * @import {NameHub} from '@agoric/vats'; diff --git a/contract/src/exos/cosmos-orchestration-account.js b/contract/src/exos/cosmos-orchestration-account.js index cc33d39c..837eb2ad 100644 --- a/contract/src/exos/cosmos-orchestration-account.js +++ b/contract/src/exos/cosmos-orchestration-account.js @@ -53,7 +53,7 @@ import { Proto3Shape, TxBodyOptsShape, } from '../typeGuards.js'; -import { coerceCoin, coerceDenom } from '../utils/amounts.js'; +import { coerceCoin, coerceDenom } from '../../utils/amounts.js'; import { maxClockSkew, toCosmosDelegationResponse, @@ -61,9 +61,9 @@ import { toDenomAmount, toTruncatedDenomAmount, tryDecodeResponse, -} from '../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../utils/time.js'; +} from '../../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../../utils/time.js'; /** * @import {HostOf} from '@agoric/async-flow'; diff --git a/contract/src/exos/exo-interfaces.ts b/contract/src/exos/exo-interfaces.ts index 41f321d1..1cf2ffc2 100644 --- a/contract/src/exos/exo-interfaces.ts +++ b/contract/src/exos/exo-interfaces.ts @@ -1,7 +1,7 @@ import type { IBCConnectionID } from '@agoric/vats'; import type { Vow } from '@agoric/vow'; import type { IcaAccount } from '../cosmos-api.js'; -import type { ICAChannelAddressOpts } from '../utils/address.js'; +import type { ICAChannelAddressOpts } from '../../utils/address.js'; import type { ICQConnection } from './icq-connection-kit.js'; /** diff --git a/contract/src/exos/ica-account-kit.js b/contract/src/exos/ica-account-kit.js index 1802666b..920047c8 100644 --- a/contract/src/exos/ica-account-kit.js +++ b/contract/src/exos/ica-account-kit.js @@ -10,8 +10,8 @@ import { Proto3Shape, TxBodyOptsShape, } from '../typeGuards.js'; -import { findAddressField } from '../utils/address.js'; -import { makeTxPacket, parseTxPacket } from '../utils/packet.js'; +import { findAddressField } from '../../utils/address.js'; +import { makeTxPacket, parseTxPacket } from '../../utils/packet.js'; /** * @import {HostOf} from '@agoric/async-flow'; diff --git a/contract/src/exos/icq-connection-kit.js b/contract/src/exos/icq-connection-kit.js index e01e4499..9597d8e2 100644 --- a/contract/src/exos/icq-connection-kit.js +++ b/contract/src/exos/icq-connection-kit.js @@ -4,7 +4,7 @@ import { E } from '@endo/far'; import { M } from '@endo/patterns'; import { VowShape } from '@agoric/vow'; import { NonNullish, makeTracer } from '@agoric/internal'; -import { makeQueryPacket, parseQueryPacket } from '../utils/packet.js'; +import { makeQueryPacket, parseQueryPacket } from '../../utils/packet.js'; import { ICQMsgShape, OutboundConnectionHandlerI } from '../typeGuards.js'; /** diff --git a/contract/src/exos/local-orchestration-account.js b/contract/src/exos/local-orchestration-account.js index bc5e1f2a..65a00d92 100644 --- a/contract/src/exos/local-orchestration-account.js +++ b/contract/src/exos/local-orchestration-account.js @@ -18,12 +18,12 @@ import { TimestampProtoShape, TypedJsonShape, } from '../typeGuards.js'; -import { maxClockSkew, toDenomAmount } from '../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../utils/time.js'; +import { maxClockSkew, toDenomAmount } from '../../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../../utils/time.js'; import { preparePacketTools } from './packet-tools.js'; import { prepareIBCTools } from './ibc-packet.js'; -import { coerceCoin, coerceDenomAmount } from '../utils/amounts.js'; +import { coerceCoin, coerceDenomAmount } from '../../utils/amounts.js'; /** * @import {HostOf} from '@agoric/async-flow'; diff --git a/contract/src/orca.contract.ts b/contract/src/orca.contract.js similarity index 77% rename from contract/src/orca.contract.ts rename to contract/src/orca.contract.js index f9a194e4..22b93311 100644 --- a/contract/src/orca.contract.ts +++ b/contract/src/orca.contract.js @@ -1,20 +1,20 @@ -/// -/// - import { AmountShape } from '@agoric/ertp'; import { makeTracer } from '@agoric/internal'; import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { ChainInfoShape } from '@agoric/orchestration/src/typeGuards.js'; import { InvitationShape } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; -import * as flows from './orca.flows.ts'; - -import type { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; -import type { CosmosChainInfo } from '@agoric/orchestration'; -import type { OrchestrationPowers, OrchestrationTools } from '@agoric/orchestration/src/utils/start-helper.js'; -import type { Zone } from '@agoric/zone'; +import * as flows from './orca.flows.js'; +/** + * @import {Marshaller} from '@agoric/internal/src/lib-chainStorage.js'; + * @import {CosmosChainInfo} from '@agoric/orchestration'; + * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; + * @import {Zone} from '@agoric/zone'; + */ +/// +/// const { entries, keys } = Object; const trace = makeTracer('OrchDev1'); @@ -34,8 +34,8 @@ const OrchestrationPowersShape = M.splitRecord({ agoricNames: M.remotable('agoricNames'), }); - -export const meta: ContractMeta = { +/** @type {ContractMeta} */ +export const meta = { privateArgsShape: M.and( OrchestrationPowersShape, M.splitRecord({ @@ -48,15 +48,23 @@ export const meta: ContractMeta = { }; harden(meta); -type OrcaTerms = { - chainDetails: Record -} - +/** + * @typedef {{ + * chainDetails: Record + * }} OrcaTerms + * + * @param {ZCF} zcf + * @param {OrchestrationPowers & { + * marshaller: Marshaller; + * }} privateArgs + * @param {Zone} zone + * @param {OrchestrationTools} tools + */ const contract = async ( - zcf: ZCF, - privateArgs: OrchestrationPowers & {marshaller: Marshaller}, - zone: Zone, - { orchestrateAll, zoeTools, chainHub }: OrchestrationTools, + zcf, + privateArgs, + zone, + { orchestrateAll, zoeTools, chainHub }, ) => { trace('orca start contract'); @@ -105,4 +113,4 @@ const contract = async ( export const start = withOrchestration(contract); harden(start); -export type OrcaSF = typeof start; \ No newline at end of file +/** @typedef {typeof start} OrcaSF */ diff --git a/contract/src/orca.flows.ts b/contract/src/orca.flows.js similarity index 69% rename from contract/src/orca.flows.ts rename to contract/src/orca.flows.js index f27fbe8f..8349a29d 100644 --- a/contract/src/orca.flows.ts +++ b/contract/src/orca.flows.js @@ -1,6 +1,13 @@ -import type { Orchestrator } from '@agoric/orchestration'; -import type { ZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; -import type { DenomArg } from '@agoric/orchestration'; +/** + * @import {GuestOf} from '@agoric/async-flow'; + * @import {Amount} from '@agoric/ertp/src/types.js'; + * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js'; + * @import {ChainAddress, Orchestrator} from '@agoric/orchestration'; + * @import {ZoeTools} from '@agoric/orchestration/src/utils/zoe-tools.js'; + * @import {Transfer} from './orca.contract.js'; + * @import {DenomArg} from '@agoric/orchestration'; + + */ import { M, mustMatch } from '@endo/patterns'; import { makeTracer } from './debug.js'; @@ -10,13 +17,13 @@ const trace = makeTracer('OrchFlows'); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. + * + * @param {Orchestrator} orch + * @param {unknown} _ctx + * @param {ZCFSeat} seat + * @param {{ chainName: string, denom: string }} offerArgs */ -export const makeAccount = async ( - orch: Orchestrator, - _ctx: unknown, - seat: ZCFSeat, - offerArgs: { chainName: string; denom: string }, -) => { +export const makeAccount = async (orch, _ctx, seat, offerArgs) => { trace('makeAccount'); mustMatch(offerArgs, M.splitRecord({ chainName: M.string() })); const { chainName } = offerArgs; @@ -32,12 +39,18 @@ harden(makeAccount); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. + * + * @param {Orchestrator} orch + * @param {object} ctx + * @param {ZoeTools['localTransfer']} ctx.localTransfer + * @param {ZCFSeat} seat + * @param {{ chainName: string, denom: DenomArg }} offerArgs */ export const makeCreateAndFund = async ( - orch: Orchestrator, - { localTransfer }: { localTransfer: ZoeTools['localTransfer'] }, - seat: ZCFSeat, - { chainName, denom }: { chainName: string; denom: DenomArg }, + orch, + { localTransfer }, + seat, + { chainName, denom }, ) => { trace( `invoked makeCreateAndFund with chain ${chainName}, and denom ${denom}`, @@ -87,4 +100,4 @@ export const makeCreateAndFund = async ( return remoteAccount.asContinuingOffer(); }; -harden(makeCreateAndFund); \ No newline at end of file +harden(makeCreateAndFund); diff --git a/contract/src/orca.proposal.js b/contract/src/orca.proposal.js index e3413599..445dc0f8 100644 --- a/contract/src/orca.proposal.js +++ b/contract/src/orca.proposal.js @@ -9,7 +9,7 @@ import { makeTracer } from './tools/debug.js'; * @import {ERef} from '@endo/far'; * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; * @import {ChainInfo, IBCConnectionInfo,} from '@agoric/orchestration'; - * @import {OrcaSF} from './orca.contract.ts'; + * @import {OrcaSF} from './orca.contract.js'; * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; */ diff --git a/contract/src/orchestration-api.ts b/contract/src/orchestration-api.ts new file mode 100644 index 00000000..986c66ea --- /dev/null +++ b/contract/src/orchestration-api.ts @@ -0,0 +1,282 @@ +/* eslint-disable no-use-before-define */ +/** + * @file General API of orchestration + * - must not have chain-specific types without runtime narrowing by chain id + * - should remain relatively stable. + */ +import type { Amount, Brand, NatAmount } from '@agoric/ertp/src/types.js'; +import type { CurrentWalletRecord } from '@agoric/smart-wallet/src/smartWallet.js'; +import type { Timestamp } from '@agoric/time'; +import type { QueryManyFn } from '@agoric/vats/src/localchain.js'; +import type { ResolvedPublicTopic } from '@agoric/zoe/src/contractSupport/topics.js'; +import type { Passable } from '@endo/marshal'; +import type { + AgoricChainMethods, + ChainInfo, + CosmosChainAccountMethods, + CosmosChainInfo, + IBCMsgTransferOptions, + KnownChains, + LocalAccountMethods, + ICQQueryFunction, +} from './types.js'; +import type { ResolvedContinuingOfferResult } from './utils/zoe-tools.js'; + +/** + * A denom that designates a path to a token type on some blockchain. + * + * Multiple denoms may designate the same underlying base denom (e.g., `uist`, + * `uatom`) on different Chains or on the same Chain via different paths. On + * Cosmos chains, all but the base denom are IBC style denoms, but that may vary + * across other chains. All the denoms that designate the same underlying base + * denom form an equivalence class, along with the unique Brand on the local + * Chain. Some operations accept any member of the equivalence class to + * effectively designate the corresponding token type on the target chain. + */ +export type Denom = string; // ibc/... or uist + +// ??? when multiple Denoms provide paths to the same remote token type, +// should the brand be 1:1 with that equivalence class or each Denom? +/** + * In many cases, either a denom string or a local Brand can be used to + * designate a remote token type. + */ +export type DenomArg = Denom | Brand<'nat'>; + +/** + * Count of some fungible token on some blockchain. + * + * @see {@link Orchestrator.asAmount} to convert to an Amount surjectively + */ +export type DenomAmount = { + denom: Denom; + value: bigint; // Nat +}; + +/** Amounts can be provided as pure data using denoms or as ERTP Amounts */ +export type AmountArg = DenomAmount | Amount<'nat'>; + +/** An address on some blockchain, e.g., cosmos, eth, etc. */ +export type ChainAddress = { + /** e.g. 1 for Ethereum, agoric-3 for Agoric, cosmoshub-4 for Cosmos */ + chainId: string; + /** The address value used on-chain */ + value: string; + encoding: 'bech32' | 'ethereum'; +}; + +/** + * Object that controls an account on a particular chain. + * + * The methods available depend on the chain and its capabilities. + */ +export type OrchestrationAccount = OrchestrationAccountI & + (CI extends CosmosChainInfo + ? CI['chainId'] extends `agoric${string}` + ? LocalAccountMethods + : CosmosChainAccountMethods + : {}); + +/** + * An object for access the core functions of a remote chain. + * + * Note that "remote" can mean the local chain; it's just that + * accounts are treated as remote/arms length for consistency. + */ +export interface Chain { + getChainInfo: () => Promise; + + // "makeAccount" suggests an operation within a vat + /** + * Creates a new Orchestration Account on the current Chain. + * @returns an object that controls the account + */ + makeAccount: () => Promise>; + // FUTURE supply optional port object; also fetch port object + + query: CI extends { icqEnabled: true } + ? ICQQueryFunction + : CI['chainId'] extends `agoric${string}` + ? QueryManyFn + : never; + + // TODO provide a way to get the local denom/brand/whatever for this chain +} + +export interface DenomInfo< + HoldingChain extends keyof KnownChains, + IssuingChain extends keyof KnownChains, +> { + /** The well-known Brand on Agoric for the direct asset */ + brand?: Brand; + /** The Chain at which the argument `denom` exists (where the asset is currently held) */ + chain: Chain; + /** The Chain that is the issuer of the underlying asset */ + base: Chain; + /** the Denom for the underlying asset on its issuer chain */ + baseDenom: Denom; +} + +/** + * Provided in the callback to `orchestrate()`. + */ +export interface Orchestrator { + /** + * Get a Chain object for working with the given chain. + * + * @param {C} chainName name of the chain in KnownChains or the ChainHub backing the Orchestrator + */ + getChain: ( + chainName: C, + ) => Promise< + Chain & + (C extends 'agoric' ? AgoricChainMethods : {}) + >; + + /** + * For a denom, return information about a denom including the equivalent + * local Brand, the Chain on which the denom is held, and the Chain that + * issues the corresponding asset. + * @param denom + */ + getDenomInfo: < + HoldingChain extends keyof KnownChains, + IssuingChain extends keyof KnownChains, + >( + denom: Denom, + ) => DenomInfo; + + /** + * Convert an amount described in native data to a local, structured Amount. + * @param amount - the described amount + * @returns the Amount in local structuerd format + */ + asAmount: (amount: DenomAmount) => NatAmount; +} + +/** + * An object that supports high-level operations for an account on a remote chain. + */ +export interface OrchestrationAccountI { + /** + * @returns the address of the account on the remote chain + */ + getAddress: () => ChainAddress; + + /** @returns an array of amounts for every balance in the account. */ + getBalances: () => Promise; + + /** @returns the balance of a specific denom for the account. */ + getBalance: (denom: DenomArg) => Promise; + + /** + * Transfer amount to another account on the same chain. The promise settles when the transfer is complete. + * @param toAccount - the account to send the amount to. MUST be on the same chain + * @param amount - the amount to send + * @returns void + */ + send: (toAccount: ChainAddress, amounts: AmountArg) => Promise; + + /** + * Transfer multiple amounts to another account on the same chain. The promise settles when the transfer is complete. + * @param toAccount - the account to send the amount to. MUST be on the same chain + * @param amounts - the amounts to send + * @returns void + */ + sendAll: (toAccount: ChainAddress, amounts: AmountArg[]) => Promise; + + /** + * Transfer an amount to another account, typically on another chain. + * The promise settles when the transfer is complete. + * @param amount - the amount to transfer. Can be provided as pure data using denoms or as ERTP Amounts. + * @param destination - the account to transfer the amount to. + * @param [opts] - an optional memo to include with the transfer, which could drive custom PFM behavior, and timeout parameters + * @returns void + * + * TODO document the mapping from the address to the destination chain. + */ + transfer: ( + destination: ChainAddress, + amount: AmountArg, + opts?: IBCMsgTransferOptions, + ) => Promise; + + /** + * Transfer an amount to another account in multiple steps. The promise settles when + * the entire path of the transfer is complete. + * @param amount - the amount to transfer + * @param msg - the transfer message, including follow-up steps + * @returns void + */ + transferSteps: (amount: AmountArg, msg: TransferMsg) => Promise; + + /** + * Returns `invitationMakers` and `publicSubscribers` to the account + * holder's smart wallet so they can continue interacting with the account + * and read account state in vstorage if published. + */ + asContinuingOffer: () => Promise; + + /** + * Public topics are a map to different vstorage paths and subscribers that + * can be shared with on or offchain clients. + * When returned as part of a continuing invitation, it will appear + * in the {@link CurrentWalletRecord} in vstorage. + */ + getPublicTopics: () => Promise>>; +} + +/** + * Flows to orchestrate are regular Javascript functions but have some + * constraints to fulfill the requirements of resumability after termination of + * the enclosing vat. Some requirements for each orchestration flow: + * - must not close over any values that could change between invocations + * - must satisfy the `OrchestrationFlow` interface + * - must be hardened + * - must not use `E()` (eventual send) + * + * The call to `orchestrate` using a flow function in reincarnations of the vat + * must have the same `durableName` as before. To help enforce these + * constraints, we recommend: + * + * - keeping flows in a `.flows.js` module + * - importing them all with `import * as flows` to get a single object keyed by + * the export name + * - using `orchestrateAll` to treat each export name as the `durableName` of + * the flow + * - adopting `@agoric/eslint-config` that has rules to help detect problems + */ +export interface OrchestrationFlow { + (orc: Orchestrator, ctx: CT, ...args: Passable[]): Promise; +} + +/** + * Internal structure for TransferMsgs. + * The type must be able to express transfers across different chains and transports. + * + * NOTE Expected to change, so consider an opaque structure. + * @internal + */ +export interface TransferMsg { + toAccount: ChainAddress; + timeout?: Timestamp; + next?: TransferMsg; + data?: object; +} + +/** @alpha */ +export interface AfterAction { + destChain: string; + destAddress: ChainAddress; +} +/** @alpha */ +export interface SwapExact { + amountIn: Amount; + amountOut: Amount; +} +/** @alpha */ +export interface SwapMaxSlippage { + amountIn: Amount; + brandOut: Brand; + slippage: number; +} diff --git a/contract/src/utils/address.js b/contract/src/utils/address.js deleted file mode 100644 index 8d39ed5a..00000000 --- a/contract/src/utils/address.js +++ /dev/null @@ -1,103 +0,0 @@ -import { Fail, q } from '@endo/errors'; - -/** - * @import {IBCConnectionID} from '@agoric/vats'; - * @import {ChainAddress} from '../types.js'; - * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -/** - * @typedef {object} ICAChannelAddressOpts - * @property {string} [encoding='proto3'] message encoding format for the - * channel - * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. - * currently only `ordered` is supported for ics27-1 - * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` - * @property {string} [version='ics27-1'] default is `ics27-1` - */ - -/** - * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID - * @param {IBCConnectionID} controllerConnectionId Self Connection ID - * @param {ICAChannelAddressOpts} [opts] - * @returns {RemoteIbcAddress} - */ -export const makeICAChannelAddress = ( - hostConnectionId, - controllerConnectionId, - { - version = 'ics27-1', - encoding = 'proto3', - ordering = 'ordered', - txType = 'sdk_multi_msg', - } = {}, -) => { - hostConnectionId || Fail`hostConnectionId is required`; - controllerConnectionId || Fail`controllerConnectionId is required`; - const connString = JSON.stringify({ - version, - controllerConnectionId, - hostConnectionId, - address: '', // will be provided by the counterparty after channelOpenAck - encoding, - txType, - }); - return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; -}; -harden(makeICAChannelAddress); - -export const DEFAULT_ICQ_VERSION = 'icq-1'; - -/** - * @param {IBCConnectionID} controllerConnectionId - * @param {string} version defaults to icq-1 - * @returns {RemoteIbcAddress} - */ -export const makeICQChannelAddress = ( - controllerConnectionId, - version = DEFAULT_ICQ_VERSION, -) => { - controllerConnectionId || Fail`controllerConnectionId is required`; - return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; -}; -harden(makeICQChannelAddress); - -/** - * Parse a chain address from a remote address string. Assumes the address - * string is in a JSON format and contains an "address" field. This function is - * designed to be safe against malformed inputs and unexpected data types, and - * will return `undefined` in those cases. - * - * @param {RemoteIbcAddress} remoteAddressString - remote address string, - * including version - * @returns {ChainAddress['value'] | undefined} returns undefined on error - */ -export const findAddressField = remoteAddressString => { - try { - // Extract JSON version string assuming it's always surrounded by {} - const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; - const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; - if (!jsonObj?.address?.length) return undefined; - return jsonObj.address; - } catch (error) { - return undefined; - } -}; -harden(findAddressField); - -/** - * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. - * - * see - * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) - * for reference implementation - * - * @param {string} address - */ -export const getBech32Prefix = address => { - assert(address, 'address is required'); - const split = address.lastIndexOf('1'); - if (split === -1) return Fail`No separator character for ${q(address)}`; - if (split === 0) return Fail`Missing prefix for ${q(address)}`; - return address.slice(0, split); -}; diff --git a/contract/src/utils/amounts.js b/contract/src/utils/amounts.js deleted file mode 100644 index 3974f922..00000000 --- a/contract/src/utils/amounts.js +++ /dev/null @@ -1,59 +0,0 @@ -import { makeError } from '@endo/errors'; - -/** - * @import {ChainHub} from "../types.js"; - * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - */ - -/** - * @param {ChainHub} chainHub - * @param {DenomArg} denomArg - * @returns {Denom} - * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom - * mapping - */ -export const coerceDenom = (chainHub, denomArg) => { - if (typeof denomArg === 'string') { - return denomArg; - } - const denom = chainHub.getDenom(denomArg); - if (!denom) { - throw makeError(`No denom for brand ${denomArg}`); - } - return denom; -}; - -/** - * @param {ChainHub} chainHub - * @param {DenomAmount | Amount<'nat'>} amount - * @returns {DenomAmount} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceDenomAmount = (chainHub, amount) => { - if ('denom' in amount) { - return amount; - } - const denom = coerceDenom(chainHub, amount.brand); - return harden({ - denom, - value: amount.value, - }); -}; - -/** - * @param {ChainHub} chainHub - * @param {AmountArg} amount - * @returns {Coin} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceCoin = (chainHub, amount) => { - const denom = - 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); - return harden({ - denom, - amount: String(amount.value), - }); -}; diff --git a/contract/src/utils/cosmos.js b/contract/src/utils/cosmos.js deleted file mode 100644 index 5082a1c5..00000000 --- a/contract/src/utils/cosmos.js +++ /dev/null @@ -1,82 +0,0 @@ -import { makeError } from '@endo/errors'; -import { decodeBase64 } from '@endo/base64'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; - -/** - * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' - * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; - */ - -/** maximum clock skew, in seconds, for unbonding time reported from other chain */ -export const maxClockSkew = 10n * 60n; - -/** - * @template T - * @param {string} ackStr - * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg - */ -export const tryDecodeResponse = (ackStr, fromProtoMsg) => { - try { - const any = Any.decode(decodeBase64(ackStr)); - const protoMsg = Any.decode(any.value); - - const msg = fromProtoMsg(protoMsg); - return msg; - } catch (cause) { - throw makeError(`bad response: ${ackStr}`, undefined, { cause }); - } -}; - -/** - * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - * @see {@link toTruncatedDenomAmount} for DecCoin - */ -export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); - -/** - * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by - * truncating the fractional portion. - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - */ -export const toTruncatedDenomAmount = c => ({ - denom: c.denom, - value: BigInt(c.amount.split('.')[0]), -}); - -/** - * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration - * {@link CosmosValidatorAddress} - * - * @type {( - * r: { validatorAddress: string }, - * chainId: string, - * ) => CosmosValidatorAddress} - */ -export const toCosmosValidatorAddress = (r, chainId) => ({ - encoding: 'bech32', - value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), - chainId, -}); - -/** - * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration - * {@link CosmosDelegationResponse} - * - * @type {( - * chainInfo: { chainId: string }, - * r: DelegationResponse, - * ) => CosmosDelegationResponse} - */ -export const toCosmosDelegationResponse = ({ chainId }, r) => ({ - delegator: { - chainId, - encoding: 'bech32', - value: r.delegation.delegatorAddress, - }, - validator: toCosmosValidatorAddress(r.delegation, chainId), - amount: toDenomAmount(r.balance), -}); diff --git a/contract/src/utils/denomHash.js b/contract/src/utils/denomHash.js deleted file mode 100644 index 561ee4b5..00000000 --- a/contract/src/utils/denomHash.js +++ /dev/null @@ -1,22 +0,0 @@ -// @ts-check -import { sha256 } from '@noble/hashes/sha256'; -import { bytesToHex } from '@noble/hashes/utils'; - -/** - * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ - * - * @param {object} opts - * @param {string} [opts.portId] - * @param {string} [opts.channelId] required unless `path` is supplied - * @param {string} [opts.path] alternative to portId, channelId - * @param {string} opts.denom base denom - */ -export const denomHash = ({ - portId = 'transfer', - channelId = /** @type {string | undefined} */ (undefined), - path = `${portId}/${channelId}`, - denom, -}) => { - const h = sha256.create().update(`${path}/${denom}`).digest(); - return bytesToHex(h).toUpperCase(); -}; diff --git a/contract/src/utils/orc.js b/contract/src/utils/orc.js deleted file mode 100644 index 47a0d260..00000000 --- a/contract/src/utils/orc.js +++ /dev/null @@ -1,38 +0,0 @@ -/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ - -export const orcUtils = { - /** - * unwinds denom with PFM, if necessary - * - * @param {Omit} _args - * @returns {TransferMsg} - */ - makeTransferMsg: _args => { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, - /** - * SwapExact or SwapMaxSlippage, with optional AfterAction - * - * @param {(SwapExact | SwapMaxSlippage) & - * (AfterAction | Record)} _args - * - * @returns {TransferMsg} - */ - makeOsmosisSwap(_args) { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, -}; diff --git a/contract/src/utils/orchestrationAccount.js b/contract/src/utils/orchestrationAccount.js deleted file mode 100644 index 23f5337d..00000000 --- a/contract/src/utils/orchestrationAccount.js +++ /dev/null @@ -1,40 +0,0 @@ -import { BrandShape } from '@agoric/ertp'; -import { Shape as NetworkShape } from '@agoric/network'; -import { VowShape } from '@agoric/vow'; -import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { M } from '@endo/patterns'; -import { - AmountArgShape, - ChainAddressShape, - DenomAmountShape, - IBCTransferOptionsShape, -} from '../typeGuards.js'; - -/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ - -const { Vow$ } = NetworkShape; // TODO #9611 - -/** @see {OrchestrationAccountI} */ -export const orchestrationAccountMethods = { - getAddress: M.call().returns(ChainAddressShape), - getBalance: M.call(M.or(BrandShape, M.string())).returns( - Vow$(DenomAmountShape), - ), - getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), - send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), - sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( - VowShape, - ), - transfer: M.call(ChainAddressShape, AmountArgShape) - .optional(IBCTransferOptionsShape) - .returns(VowShape), - transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), - asContinuingOffer: M.call().returns( - Vow$({ - publicSubscribers: TopicsRecordShape, - invitationMakers: M.any(), - holder: M.remotable(), - }), - ), - getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), -}; diff --git a/contract/src/utils/packet.js b/contract/src/utils/packet.js deleted file mode 100644 index 70564cff..00000000 --- a/contract/src/utils/packet.js +++ /dev/null @@ -1,112 +0,0 @@ -import { Fail } from '@endo/errors'; -import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; -import { - RequestQuery, - ResponseQuery, -} from '@agoric/cosmic-proto/tendermint/abci/types.js'; -import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; -import { - CosmosQuery, - CosmosResponse, -} from '@agoric/cosmic-proto/icq/v1/packet.js'; -import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - -/** - * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; - * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; - */ - -/** - * Makes an IBC transaction packet from an array of messages. Expects the - * `value` of each message to be base64 encoded bytes. Skips checks for - * malformed messages in favor of interface guards. - * - * @param {AnyJson[]} msgs - * @param {Partial>} [opts] - * @returns {string} stringified InterchainAccountPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeTxPacket(msgs, opts) { - const messages = msgs.map(Any.fromJSON); - const bytes = TxBody.encode( - TxBody.fromPartial({ - messages, - ...opts, - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - type: PacketType.TYPE_EXECUTE_TX, - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeTxPacket); - -/** - * Makes an IBC query packet from an array of query messages. Expects the `data` - * of each message to be base64 encoded bytes. Skips checks for malformed - * messages in favor of interface guards. - * - * @param {JsonSafe[]} msgs - * @returns {string} stringified InterchainQueryPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeQueryPacket(msgs) { - const bytes = CosmosQuery.encode( - CosmosQuery.fromPartial({ - requests: msgs.map(RequestQuery.fromJSON), - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeQueryPacket); - -/** - * Looks for a result or error key in the response string, and returns a - * Base64Bytes string. This string can be decoded using the corresponding - * Msg*Response object. Error strings seem to be plain text and do not need - * decoding. - * - * @param {string} response - * @returns {string} - base64 encoded bytes string - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseTxPacket(response) { - const { result, error } = JSON.parse(response); - if (result) return result; - else if (error) throw Error(error); - else throw Fail`expected either result or error: ${response}`; -} -harden(parseTxPacket); - -/** - * Looks for a result or error key in the response string. If a result is found, - * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on - * the resulting entries are base64 encoded for inter-vat communication. These - * can be decoded using the corresponding Query*Response objects. Error strings - * seem to be plain text and do not need decoding. - * - * @param {string} response - * @returns {JsonSafe[]} - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseQueryPacket(response) { - const result = parseTxPacket(response); - const { data } = JSON.parse(atob(result)); - const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); - return harden(responses.map(ResponseQuery.toJSON)); -} -harden(parseQueryPacket); diff --git a/contract/src/utils/registry.js b/contract/src/utils/registry.js deleted file mode 100644 index 25789864..00000000 --- a/contract/src/utils/registry.js +++ /dev/null @@ -1,130 +0,0 @@ -import { - State as IBCChannelState, - Order, -} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; -import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; -import assert from 'node:assert'; - -/** - * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; - * @import {Chain, IBCInfo} from '@chain-registry/types'; - * @import {ChainRegistryClient} from '@chain-registry/client'; - * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; - */ - -/** - * @param {IBCInfo} ibcInfo - * @param {string} name - * @param {Record} chainInfo - * @returns {[string, IBCConnectionInfo] | []} - */ -function toConnectionEntry(ibcInfo, name, chainInfo) { - // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order - const fromChain1 = ibcInfo.chain_1.chain_name === name; - const [from, to] = fromChain1 - ? [ibcInfo.chain_1, ibcInfo.chain_2] - : [ibcInfo.chain_2, ibcInfo.chain_1]; - assert.equal(from.chain_name, name); - const transferChannels = ibcInfo.channels.filter( - c => - c.chain_1.port_id === 'transfer' && - // @ts-expect-error tags does not specify keys - c.tags?.preferred, - ); - if (transferChannels.length === 0) { - console.warn( - 'no transfer channel for [', - from.chain_name, - to.chain_name, - ']', - '(skipping)', - ); - return []; - } - if (transferChannels.length > 1) { - console.warn( - 'multiple preferred transfer channels [', - from.chain_name, - to.chain_name, - ']:', - transferChannels, - '(choosing first)', - ); - } - const [channel] = transferChannels; - const [channelFrom, channelTo] = fromChain1 - ? [channel.chain_1, channel.chain_2] - : [channel.chain_2, channel.chain_1]; - const record = { - id: /** @type {IBCConnectionID} */ (from.connection_id), - client_id: from.client_id, - counterparty: { - client_id: to.client_id, - connection_id: /** @type {IBCConnectionID} */ (to.connection_id), - }, - state: IBCConnectionState.STATE_OPEN, // XXX presumably - transferChannel: { - channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), - portId: channelFrom.port_id, - counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), - counterPartyPortId: channelTo.port_id, - // FIXME mapping, our guard expects a numerical enum - ordering: Order.ORDER_NONE_UNSPECIFIED, - state: IBCChannelState.STATE_OPEN, // XXX presumably - version: channel.version, - }, - }; - const destChainId = chainInfo[to.chain_name].chainId; - return [destChainId, record]; -} - -/** - * Converts the given chain info to our local config format - * - * @param {Pick} registry - */ -export const convertChainInfo = async registry => { - /** @type {Record} */ - const chainInfo = {}; - - for (const chain of registry.chains) { - console.log('processing info', chain.chain_name); - chainInfo[chain.chain_name] = { - bech32Prefix: chain.bech32_prefix, - chainId: chain.chain_id, - stakingTokens: chain.staking?.staking_tokens, - // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 - icqEnabled: chain.chain_name === 'osmosis', - }; - } - - // XXX probably easier to keep ibc separate - const ibcLookup = {}; - for (const ibc of registry.ibcData) { - ibcLookup[ibc.chain_1.chain_name] ||= []; - ibcLookup[ibc.chain_2.chain_name] ||= []; - - ibcLookup[ibc.chain_1.chain_name].push(ibc); - ibcLookup[ibc.chain_2.chain_name].push(ibc); - } - - const chainNames = registry.chains.map(c => c.chain_name).sort(); - - // iterate this after chainInfo is filled out - for (const name of chainNames) { - console.log('processing connections', name); - - const ibcData = ibcLookup[name]; - const connections = Object.fromEntries( - ibcData - .map(datum => toConnectionEntry(datum, name, chainInfo)) - .filter(entry => entry.length > 0) - // sort alphabetically for consistency - .sort(([a], [b]) => a.localeCompare(b)), - ); - chainInfo[name] = { ...chainInfo[name], connections }; - } - - // return object with insertion in alphabetical order of chain name - return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); -}; diff --git a/contract/src/utils/start-helper.js b/contract/src/utils/start-helper.js deleted file mode 100644 index 902c7194..00000000 --- a/contract/src/utils/start-helper.js +++ /dev/null @@ -1,214 +0,0 @@ -import { prepareAsyncFlowTools } from '@agoric/async-flow'; -import { prepareVowTools } from '@agoric/vow'; -import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; -import { makeDurableZone } from '@agoric/zone/durable.js'; -import { makeChainHub } from '../exos/chain-hub.js'; -import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; -import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; -import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; -import { prepareOrchestrator } from '../exos/orchestrator.js'; -import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; -import { makeOrchestrationFacade } from '../facade.js'; -import { makeZoeTools } from './zoe-tools.js'; -import { makeZcfTools } from './zcf-tools.js'; - -/** - * @import {LocalChain} from '@agoric/vats/src/localchain.js'; - * @import {TimerService, TimerBrand} from '@agoric/time'; - * @import {Baggage} from '@agoric/vat-data'; - * @import {NameHub} from '@agoric/vats'; - * @import {Remote} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; - */ - -/** - * @typedef {{ - * localchain: Remote; - * orchestrationService: Remote; - * storageNode: Remote; - * timerService: Remote; - * agoricNames: Remote; - * }} OrchestrationPowers - */ - -/** - * Helper that a contract start function can use to set up the objects needed - * for orchestration. - * - * TODO strip problematic operations from ZCF (e.g., getPayouts) - * - * @param {ZCF} zcf - * @param {Baggage} baggage - * @param {OrchestrationPowers} remotePowers - * @param {Marshaller} marshaller - * @internal - */ -export const provideOrchestration = ( - zcf, - baggage, - remotePowers, - marshaller, -) => { - // separate zones - const zones = (() => { - const zone = makeDurableZone(baggage); - return { - /** system names for async flow */ - asyncFlow: zone.subZone('asyncFlow'), - /** system names for orchestration implementation */ - orchestration: zone.subZone('orchestration'), - /** system names for chainHub */ - chainHub: zone.subZone('chainHub'), - /** system names for vows */ - vows: zone.subZone('vows'), - /** contract-provided names, and subzones */ - contract: zone.subZone('contract'), - }; - })(); - - const { agoricNames, timerService, localchain } = remotePowers; - - const vowTools = prepareVowTools(zones.vows); - - const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); - - const zoeTools = makeZoeTools(zcf, vowTools); - - const zcfTools = makeZcfTools(zcf, vowTools); - - const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); - const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( - zones.orchestration, - { - makeRecorderKit, - zcf, - timerService, - vowTools, - chainHub, - localchain, - zoeTools, - }, - ); - - const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { - vowTools, - }); - - const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( - zones.orchestration, - { - chainHub, - makeRecorderKit, - timerService, - vowTools, - zcf, - }, - ); - - const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { - makeCosmosOrchestrationAccount, - orchestration: remotePowers.orchestrationService, - storageNode: remotePowers.storageNode, - timer: remotePowers.timerService, - vowTools, - }); - - const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { - makeLocalOrchestrationAccountKit, - localchain: remotePowers.localchain, - // FIXME what path? - storageNode: remotePowers.storageNode, - agoricNames, - orchestration: remotePowers.orchestrationService, - timer: remotePowers.timerService, - vowTools, - }); - - const makeOrchestrator = prepareOrchestrator(zones.orchestration, { - chainHub, - makeLocalChainFacade, - makeRemoteChainFacade, - vowTools, - }); - - /** - * Create orchestrate functions in a specific zone, instead of the default - * `contract.orchestration` zone. This is used for modules that add their own - * orchestration functions (e.g., a Portfolio with orchestration flows for - * continuing offers) - * - * @param {Zone} zone - */ - const makeOrchestrateKit = zone => - makeOrchestrationFacade({ - zone, - zcf, - makeRecorderKit, - makeOrchestrator, - asyncFlowTools, - vowTools, - ...remotePowers, - }); - - // Create orchestrate functions for the default `contract.orchestration` zone - const defaultOrchestrateKit = makeOrchestrateKit( - zones.contract.subZone('orchestration'), - ); - - zcf.setTestJig(() => ({ - baggage, - chainHub, - })); - - return { - ...defaultOrchestrateKit, - makeOrchestrateKit, - chainHub, - vowTools, - asyncFlowTools, - zcfTools, - zoeTools, - zone: zones.contract, - }; -}; -harden(provideOrchestration); - -/** @typedef {Omit, 'zone'>} OrchestrationTools */ - -/** - * Simplifies contract functions for Orchestration by wrapping a simpler - * function with all the tools it needs in order to use Orchestration. - * - * @example - * - * ```js - * const contract = (zcf, privateArgs, zone, tools) => { ... }; - * export const start = withOrchestration(contract); - * ``` - * - * @template {Record} CT - * @template {OrchestrationPowers & { - * marshaller: Marshaller; - * }} PA - * @template R - * @param {( - * zcf: ZCF, - * privateArgs: PA, - * zone: Zone, - * tools: OrchestrationTools, - * ) => Promise} contractFn - * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a - * Zoe start function - */ -export const withOrchestration = - contractFn => async (zcf, privateArgs, baggage) => { - const { zone, ...tools } = provideOrchestration( - zcf, - baggage, - privateArgs, - privateArgs.marshaller, - ); - return contractFn(zcf, privateArgs, zone, tools); - }; -harden(withOrchestration); diff --git a/contract/src/utils/time.js b/contract/src/utils/time.js deleted file mode 100644 index 06f995ab..00000000 --- a/contract/src/utils/time.js +++ /dev/null @@ -1,48 +0,0 @@ -import { E } from '@endo/far'; -import { TimeMath } from '@agoric/time'; - -/** - * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - */ - -export const SECONDS_PER_MINUTE = 60n; -export const MILLISECONDS_PER_SECOND = 1000n; -export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; -export const NANOSECONDS_PER_SECOND = 1_000_000_000n; - -/** - * XXX should this be durable? resumable? - * - * @param {Remote} timer - */ -export function makeTimestampHelper(timer) { - return harden({ - /** - * XXX do this need to be resumable / use Vows? - * - * Takes the current time from ChainTimerService and adds a relative time to - * determine a timeout timestamp in nanoseconds. Useful for - * {@link MsgTransfer.timeoutTimestamp}. - * - * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes - * @returns {Promise} Timeout timestamp in absolute nanoseconds - * since unix epoch - */ - async getTimeoutTimestampNS(relativeTime) { - const currentTime = await E(timer).getCurrentTimestamp(); - const timeout = - relativeTime || - TimeMath.coerceRelativeTimeRecord( - SECONDS_PER_MINUTE * 5n, - currentTime.timerBrand, - ); - return ( - TimeMath.addAbsRel(currentTime, timeout).absValue * - NANOSECONDS_PER_SECOND - ); - }, - }); -} - -/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/src/utils/zcf-tools.js b/contract/src/utils/zcf-tools.js deleted file mode 100644 index d3843695..00000000 --- a/contract/src/utils/zcf-tools.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @import {HostInterface} from '@agoric/async-flow'; - * @import {VowTools} from '@agoric/vow'; - * @import {ZcfTools} from '../types.js'; - */ - -import { M, mustMatch } from '@endo/patterns'; - -const HandlerShape = M.remotable('OfferHandler'); - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - * @returns {HostInterface} - */ -export const makeZcfTools = (zcf, vowTools) => - harden({ - makeInvitation(offerHandler, description, customDetails, proposalShape) { - mustMatch(offerHandler, HandlerShape); - return vowTools.watch( - zcf.makeInvitation( - offerHandler, - description, - customDetails, - proposalShape, - ), - ); - }, - atomicRearrange(transfers) { - zcf.atomicRearrange(transfers); - }, - assertUniqueKeyword(keyword) { - zcf.assertUniqueKeyword(keyword); - }, - }); diff --git a/contract/src/utils/zoe-tools.js b/contract/src/utils/zoe-tools.js deleted file mode 100644 index a5cbbe38..00000000 --- a/contract/src/utils/zoe-tools.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file Helper functions for transferring payments between a LocalChainAccount - * and a ZCFSeat. - * - * Maintainers: This exists as an endowment for orchestrated async-flows so we - * can make use of E and promises. The logic for recovering partial failures - * is also an added convenience for developers. - * - * Functions are written using `asVow` and non-resumable promises as we expect - * each invocation to resolve promptly - there are no timers or interchain - * network calls. - * - * A promise resolved promptly is currently safe from being severed by an - * upgrade because we only trigger vat upgrades as the result of network - * input. - */ - -import { makeError, q, Fail } from '@endo/errors'; -import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; -import { E } from '@endo/far'; - -const { assign, keys, values } = Object; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; - * @import {VowTools} from '@agoric/vow'; - * @import {LocalAccountMethods} from '../types.js'; - */ - -/** - * @typedef {{ - * invitationMakers: InvitationMakers; - * publicSubscribers: Record>; - * }} ResolvedContinuingOfferResult - * - * @see {ContinuingOfferResult} - */ - -/** - * @typedef {( - * srcSeat: ZCFSeat, - * localAccount: LocalAccountMethods, - * amounts: AmountKeywordRecord, - * ) => Promise} LocalTransfer - */ - -/** - * @typedef {( - * localAccount: LocalAccountMethods, - * destSeat: ZCFSeat, - * amounts: AmountKeywordRecord, - * ) => Promise} WithdrawToSeat - */ - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - */ -export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { - /** - * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the - * deposits fail, everything will be rolled back to the `srcSeat`. Supports - * multiple items in the `amounts` {@link AmountKeywordRecord}. - * - * @type {HostOf} - */ - const localTransfer = (srcSeat, localAccount, amounts) => - asVow(async () => { - !srcSeat.hasExited() || Fail`The seat cannot have exited.`; - const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); - const userSeat = await userSeatP; - zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); - tempSeat.exit(); - // TODO (#9541) get the userSeat into baggage so it's at least recoverable - // const userSeat = await subzone.makeOnce( - // 'localTransferHelper', - // async () => { - // const { zcfSeat: tempSeat, userSeat: userSeatP } = - // zcf.makeEmptySeatKit(); - // const uSeat = await userSeatP; - // // TODO how do I store in the place for this retryable? - // atomicTransfer(zcf, srcSeat, tempSeat, amounts); - // tempSeat.exit(); - // return uSeat; - // }, - // ); - - // Now all the `amounts` are accessible, so we can move them to the localAccount - const payments = await Promise.all( - keys(amounts).map(kw => E(userSeat).getPayout(kw)), - ); - const settleDeposits = await when( - allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), - ); - // if any of the deposits to localAccount failed, unwind all of the allocations - if (settleDeposits.find(x => x.status === 'rejected')) { - const amts = values(amounts); - const errors = []; - // withdraw the successfully deposited payments - const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { - if (x.status === 'rejected') { - errors.push(x.reason); - return payments[i]; - } - return E(localAccount).withdraw(amts[i]); - }); - - // return all payments to the srcSeat - const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); - const paymentKwr = harden( - keys(amounts).reduce( - (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - srcSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - throw makeError(`One or more deposits failed ${q(errors)}`); - } - // TODO #9541 remove userSeat from baggage - }); - - /** - * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any - * of the withdrawals fail, everything will be rolled back to the - * `srcLocalAccount`. Supports multiple items in the `amounts` - * {@link PaymentKeywordRecord} - * - * @type {HostOf} - */ - const withdrawToSeat = (localAccount, destSeat, amounts) => - asVow(async () => { - !destSeat.hasExited() || Fail`The seat cannot have exited.`; - - const settledWithdrawals = await when( - allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), - ); - - // if any of the withdrawals were rejected, unwind the successful ones - if (settledWithdrawals.find(x => x.status === 'rejected')) { - const returnPaymentVs = []; - const errors = []; - for (const result of settledWithdrawals) { - if (result.status === 'fulfilled') { - returnPaymentVs.push(E(localAccount).deposit(result.value)); - } else { - errors.push(result.reason); - } - } - await when(allVows(returnPaymentVs)); - throw makeError(`One or more withdrawals failed ${q(errors)}`); - } - // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat - const paymentKwr = harden( - keys(amounts).reduce( - (acc, kw, i) => - assign(acc, { - [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] - .value, - }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - destSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - }); - - return harden({ - localTransfer, - withdrawToSeat, - }); -}; - -/** @typedef {ReturnType} ZoeTools */ diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index 8df36680..b680b0fa 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -17,7 +17,7 @@ const contractName = 'auto-stake-it'; const contractFile = `${dirname}/../src/${contractName}.contract.js`; type StartFn = - typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; + typeof import('../src/auto-stake-it.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); diff --git a/contract/test/bundle-source.test.js b/contract/test/bundle-source.test.js index 0beed6ce..4e958445 100644 --- a/contract/test/bundle-source.test.js +++ b/contract/test/bundle-source.test.js @@ -11,7 +11,7 @@ import { E, passStyleOf } from '@endo/far'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; const myRequire = createRequire(import.meta.url); -const contractPath = myRequire.resolve(`../src/orca.contract.ts`); +const contractPath = myRequire.resolve(`../src/orca.contract.js`); test('bundleSource() bundles the contract for use with zoe', async t => { const bundle = await bundleSource(contractPath); diff --git a/contract/test/old_network-fakes.js b/contract/test/old_network-fakes.js deleted file mode 100644 index 4e9b5e93..00000000 --- a/contract/test/old_network-fakes.js +++ /dev/null @@ -1,268 +0,0 @@ -// import { VowTools } from '@agoric/vow'; -import { - prepareEchoConnectionKit, - prepareLoopbackProtocolHandler, - prepareNetworkPowers, - preparePortAllocator, - prepareRouterProtocol, -} from '@agoric/network'; -// import type { Zone } from '@agoric/zone'; -// import type { -// IBCChannelID, -// IBCMethod, -// IBCEvent, -// ScopedBridgeManagerMethods, -// IBCConnectionID, -// } from '@agoric/vats'; -import { - prepareCallbacks as prepareIBCCallbacks, - prepareIBCProtocol, -} from '@agoric/vats/src/ibc.js'; -import { BridgeId } from '@agoric/internal'; -import { E, Far } from '@endo/far'; -// import type { Guarded } from '@endo/exo'; -import { defaultMockAckMap, errorAcknowledgments } from './ibc-mocks.js'; - -/** - * Mimic IBC Channel version negotation - * - * As part of the IBC Channel initialization, the version field is negotiated - * with the host. `version` is a String or JSON string as determined by the IBC - * Application protol. - * - * @param version requested version string - * @param {object} params mock parameters to add to version string - * @param {string} params.address for ICS-27, the bech32 address provided by the host - */ -const addParamsIfJsonVersion = (version, params) => { - try { - const parsed = JSON.parse(version); - return JSON.stringify({ - ...parsed, - ...params, - }); - } catch { - return version; - } -}; - -// type ImplementedIBCEvents = 'channelOpenAck' | 'acknowledgementPacket'; - -export const ibcBridgeMocks = { - channelOpenAck: ( - obj, - { bech32Prefix, sequence, channelID, counterpartyChannelID }, - ) => { - const mockChainAddress = - sequence > 0 ? `${bech32Prefix}1test${sequence}` : `${bech32Prefix}1test`; - - return { - type: 'IBC_EVENT', - blockHeight: 99, - blockTime: 1711571357, - event: 'channelOpenAck', - portID: obj.packet.source_port, - channelID, - counterparty: { - port_id: obj.packet.destination_port, - channel_id: counterpartyChannelID, - }, - counterpartyVersion: addParamsIfJsonVersion(obj.version, { - address: mockChainAddress, - }), - connectionHops: obj.hops, - order: obj.order, - version: obj.version, - }; - }, - - acknowledgementPacket: (obj, opts) => { - const { sequence, acknowledgement } = opts; - return { - acknowledgement, - blockHeight: 289, - blockTime: 1712180320, - event: 'acknowledgementPacket', - packet: { - data: obj.packet.data, - destination_channel: obj.packet.destination_channel, - destination_port: obj.packet.destination_port, - sequence, - source_channel: obj.packet.source_channel, - source_port: obj.packet.source_port, - timeout_height: 0, - timeout_timestamp: 1712183910866313000, - }, - relayer: 'agoric1gtkg0g6x8lqc734ht3qe2sdkrfugpdp2h7fuu0', - type: 'IBC_EVENT', - }; - }, -}; - -/** - * Make a fake IBC Bridge, extended from the dibc ScopedBridgeManager. - * - * Has extra `setMockAck` and `setAddressPrefix` met - * - * @param zone - */ -export const makeFakeIBCBridge = zone => { - let bridgeHandler; - /** - * Intended to mock an individual account's sequence, but is global for all - * accounts. - * XXX teach this about IBCConnections and store sequence on a - * per-channel basis. - * @type {number} - */ - let ibcSequenceNonce = 0; - /** - * The number of channels created. Currently used as a proxy to increment - * fake account addresses and channels. - * @type {number} - */ - let channelCount = 0; - let bech32Prefix = 'cosmos'; - - /** - * Keep track channels requested by remote chain. Used as a proxy for - * counterpaty channel ids - */ - const remoteChannelMap = {}; - - /** - * Packet byte string map of requests to responses - * @type {Record} - */ - let mockAckMap = defaultMockAckMap; - let bridgeEvents = []; - - return zone.exo('Fake IBC Bridge Manager', undefined, { - getBridgeId: () => BridgeId.DIBC, - toBridge: async obj => { - if (obj.type === 'IBC_METHOD') { - switch (obj.method) { - case 'startChannelOpenInit': { - const connectionChannelCount = remoteChannelMap[obj.hops[0]] || 0; - const ackEvent = ibcBridgeMocks.channelOpenAck(obj, { - bech32Prefix, - sequence: channelCount, - channelID: `channel-${channelCount}`, - counterpartyChannelID: `channel-${connectionChannelCount}`, - }); - bridgeHandler?.fromBridge(ackEvent); - bridgeEvents = bridgeEvents.concat(ackEvent); - channelCount += 1; - remoteChannelMap[obj.hops[0]] = connectionChannelCount + 1; - return undefined; - } - case 'sendPacket': { - const ackEvent = ibcBridgeMocks.acknowledgementPacket(obj, { - sequence: ibcSequenceNonce, - acknowledgement: - mockAckMap?.[obj.packet.data] || errorAcknowledgments.error5, - }); - bridgeEvents = bridgeEvents.concat(ackEvent); - ibcSequenceNonce += 1; - bridgeHandler?.fromBridge(ackEvent); - return ackEvent.packet; - } - default: - return undefined; - } - } - return undefined; - }, - fromBridge: async obj => { - if (!bridgeHandler) throw Error('no handler!'); - return bridgeHandler.fromBridge(obj); - }, - initHandler: handler => { - if (bridgeHandler) throw Error('already init'); - bridgeHandler = handler; - }, - setHandler: handler => { - if (!bridgeHandler) throw Error('must init first'); - bridgeHandler = handler; - }, - /** - * Set a map of requests to responses to simulate different scenarios. Defaults to `defaultMockAckMap`. - * See `@agoric/orchestration/tools/ibc-mocks.js` for helpers to build this map. - * - * @param ackMap - */ - setMockAck: ackMap => { - mockAckMap = ackMap; - }, - /** - * Set a new bech32 prefix for the mocked ICA channel. Defaults to `cosmos`. - * - * @param newPrefix - */ - setAddressPrefix: newPrefix => { - bech32Prefix = newPrefix; - }, - /** - * for debugging and testing - */ - inspectDibcBridge() { - return bridgeEvents; - }, - }); -}; - -export const setupFakeNetwork = (zone, { vowTools }) => { - const powers = prepareNetworkPowers(zone, vowTools); - const makeRouterProtocol = prepareRouterProtocol(zone, powers); - const makePortAllocator = preparePortAllocator(zone, powers); - // const makeRouterProtocol = prepareRouterProtocol(zone, vowTools); - // const makePortAllocator = preparePortAllocator(zone, vowTools); - const makeLoopbackProtocolHandler = prepareLoopbackProtocolHandler( - zone, - vowTools, - ); - const makeEchoConnectionKit = prepareEchoConnectionKit(zone); - const makeIBCProtocolHandler = prepareIBCProtocol(zone, vowTools); - - const protocol = makeRouterProtocol(); - const portAllocator = makePortAllocator({ protocol }); - const ibcBridge = makeFakeIBCBridge(zone); - - const networkVat = Far('vat-network', { - registerProtocolHandler: (prefixes, handler) => - protocol.registerProtocolHandler(prefixes, handler), - makeLoopbackProtocolHandler, - makeEchoConnectionKit, - unregisterProtocolHandler: (prefix, handler) => - protocol.unregisterProtocolHandler(prefix, handler), - getPortAllocator: () => portAllocator, - }); - - const ibcVat = Far('vat-ibc', { - makeCallbacks: prepareIBCCallbacks(zone), - createHandlers(callbacks) { - const ibcHandler = makeIBCProtocolHandler(callbacks); - return harden(ibcHandler); - }, - }); - - const setupIBCProtocol = async () => { - const callbacks = await E(ibcVat).makeCallbacks(ibcBridge); - const { protocolHandler, bridgeHandler } = - await E(ibcVat).createHandlers(callbacks); - await E(ibcBridge).initHandler(bridgeHandler); - await E(networkVat).registerProtocolHandler( - ['/ibc-port', '/ibc-hop'], - protocolHandler, - ); - }; - - return { - portAllocator, - protocol, - ibcBridge, - networkVat, - ibcVat, - setupIBCProtocol, - }; -}; diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index a363101e..3ba77cad 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -18,12 +18,12 @@ import { installContract } from '../src/platform-goals/start-contract.js'; * @import {IcaAccount, MakeCosmosInterchainService} from '@agoric/orchestration'; * @import {LocalChain,LocalChainAccount} from '@agoric/vats/src/localchain.js'; * @import {TargetRegistration} from '@agoric/vats/src/bridge-target.js'; - * @import {OrcaSF} from '../src/orca.contract.ts'; + * @import {OrcaSF} from '../src/orca.contract.js'; */ const nodeRequire = createRequire(import.meta.url); -const contractPath = nodeRequire.resolve(`../src/orca.contract.ts`); +const contractPath = nodeRequire.resolve(`../src/orca.contract.js`); const scriptRoot = { orca: nodeRequire.resolve('../src/orca.proposal.js'), }; diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts index 96995b9e..2e20c46a 100644 --- a/contract/tools/ibc-mocks.ts +++ b/contract/tools/ibc-mocks.ts @@ -22,7 +22,7 @@ import type { import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; import type { ChainAddress } from '../src/orchestration-api.js'; -import { makeQueryPacket, makeTxPacket } from '../src/utils/packet.js'; +import { makeQueryPacket, makeTxPacket } from '../utils/packet.js'; interface EncoderI { encode: (message: T) => { diff --git a/contract/utils/address.js b/contract/utils/address.js index 8d39ed5a..4699afa4 100644 --- a/contract/utils/address.js +++ b/contract/utils/address.js @@ -2,7 +2,7 @@ import { Fail, q } from '@endo/errors'; /** * @import {IBCConnectionID} from '@agoric/vats'; - * @import {ChainAddress} from '../types.js'; + * @import {ChainAddress} from '../src/types.js'; * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; */ diff --git a/contract/utils/start-helper.js b/contract/utils/start-helper.js index 902c7194..8e2a21c6 100644 --- a/contract/utils/start-helper.js +++ b/contract/utils/start-helper.js @@ -1,14 +1,14 @@ import { prepareAsyncFlowTools } from '@agoric/async-flow'; -import { prepareVowTools } from '@agoric/vow'; +import { prepareVowTools } from '@agoric/vow/vat.js'; import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; import { makeDurableZone } from '@agoric/zone/durable.js'; -import { makeChainHub } from '../exos/chain-hub.js'; -import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; -import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; -import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; -import { prepareOrchestrator } from '../exos/orchestrator.js'; -import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; -import { makeOrchestrationFacade } from '../facade.js'; +import { makeChainHub } from '../src/exos/chain-hub.js'; +import { prepareCosmosOrchestrationAccount } from '../src/exos/cosmos-orchestration-account.js'; +import { prepareLocalChainFacade } from '../src/exos/local-chain-facade.js'; +import { prepareLocalOrchestrationAccountKit } from '../src/exos/local-orchestration-account.js'; +import { prepareOrchestrator } from '../src/exos/orchestrator.js'; +import { prepareRemoteChainFacade } from '../src/exos/remote-chain-facade.js'; +import { makeOrchestrationFacade } from '../src/facade.js'; import { makeZoeTools } from './zoe-tools.js'; import { makeZcfTools } from './zcf-tools.js'; diff --git a/contract/utils/zcf-tools.js b/contract/utils/zcf-tools.js index d3843695..bc8027e6 100644 --- a/contract/utils/zcf-tools.js +++ b/contract/utils/zcf-tools.js @@ -1,7 +1,7 @@ /** * @import {HostInterface} from '@agoric/async-flow'; * @import {VowTools} from '@agoric/vow'; - * @import {ZcfTools} from '../types.js'; + * @import {ZcfTools} from '../src/types.js'; */ import { M, mustMatch } from '@endo/patterns'; From 4ee7e703295ddbff8cf47352589e63ad078c612e Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 15:36:02 +0500 Subject: [PATCH 15/31] fixup! removing duplicate files --- contract/src/auto-stake-it-tap-kit.js | 2 +- contract/src/exos/README.md | 4 +- contract/test/auto-stake-it.contract.test.ts | 3 +- contract/test/orca-contract.test.js | 2 +- contract/tsconfig.json | 6 +- contract/typeGuards.js | 197 ------------------- contract/utils/orchestrationAccount.js | 2 +- 7 files changed, 8 insertions(+), 208 deletions(-) delete mode 100644 contract/typeGuards.js diff --git a/contract/src/auto-stake-it-tap-kit.js b/contract/src/auto-stake-it-tap-kit.js index 8e73fc74..0c30f9c4 100644 --- a/contract/src/auto-stake-it-tap-kit.js +++ b/contract/src/auto-stake-it-tap-kit.js @@ -3,7 +3,7 @@ import { E } from '@endo/far'; import { VowShape } from '@agoric/vow'; import { makeTracer } from '@agoric/internal'; import { atob } from '@endo/base64'; -import { ChainAddressShape } from '../typeGuards.js'; +import { ChainAddressShape } from './typeGuards.js'; const trace = makeTracer('AutoStakeItTap'); diff --git a/contract/src/exos/README.md b/contract/src/exos/README.md index 0599cbbb..d3a59777 100644 --- a/contract/src/exos/README.md +++ b/contract/src/exos/README.md @@ -81,10 +81,10 @@ classDiagram } %% In api consumer vats - + LocalOrchestrationAccount --* LocalChainAccount CosmosOrchestrationAccount --* IcaAccount - + class LocalOrchestrationAccount { account: LocalChainAccount address: ChainAddress diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index b680b0fa..6804b030 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -16,8 +16,7 @@ const dirname = path.dirname(new URL(import.meta.url).pathname); const contractName = 'auto-stake-it'; const contractFile = `${dirname}/../src/${contractName}.contract.js`; -type StartFn = - typeof import('../src/auto-stake-it.contract.js').start; +type StartFn = typeof import('../src/auto-stake-it.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index 3ba77cad..7a670a59 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -1,6 +1,7 @@ // @ts-check import { test as anyTest } from './prepare-test-env-ava.js'; + import { createRequire } from 'module'; import { E, Far, passStyleOf } from '@endo/far'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; @@ -364,7 +365,6 @@ const orchestrationAccountAndFundScenario = test.macro({ ); let offerResult; - offerResult = await E(seat).getOfferResult(); await t.throwsAsync( async () => (offerResult = await vt.when(E(seat).getOfferResult())), { message: /TODO: use IBC mocks or something/ }, diff --git a/contract/tsconfig.json b/contract/tsconfig.json index 08a01a83..4646fe56 100644 --- a/contract/tsconfig.json +++ b/contract/tsconfig.json @@ -12,10 +12,8 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "outDir": "./dist", - "allowImportingTsExtensions": true, - "noEmit": true + "outDir": "./dist" }, "include": ["tools", "test"], "exclude": ["node_modules"] -} \ No newline at end of file +} diff --git a/contract/typeGuards.js b/contract/typeGuards.js deleted file mode 100644 index 995754dd..00000000 --- a/contract/typeGuards.js +++ /dev/null @@ -1,197 +0,0 @@ -import { VowShape } from '@agoric/vow'; -import { M } from '@endo/patterns'; - -/** - * @import {TypedPattern} from '@agoric/internal'; - * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; - * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; - * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; - * @import {TypedJson} from '@agoric/cosmic-proto'; - */ - -/** - * Used for IBC Channel Connections that only send outgoing transactions. If - * your channel expects incoming transactions, please extend this interface to - * include the `onReceive` handler. - */ -export const OutboundConnectionHandlerI = M.interface( - 'OutboundConnectionHandler', - { - onOpen: M.callWhen(M.any(), M.string(), M.string(), M.any()).returns( - M.any(), - ), - onClose: M.callWhen(M.any(), M.any(), M.any()).returns(M.any()), - }, -); - -/** @type {TypedPattern} */ -export const ChainAddressShape = { - chainId: M.string(), - encoding: M.string(), - value: M.string(), -}; -harden(ChainAddressShape); - -/** @type {TypedPattern} */ -export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; -harden(ChainAddressShape); - -/** @internal */ -export const IBCTransferOptionsShape = M.splitRecord( - {}, - { - timeoutTimestamp: M.bigint(), - timeoutHeight: { - revisionHeight: M.bigint(), - revisionNumber: M.bigint(), - }, - memo: M.string(), - }, -); - -/** @internal */ -export const IBCChannelIDShape = M.string(); - -/** @internal */ -export const IBCChannelInfoShape = M.splitRecord({ - portId: M.string(), - channelId: IBCChannelIDShape, - counterPartyPortId: M.string(), - counterPartyChannelId: IBCChannelIDShape, - ordering: M.scalar(), // XXX - state: M.scalar(), // XXX - version: M.string(), -}); - -/** @internal */ -export const IBCConnectionIDShape = M.string(); - -/** @internal */ -export const IBCConnectionInfoShape = M.splitRecord({ - id: IBCConnectionIDShape, - client_id: M.string(), - state: M.scalar(), // XXX STATE_OPEN or... - counterparty: { - client_id: M.string(), - connection_id: IBCConnectionIDShape, - }, - transferChannel: IBCChannelInfoShape, -}); - -/** @type {TypedPattern} */ -export const CosmosAssetInfoShape = M.splitRecord({ - base: M.string(), - name: M.string(), - display: M.string(), - symbol: M.string(), - denom_units: M.arrayOf( - M.splitRecord({ denom: M.string(), exponent: M.number() }), - ), -}); - -/** @type {TypedPattern} */ -export const CosmosChainInfoShape = M.splitRecord( - { - chainId: M.string(), - }, - { - bech32Prefix: M.string(), - connections: M.record(), - stakingTokens: M.arrayOf({ denom: M.string() }), - // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 - icqEnabled: M.boolean(), - }, -); - -/** @type {TypedPattern} */ -export const ChainInfoShape = M.splitRecord({ - chainId: M.string(), -}); -export const DenomShape = M.string(); - -/** @type {TypedPattern>} */ -export const DenomInfoShape = { - chain: M.remotable('Chain'), - base: M.remotable('Chain'), - brand: M.or(M.remotable('Brand'), M.undefined()), - baseDenom: M.string(), -}; -harden(DenomInfoShape); - -/** @type {TypedPattern} */ -export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; -harden(DenomAmountShape); - -/** @type {TypedPattern>} */ -export const AnyNatAmountShape = { - brand: M.remotable('Brand'), - value: M.nat(), -}; -harden(AnyNatAmountShape); - -/** @type {TypedPattern} */ -export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); - -/** - * @type {TypedPattern<{ - * validator: CosmosValidatorAddress; - * amount: AmountArg; - * }>} - */ -export const DelegationShape = M.splitRecord( - { - validator: ChainAddressShape, - amount: AmountArgShape, - }, - { delegator: ChainAddressShape }, -); - -/** Approximately @see RequestQuery */ -export const ICQMsgShape = M.splitRecord( - { path: M.string(), data: M.string() }, - { height: M.string(), prove: M.boolean() }, -); - -/** @type {TypedPattern} */ -export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); - -/** @see {Chain} */ -export const chainFacadeMethods = { - getChainInfo: M.call().returns(VowShape), - makeAccount: M.call().returns(VowShape), -}; -harden(chainFacadeMethods); - -/** - * for google/protobuf/timestamp.proto, not to be confused with TimestampShape - * from `@agoric/time` - * - * `seconds` is a big integer but since it goes through JSON it is encoded as - * string - */ -export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; -harden(TimestampProtoShape); - -/** - * see {@link TxBody} for more details - * - * @internal - */ -export const TxBodyOptsShape = M.splitRecord( - {}, - { - memo: M.string(), - timeoutHeight: M.bigint(), - extensionOptions: M.arrayOf(M.any()), - nonCriticalExtensionOptions: M.arrayOf(M.any()), - }, -); - -/** - * Ensures at least one {@link AmountKeywordRecord} entry is present and only - * permits Nat (fungible) amounts. - */ -export const AnyNatAmountsRecord = M.and( - M.recordOf(M.string(), AnyNatAmountShape), - M.not({}), -); diff --git a/contract/utils/orchestrationAccount.js b/contract/utils/orchestrationAccount.js index 23f5337d..2290af54 100644 --- a/contract/utils/orchestrationAccount.js +++ b/contract/utils/orchestrationAccount.js @@ -8,7 +8,7 @@ import { ChainAddressShape, DenomAmountShape, IBCTransferOptionsShape, -} from '../typeGuards.js'; +} from '../src/typeGuards.js'; /** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ From 62c7c547c6441048368770337558f0aee6631c2e Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 16:34:10 +0500 Subject: [PATCH 16/31] fixup! removed exos and utils dir --- contract/package.json | 2 +- contract/src/auto-stake-it.contract.js | 9 +- contract/src/auto-stake-it.flows.js | 3 +- contract/src/exos/README.md | 130 -- contract/src/exos/chain-hub-admin.js | 84 -- contract/src/exos/chain-hub.js | 488 ------- .../src/exos/combine-invitation-makers.js | 59 - .../src/exos/cosmos-interchain-service.js | 280 ---- .../src/exos/cosmos-orchestration-account.js | 1147 ----------------- contract/src/exos/exo-interfaces.ts | 35 - contract/src/exos/ibc-packet.js | 219 ---- contract/src/exos/ica-account-kit.js | 231 ---- contract/src/exos/icq-connection-kit.js | 132 -- contract/src/exos/local-chain-facade.js | 196 --- .../src/exos/local-orchestration-account.js | 747 ----------- contract/src/exos/orchestrator.js | 196 --- contract/src/exos/packet-tools.js | 372 ------ contract/src/exos/portfolio-holder-kit.js | 230 ---- contract/src/exos/remote-chain-facade.js | 269 ---- .../src/{chain-info.js => old_chain-info.js} | 0 contract/src/orchestration-api.ts | 3 +- contract/test/supports.ts | 8 +- contract/tools/ibc-mocks.ts | 4 +- contract/utils/address.js | 103 -- contract/utils/amounts.js | 59 - contract/utils/cosmos.js | 82 -- contract/utils/denomHash.js | 22 - contract/utils/orc.js | 38 - contract/utils/orchestrationAccount.js | 40 - contract/utils/packet.js | 112 -- contract/utils/registry.js | 130 -- contract/utils/start-helper.js | 214 --- contract/utils/time.js | 48 - contract/utils/zcf-tools.js | 35 - contract/utils/zoe-tools.js | 186 --- yarn.lock | 565 ++------ 36 files changed, 93 insertions(+), 6385 deletions(-) delete mode 100644 contract/src/exos/README.md delete mode 100644 contract/src/exos/chain-hub-admin.js delete mode 100644 contract/src/exos/chain-hub.js delete mode 100644 contract/src/exos/combine-invitation-makers.js delete mode 100644 contract/src/exos/cosmos-interchain-service.js delete mode 100644 contract/src/exos/cosmos-orchestration-account.js delete mode 100644 contract/src/exos/exo-interfaces.ts delete mode 100644 contract/src/exos/ibc-packet.js delete mode 100644 contract/src/exos/ica-account-kit.js delete mode 100644 contract/src/exos/icq-connection-kit.js delete mode 100644 contract/src/exos/local-chain-facade.js delete mode 100644 contract/src/exos/local-orchestration-account.js delete mode 100644 contract/src/exos/orchestrator.js delete mode 100644 contract/src/exos/packet-tools.js delete mode 100644 contract/src/exos/portfolio-holder-kit.js delete mode 100644 contract/src/exos/remote-chain-facade.js rename contract/src/{chain-info.js => old_chain-info.js} (100%) delete mode 100644 contract/utils/address.js delete mode 100644 contract/utils/amounts.js delete mode 100644 contract/utils/cosmos.js delete mode 100644 contract/utils/denomHash.js delete mode 100644 contract/utils/orc.js delete mode 100644 contract/utils/orchestrationAccount.js delete mode 100644 contract/utils/packet.js delete mode 100644 contract/utils/registry.js delete mode 100644 contract/utils/start-helper.js delete mode 100644 contract/utils/time.js delete mode 100644 contract/utils/zcf-tools.js delete mode 100644 contract/utils/zoe-tools.js diff --git a/contract/package.json b/contract/package.json index 66a6a0cf..4f092fb2 100644 --- a/contract/package.json +++ b/contract/package.json @@ -30,7 +30,7 @@ "@agoric/inter-protocol": "^0.17.0-u17.1", "@agoric/internal": "^0.4.0-u17.1", "@agoric/network": "0.1.1-dev-d1562a1.0", - "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch", + "@agoric/orchestration": "0.2.0-u18.1", "@agoric/smart-wallet": "^0.5.4-u17.1", "@agoric/store": "^0.9.3-u17.1", "@agoric/time": "^0.3.3-u17.1", diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js index 7a365c07..c593c42e 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/auto-stake-it.contract.js @@ -3,15 +3,16 @@ import { InvitationShape, } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; -import { prepareChainHubAdmin } from './exos/chain-hub-admin.js'; -import { preparePortfolioHolder } from './exos/portfolio-holder-kit.js'; -import { withOrchestration } from '../utils/start-helper.js'; +import { prepareChainHubAdmin } from '@agoric/orchestration/src/exos/chain-hub-admin.js'; +import { preparePortfolioHolder } from '@agoric/orchestration/src/exos/portfolio-holder-kit.js'; +// import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; +import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; import * as flows from './auto-stake-it.flows.js'; /** * @import {Zone} from '@agoric/zone'; - * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; + * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; * @import { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; */ diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/auto-stake-it.flows.js index 16b10212..fa180e89 100644 --- a/contract/src/auto-stake-it.flows.js +++ b/contract/src/auto-stake-it.flows.js @@ -1,5 +1,6 @@ import { Fail } from '@endo/errors'; -import { denomHash } from '../utils/denomHash.js'; +import { denomHash } from '@agoric/orchestration/src/utils/denomHash.js'; +// import { denomHash } from '../utils/denomHash.js'; /** * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; diff --git a/contract/src/exos/README.md b/contract/src/exos/README.md deleted file mode 100644 index d3a59777..00000000 --- a/contract/src/exos/README.md +++ /dev/null @@ -1,130 +0,0 @@ -# Exo structure - -Last verified 2024-10-30 - -```mermaid -classDiagram - -%% Orchestration vat business logic (Zoe) - ICQConnection --* Port - ICQConnection --* Connection - IcaAccount --* Port - IcaAccount --* Connection - IcaAccount --* CosmosInterchainService - ICQConnection --* CosmosInterchainService - CosmosInterchainService --* PortAllocator - PortAllocator --* NetworkVat - LocalChainAccount --* LocalChainVat - - class IcaAccount { - port: Port - connection: Connection - localAddress: LocalIbcAddress - requestedRemoteAddress: string - remoteAddress: RemoteIbcAddress - chainAddress: ChainAddress - getAddress() - getLocalAddress() - getRemoteAddress() - getPort() - executeTx() - executeEncodedTx() - deactivate() - reactivate() - } - class ICQConnection { - port: Port - connection: Connection - localAddress: LocalIbcAddress - remoteAddress: RemoteIbcAddress - getLocalAddress() - getRemoteAddress() - query() - } - - class CosmosInterchainService { - portAllocator: PortAllocator - icqConnections: MapStore - sharedICQPort: Port - makeAccount() - provideICQConnection() - } - -%% In other vats - class Port { - addListener() - connect() - getLocalAddress() - removeListener() - revoke() - } - - class Connection { - getLocalAddress() - getRemoteAddress() - send() - close() - } - - class PortAllocator { - allocateCustomIBCPort() - allocateICAControllerPort() - allocateICQControllerPort() - } - - class LocalChainAccount { - deposit() - executeTx() - getBalance() - monitorTransfers() - withdraw() - } - -%% In api consumer vats - - LocalOrchestrationAccount --* LocalChainAccount - CosmosOrchestrationAccount --* IcaAccount - - class LocalOrchestrationAccount { - account: LocalChainAccount - address: ChainAddress - topicKit: RecorderKit - asContinuingOffer() - delegate() - deposit() - executeTx() - getAddress() - getBalance() - getBalances() - getPublicTopics() - monitorTransfers() - send() - sendAll() - transfer() - undelegate() - withdraw() - } - - class CosmosOrchestrationAccount { - account: LocalChainAccount - chainAddress: ChainAddress - icqConnection: ICQConnection | undefined - timer: Timer - topicKit: RecorderKit - asContinuingOffer() - deactivate() - delegate() - executeEncodedTx() - getAddress() - getBalance() - getBalances() - getPublicTopics() - reactivate() - redelegate() - send() - sendAll() - transfer() - undelegate() - withdrawReward() - } -``` diff --git a/contract/src/exos/chain-hub-admin.js b/contract/src/exos/chain-hub-admin.js deleted file mode 100644 index e790257b..00000000 --- a/contract/src/exos/chain-hub-admin.js +++ /dev/null @@ -1,84 +0,0 @@ -/* we expect promises to resolved promptly, */ -/* eslint-disable no-restricted-syntax */ -import { heapVowE } from '@agoric/vow/vat.js'; -import { M } from '@endo/patterns'; -import { CosmosChainInfoShape } from '../typeGuards.js'; -import { DenomDetailShape } from './chain-hub.js'; - -/** - * @import {Zone} from '@agoric/zone'; - * @import {CosmosChainInfo, Denom, IBCConnectionInfo} from '@agoric/orchestration'; - * @import {ChainHub, DenomDetail} from './chain-hub.js'; - */ - -/** - * For use with async-flow contracts: can be used as a creator facet that allows - * developers to add new chain configurations to a local chainHub, in the event - * the information is not available widely in `agoricNames`. - * - * @example - * - * ```js - * const chainHubAdmin = prepareChainHubAdmin(zone, chainHub); - * chainHubAdmin.initChain( - * 'hotNewChain', - * hotNewChainInfo, - * agoricTohotNewChainConnectionInfo, - * ); - * ``` - * - * @param {Zone} zone - * @param {ChainHub} chainHub - */ -export const prepareChainHubAdmin = (zone, chainHub) => { - const ConnectionInfoShape = M.record(); // TODO - const makeCreatorFacet = zone.exo( - 'ChainHub Admin', - M.interface('ChainHub Admin', { - registerChain: M.callWhen( - M.string(), - CosmosChainInfoShape, - ConnectionInfoShape, - ).returns(M.undefined()), - registerAsset: M.call(M.string(), DenomDetailShape).returns(M.promise()), - }), - { - /** - * Register information for a chain - * - * @param {string} chainName - must not exist in chainHub - * @param {CosmosChainInfo} chainInfo - * @param {IBCConnectionInfo} connectionInfo - from Agoric chain - */ - async registerChain(chainName, chainInfo, connectionInfo) { - // when() because chainHub methods return vows. If this were inside - // orchestrate() the membrane would wrap/unwrap automatically. - const agoricChainInfo = await heapVowE.when( - chainHub.getChainInfo('agoric'), - ); - chainHub.registerChain(chainName, chainInfo); - chainHub.registerConnection( - agoricChainInfo.chainId, - chainInfo.chainId, - connectionInfo, - ); - }, - /** - * Register an asset that may be held on a chain other than the issuing - * chain. - * - * @param {Denom} denom - on the holding chain, whose name is given in - * `detail.chainName` - * @param {DenomDetail} detail - chainName and baseName must be registered - */ - async registerAsset(denom, detail) { - // XXX async work necessary before the synchronous call - await heapVowE.when(chainHub.getChainInfo('agoric')); - chainHub.registerAsset(denom, detail); - }, - }, - ); - return makeCreatorFacet; -}; - -/** @typedef {ReturnType} ChainHubAdmin */ diff --git a/contract/src/exos/chain-hub.js b/contract/src/exos/chain-hub.js deleted file mode 100644 index a7a31472..00000000 --- a/contract/src/exos/chain-hub.js +++ /dev/null @@ -1,488 +0,0 @@ -import { Fail, makeError, q } from '@endo/errors'; -import { E } from '@endo/far'; -import { M } from '@endo/patterns'; -import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; - -import { VowShape } from '@agoric/vow'; -import { - ChainAddressShape, - CosmosChainInfoShape, - IBCConnectionInfoShape, -} from '../typeGuards.js'; -import { getBech32Prefix } from '../../utils/address.js'; - -/** - * @import {NameHub} from '@agoric/vats'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {CosmosAssetInfo, CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; - * @import {ChainInfo, KnownChains} from '../chain-info.js'; - * @import {ChainAddress, Denom} from '../orchestration-api.js'; - * @import {Remote} from '@agoric/internal'; - * @import {TypedPattern} from '@agoric/internal'; - */ - -/** - * If K matches a known chain, narrow the type from generic ChainInfo - * - * @template {string} K - * @typedef {K extends keyof KnownChains - * ? ChainInfo & Omit - * : ChainInfo} ActualChainInfo - * @internal - */ - -/** - * @typedef {object} DenomDetail - * @property {string} baseName - name of issuing chain; e.g. cosmoshub - * @property {Denom} baseDenom - e.g. uatom - * @property {string} chainName - name of holding chain; e.g. agoric - * @property {Brand<'nat'>} [brand] - vbank brand, if registered - * @see {ChainHub} `registerAsset` method - */ -/** @type {TypedPattern} */ -export const DenomDetailShape = M.splitRecord( - { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, - { brand: BrandShape }, -); - -/** - * @enum {(typeof HubName)[keyof typeof HubName]} - */ -export const HubName = /** @type {const} */ ({ - /** agoricNames key for ChainInfo hub */ - Chain: 'chain', - /** namehub for assets info */ - ChainAssets: 'chainAssets', - /** namehub for connection info */ - ChainConnection: 'chainConnection', -}); -harden(HubName); - -/** @deprecated use HubName.Chain */ -export const CHAIN_KEY = HubName.Chain; -/** @deprecated use HubName.ChainConnection */ -export const CONNECTIONS_KEY = HubName.ChainConnection; -/** @deprecated use HubName.ChainAssets */ -export const ASSETS_KEY = HubName.ChainAssets; - -/** - * Character used in a connection tuple key to separate the two chain ids. Valid - * because a chainId can contain only alphanumerics and dash. - * - * Vstorage keys can be only alphanumerics, dash or underscore. That leaves - * underscore as the only valid separator. - * - * @see {@link https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md} - */ -const CHAIN_ID_SEPARATOR = '_'; - -/** - * The entries of the top-level namehubs in agoricNames are reflected to - * vstorage. But only the top level. So we combine the 2 chain ids into 1 key. - * Connections are directionless, so we sort the ids. - * - * @param {string} chainId1 - * @param {string} chainId2 - */ -export const connectionKey = (chainId1, chainId2) => { - if ( - chainId1.includes(CHAIN_ID_SEPARATOR) || - chainId2.includes(CHAIN_ID_SEPARATOR) - ) { - Fail`invalid chain id ${chainId1} or ${chainId2}`; - } - return [chainId1, chainId2].sort().join(CHAIN_ID_SEPARATOR); -}; - -/** - * Utility to reverse connection info perspective. - * - * @param {IBCConnectionInfo} connInfo - * @returns {IBCConnectionInfo} - */ -const reverseConnInfo = connInfo => { - const { transferChannel } = connInfo; - return { - id: connInfo.counterparty.connection_id, - client_id: connInfo.counterparty.client_id, - counterparty: { - client_id: connInfo.client_id, - connection_id: connInfo.id, - }, - state: connInfo.state, - transferChannel: { - ...transferChannel, - channelId: transferChannel.counterPartyChannelId, - counterPartyChannelId: transferChannel.channelId, - portId: transferChannel.counterPartyPortId, - counterPartyPortId: transferChannel.portId, - }, - }; -}; - -/** - * Convert the info to an undirected form. - * - * @param {string} primaryChainId - * @param {string} counterChainId - * @param {IBCConnectionInfo} directed - * @returns {[string, IBCConnectionInfo]} - */ -export const normalizeConnectionInfo = ( - primaryChainId, - counterChainId, - directed, -) => { - const key = connectionKey(primaryChainId, counterChainId); - if (primaryChainId < counterChainId) { - return [key, directed]; - } else { - return [key, reverseConnInfo(directed)]; - } -}; - -/** - * Provide a view on the connection from the primary chain's perspective. - * - * @param {string} primaryChainId - * @param {string} counterChainId - * @param {IBCConnectionInfo} normalized - */ -const denormalizeConnectionInfo = ( - primaryChainId, - counterChainId, - normalized, -) => { - if (primaryChainId < counterChainId) { - return normalized; - } else { - return reverseConnInfo(normalized); - } -}; - -const ChainIdArgShape = M.or( - M.string(), - M.splitRecord( - { - chainId: M.string(), - }, - undefined, - M.any(), - ), -); - -const ChainHubI = M.interface('ChainHub', { - registerChain: M.call(M.string(), CosmosChainInfoShape).returns(), - getChainInfo: M.call(M.string()).returns(VowShape), - registerConnection: M.call( - M.string(), - M.string(), - IBCConnectionInfoShape, - ).returns(), - getConnectionInfo: M.call(ChainIdArgShape, ChainIdArgShape).returns(VowShape), - getChainsAndConnection: M.call(M.string(), M.string()).returns(VowShape), - registerAsset: M.call(M.string(), DenomDetailShape).returns(), - getAsset: M.call(M.string()).returns(M.or(DenomDetailShape, M.undefined())), - getDenom: M.call(BrandShape).returns(M.or(M.string(), M.undefined())), - makeChainAddress: M.call(M.string()).returns(ChainAddressShape), -}); - -/** - * Make a new ChainHub in the zone. - * - * The resulting object is an Exo singleton. It has no precious state. It's only - * state is a cache of queries to agoricNames and whatever info was provided in - * registration calls. When you need a newer version you can simply make a hub - * hub and repeat the registrations. - * - * @param {Zone} zone - * @param {Remote} agoricNames - * @param {VowTools} vowTools - */ -export const makeChainHub = (zone, agoricNames, vowTools) => { - /** @type {MapStore} */ - const chainInfos = zone.mapStore('chainInfos', { - keyShape: M.string(), - valueShape: CosmosChainInfoShape, - }); - /** @type {MapStore} */ - const connectionInfos = zone.mapStore('connectionInfos', { - keyShape: M.string(), - valueShape: IBCConnectionInfoShape, - }); - - /** @type {MapStore} */ - const denomDetails = zone.mapStore('denom', { - keyShape: M.string(), - valueShape: DenomDetailShape, - }); - /** @type {MapStore} */ - const brandDenoms = zone.mapStore('brandDenom', { - keyShape: BrandShape, - valueShape: M.string(), - }); - /** @type {MapStore} */ - const bech32PrefixToChainName = zone.mapStore('bech32PrefixToChainName', { - keyShape: M.string(), - valueShape: M.string(), - }); - - const lookupChainInfo = vowTools.retriable( - zone, - 'lookupChainInfo', - /** @param {string} chainName */ - // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices - async chainName => { - await null; - try { - const chainInfo = await E(agoricNames).lookup(HubName.Chain, chainName); - // It may have been set by another concurrent call - // TODO consider makeAtomicProvider for vows - if (!chainInfos.has(chainName)) { - chainInfos.init(chainName, chainInfo); - if (chainInfo.bech32Prefix) { - bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName); - } - } - return chainInfo; - } catch (e) { - console.error('lookupChainInfo', chainName, 'error', e); - throw makeError(`chain not found:${chainName}`); - } - }, - ); - - const lookupConnectionInfo = vowTools.retriable( - zone, - 'lookupConnectionInfo', - /** - * @param {string} chainId1 - * @param {string} chainId2 - */ - // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices - async (chainId1, chainId2) => { - await null; - const key = connectionKey(chainId1, chainId2); - try { - const connectionInfo = await E(agoricNames).lookup( - HubName.ChainConnection, - key, - ); - // It may have been set by another concurrent call - // TODO consider makeAtomicProvider for vows - if (!connectionInfos.has(key)) { - connectionInfos.init(key, connectionInfo); - } - - return denormalizeConnectionInfo(chainId1, chainId2, connectionInfo); - } catch (e) { - console.error('lookupConnectionInfo', chainId1, chainId2, 'error', e); - throw makeError(`connection not found: ${chainId1}<->${chainId2}`); - } - }, - ); - - /* eslint-disable no-use-before-define -- chainHub defined below */ - const lookupChainsAndConnection = vowTools.retriable( - zone, - 'lookupChainsAndConnection', - /** - * @template {string} C1 - * @template {string} C2 - * @param {C1} primaryName - * @param {C2} counterName - * @returns {Promise< - * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] - * >} - */ - // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices - async (primaryName, counterName) => { - const [primary, counter] = await vowTools.asPromise( - vowTools.allVows([ - chainHub.getChainInfo(primaryName), - chainHub.getChainInfo(counterName), - ]), - ); - const connectionInfo = await vowTools.asPromise( - chainHub.getConnectionInfo(primary, counter), - ); - return /** @type {[ActualChainInfo, ActualChainInfo, IBCConnectionInfo]} */ ([ - primary, - counter, - connectionInfo, - ]); - }, - ); - - const chainHub = zone.exo('ChainHub', ChainHubI, { - /** - * Register a new chain. The name will override a name in well known chain - * names. - * - * If a durable zone was not provided, registration will not survive a - * reincarnation of the vat. Then if the chain is not yet in the well known - * names at that point, it will have to be registered again. In an unchanged - * contract `start` the call will happen again naturally. - * - * @param {string} name - * @param {CosmosChainInfo} chainInfo - */ - registerChain(name, chainInfo) { - chainInfos.init(name, chainInfo); - if (chainInfo.bech32Prefix) { - bech32PrefixToChainName.init(chainInfo.bech32Prefix, name); - } - }, - /** - * @template {string} K - * @param {K} chainName - * @returns {Vow>} - */ - getChainInfo(chainName) { - // Either from registerChain or memoized remote lookup() - if (chainInfos.has(chainName)) { - return /** @type {Vow>} */ ( - vowTools.asVow(() => chainInfos.get(chainName)) - ); - } - - return lookupChainInfo(chainName); - }, - /** - * @param {string} primaryChainId - * @param {string} counterpartyChainId - * @param {IBCConnectionInfo} connectionInfo from primary to counterparty - */ - registerConnection(primaryChainId, counterpartyChainId, connectionInfo) { - const [key, normalized] = normalizeConnectionInfo( - primaryChainId, - counterpartyChainId, - connectionInfo, - ); - connectionInfos.init(key, normalized); - }, - - /** - * @param {string | { chainId: string }} primary the primary chain - * @param {string | { chainId: string }} counter the counterparty chain - * @returns {Vow} - */ - getConnectionInfo(primary, counter) { - const primaryId = typeof primary === 'string' ? primary : primary.chainId; - const counterId = typeof counter === 'string' ? counter : counter.chainId; - const key = connectionKey(primaryId, counterId); - if (connectionInfos.has(key)) { - return vowTools.asVow(() => - denormalizeConnectionInfo( - primaryId, - counterId, - connectionInfos.get(key), - ), - ); - } - - return lookupConnectionInfo(primaryId, counterId); - }, - - /** - * @template {string} C1 - * @template {string} C2 - * @param {C1} primaryName the primary chain name - * @param {C2} counterName the counterparty chain name - * @returns {Vow< - * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] - * >} - */ - getChainsAndConnection(primaryName, counterName) { - // @ts-expect-error XXX generic parameter propagation - return lookupChainsAndConnection(primaryName, counterName); - }, - - /** - * Register an asset that may be held on a chain other than the issuing - * chain. - * - * @param {Denom} denom - on the holding chain, whose name is given in - * `detail.chainName` - * @param {DenomDetail} detail - chainName and baseName must be registered - */ - registerAsset(denom, detail) { - const { chainName, baseName } = detail; - chainInfos.has(chainName) || - Fail`must register chain ${q(chainName)} first`; - chainInfos.has(baseName) || - Fail`must register chain ${q(baseName)} first`; - denomDetails.init(denom, detail); - if (detail.brand) { - brandDenoms.init(detail.brand, denom); - } - }, - /** - * Retrieve holding, issuing chain names etc. for a denom. - * - * @param {Denom} denom - * @returns {DenomDetail | undefined} - */ - getAsset(denom) { - if (denomDetails.has(denom)) { - return denomDetails.get(denom); - } - return undefined; - }, - /** - * Retrieve denom (string) for a Brand. - * - * @param {Brand} brand - * @returns {Denom | undefined} - */ - getDenom(brand) { - if (brandDenoms.has(brand)) { - return brandDenoms.get(brand); - } - return undefined; - }, - /** - * @param {string} address bech32 address - * @returns {ChainAddress} - */ - makeChainAddress(address) { - const prefix = getBech32Prefix(address); - if (!bech32PrefixToChainName.has(prefix)) { - throw makeError(`Chain info not found for bech32Prefix ${q(prefix)}`); - } - const chainName = bech32PrefixToChainName.get(prefix); - const { chainId } = chainInfos.get(chainName); - return harden({ - chainId, - value: address, - encoding: /** @type {const} */ ('bech32'), - }); - }, - }); - - return chainHub; -}; -/** @typedef {ReturnType} ChainHub */ - -/** - * Register assets with the given ChainHub so they are available for lookup - * - * @param {ChainHub} chainHub - * @param {string} name - * @param {CosmosAssetInfo[]} assets - */ -export const registerAssets = (chainHub, name, assets) => { - for (const { base, traces } of assets) { - const native = !traces; - native || traces.length === 1 || Fail`unexpected ${traces.length} traces`; - const [chainName, baseName, baseDenom] = native - ? [name, name, base] - : [ - name, - traces[0].counterparty.chain_name, - traces[0].counterparty.base_denom, - ]; - chainHub.registerAsset(base, { chainName, baseName, baseDenom }); - } -}; diff --git a/contract/src/exos/combine-invitation-makers.js b/contract/src/exos/combine-invitation-makers.js deleted file mode 100644 index 3dd20625..00000000 --- a/contract/src/exos/combine-invitation-makers.js +++ /dev/null @@ -1,59 +0,0 @@ -import { M } from '@endo/patterns'; -import { - prepareGuardedAttenuator, - makeSyncMethodCallback, -} from '@agoric/internal/src/callback.js'; -import { getMethodNames } from '@agoric/internal'; - -/** - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {Zone} from '@agoric/zone'; - */ - -// TODO use a helper from Endo https://github.com/endojs/endo/issues/2448 -/** - * Takes two or more InvitationMaker exos and combines them into a new one. - * Combine with `publicTopics` to form a {@link ContinuingOfferResult} that can - * be returned to a smart-wallet client. - * - * Useful for writing your own invitationMakers while preserving - * platform-provided ones like `Delegate`, `Transfer`, `Send`. - * - * @param {Zone} zone - * @param {import('@endo/patterns').InterfaceGuard[]} interfaceGuards - */ -export const prepareCombineInvitationMakers = (zone, ...interfaceGuards) => { - const methodGuards = interfaceGuards.map(ig => ig.payload.methodGuards); - const CombinedInterfaceGuard = M.interface( - 'CombinedInvitationMakers interface', - Object.assign({}, ...methodGuards), - ); - - const mixin = prepareGuardedAttenuator(zone, CombinedInterfaceGuard, { - tag: 'CombinedInvitationMakers', - }); - - /** - * @template {InvitationMakers[]} IM - * @param {IM} invitationMakers - * @returns {IM[number]} - */ - const combineInvitationMakers = (...invitationMakers) => { - const overrides = {}; - for (const invMakers of invitationMakers) { - // remove '__getInterfaceGuard__', '__getMethodNames__' - const names = getMethodNames(invMakers).filter(n => !n.startsWith('__')); - for (const key of names) { - overrides[key] = makeSyncMethodCallback(invMakers, key); - } - } - return mixin({ - overrides, - }); - }; - - return combineInvitationMakers; -}; - -/** @typedef {ReturnType} MakeCombineInvitationMakers */ -/** @typedef {ReturnType} CombinedInvitationMakers */ diff --git a/contract/src/exos/cosmos-interchain-service.js b/contract/src/exos/cosmos-interchain-service.js deleted file mode 100644 index c6d72b96..00000000 --- a/contract/src/exos/cosmos-interchain-service.js +++ /dev/null @@ -1,280 +0,0 @@ -/** @file Orchestration service */ - -import { Shape as NetworkShape } from '@agoric/network'; -import { pickFacet } from '@agoric/vat-data'; -import { E } from '@endo/far'; -import { M, mustMatch } from '@endo/patterns'; -import { - DEFAULT_ICQ_VERSION, - makeICAChannelAddress, - makeICQChannelAddress, -} from '../../utils/address.js'; -import { prepareIcaAccountKit } from './ica-account-kit.js'; -import { prepareICQConnectionKit } from './icq-connection-kit.js'; - -/** - * @import {Zone} from '@agoric/base-zone'; - * @import {Remote} from '@agoric/internal'; - * @import {Connection, Port, PortAllocator} from '@agoric/network'; - * @import {IBCConnectionID} from '@agoric/vats'; - * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {ICQConnection, IcaAccount, ICQConnectionKit, IcaAccountKit} from '../types.js'; - * @import {ICAChannelAddressOpts} from '../../utils/address.js'; - */ - -const { Vow$ } = NetworkShape; // TODO #9611 -/** - * @typedef {object} OrchestrationPowers - * @property {Remote} portAllocator - * @property {undefined} reserved reserve a state key for future use. can hold - * an additional power or a record of powers - */ - -/** @typedef {MapStore} ICQConnectionStore */ - -/** @typedef {IcaAccountKit | ICQConnectionKit} ConnectionKit */ - -/** - * @typedef {{ - * icqConnections: ICQConnectionStore; - * sharedICQPort: Remote | undefined; - * } & OrchestrationPowers} OrchestrationState - */ - -/** - * Creates a key for the icqConnections mapStore based on connectionId and - * version - * - * @param {IBCConnectionID} controllerConnectionId - * @param {string} [version] - * @returns {string} - */ -const getICQConnectionKey = (controllerConnectionId, version) => { - return `${controllerConnectionId}:${version || DEFAULT_ICQ_VERSION}`; -}; - -/** - * @param {Zone} zone - * @param {VowTools} vowTools - * @param {ReturnType} makeIcaAccountKit - * @param {ReturnType} makeICQConnectionKit - */ -const prepareCosmosOrchestrationServiceKit = ( - zone, - { watch, asVow }, - makeIcaAccountKit, - makeICQConnectionKit, -) => - zone.exoClassKit( - 'Orchestration', - { - requestICAChannelWatcher: M.interface('RequestICAChannelWatcher', { - onFulfilled: M.call(M.remotable('Port')) - .optional({ chainId: M.string(), remoteConnAddr: M.string() }) - .returns(Vow$(NetworkShape.Connection)), - }), - requestICQChannelWatcher: M.interface('RequestICQChannelWatcher', { - onFulfilled: M.call(M.remotable('Port')) - .optional({ - remoteConnAddr: M.string(), - icqLookupKey: M.string(), - }) - .returns(Vow$(NetworkShape.Connection)), - }), - channelOpenWatcher: M.interface('ChannelOpenWatcher', { - onFulfilled: M.call(M.remotable('Connection')) - .optional( - M.splitRecord( - { connectionKit: M.record(), returnFacet: M.string() }, - { icqLookupKey: M.string() }, - ), - ) - .returns(M.remotable('ConnectionKit Holder facet')), - }), - public: M.interface('CosmosInterchainService', { - makeAccount: M.call(M.string(), M.string(), M.string()) - .optional(M.record()) - .returns(Vow$(M.remotable('IcaAccountKit'))), - provideICQConnection: M.call(M.string()) - .optional(M.string()) - .returns(Vow$(M.remotable('ICQConnection'))), - }), - }, - /** @param {Partial} powers */ - powers => { - mustMatch(powers?.portAllocator, M.remotable('PortAllocator')); - const icqConnections = zone.detached().mapStore('ICQConnections'); - return /** @type {OrchestrationState} */ ({ - icqConnections, - sharedICQPort: undefined, - reserved: undefined, - ...powers, - }); - }, - { - requestICAChannelWatcher: { - /** - * @param {Port} port - * @param {{ - * chainId: string; - * remoteConnAddr: RemoteIbcAddress; - * }} watchContext - */ - onFulfilled(port, { chainId, remoteConnAddr }) { - const connectionKit = makeIcaAccountKit( - chainId, - port, - remoteConnAddr, - ); - return watch( - E(port).connect(remoteConnAddr, connectionKit.connectionHandler), - this.facets.channelOpenWatcher, - { returnFacet: 'account', connectionKit }, - ); - }, - }, - requestICQChannelWatcher: { - /** - * @param {Port} port - * @param {{ - * remoteConnAddr: RemoteIbcAddress; - * icqLookupKey: string; - * }} watchContext - */ - onFulfilled(port, { remoteConnAddr, icqLookupKey }) { - if (!this.state.sharedICQPort) { - this.state.sharedICQPort = port; - } - const connectionKit = makeICQConnectionKit(port); - return watch( - E(port).connect(remoteConnAddr, connectionKit.connectionHandler), - this.facets.channelOpenWatcher, - { - connectionKit, - returnFacet: 'connection', - icqLookupKey, - }, - ); - }, - }, - /** - * Waits for a channel (ICA, ICQ) to open and returns the consumer-facing - * facet of the ConnectionKit, specified by `returnFacet`. Saves the - * ConnectionKit if `saveICQConnection` is provided. - */ - channelOpenWatcher: { - /** - * @param {Connection} _connection - * @param {{ - * connectionKit: ConnectionKit; - * returnFacet: string; - * icqLookupKey?: string; - * }} watchContext - */ - onFulfilled(_connection, { connectionKit, returnFacet, icqLookupKey }) { - if (icqLookupKey) { - this.state.icqConnections.init( - icqLookupKey, - /** @type {ICQConnectionKit} */ (connectionKit), - ); - } - return connectionKit[returnFacet]; - }, - }, - public: { - /** - * @satisfies {CosmosInterchainService['makeAccount']} - * @param {string} chainId - * @param {IBCConnectionID} hostConnectionId the counterparty - * connection_id - * @param {IBCConnectionID} controllerConnectionId self connection_id - * @param {ICAChannelAddressOpts} [opts] optional to configure the - * channel address, such as version and ordering - * @returns {Vow} - */ - makeAccount(chainId, hostConnectionId, controllerConnectionId, opts) { - const remoteConnAddr = makeICAChannelAddress( - hostConnectionId, - controllerConnectionId, - opts, - ); - const { portAllocator } = this.state; - return watch( - E(portAllocator).allocateICAControllerPort(), - this.facets.requestICAChannelWatcher, - { - chainId, - remoteConnAddr, - }, - ); - }, - /** - * @satisfies {CosmosInterchainService['provideICQConnection']} - * @param {IBCConnectionID} controllerConnectionId - * @param {string} [version] - * @returns {Vow | ICQConnection} - */ - provideICQConnection(controllerConnectionId, version) { - const icqLookupKey = getICQConnectionKey( - controllerConnectionId, - version, - ); - if (this.state.icqConnections.has(icqLookupKey)) { - return asVow( - () => this.state.icqConnections.get(icqLookupKey).connection, - ); - } - const remoteConnAddr = makeICQChannelAddress( - controllerConnectionId, - version, - ); - const { portAllocator, sharedICQPort } = this.state; - const portOrPortVow = - sharedICQPort || E(portAllocator).allocateICQControllerPort(); - - return watch(portOrPortVow, this.facets.requestICQChannelWatcher, { - remoteConnAddr, - icqLookupKey, - }); - }, - }, - }, - { - stateShape: { - icqConnections: M.remotable('icqConnections mapStore'), - sharedICQPort: M.or(M.remotable('Port'), M.undefined()), - portAllocator: M.remotable('PortAllocator'), - reserved: M.any(), - }, - }, - ); - -/** - * Used only by vat-orchestration and tests mocking it - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @internal - */ -export const prepareCosmosInterchainService = (zone, vowTools) => { - const makeIcaAccountKit = prepareIcaAccountKit(zone, vowTools); - const makeICQConnectionKit = prepareICQConnectionKit(zone, vowTools); - const makeCosmosOrchestrationServiceKit = - prepareCosmosOrchestrationServiceKit( - zone, - vowTools, - makeIcaAccountKit, - makeICQConnectionKit, - ); - - const makeCosmosInterchainService = pickFacet( - makeCosmosOrchestrationServiceKit, - 'public', - ); - - return makeCosmosInterchainService; -}; -harden(prepareCosmosInterchainService); - -/** @typedef {ReturnType} MakeCosmosInterchainService */ diff --git a/contract/src/exos/cosmos-orchestration-account.js b/contract/src/exos/cosmos-orchestration-account.js deleted file mode 100644 index 837eb2ad..00000000 --- a/contract/src/exos/cosmos-orchestration-account.js +++ /dev/null @@ -1,1147 +0,0 @@ -/** @file Use-object for the owner of a staking account */ -import { toRequestQueryJson } from '@agoric/cosmic-proto'; -import { - QueryAllBalancesRequest, - QueryAllBalancesResponse, - QueryBalanceRequest, - QueryBalanceResponse, -} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; -import { MsgSend } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; -import { - QueryDelegationRewardsRequest, - QueryDelegationRewardsResponse, - QueryDelegationTotalRewardsRequest, - QueryDelegationTotalRewardsResponse, -} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; -import { - MsgWithdrawDelegatorReward, - MsgWithdrawDelegatorRewardResponse, -} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/tx.js'; -import { - QueryDelegationRequest, - QueryDelegationResponse, - QueryDelegatorDelegationsRequest, - QueryDelegatorDelegationsResponse, - QueryDelegatorUnbondingDelegationsRequest, - QueryDelegatorUnbondingDelegationsResponse, - QueryRedelegationsRequest, - QueryRedelegationsResponse, - QueryUnbondingDelegationRequest, - QueryUnbondingDelegationResponse, -} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/query.js'; -import { - MsgBeginRedelegate, - MsgDelegate, - MsgUndelegate, - MsgUndelegateResponse, -} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; -import { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; -import { makeTracer } from '@agoric/internal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { M } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; -import { decodeBase64 } from '@endo/base64'; -import { Fail, makeError, q } from '@endo/errors'; -import { E } from '@endo/far'; -import { - AmountArgShape, - ChainAddressShape, - DelegationShape, - DenomAmountShape, - IBCTransferOptionsShape, - Proto3Shape, - TxBodyOptsShape, -} from '../typeGuards.js'; -import { coerceCoin, coerceDenom } from '../../utils/amounts.js'; -import { - maxClockSkew, - toCosmosDelegationResponse, - toCosmosValidatorAddress, - toDenomAmount, - toTruncatedDenomAmount, - tryDecodeResponse, -} from '../../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../../utils/time.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {AmountArg, IcaAccount, ChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, OrchestrationAccountI, CosmosRewardsResponse, IBCConnectionInfo, IBCMsgTransferOptions, ChainHub, CosmosDelegationResponse} from '../types.js'; - * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - * @import {Remote} from '@agoric/internal'; - * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {TimerService} from '@agoric/time'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; - * @import {JsonSafe} from '@agoric/cosmic-proto'; - * @import {Matcher} from '@endo/patterns'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -const trace = makeTracer('ComosOrchestrationAccountHolder'); - -const { Vow$ } = NetworkShape; // TODO #9611 - -/** - * @typedef {object} ComosOrchestrationAccountNotification - * @property {ChainAddress} chainAddress - */ - -/** - * @private - * @typedef {{ - * topicKit: RecorderKit; - * account: IcaAccount; - * chainAddress: ChainAddress; - * localAddress: LocalIbcAddress; - * remoteAddress: RemoteIbcAddress; - * icqConnection: ICQConnection | undefined; - * timer: Remote; - * }} State - * Internal to the IcaAccountHolder exo - */ - -/** - * @typedef {{ - * localAddress: LocalIbcAddress; - * remoteAddress: RemoteIbcAddress; - * }} CosmosOrchestrationAccountStorageState - */ - -/** @see {StakingAccountActions} */ -const stakingAccountActionsMethods = { - delegate: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), - redelegate: M.call( - ChainAddressShape, - ChainAddressShape, - AmountArgShape, - ).returns(VowShape), - undelegate: M.call(M.arrayOf(DelegationShape)).returns(VowShape), - withdrawReward: M.call(ChainAddressShape).returns( - Vow$(M.arrayOf(DenomAmountShape)), - ), - withdrawRewards: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), -}; - -/** @see {StakingAccountQueries} */ -const stakingAccountQueriesMethods = { - getDelegation: M.call(ChainAddressShape).returns(VowShape), - getDelegations: M.call().returns(VowShape), - getUnbondingDelegation: M.call(ChainAddressShape).returns(VowShape), - getUnbondingDelegations: M.call().returns(VowShape), - getRedelegations: M.call().returns(VowShape), - getReward: M.call(ChainAddressShape).returns(VowShape), - getRewards: M.call().returns(VowShape), -}; - -/** @see {OrchestrationAccountI} */ -export const IcaAccountHolderI = M.interface('IcaAccountHolder', { - ...orchestrationAccountMethods, - ...stakingAccountActionsMethods, - ...stakingAccountQueriesMethods, - deactivate: M.call().returns(VowShape), - reactivate: M.call().returns(VowShape), - executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) - .optional(TxBodyOptsShape) - .returns(VowShape), -}); - -/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ -const PUBLIC_TOPICS = { - account: ['Staking Account holder status', M.any()], -}; - -export const CosmosOrchestrationInvitationMakersI = M.interface( - 'invitationMakers', - { - Delegate: M.call(ChainAddressShape, AmountArgShape).returns(M.promise()), - Redelegate: M.call( - ChainAddressShape, - ChainAddressShape, - AmountArgShape, - ).returns(M.promise()), - WithdrawReward: M.call(ChainAddressShape).returns(M.promise()), - Undelegate: M.call(M.arrayOf(DelegationShape)).returns(M.promise()), - DeactivateAccount: M.call().returns(M.promise()), - ReactivateAccount: M.call().returns(M.promise()), - TransferAccount: M.call().returns(M.promise()), - Send: M.call().returns(M.promise()), - SendAll: M.call().returns(M.promise()), - Transfer: M.call().returns(M.promise()), - }, -); -harden(CosmosOrchestrationInvitationMakersI); - -/** - * @param {Zone} zone - * @param {object} powers - * @param {ChainHub} powers.chainHub - * @param {MakeRecorderKit} powers.makeRecorderKit - * @param {Remote} powers.timerService - * @param {VowTools} powers.vowTools - * @param {ZCF} powers.zcf - */ -export const prepareCosmosOrchestrationAccountKit = ( - zone, - { - chainHub, - makeRecorderKit, - timerService, - vowTools: { watch, asVow, when, allVows }, - zcf, - }, -) => { - const timestampHelper = makeTimestampHelper(timerService); - const makeCosmosOrchestrationAccountKit = zone.exoClassKit( - 'Cosmos Orchestration Account Holder', - { - helper: M.interface('helper', { - owned: M.call().returns(M.remotable()), - getUpdater: M.call().returns(M.remotable()), - amountToCoin: M.call(AmountArgShape).returns(M.record()), - }), - returnVoidWatcher: M.interface('returnVoidWatcher', { - onFulfilled: M.call(M.or(M.string(), M.record())) - .optional(M.arrayOf(M.undefined())) - .returns(M.undefined()), - }), - balanceQueryWatcher: M.interface('balanceQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(M.or(M.record(), M.undefined())), - }), - allBalancesQueryWatcher: M.interface('allBalancesQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - undelegateWatcher: M.interface('undelegateWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(Vow$(M.promise())), - }), - withdrawRewardWatcher: M.interface('withdrawRewardWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(M.arrayOf(DenomAmountShape)), - }), - transferWatcher: M.interface('transferWatcher', { - onFulfilled: M.call([M.record(), M.nat()]) - .optional({ - destination: ChainAddressShape, - opts: M.or(M.undefined(), IBCTransferOptionsShape), - token: { - denom: M.string(), - amount: M.string(), - }, - }) - .returns(Vow$(M.record())), - }), - delegationQueryWatcher: M.interface('delegationQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), - }), - delegationsQueryWatcher: M.interface('delegationsQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - unbondingDelegationQueryWatcher: M.interface( - 'unbondingDelegationQueryWatcher', - { - onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), - }, - ), - unbondingDelegationsQueryWatcher: M.interface( - 'unbondingDelegationsQueryWatcher', - { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }, - ), - redelegationQueryWatcher: M.interface('redelegationQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - redelegationsQueryWatcher: M.interface('redelegationsQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - rewardQueryWatcher: M.interface('rewardQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - rewardsQueryWatcher: M.interface('rewardsQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), - }), - holder: IcaAccountHolderI, - invitationMakers: CosmosOrchestrationInvitationMakersI, - }, - /** - * @param {object} info - * @param {ChainAddress} info.chainAddress - * @param {LocalIbcAddress} info.localAddress - * @param {RemoteIbcAddress} info.remoteAddress - * @param {object} io - * @param {IcaAccount} io.account - * @param {Remote} io.storageNode - * @param {ICQConnection | undefined} io.icqConnection - * @param {Remote} io.timer - * @returns {State} - */ - ({ chainAddress, localAddress, remoteAddress }, io) => { - const { storageNode } = io; - // must be the fully synchronous maker because the kit is held in durable state - const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); - // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 - // XXX consider parsing local/remoteAddr to portId, channelId, counterpartyPortId, counterpartyChannelId, connectionId, counterpartyConnectionId - // FIXME these values will not update if IcaAccount gets new values after reopening. - // consider having IcaAccount responsible for the owning the writer. It might choose to share it with COA. - void E(topicKit.recorder).write( - /** @type {CosmosOrchestrationAccountStorageState} */ ({ - localAddress, - remoteAddress, - }), - ); - - const { account, icqConnection, timer } = io; - return { - account, - chainAddress, - icqConnection, - localAddress, - remoteAddress, - timer, - topicKit, - }; - }, - { - helper: { - /** @throws if this holder no longer owns the account */ - owned() { - const { account } = this.state; - if (!account) { - throw Fail`Using account holder after transfer`; - } - return account; - }, - getUpdater() { - return this.state.topicKit.recorder; - }, - /** - * @param {AmountArg} amount - * @returns {Coin} - */ - amountToCoin(amount) { - return coerceCoin(chainHub, amount); - }, - }, - balanceQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { balance } = QueryBalanceResponse.decode( - decodeBase64(result.key), - ); - if (!balance) throw Fail`Result lacked balance key: ${result}`; - return harden(toDenomAmount(balance)); - }, - }, - delegationQueryWatcher: { - /** - * @param {JsonSafe[]} results - * @returns {CosmosDelegationResponse} - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { delegationResponse } = QueryDelegationResponse.decode( - decodeBase64(result.key), - ); - if (!delegationResponse) - throw Fail`Result lacked delegationResponse key: ${result}`; - const { chainAddress } = this.state; - return harden( - toCosmosDelegationResponse(chainAddress, delegationResponse), - ); - }, - }, - delegationsQueryWatcher: { - /** - * @param {JsonSafe[]} results - * @returns {CosmosDelegationResponse[]} - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { delegationResponses } = - QueryDelegatorDelegationsResponse.decode(decodeBase64(result.key)); - if (!delegationResponses) - throw Fail`Result lacked delegationResponses key: ${result}`; - const { chainAddress } = this.state; - return harden( - delegationResponses.map(r => - toCosmosDelegationResponse(chainAddress, r), - ), - ); - }, - }, - unbondingDelegationQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { unbond } = QueryUnbondingDelegationResponse.decode( - decodeBase64(result.key), - ); - if (!unbond) throw Fail`Result lacked unbond key: ${result}`; - return harden(unbond); - }, - }, - unbondingDelegationsQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { unbondingResponses } = - QueryDelegatorUnbondingDelegationsResponse.decode( - decodeBase64(result.key), - ); - if (!unbondingResponses) - throw Fail`Result lacked unbondingResponses key: ${result}`; - return harden(unbondingResponses); - }, - }, - redelegationQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { redelegationResponses } = QueryRedelegationsResponse.decode( - decodeBase64(result.key), - ); - if (!redelegationResponses) - throw Fail`Result lacked redelegationResponses key: ${result}`; - return harden(redelegationResponses); - }, - }, - redelegationsQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { redelegationResponses } = QueryRedelegationsResponse.decode( - decodeBase64(result.key), - ); - if (!redelegationResponses) - throw Fail`Result lacked redelegationResponses key: ${result}`; - return harden(redelegationResponses); - }, - }, - rewardQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { rewards } = QueryDelegationRewardsResponse.decode( - decodeBase64(result.key), - ); - if (!rewards) throw Fail`Result lacked rewards key: ${result}`; - return harden(rewards.map(toTruncatedDenomAmount)); - }, - }, - rewardsQueryWatcher: { - /** - * @param {JsonSafe[]} results - * @returns {CosmosRewardsResponse} - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { rewards, total } = QueryDelegationTotalRewardsResponse.decode( - decodeBase64(result.key), - ); - if (!rewards || !total) - throw Fail`Result lacked rewards or total key: ${result}`; - const { chainAddress } = this.state; - return harden({ - rewards: rewards.map(reward => ({ - validator: toCosmosValidatorAddress(reward, chainAddress.chainId), - reward: reward.reward.map(toTruncatedDenomAmount), - })), - total: total.map(toTruncatedDenomAmount), - }); - }, - }, - allBalancesQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - let response; - try { - response = QueryAllBalancesResponse.decode( - // note: an empty string for result.key is a valid result - decodeBase64(result.key), - ); - } catch (cause) { - throw makeError( - `Error parsing QueryAllBalances result ${q(result)}`, - undefined, - { cause }, - ); - } - const { balances } = response; - if (!balances) throw Fail`Result lacked balances key: ${q(result)}`; - return harden(balances.map(coin => toDenomAmount(coin))); - }, - }, - undelegateWatcher: { - /** - * @param {string} result - */ - onFulfilled(result) { - const response = tryDecodeResponse( - result, - MsgUndelegateResponse.fromProtoMsg, - ); - trace('undelegate response', response); - const { completionTime } = response; - completionTime || Fail`No completion time result ${result}`; - return watch( - // ignore nanoseconds and just use seconds from Timestamp - E(this.state.timer).wakeAt(completionTime.seconds + maxClockSkew), - ); - }, - }, - /** - * takes an array of results (from `executeEncodedTx`) and returns void - * since we are not interested in the result - */ - returnVoidWatcher: { - /** @param {string | Record} result */ - onFulfilled(result) { - trace('Result', result); - return undefined; - }, - }, - withdrawRewardWatcher: { - /** @param {string} result */ - onFulfilled(result) { - const response = tryDecodeResponse( - result, - MsgWithdrawDelegatorRewardResponse.fromProtoMsg, - ); - trace('withdrawReward response', response); - const { amount: coins } = response; - return harden(coins.map(toDenomAmount)); - }, - }, - transferWatcher: { - /** - * @param {[ - * { transferChannel: IBCConnectionInfo['transferChannel'] }, - * bigint, - * ]} results - * @param {{ - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * token: Coin; - * }} ctx - */ - onFulfilled( - [{ transferChannel }, timeoutTimestamp], - { opts, token, destination }, - ) { - const results = E(this.facets.helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgTransfer.toProtoMsg({ - sourcePort: transferChannel.portId, - sourceChannel: transferChannel.channelId, - token, - sender: this.state.chainAddress.value, - receiver: destination.value, - timeoutHeight: opts?.timeoutHeight ?? { - revisionHeight: 0n, - revisionNumber: 0n, - }, - timeoutTimestamp, - memo: opts?.memo ?? '', - }), - ), - ]); - return watch(results, this.facets.returnVoidWatcher); - }, - }, - invitationMakers: { - /** - * @param {CosmosValidatorAddress} validator - * @param {AmountArg} amount - */ - Delegate(validator, amount) { - trace('Delegate', validator, amount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.delegate(validator, amount)); - }, 'Delegate'); - }, - /** - * @param {CosmosValidatorAddress} srcValidator - * @param {CosmosValidatorAddress} dstValidator - * @param {AmountArg} amount - */ - Redelegate(srcValidator, dstValidator, amount) { - trace('Redelegate', srcValidator, dstValidator, amount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch( - this.facets.holder.redelegate(srcValidator, dstValidator, amount), - ); - }, 'Redelegate'); - }, - /** @param {CosmosValidatorAddress} validator */ - WithdrawReward(validator) { - trace('WithdrawReward', validator); - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.withdrawReward(validator)); - }, 'WithdrawReward'); - }, - /** - * @param {{ - * amount: AmountArg; - * validator: CosmosValidatorAddress; - * }[]} delegations - */ - Undelegate(delegations) { - trace('Undelegate', delegations); - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.undelegate(delegations)); - }, 'Undelegate'); - }, - DeactivateAccount() { - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.deactivate()); - }, 'DeactivateAccount'); - }, - ReactivateAccount() { - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.reactivate()); - }, 'ReactivateAccount'); - }, - Send() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amount: AmountArg } - * >} - */ - const offerHandler = (seat, { toAccount, amount }) => { - seat.exit(); - return watch(this.facets.holder.send(toAccount, amount)); - }; - return zcf.makeInvitation(offerHandler, 'Send'); - }, - SendAll() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amounts: AmountArg[] } - * >} - */ - const offerHandler = (seat, { toAccount, amounts }) => { - seat.exit(); - return watch(this.facets.holder.sendAll(toAccount, amounts)); - }; - return zcf.makeInvitation(offerHandler, 'SendAll'); - }, - /** - * Starting a transfer revokes the account holder. The associated - * updater will get a special notification that the account is being - * transferred. - */ - TransferAccount() { - throw Error('not yet implemented'); - }, - Transfer() { - /** - * @type {OfferHandler< - * Vow, - * { - * amount: AmountArg; - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * } - * >} - */ - const offerHandler = (seat, { amount, destination, opts }) => { - seat.exit(); - return watch( - this.facets.holder.transfer(destination, amount, opts), - ); - }; - return zcf.makeInvitation(offerHandler, 'Transfer'); - }, - }, - holder: { - /** @type {HostOf} */ - asContinuingOffer() { - // @ts-expect-error XXX invitationMakers - // getPublicTopics resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { holder, invitationMakers: im } = this.facets; - // XXX cast to a type that has string index signature - const invitationMakers = /** @type {InvitationMakers} */ ( - /** @type {unknown} */ (im) - ); - - return harden({ - // getPublicTopics returns a vow, for membrane compatibility. - // it's safe to unwrap to a promise and get the result as we - // expect this complete in the same run - publicSubscribers: await when(holder.getPublicTopics()), - invitationMakers, - }); - }); - }, - /** @type {HostOf} */ - getPublicTopics() { - // getStoragePath resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { topicKit } = this.state; - return harden({ - account: { - description: PUBLIC_TOPICS.account[0], - subscriber: topicKit.subscriber, - storagePath: await topicKit.recorder.getStoragePath(), - }, - }); - }); - }, - - /** @type {HostOf} */ - getAddress() { - return this.state.chainAddress; - }, - /** @type {HostOf} */ - delegate(validator, amount) { - return asVow(() => { - trace('delegate', validator, amount); - const { helper } = this.facets; - const { chainAddress } = this.state; - - const amountAsCoin = helper.amountToCoin(amount); - - const results = E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgDelegate.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - amount: amountAsCoin, - }), - ), - ]); - return watch(results, this.facets.returnVoidWatcher); - }); - }, - - /** @type {HostOf} */ - redelegate(srcValidator, dstValidator, amount) { - return asVow(() => { - trace('redelegate', srcValidator, dstValidator, amount); - const { helper } = this.facets; - const { chainAddress } = this.state; - - const results = E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgBeginRedelegate.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorSrcAddress: srcValidator.value, - validatorDstAddress: dstValidator.value, - amount: helper.amountToCoin(amount), - }), - ), - ]); - - return watch( - results, - // NOTE: response, including completionTime, is currently discarded. - this.facets.returnVoidWatcher, - ); - }); - }, - /** @type {HostOf} */ - withdrawReward(validator) { - return asVow(() => { - trace('withdrawReward', validator); - const { helper } = this.facets; - const { chainAddress } = this.state; - const msg = MsgWithdrawDelegatorReward.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - }); - const account = helper.owned(); - - const results = E(account).executeEncodedTx([Any.toJSON(msg)]); - return watch(results, this.facets.withdrawRewardWatcher); - }); - }, - /** @type {HostOf} */ - getBalance(denom) { - return asVow(() => { - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryBalanceRequest.toProtoMsg({ - address: chainAddress.value, - denom: coerceDenom(chainHub, denom), - }), - ), - ]); - return watch(results, this.facets.balanceQueryWatcher); - }); - }, - - /** @type {HostOf} */ - getBalances() { - return asVow(() => { - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryAllBalancesRequest.toProtoMsg({ - address: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.allBalancesQueryWatcher); - }); - }, - - /** @type {HostOf} */ - send(toAccount, amount) { - return asVow(() => { - trace('send', toAccount, amount); - const { helper } = this.facets; - const { chainAddress } = this.state; - return watch( - E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgSend.toProtoMsg({ - fromAddress: chainAddress.value, - toAddress: toAccount.value, - amount: [helper.amountToCoin(amount)], - }), - ), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - - /** @type {HostOf} */ - sendAll(toAccount, amounts) { - return asVow(() => { - trace('sendAll', toAccount, amounts); - const { helper } = this.facets; - const { chainAddress } = this.state; - return watch( - E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgSend.toProtoMsg({ - fromAddress: chainAddress.value, - toAddress: toAccount.value, - amount: amounts.map(x => helper.amountToCoin(x)), - }), - ), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - - /** @type {HostOf} */ - transfer(destination, amount, opts) { - trace('transfer', destination, amount, opts); - return asVow(() => { - const { helper } = this.facets; - const token = helper.amountToCoin(amount); - - const connectionInfoV = watch( - chainHub.getConnectionInfo( - this.state.chainAddress.chainId, - destination.chainId, - ), - ); - - // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` - // TODO #9324 what's a reasonable default? currently 5 minutes - const timeoutTimestampVowOrValue = - opts?.timeoutTimestamp ?? - (opts?.timeoutHeight - ? 0n - : E(timestampHelper).getTimeoutTimestampNS()); - - // Resolves when host chain successfully submits, but not when - // the receiving chain acknowledges. - // See https://github.com/Agoric/agoric-sdk/issues/9784 for a - // solution that tracks the acknowledgement on the receiving chain. - return watch( - allVows([connectionInfoV, timeoutTimestampVowOrValue]), - this.facets.transferWatcher, - { opts, token, destination }, - ); - }); - }, - - /** @type {HostOf} */ - transferSteps(amount, msg) { - console.log('transferSteps got', amount, msg); - return asVow(() => Fail`not yet implemented`); - }, - - /** @type {HostOf} */ - withdrawRewards() { - return asVow(() => Fail`Not Implemented. Try using withdrawReward.`); - }, - - /** @type {HostOf} */ - undelegate(delegations) { - return asVow(() => { - trace('undelegate', delegations); - const { helper } = this.facets; - const { chainAddress } = this.state; - - delegations.every(d => - d.delegator ? d.delegator.value === chainAddress.value : true, - ) || Fail`Some delegation record is for another delegator`; - - const undelegateV = watch( - E(helper.owned()).executeEncodedTx( - delegations.map(({ validator, amount }) => - Any.toJSON( - MsgUndelegate.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - amount: coerceCoin(chainHub, amount), - }), - ), - ), - ), - this.facets.undelegateWatcher, - ); - return watch(undelegateV, this.facets.returnVoidWatcher); - }); - }, - /** @type {HostOf} */ - deactivate() { - return asVow(() => watch(E(this.facets.helper.owned()).deactivate())); - }, - /** @type {HostOf} */ - reactivate() { - return asVow(() => watch(E(this.facets.helper.owned()).reactivate())); - }, - /** @type {HostOf} */ - getDelegation(validator) { - return asVow(() => { - trace('getDelegation', validator); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegationRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - validatorAddr: validator.value, - }), - ), - ]); - return watch(results, this.facets.delegationQueryWatcher); - }); - }, - /** @type {HostOf} */ - getDelegations() { - return asVow(() => { - trace('getDelegations'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegatorDelegationsRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.delegationsQueryWatcher); - }); - }, - /** @type {HostOf} */ - getUnbondingDelegation(validator) { - return asVow(() => { - trace('getUnbondingDelegation', validator); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryUnbondingDelegationRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - validatorAddr: validator.value, - }), - ), - ]); - return watch(results, this.facets.unbondingDelegationQueryWatcher); - }); - }, - /** @type {HostOf} */ - getUnbondingDelegations() { - return asVow(() => { - trace('getUnbondingDelegations'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegatorUnbondingDelegationsRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.unbondingDelegationsQueryWatcher); - }); - }, - /** @type {HostOf} */ - getRedelegations() { - return asVow(() => { - trace('getRedelegations'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryRedelegationsRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - // These are optional but the protobufs require values to be set - dstValidatorAddr: '', - srcValidatorAddr: '', - }), - ), - ]); - return watch(results, this.facets.redelegationsQueryWatcher); - }); - }, - /** @type {HostOf} */ - getReward(validator) { - return asVow(() => { - trace('getReward', validator); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegationRewardsRequest.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - }), - ), - ]); - return watch(results, this.facets.rewardQueryWatcher); - }); - }, - /** @type {HostOf} */ - getRewards() { - return asVow(() => { - trace('getRewards'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegationTotalRewardsRequest.toProtoMsg({ - delegatorAddress: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.rewardsQueryWatcher); - }); - }, - /** @type {HostOf} */ - executeEncodedTx(msgs, opts) { - return asVow(() => - watch(E(this.facets.helper.owned()).executeEncodedTx(msgs, opts)), - ); - }, - }, - }, - ); - - return makeCosmosOrchestrationAccountKit; -}; - -/** - * @typedef {ReturnType< - * ReturnType - * >} CosmosOrchestrationAccountKit - */ - -/** - * @param {Zone} zone - * @param {object} powers - * @param {ChainHub} powers.chainHub - * @param {MakeRecorderKit} powers.makeRecorderKit - * @param {Remote} powers.timerService - * @param {VowTools} powers.vowTools - * @param {ZCF} powers.zcf - * @returns {( - * ...args: Parameters< - * ReturnType - * > - * ) => CosmosOrchestrationAccountKit['holder']} - */ -export const prepareCosmosOrchestrationAccount = ( - zone, - { chainHub, makeRecorderKit, timerService, vowTools, zcf }, -) => { - const makeKit = prepareCosmosOrchestrationAccountKit(zone, { - chainHub, - makeRecorderKit, - timerService, - vowTools, - zcf, - }); - return (...args) => makeKit(...args).holder; -}; -/** @typedef {CosmosOrchestrationAccountKit['holder']} CosmosOrchestrationAccount */ diff --git a/contract/src/exos/exo-interfaces.ts b/contract/src/exos/exo-interfaces.ts deleted file mode 100644 index 1cf2ffc2..00000000 --- a/contract/src/exos/exo-interfaces.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { IBCConnectionID } from '@agoric/vats'; -import type { Vow } from '@agoric/vow'; -import type { IcaAccount } from '../cosmos-api.js'; -import type { ICAChannelAddressOpts } from '../../utils/address.js'; -import type { ICQConnection } from './icq-connection-kit.js'; - -/** - * Authority to make a Cosmos interchain account or an interchain query connection. - */ -export interface CosmosInterchainService { - /** - * @param {string} chainId - * @param {IBCConnectionID} hostConnectionId the counterparty - * connection_id - * @param {IBCConnectionID} controllerConnectionId self connection_id - * @param {ICAChannelAddressOpts} [opts] optional to configure the - * channel address, such as version and ordering - * @returns {Vow} - */ - makeAccount( - chainId: string, - hostConnectionId: IBCConnectionID, - controllerConnectionId: IBCConnectionID, - opts?: ICAChannelAddressOpts | undefined, - ): Vow; - /** - * @param {IBCConnectionID} controllerConnectionId - * @param {string} [version] - * @returns {Vow | ICQConnection} - */ - provideICQConnection( - controllerConnectionId: IBCConnectionID, - version?: string | undefined, - ): Vow | ICQConnection; -} diff --git a/contract/src/exos/ibc-packet.js b/contract/src/exos/ibc-packet.js deleted file mode 100644 index dd25ac55..00000000 --- a/contract/src/exos/ibc-packet.js +++ /dev/null @@ -1,219 +0,0 @@ -import { assertAllDefined } from '@agoric/internal'; -import { base64ToBytes, Shape as NetworkShape } from '@agoric/network'; -import { M } from '@endo/patterns'; -import { E } from '@endo/far'; - -// As specified in ICS20, the success result is a base64-encoded '\0x1' byte. -export const ICS20_TRANSFER_SUCCESS_RESULT = 'AQ=='; - -/** - * @import {JsonSafe, TypedJson, ResponseTo} from '@agoric/cosmic-proto'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; - * @import {PacketOptions} from './packet-tools.js'; - */ - -const { Fail, bare } = assert; -const { Vow$ } = NetworkShape; // TODO #9611 - -/** - * Create a pattern for alterative representations of a sequence number. - * - * @param {any} sequence - * @returns {Pattern} - */ -export const createSequencePattern = sequence => { - const sequencePatterns = []; - - try { - const bintSequence = BigInt(sequence); - bintSequence > 0n && sequencePatterns.push(bintSequence); - } catch (e) { - // ignore - } - - const numSequence = Number(sequence); - numSequence > 0 && - Number.isSafeInteger(numSequence) && - sequencePatterns.push(numSequence); - - const strSequence = String(sequence); - strSequence && sequencePatterns.push(strSequence); - - if (!sequencePatterns.find(seq => seq === sequence)) { - sequencePatterns.push(sequence); - } - - switch (sequencePatterns.length) { - case 0: - throw Fail`sequence ${sequence} is not valid`; - case 1: - return sequencePatterns[0]; - default: - return M.or(...sequencePatterns); - } -}; -harden(createSequencePattern); - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools & { makeIBCReplyKit: MakeIBCReplyKit }} powers - */ -export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => { - const makeIBCTransferSenderKit = zone.exoClassKit( - 'IBCTransferSenderKit', - { - public: M.interface('IBCTransferSender', { - sendPacket: M.call(Vow$(M.any()), M.any()).returns(Vow$(M.record())), - }), - responseWatcher: M.interface('responseWatcher', { - onFulfilled: M.call([M.record()], M.record()).returns(M.any()), - }), - verifyTransferSuccess: M.interface('verifyTransferSuccess', { - onFulfilled: M.call(M.any()).returns(), - }), - }, - /** - * @param {{ - * executeTx: LocalChainAccount['executeTx']; - * }} txExecutor - * @param {TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'>} transferMsg - */ - (txExecutor, transferMsg) => ({ - txExecutor, - transferMsg: harden(transferMsg), - }), - { - public: { - sendPacket(match, opts) { - const { txExecutor, transferMsg } = this.state; - return watch( - E(txExecutor).executeTx([transferMsg]), - this.facets.responseWatcher, - { opts, match }, - ); - }, - }, - responseWatcher: { - /** - * Wait for successfully sending the transfer packet. - * - * @param {[ - * JsonSafe< - * ResponseTo< - * TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'> - * > - * >, - * ]} response - * @param {Record} ctx - */ - onFulfilled([{ sequence }], ctx) { - const { match } = ctx; - const { transferMsg } = this.state; - - // Match the port/channel and sequence number. - const replyPacketPattern = M.splitRecord({ - source_port: transferMsg.sourcePort, - source_channel: transferMsg.sourceChannel, - sequence: createSequencePattern(sequence), - }); - - const { resultV: ackDataV, ...rest } = makeIBCReplyKit( - replyPacketPattern, - match, - ctx, - ); - const resultV = watch(ackDataV, this.facets.verifyTransferSuccess); - return harden({ resultV, ...rest }); - }, - }, - verifyTransferSuccess: { - onFulfilled(ackData) { - let obj; - try { - obj = JSON.parse(ackData); - } catch { - Fail`ICS20-1 transfer ack data is not JSON: ${ackData}`; - } - const { result, error } = obj; - error === undefined || Fail`ICS20-1 transfer error ${error}`; - result ?? Fail`Missing result in ICS20-1 transfer ack ${obj}`; - result === ICS20_TRANSFER_SUCCESS_RESULT || - Fail`ICS20-1 transfer unsuccessful with ack result ${result}`; - }, - }, - }, - ); - - /** - * @param {Parameters} args - */ - return (...args) => makeIBCTransferSenderKit(...args).public; -}; -harden(prepareIBCTransferSender); - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools} vowTools - */ -export const prepareIBCReplyKit = (zone, vowTools) => { - const { watch } = vowTools; - const ibcWatcher = zone.exo( - 'ibcResultWatcher', - M.interface('processIBCWatcher', { - onFulfilled: M.call(M.record(), M.record()).returns(Vow$(M.string())), - }), - { - onFulfilled({ event, acknowledgement }, { opName = 'unknown' }) { - assertAllDefined({ event, acknowledgement }); - switch (event) { - case 'acknowledgementPacket': - return base64ToBytes(acknowledgement); - case 'timeoutPacket': - throw Fail`${bare(opName)} operation received timeout packet`; - default: - throw Fail`Unexpected event: ${event}`; - } - }, - }, - ); - - /** - * @param {Pattern} replyPacketPattern - * @param {Vow} matchV - * @param {PacketOptions} opts - */ - const makeIBCReplyKit = (replyPacketPattern, matchV, opts) => { - const eventPattern = M.or( - M.splitRecord({ - event: 'acknowledgementPacket', - packet: replyPacketPattern, - acknowledgement: M.string(), - }), - M.splitRecord({ - event: 'timeoutPacket', - packet: replyPacketPattern, - }), - ); - const resultV = watch(matchV, ibcWatcher, opts); - return harden({ eventPattern, resultV }); - }; - - return makeIBCReplyKit; -}; -harden(prepareIBCReplyKit); -/** @typedef {ReturnType} MakeIBCReplyKit */ - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools} vowTools - */ -export const prepareIBCTools = (zone, vowTools) => { - const makeIBCReplyKit = prepareIBCReplyKit(zone, vowTools); - const makeIBCTransferSender = prepareIBCTransferSender(zone, { - makeIBCReplyKit, - ...vowTools, - }); - return harden({ makeIBCTransferSender, makeIBCReplyKit }); -}; -harden(prepareIBCTools); diff --git a/contract/src/exos/ica-account-kit.js b/contract/src/exos/ica-account-kit.js deleted file mode 100644 index 920047c8..00000000 --- a/contract/src/exos/ica-account-kit.js +++ /dev/null @@ -1,231 +0,0 @@ -/** @file IcaAccount exo */ -import { Fail } from '@endo/errors'; -import { E } from '@endo/far'; -import { M } from '@endo/patterns'; -import { NonNullish, makeTracer } from '@agoric/internal'; -import { VowShape } from '@agoric/vow'; -import { - ChainAddressShape, - OutboundConnectionHandlerI, - Proto3Shape, - TxBodyOptsShape, -} from '../typeGuards.js'; -import { findAddressField } from '../../utils/address.js'; -import { makeTxPacket, parseTxPacket } from '../../utils/packet.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {Zone} from '@agoric/base-zone'; - * @import {Connection, Port} from '@agoric/network'; - * @import {Remote, Vow, VowTools} from '@agoric/vow'; - * @import {AnyJson} from '@agoric/cosmic-proto'; - * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - * @import {ChainAddress, IcaAccount} from '../types.js'; - */ - -const trace = makeTracer('IcaAccountKit'); - -const UNPARSABLE_CHAIN_ADDRESS = 'UNPARSABLE_CHAIN_ADDRESS'; - -export const IcaAccountI = M.interface('IcaAccount', { - getAddress: M.call().returns(ChainAddressShape), - getLocalAddress: M.call().returns(M.string()), - getRemoteAddress: M.call().returns(M.string()), - getPort: M.call().returns(M.remotable('Port')), - executeTx: M.call(M.arrayOf(M.record())).returns(VowShape), - executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) - .optional(TxBodyOptsShape) - .returns(VowShape), - deactivate: M.call().returns(VowShape), - reactivate: M.call().returns(VowShape), -}); - -// XXX none of these modifiers are working to exclude this type from api-docs -/** - * @private - * @typedef {{ - * chainId: string; - * port: Port; - * connection: Remote | undefined; - * localAddress: LocalIbcAddress | undefined; - * requestedRemoteAddress: string; - * remoteAddress: RemoteIbcAddress | undefined; - * chainAddress: ChainAddress | undefined; - * isInitiatingClose: boolean; - * }} State - * Internal to the IcaAccountKit exo - * @internal - */ - -/** - * Used only by CosmosInterchainService - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @internal - */ -export const prepareIcaAccountKit = (zone, { watch, asVow }) => - zone.exoClassKit( - 'IcaAccountKit', - { - account: IcaAccountI, - connectionHandler: OutboundConnectionHandlerI, - parseTxPacketWatcher: M.interface('ParseTxPacketWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // does not need watcherContext - .returns(M.string()), - }), - }, - /** - * @param {string} chainId - * @param {Port} port - * @param {string} requestedRemoteAddress - */ - (chainId, port, requestedRemoteAddress) => - /** @type {State} */ ({ - chainId, - port, - connection: undefined, - requestedRemoteAddress, - remoteAddress: undefined, - chainAddress: undefined, - localAddress: undefined, - isInitiatingClose: false, - }), - { - parseTxPacketWatcher: { - /** @param {string} ack */ - onFulfilled(ack) { - return parseTxPacket(ack); - }, - }, - account: { - /** @returns {ChainAddress} */ - getAddress() { - return NonNullish( - this.state.chainAddress, - 'ICA channel creation acknowledgement not yet received.', - ); - }, - getLocalAddress() { - return NonNullish( - this.state.localAddress, - 'local address not available', - ); - }, - getRemoteAddress() { - return NonNullish( - this.state.remoteAddress, - 'remote address not available', - ); - }, - getPort() { - return this.state.port; - }, - executeTx() { - return asVow(() => Fail`not yet implemented`); - }, - /** - * Submit a transaction on behalf of the remote account for execution on - * the remote chain. - * - * @param {AnyJson[]} msgs - * @param {Omit} [opts] - * @returns {Vow} - base64 encoded bytes string. Can be decoded - * using the corresponding `Msg*Response` object. - * @throws {Error} if packet fails to send or an error is returned - */ - executeEncodedTx(msgs, opts) { - return asVow(() => { - const { connection } = this.state; - if (!connection) { - throw Fail`Account not available or deactivated.`; - } - return watch( - E(connection).send(makeTxPacket(msgs, opts)), - this.facets.parseTxPacketWatcher, - ); - }); - }, - /** @type {HostOf} */ - deactivate() { - return asVow(() => { - const { connection } = this.state; - if (!connection) throw Fail`Account not available or deactivated.`; - this.state.isInitiatingClose = true; - return E(connection).close(); - }); - }, - /** @type {HostOf} */ - reactivate() { - return asVow(() => { - const { connection, port, requestedRemoteAddress } = this.state; - if (connection) { - throw Fail`Account is already active.`; - } - return watch( - E(port).connect( - requestedRemoteAddress, - this.facets.connectionHandler, - ), - ); - }); - }, - }, - connectionHandler: { - /** - * @param {Remote} connection - * @param {LocalIbcAddress} localAddr - * @param {RemoteIbcAddress} remoteAddr - */ - async onOpen(connection, localAddr, remoteAddr) { - trace(`ICA Channel Opened for ${localAddr} at ${remoteAddr}`); - this.state.connection = connection; - this.state.remoteAddress = remoteAddr; - this.state.localAddress = localAddr; - const address = findAddressField(remoteAddr); - if (!address) { - console.error('⚠️ failed to parse chain address', remoteAddr); - } - this.state.chainAddress = harden({ - value: address || UNPARSABLE_CHAIN_ADDRESS, - chainId: this.state.chainId, - encoding: 'bech32', - }); - }, - /** - * This handler fires any time the connection (channel) closes. This - * could be due to external factors (e.g. a packet timeout), or a holder - * initiated action (`.deactivate()`). - * - * Here, if a connection is opened again, we clear the connection and - * addresses from state as they will change - a new channel will be - * established if the connection is reopened. - * - * If the holder did not initiate the closure, a new connection is - * established using the original requested remote address. This will - * result in a new channelID but the ChainAddress will be preserved. - * - * @param {Remote} _connection - * @param {unknown} reason - * @see {@link https://docs.cosmos.network/v0.45/ibc/overview.html#:~:text=In%20ORDERED%20channels%2C%20a%20timeout%20of%20a%20single%20packet%20in%20the%20channel%20closes%20the%20channel.} - */ - async onClose(_connection, reason) { - trace(`ICA Channel closed. Reason: ${reason}`); - this.state.connection = undefined; - this.state.localAddress = undefined; - this.state.remoteAddress = undefined; - if (this.state.isInitiatingClose === true) { - trace('Account deactivated by holder. Skipping reactivation.'); - this.state.isInitiatingClose = false; - } else { - trace('Account closed unexpectedly. Automatically reactivating.'); - void watch(this.facets.account.reactivate()); - } - }, - }, - }, - ); - -/** @typedef {ReturnType>} IcaAccountKit */ diff --git a/contract/src/exos/icq-connection-kit.js b/contract/src/exos/icq-connection-kit.js deleted file mode 100644 index 9597d8e2..00000000 --- a/contract/src/exos/icq-connection-kit.js +++ /dev/null @@ -1,132 +0,0 @@ -/** @file ICQConnection Exo */ -import { Fail } from '@endo/errors'; -import { E } from '@endo/far'; -import { M } from '@endo/patterns'; -import { VowShape } from '@agoric/vow'; -import { NonNullish, makeTracer } from '@agoric/internal'; -import { makeQueryPacket, parseQueryPacket } from '../../utils/packet.js'; -import { ICQMsgShape, OutboundConnectionHandlerI } from '../typeGuards.js'; - -/** - * @import {Zone} from '@agoric/base-zone'; - * @import {Connection, Port} from '@agoric/network'; - * @import {Remote, Vow, VowTools} from '@agoric/vow'; - * @import {JsonSafe} from '@agoric/cosmic-proto'; - * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -const trace = makeTracer('Orchestration:ICQConnection'); - -export const ICQConnectionI = M.interface('ICQConnection', { - getLocalAddress: M.call().returns(M.string()), - getRemoteAddress: M.call().returns(M.string()), - query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), -}); - -/** - * @typedef {{ - * port: Port; - * connection: Remote | undefined; - * localAddress: LocalIbcAddress | undefined; - * remoteAddress: RemoteIbcAddress | undefined; - * }} ICQConnectionKitState - */ - -/** - * Used only by CosmosInterchainService - * - * Prepares an ICQ Connection Kit based on the - * {@link https://github.com/cosmos/ibc-apps/blob/e9b46e4bf0ad0a66cf6bc53b5e5496f6e2b4b02b/modules/async-icq/README.md | `icq/v1` IBC application protocol}. - * - * `icq/v1`, also referred to as `async-icq`, is a protocol for asynchronous - * queries between IBC-enabled chains. It allows a chain to send queries to - * another chain and receive responses asynchronously. - * - * The ICQ connection kit provides the necessary functionality to establish and - * manage an ICQ connection between two chains. It includes methods for - * retrieving the local and remote addresses of the connection, as well as - * sending queries and handling connection events. - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @internal - */ -export const prepareICQConnectionKit = (zone, { watch, asVow }) => - zone.exoClassKit( - 'ICQConnectionKit', - { - connection: ICQConnectionI, - connectionHandler: OutboundConnectionHandlerI, - parseQueryPacketWatcher: M.interface('ParseQueryPacketWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // does not need watcherContext - .returns(M.arrayOf(M.record())), - }), - }, - /** @param {Port} port */ - port => - /** @type {ICQConnectionKitState} */ ({ - port, - connection: undefined, - remoteAddress: undefined, - localAddress: undefined, - }), - { - connection: { - getLocalAddress() { - return NonNullish( - this.state.localAddress, - 'local address not available', - ); - }, - getRemoteAddress() { - return NonNullish( - this.state.remoteAddress, - 'remote address not available', - ); - }, - /** - * Vow rejects if packet fails to send or an error is returned - * - * @param {JsonSafe[]} msgs - * @returns {Vow[]>} - */ - query(msgs) { - return asVow(() => { - const { connection } = this.state; - if (!connection) throw Fail`connection not available`; - return watch( - E(connection).send(makeQueryPacket(msgs)), - this.facets.parseQueryPacketWatcher, - ); - }); - }, - }, - parseQueryPacketWatcher: { - /** @param {string} ack packet acknowledgement string */ - onFulfilled(ack) { - return parseQueryPacket(ack); - }, - }, - connectionHandler: { - /** - * @param {Remote} connection - * @param {LocalIbcAddress} localAddr - * @param {RemoteIbcAddress} remoteAddr - */ - async onOpen(connection, localAddr, remoteAddr) { - trace(`ICQ Channel Opened for ${localAddr} at ${remoteAddr}`); - this.state.connection = connection; - this.state.remoteAddress = remoteAddr; - this.state.localAddress = localAddr; - }, - async onClose(_connection, reason) { - trace(`ICQ Channel closed. Reason: ${reason}`); - }, - }, - }, - ); - -/** @typedef {ReturnType>} ICQConnectionKit */ -/** @typedef {ICQConnectionKit['connection']} ICQConnection */ diff --git a/contract/src/exos/local-chain-facade.js b/contract/src/exos/local-chain-facade.js deleted file mode 100644 index 7f4ace2d..00000000 --- a/contract/src/exos/local-chain-facade.js +++ /dev/null @@ -1,196 +0,0 @@ -/** @file Localchain Facade exo */ -import { E } from '@endo/far'; -// eslint-disable-next-line no-restricted-syntax -- just the import -import { heapVowE } from '@agoric/vow/vat.js'; -import { M } from '@endo/patterns'; -import { pickFacet } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; - -import { chainFacadeMethods, TypedJsonShape } from '../typeGuards.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {Zone} from '@agoric/base-zone'; - * @import {TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - * @import {LocalChain, LocalChainAccount, QueryManyFn} from '@agoric/vats/src/localchain.js'; - * @import {AssetInfo} from '@agoric/vats/src/vat-bank.js'; - * @import {NameHub} from '@agoric/vats'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {CosmosInterchainService} from './exo-interfaces.js'; - * @import {LocalOrchestrationAccountKit, MakeLocalOrchestrationAccountKit} from './local-orchestration-account.js'; - * @import {Chain, ChainAddress, ChainInfo, CosmosChainInfo, IBCConnectionInfo, OrchestrationAccount} from '../types.js'; - */ - -/** - * Chain facade methods unique to the Agoric (local) chain. - * - * @typedef {object} AgoricChainMethods - * @property {() => Promise} getVBankAssetInfo Get asset info from - * agoricNames.vbankAsset. - * - * Caches the query to agoricNames in the first call. - */ - -/** - * @typedef {{ - * makeLocalOrchestrationAccountKit: MakeLocalOrchestrationAccountKit; - * orchestration: Remote; - * storageNode: Remote; - * agoricNames: Remote; - * timer: Remote; - * localchain: Remote; - * vowTools: VowTools; - * }} LocalChainFacadePowers - */ - -/** - * @param {Zone} zone - * @param {LocalChainFacadePowers} powers - */ -const prepareLocalChainFacadeKit = ( - zone, - { - makeLocalOrchestrationAccountKit, - agoricNames, - localchain, - // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 - // consider making an `accounts` childNode - storageNode, - vowTools: { allVows, watch, asVow }, - }, -) => - zone.exoClassKit( - 'LocalChainFacade', - { - public: M.interface('LocalChainFacade', { - ...chainFacadeMethods, - query: M.call(M.arrayOf(TypedJsonShape)).returns(VowShape), - getVBankAssetInfo: M.call().optional(M.boolean()).returns(VowShape), - }), - vbankAssetValuesWatcher: M.interface('vbankAssetValuesWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(VowShape), - }), - makeAccountWatcher: M.interface('makeAccountWatcher', { - onFulfilled: M.call([M.remotable('LCA Account'), M.string()]) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(VowShape), - }), - makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { - onFulfilled: M.call(M.remotable()) - .optional({ account: M.remotable(), address: M.string() }) // empty context - .returns(M.remotable()), - }), - }, - /** - * @param {CosmosChainInfo} localChainInfo - */ - localChainInfo => { - return { - localChainInfo, - vbankAssets: /** @type {AssetInfo[] | undefined} */ (undefined), - }; - }, - { - public: { - getChainInfo() { - return watch(this.state.localChainInfo); - }, - - /** @returns {Vow} */ - makeAccount() { - const lcaP = E(localchain).makeAccount(); - return watch( - // XXX makeAccount returns a Promise for an exo but reserves being able to return a vow - // so we use heapVowE to shorten the promise path - // eslint-disable-next-line no-restricted-syntax -- will run in one turn - allVows([lcaP, heapVowE(lcaP).getAddress()]), - this.facets.makeAccountWatcher, - ); - }, - /** @type {HostOf['query']>} */ - query(requests) { - return watch(E(localchain).queryMany(requests)); - }, - /** @type {HostOf} */ - getVBankAssetInfo() { - return asVow(() => { - const { vbankAssets } = this.state; - if (vbankAssets) { - return vbankAssets; - } - const vbankAssetNameHubP = E(agoricNames).lookup('vbankAsset'); - const vbankAssetValuesP = E(vbankAssetNameHubP).values(); - const { vbankAssetValuesWatcher } = this.facets; - return watch(vbankAssetValuesP, vbankAssetValuesWatcher); - }); - }, - }, - vbankAssetValuesWatcher: { - /** - * @param {AssetInfo[]} assets - */ - onFulfilled(assets) { - const { state } = this; - return asVow(() => { - state.vbankAssets = assets; - return assets; - }); - }, - }, - makeAccountWatcher: { - /** - * @param {[LocalChainAccount, ChainAddress['value']]} results - */ - onFulfilled([account, address]) { - return watch( - E(storageNode).makeChildNode(address), - this.facets.makeChildNodeWatcher, - { account, address }, - ); - }, - }, - makeChildNodeWatcher: { - /** - * @param {Remote} childNode - * @param {{ - * account: LocalChainAccount; - * address: ChainAddress['value']; - * }} ctx - */ - onFulfilled(childNode, { account, address }) { - const { localChainInfo } = this.state; - const { holder } = makeLocalOrchestrationAccountKit({ - account, - address: harden({ - value: address, - encoding: 'bech32', - chainId: localChainInfo.chainId, - }), - // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 - storageNode: childNode, - }); - return holder; - }, - }, - }, - ); -harden(prepareLocalChainFacadeKit); - -/** - * Used only by `withOrchestration` helper - * - * @param {Zone} zone - * @param {LocalChainFacadePowers} powers - * @internal - */ -export const prepareLocalChainFacade = (zone, powers) => { - const makeLocalChainFacadeKit = prepareLocalChainFacadeKit(zone, powers); - return pickFacet(makeLocalChainFacadeKit, 'public'); -}; -harden(prepareLocalChainFacade); - -/** @typedef {ReturnType} MakeLocalChainFacade */ -/** @typedef {ReturnType} LocalChainFacade */ diff --git a/contract/src/exos/local-orchestration-account.js b/contract/src/exos/local-orchestration-account.js deleted file mode 100644 index 65a00d92..00000000 --- a/contract/src/exos/local-orchestration-account.js +++ /dev/null @@ -1,747 +0,0 @@ -/** @file Use-object for the owner of a localchain account */ -import { typedJson } from '@agoric/cosmic-proto'; -import { AmountShape, PaymentShape } from '@agoric/ertp'; -import { makeTracer } from '@agoric/internal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { M } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; -import { E } from '@endo/far'; -import { Fail, q } from '@endo/errors'; - -import { - AmountArgShape, - AnyNatAmountsRecord, - ChainAddressShape, - DenomAmountShape, - DenomShape, - IBCTransferOptionsShape, - TimestampProtoShape, - TypedJsonShape, -} from '../typeGuards.js'; -import { maxClockSkew, toDenomAmount } from '../../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../../utils/time.js'; -import { preparePacketTools } from './packet-tools.js'; -import { prepareIBCTools } from './ibc-packet.js'; -import { coerceCoin, coerceDenomAmount } from '../../utils/amounts.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {LocalChain, LocalChainAccount} from '@agoric/vats/src/localchain.js'; - * @import {AmountArg, ChainAddress, DenomAmount, IBCMsgTransferOptions, IBCConnectionInfo, OrchestrationAccountI, LocalAccountMethods} from '@agoric/orchestration'; - * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. - * @import {Zone} from '@agoric/zone'; - * @import {Remote} from '@agoric/internal'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {TimerService, TimestampRecord} from '@agoric/time'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {TypedJson, JsonSafe, ResponseTo} from '@agoric/cosmic-proto'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - * @import {Matcher} from '@endo/patterns'; - * @import {ChainHub} from './chain-hub.js'; - * @import {PacketTools} from './packet-tools.js'; - * @import {ZoeTools} from '../utils/zoe-tools.js'; - */ - -const trace = makeTracer('LOA'); - -const { Vow$ } = NetworkShape; // TODO #9611 - -const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); - -/** - * @typedef {object} LocalChainAccountNotification - * @property {string} address - */ - -/** - * @private - * @typedef {{ - * topicKit: RecorderKit; - * packetTools: PacketTools; - * account: LocalChainAccount; - * address: ChainAddress; - * }} State - * Internal to the LocalOrchestrationAccount exo - */ - -const HolderI = M.interface('holder', { - ...orchestrationAccountMethods, - delegate: M.call(M.string(), AmountShape).returns(VowShape), - undelegate: M.call(M.string(), AmountShape).returns(VowShape), - deposit: M.call(PaymentShape).returns(VowShape), - withdraw: M.call(AmountShape).returns(Vow$(PaymentShape)), - executeTx: M.call(M.arrayOf(M.record())).returns(Vow$(M.record())), - sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) - .optional(M.any()) - .returns(EVow$(M.string())), - matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), - monitorTransfers: M.call(M.remotable('TargetApp')).returns(EVow$(M.any())), -}); - -/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ -const PUBLIC_TOPICS = { - account: ['Account holder status', M.any()], -}; - -/** - * @param {Zone} zone - * @param {object} powers - * @param {MakeRecorderKit} powers.makeRecorderKit - * @param {ZCF} powers.zcf - * @param {Remote} powers.timerService - * @param {VowTools} powers.vowTools - * @param {ChainHub} powers.chainHub - * @param {Remote} powers.localchain - * @param {ZoeTools} powers.zoeTools - */ -export const prepareLocalOrchestrationAccountKit = ( - zone, - { - makeRecorderKit, - zcf, - timerService, - vowTools, - chainHub, - localchain, - zoeTools, - }, -) => { - const { watch, allVows, asVow, when } = vowTools; - const { makeIBCTransferSender } = prepareIBCTools( - zone.subZone('ibcTools'), - vowTools, - ); - const makePacketTools = preparePacketTools( - zone.subZone('packetTools'), - vowTools, - ); - const timestampHelper = makeTimestampHelper(timerService); - - /** Make an object wrapping an LCA with Zoe interfaces. */ - const makeLocalOrchestrationAccountKit = zone.exoClassKit( - 'Local Orchestration Account Kit', - { - helper: M.interface('helper', { - amountToCoin: M.call(AmountArgShape).returns(M.record()), - }), - holder: HolderI, - undelegateWatcher: M.interface('undelegateWatcher', { - onFulfilled: M.call([ - M.splitRecord({ completionTime: TimestampProtoShape }), - ]) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(VowShape), - }), - transferWatcher: M.interface('transferWatcher', { - onFulfilled: M.call([M.record(), M.nat()]) - .optional({ - destination: ChainAddressShape, - opts: M.or(M.undefined(), IBCTransferOptionsShape), - amount: DenomAmountShape, - }) - .returns(Vow$(M.record())), - }), - extractFirstResultWatcher: M.interface('extractFirstResultWatcher', { - onFulfilled: M.call([M.record()]) - .optional(M.arrayOf(M.undefined())) - .returns(M.any()), - }), - returnVoidWatcher: M.interface('returnVoidWatcher', { - onFulfilled: M.call(M.any()).optional(M.any()).returns(M.undefined()), - }), - seatExiterHandler: M.interface('seatExiterHandler', { - onFulfilled: M.call(M.undefined(), M.remotable()).returns( - M.undefined(), - ), - onRejected: M.call(M.error(), M.remotable()).returns(M.undefined()), - }), - getBalanceWatcher: M.interface('getBalanceWatcher', { - onFulfilled: M.call(AmountShape, DenomShape).returns(DenomAmountShape), - }), - queryBalanceWatcher: M.interface('queryBalanceWatcher', { - onFulfilled: M.call(TypedJsonShape).returns(DenomAmountShape), - }), - queryBalancesWatcher: M.interface('queryBalancesWatcher', { - onFulfilled: M.call(TypedJsonShape).returns( - M.arrayOf(DenomAmountShape), - ), - }), - invitationMakers: M.interface('invitationMakers', { - CloseAccount: M.call().returns(M.promise()), - Delegate: M.call(M.string(), AmountShape).returns(M.promise()), - Deposit: M.call().returns(M.promise()), - Send: M.call().returns(M.promise()), - SendAll: M.call().returns(M.promise()), - Transfer: M.call().returns(M.promise()), - Undelegate: M.call(M.string(), AmountShape).returns(M.promise()), - Withdraw: M.call().returns(M.promise()), - }), - }, - /** - * @param {object} initState - * @param {LocalChainAccount} initState.account - * @param {ChainAddress} initState.address - * @param {Remote} initState.storageNode - * @returns {State} - */ - ({ account, address, storageNode }) => { - // must be the fully synchronous maker because the kit is held in durable state - const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); - // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 - void E(topicKit.recorder).write(''); - const packetTools = makePacketTools(account); - - return { account, address, topicKit, packetTools }; - }, - { - helper: { - /** - * @param {AmountArg} amount - * @returns {Coin} - */ - amountToCoin(amount) { - return coerceCoin(chainHub, amount); - }, - }, - invitationMakers: { - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - */ - Delegate(validatorAddress, ertpAmount) { - trace('Delegate', validatorAddress, ertpAmount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch( - this.facets.holder.delegate(validatorAddress, ertpAmount), - ); - }, 'Delegate'); - }, - Deposit() { - trace('Deposit'); - return zcf.makeInvitation( - seat => { - const { give } = seat.getProposal(); - return watch( - zoeTools.localTransfer( - seat, - // @ts-expect-error LocalAccount vs LocalAccountMethods - this.state.account, - give, - ), - this.facets.seatExiterHandler, - seat, - ); - }, - 'Deposit', - undefined, - M.splitRecord({ give: AnyNatAmountsRecord, want: {} }), - ); - }, - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - */ - Undelegate(validatorAddress, ertpAmount) { - trace('Undelegate', validatorAddress, ertpAmount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch( - this.facets.holder.undelegate(validatorAddress, ertpAmount), - ); - }, 'Undelegate'); - }, - CloseAccount() { - throw Error('not yet implemented'); - }, - Send() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amount: AmountArg } - * >} - */ - const offerHandler = (seat, { toAccount, amount }) => { - seat.exit(); - return watch(this.facets.holder.send(toAccount, amount)); - }; - return zcf.makeInvitation(offerHandler, 'Send'); - }, - SendAll() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amounts: AmountArg[] } - * >} - */ - const offerHandler = (seat, { toAccount, amounts }) => { - seat.exit(); - return watch(this.facets.holder.sendAll(toAccount, amounts)); - }; - return zcf.makeInvitation(offerHandler, 'SendAll'); - }, - Transfer() { - /** - * @type {OfferHandler< - * Vow, - * { - * amount: AmountArg; - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * } - * >} - */ - const offerHandler = (seat, { amount, destination, opts }) => { - seat.exit(); - return watch( - this.facets.holder.transfer(destination, amount, opts), - ); - }; - return zcf.makeInvitation(offerHandler, 'Transfer'); - }, - Withdraw() { - trace('Withdraw'); - return zcf.makeInvitation( - seat => { - const { want } = seat.getProposal(); - return watch( - zoeTools.withdrawToSeat( - // @ts-expect-error LocalAccount vs LocalAccountMethods - this.state.account, - seat, - want, - ), - this.facets.seatExiterHandler, - seat, - ); - }, - 'Withdraw', - undefined, - M.splitRecord({ give: {}, want: AnyNatAmountsRecord }), - ); - }, - }, - undelegateWatcher: { - /** - * @param {[ - * JsonSafe< - * TypedJson<'/cosmos.staking.v1beta1.MsgUndelegateResponse'> - * >, - * ]} response - */ - onFulfilled(response) { - const { completionTime } = response[0]; - return watch( - E(timerService).wakeAt( - // ignore nanoseconds and just use seconds from Timestamp - BigInt(completionTime.seconds) + maxClockSkew, - ), - this.facets.returnVoidWatcher, - ); - }, - }, - transferWatcher: { - /** - * @param {[ - * { transferChannel: IBCConnectionInfo['transferChannel'] }, - * bigint, - * ]} results - * @param {{ - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * amount: DenomAmount; - * }} ctx - */ - onFulfilled( - [{ transferChannel }, timeoutTimestamp], - { opts, amount, destination }, - ) { - const transferMsg = typedJson( - '/ibc.applications.transfer.v1.MsgTransfer', - { - sourcePort: transferChannel.portId, - sourceChannel: transferChannel.channelId, - token: { - amount: String(amount.value), - denom: amount.denom, - }, - sender: this.state.address.value, - receiver: destination.value, - timeoutHeight: opts?.timeoutHeight ?? { - revisionHeight: 0n, - revisionNumber: 0n, - }, - timeoutTimestamp, - memo: opts?.memo ?? '', - }, - ); - - const { holder } = this.facets; - const sender = makeIBCTransferSender( - /** @type {any} */ (holder), - transferMsg, - ); - // Begin capturing packets, send the transfer packet, then return a - // vow that rejects unless the packet acknowledgment comes back and is - // verified. - return holder.sendThenWaitForAck(sender); - }, - }, - /** - * takes an array of results (from `executeEncodedTx`) and returns the - * first result - */ - extractFirstResultWatcher: { - /** - * @param {Record[]} results - */ - onFulfilled(results) { - results.length === 1 || - Fail`expected exactly one result; got ${results}`; - return results[0]; - }, - }, - returnVoidWatcher: { - onFulfilled() { - return undefined; - }, - }, - /** - * handles a request for balance from a bank purse and returns the balance - * as a Chain Amount - */ - getBalanceWatcher: { - /** - * @param {Amount<'nat'>} natAmount - * @param {DenomAmount['denom']} denom - * @returns {DenomAmount} - */ - onFulfilled(natAmount, denom) { - return harden({ denom, value: natAmount.value }); - }, - }, - /** exits or fails a seat depending the outcome */ - seatExiterHandler: { - /** - * @param {undefined} _ - * @param {ZCFSeat} seat - */ - onFulfilled(_, seat) { - seat.exit(); - }, - /** - * @param {Error} reason - * @param {ZCFSeat} seat - */ - onRejected(reason, seat) { - seat.exit(reason); - throw reason; - }, - }, - /** - * handles a QueryBalanceRequest from localchain.query and returns the - * balance as a DenomAmount - */ - queryBalanceWatcher: { - /** - * @param {ResponseTo< - * TypedJson<'/cosmos.bank.v1beta1.QueryBalanceRequest'> - * >} result - * @returns {DenomAmount} - */ - onFulfilled(result) { - const { balance } = result; - if (!balance || !balance?.denom) { - throw Fail`Expected balance ${q(result)};`; - } - return harden(toDenomAmount(balance)); - }, - }, - /** - * handles a QueryAllBalancesRequest from localchain.query and returns the - * balances as a DenomAmounts - */ - queryBalancesWatcher: { - /** - * @param {JsonSafe< - * ResponseTo< - * TypedJson<'/cosmos.bank.v1beta1.QueryAllBalancesRequest'> - * > - * >} result - * @returns {DenomAmount[]} - */ - onFulfilled(result) { - const { balances } = result; - if (!balances || !Array.isArray(balances)) { - throw Fail`Expected balances ${q(result)};`; - } - return harden(balances.map(toDenomAmount)); - }, - }, - holder: { - /** @type {HostOf} */ - asContinuingOffer() { - // @ts-expect-error XXX invitationMakers - // getPublicTopics resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { holder, invitationMakers: im } = this.facets; - // XXX cast to a type that has string index signature - const invitationMakers = /** @type {InvitationMakers} */ ( - /** @type {unknown} */ (im) - ); - - return harden({ - // getPublicTopics returns a vow, for membrane compatibility. - // it's safe to unwrap to a promise and get the result as we - // expect this complete in the same run - publicSubscribers: await when(holder.getPublicTopics()), - invitationMakers, - }); - }); - }, - /** - * @type {HostOf} - */ - getBalance(denomArg) { - return asVow(() => { - const [brand, denom] = - typeof denomArg === 'string' - ? [chainHub.getAsset(denomArg)?.brand, denomArg] - : [denomArg, chainHub.getDenom(denomArg)]; - - if (!denom) { - throw Fail`No denom for brand: ${denomArg}`; - } - - if (brand) { - return watch( - E(this.state.account).getBalance(brand), - this.facets.getBalanceWatcher, - denom, - ); - } - - return watch( - E(localchain).query( - typedJson('/cosmos.bank.v1beta1.QueryBalanceRequest', { - address: this.state.address.value, - denom, - }), - ), - this.facets.queryBalanceWatcher, - ); - }); - }, - /** @type {HostOf} */ - getBalances() { - return watch( - E(localchain).query( - typedJson('/cosmos.bank.v1beta1.QueryAllBalancesRequest', { - address: this.state.address.value, - }), - ), - this.facets.queryBalancesWatcher, - ); - }, - - /** - * @type {HostOf} - */ - getPublicTopics() { - // getStoragePath resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { topicKit } = this.state; - return harden({ - account: { - description: PUBLIC_TOPICS.account[0], - subscriber: topicKit.subscriber, - storagePath: await topicKit.recorder.getStoragePath(), - }, - }); - }); - }, - // FIXME take ChainAddress to match OrchestrationAccountI - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - */ - delegate(validatorAddress, ertpAmount) { - const { account: lca } = this.state; - - const amount = coerceCoin(chainHub, ertpAmount); - - return watch( - E(lca).executeTx([ - typedJson('/cosmos.staking.v1beta1.MsgDelegate', { - amount, - validatorAddress, - delegatorAddress: this.state.address.value, - }), - ]), - this.facets.extractFirstResultWatcher, - ); - }, - // FIXME take ChainAddress to match OrchestrationAccountI - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - * @returns {Vow} - */ - undelegate(validatorAddress, ertpAmount) { - const amount = coerceCoin(chainHub, ertpAmount); - const { account: lca } = this.state; - return watch( - E(lca).executeTx([ - typedJson('/cosmos.staking.v1beta1.MsgUndelegate', { - amount, - validatorAddress, - delegatorAddress: this.state.address.value, - }), - ]), - this.facets.undelegateWatcher, - ); - }, - /** - * Starting a transfer revokes the account holder. The associated - * updater will get a special notification that the account is being - * transferred. - */ - /** @type {HostOf} */ - deposit(payment) { - return watch( - E(this.state.account).deposit(payment), - this.facets.returnVoidWatcher, - ); - }, - /** @type {HostOf} */ - withdraw(amount) { - return watch(E(this.state.account).withdraw(amount)); - }, - /** @type {HostOf} */ - executeTx(messages) { - return watch(E(this.state.account).executeTx(messages)); - }, - /** @type {OrchestrationAccountI['getAddress']} */ - getAddress() { - return this.state.address; - }, - /** - * XXX consider using ERTP to send if it's vbank asset - * - * @type {HostOf} - */ - send(toAccount, amount) { - return asVow(() => { - trace('send', toAccount, amount); - const { helper } = this.facets; - return watch( - E(this.state.account).executeTx([ - typedJson('/cosmos.bank.v1beta1.MsgSend', { - amount: [helper.amountToCoin(amount)], - toAddress: toAccount.value, - fromAddress: this.state.address.value, - }), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - /** - * XXX consider using ERTP to send if it's vbank asset - * - * @type {HostOf} - */ - sendAll(toAccount, amounts) { - return asVow(() => { - trace('sendAll', toAccount, amounts); - const { helper } = this.facets; - return watch( - E(this.state.account).executeTx([ - typedJson('/cosmos.bank.v1beta1.MsgSend', { - amount: amounts.map(a => helper.amountToCoin(a)), - toAddress: toAccount.value, - fromAddress: this.state.address.value, - }), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - /** - * @param {ChainAddress} destination - * @param {AmountArg} amount an ERTP {@link Amount} or a - * {@link DenomAmount} - * @param {IBCMsgTransferOptions} [opts] if either timeoutHeight or - * timeoutTimestamp are not supplied, a default timeoutTimestamp will - * be set for 5 minutes in the future - * @returns {Vow} - */ - transfer(destination, amount, opts) { - return asVow(() => { - trace('Transferring funds from LCA over IBC'); - - const connectionInfoV = watch( - chainHub.getConnectionInfo( - this.state.address.chainId, - destination.chainId, - ), - ); - - // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` - // TODO #9324 what's a reasonable default? currently 5 minutes - const timeoutTimestampVowOrValue = - opts?.timeoutTimestamp ?? - (opts?.timeoutHeight - ? 0n - : E(timestampHelper).getTimeoutTimestampNS()); - - // don't resolve the vow until the transfer is confirmed on remote - // and reject vow if the transfer fails for any reason - const resultV = watch( - allVows([connectionInfoV, timeoutTimestampVowOrValue]), - this.facets.transferWatcher, - { - opts, - amount: coerceDenomAmount(chainHub, amount), - destination, - }, - ); - return resultV; - }); - }, - /** @type {HostOf} */ - transferSteps(amount, msg) { - return asVow(() => { - console.log('transferSteps got', amount, msg); - throw Fail`not yet implemented`; - }); - }, - /** @type {HostOf} */ - sendThenWaitForAck(sender, opts) { - return watch( - E(this.state.packetTools).sendThenWaitForAck(sender, opts), - ); - }, - /** @type {HostOf} */ - matchFirstPacket(patternV) { - return watch(E(this.state.packetTools).matchFirstPacket(patternV)); - }, - /** @type {HostOf} */ - monitorTransfers(tap) { - return watch(E(this.state.packetTools).monitorTransfers(tap)); - }, - }, - }, - ); - return makeLocalOrchestrationAccountKit; -}; - -/** @typedef {ReturnType} MakeLocalOrchestrationAccountKit */ -/** @typedef {ReturnType} LocalOrchestrationAccountKit */ diff --git a/contract/src/exos/orchestrator.js b/contract/src/exos/orchestrator.js deleted file mode 100644 index 70e02ee6..00000000 --- a/contract/src/exos/orchestrator.js +++ /dev/null @@ -1,196 +0,0 @@ -/** @file Orchestrator exo */ -import { AmountShape } from '@agoric/ertp'; -import { pickFacet } from '@agoric/vat-data'; -import { makeTracer } from '@agoric/internal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { Fail, q } from '@endo/errors'; -import { M } from '@endo/patterns'; -import { - DenomInfoShape, - ChainInfoShape, - DenomAmountShape, - DenomShape, -} from '../typeGuards.js'; - -/** - * @import {Zone} from '@agoric/base-zone'; - * @import {ActualChainInfo, ChainHub} from './chain-hub.js'; - * @import {AsyncFlowTools, HostInterface, HostOf} from '@agoric/async-flow'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {TimerService} from '@agoric/time'; - * @import {LocalChain} from '@agoric/vats/src/localchain.js'; - * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. - * @import {Remote} from '@agoric/internal'; - * @import {PickFacet} from '@agoric/swingset-liveslots'; - * @import {CosmosInterchainService} from './exo-interfaces.js'; - * @import {MakeLocalChainFacade} from './local-chain-facade.js'; - * @import {MakeRemoteChainFacade} from './remote-chain-facade.js'; - * @import {Chain, ChainInfo, IBCConnectionInfo, KnownChains, Orchestrator} from '../types.js'; - */ - -const { Vow$ } = NetworkShape; // TODO #9611 -const trace = makeTracer('Orchestrator'); - -/** @see {Orchestrator} */ -export const OrchestratorI = M.interface('Orchestrator', { - getChain: M.call(M.string()).returns(Vow$(ChainInfoShape)), - getDenomInfo: M.call(DenomShape).returns(DenomInfoShape), - asAmount: M.call(DenomAmountShape).returns(AmountShape), -}); - -/** - * @param {Zone} zone - * @param {{ - * chainHub: ChainHub; - * makeLocalChainFacade: MakeLocalChainFacade; - * makeRemoteChainFacade: MakeRemoteChainFacade; - * vowTools: VowTools; - * }} powers - */ -const prepareOrchestratorKit = ( - zone, - { - chainHub, - makeLocalChainFacade, - makeRemoteChainFacade, - vowTools: { watch, asVow }, - }, -) => { - /** - * @template T - * @typedef {{ vow: Vow; pending: true } | { value: T; pending: false }} MaybePendingValue - */ - - /** @type {MapStore>>} */ - const chainByName = zone.mapStore('chainName'); - - return zone.exoClassKit( - 'Orchestrator', - { - orchestrator: OrchestratorI, - makeLocalChainFacadeWatcher: M.interface('makeLocalChainFacadeWatcher', { - onFulfilled: M.call(M.record()).returns(M.remotable()), - }), - makeRemoteChainFacadeWatcher: M.interface( - 'makeRemoteChainFacadeWatcher', - { - onFulfilled: M.call(M.any(), M.string()) - .optional(M.arrayOf(M.undefined())) // XXX needed? - .returns(M.remotable()), - }, - ), - }, - () => { - trace('making an Orchestrator'); - return {}; - }, - { - /** Waits for `chainInfo` and returns a LocalChainFacade */ - makeLocalChainFacadeWatcher: { - /** - * @param {ActualChainInfo<'agoric'>} agoricChainInfo - */ - onFulfilled(agoricChainInfo) { - const it = makeLocalChainFacade(agoricChainInfo); - chainByName.set('agoric', harden({ value: it, pending: false })); - return it; - }, - }, - /** - * Waits for `chainInfo` for `agoric` and a remote chain and returns a - * RemoteChainFacade - */ - makeRemoteChainFacadeWatcher: { - /** - * Waits for `chainInfo` for `agoric` and a remote chain and returns a - * RemoteChainFacade - * - * @param {[ChainInfo, ChainInfo, IBCConnectionInfo]} chainsAndConnection - * @param {string} name - */ - onFulfilled([_agoricChainInfo, remoteChainInfo, connectionInfo], name) { - const it = makeRemoteChainFacade(remoteChainInfo, connectionInfo); - chainByName.set(name, harden({ value: it, pending: false })); - return it; - }, - }, - orchestrator: { - /** @type {HostOf} */ - getChain(name) { - return asVow(() => { - if (chainByName.has(name)) { - const maybeChain = chainByName.get(name); - return maybeChain.pending ? maybeChain.vow : maybeChain.value; - } - const vow = - name === 'agoric' - ? watch( - chainHub.getChainInfo('agoric'), - this.facets.makeLocalChainFacadeWatcher, - ) - : watch( - chainHub.getChainsAndConnection('agoric', name), - this.facets.makeRemoteChainFacadeWatcher, - name, - ); - chainByName.init(name, harden({ vow, pending: true })); - return vow; - }); - }, - /** @type {HostOf} */ - getDenomInfo(denom) { - const denomDetail = chainHub.getAsset(denom); - if (!denomDetail) throw Fail`No denom detail for ${q(denom)}`; - const { chainName, baseName, baseDenom, brand } = denomDetail; - chainByName.has(chainName) || - Fail`use getChain(${q(chainName)}) before getDenomInfo(${q(denom)})`; - const maybeChain = chainByName.get(chainName); - if (maybeChain.pending) { - throw Fail`wait until getChain(${q(chainName)}) completes before getDenomInfo(${q(denom)})`; - } - const chain = - /** @type {HostInterface>} */ ( - maybeChain.value - ); - chainByName.has(baseName) || - Fail`use getChain(${q(baseName)}) before getDenomInfo(${q(denom)})`; - const maybeBase = chainByName.get(baseName); - if (maybeBase.pending) { - throw Fail`wait until getChain(${q(baseName)}) completes before getDenomInfo(${q(denom)})`; - } - const base = - /** @type {HostInterface>} */ ( - maybeBase.value - ); - return harden({ chain, base, brand, baseDenom }); - }, - /** @type {HostOf} */ - asAmount: () => Fail`not yet implemented`, - }, - }, - ); -}; -harden(prepareOrchestratorKit); - -/** - * @param {Zone} zone - * @param {{ - * chainHub: ChainHub; - * makeLocalChainFacade: MakeLocalChainFacade; - * makeRemoteChainFacade: MakeRemoteChainFacade; - * vowTools: VowTools; - * }} powers - */ -export const prepareOrchestrator = (zone, powers) => { - const makeOrchestratorKit = prepareOrchestratorKit(zone, powers); - return pickFacet(makeOrchestratorKit, 'orchestrator'); -}; - -/** - * Host side of the Orchestrator interface. (Methods return vows instead of - * promises as the interface within the guest function.) - * - * @typedef {ReturnType< - * ReturnType - * >['orchestrator']} HostOrchestrator - */ diff --git a/contract/src/exos/packet-tools.js b/contract/src/exos/packet-tools.js deleted file mode 100644 index a4ba79c2..00000000 --- a/contract/src/exos/packet-tools.js +++ /dev/null @@ -1,372 +0,0 @@ -import { makeMarshal, decodeToJustin } from '@endo/marshal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { M, matches } from '@endo/patterns'; -import { E } from '@endo/far'; -import { pickFacet } from '@agoric/vat-data'; - -const { toCapData } = makeMarshal(undefined, undefined, { - marshalName: 'JustEncoder', - serializeBodyFormat: 'capdata', -}); -const just = obj => { - const { body } = toCapData(obj); - return decodeToJustin(JSON.parse(body), true); -}; - -/** - * @import {Pattern} from '@endo/patterns'; - * @import {EVow, Remote, Vow, VowResolver, VowTools} from '@agoric/vow'; - * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; - * @import {TargetApp, TargetRegistration} from '@agoric/vats/src/bridge-target.js'; - */ - -/** - * @callback MatchEvent - * @param {EVow} pattern - * @returns {Vow<{ resolver: VowResolver; match: Vow }>} - */ - -/** - * @typedef {object} PacketSender - * @property {( - * opts: PacketOptions, - * ) => Vow<{ eventPattern: Pattern; resultV: Vow }>} sendPacket - */ - -/** - * @typedef {object} PacketOptions - * @property {string} [opName] - * @property {PacketTimeout} [timeout] - */ - -/** - * @typedef {Pick< - * import('../cosmos-api').IBCMsgTransferOptions, - * 'timeoutHeight' | 'timeoutTimestamp' - * >} PacketTimeout - */ - -const { Vow$ } = NetworkShape; // TODO #9611 - -const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); - -const sink = () => {}; -harden(sink); - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools} vowTools - */ -export const preparePacketTools = (zone, vowTools) => { - const { allVows, makeVowKit, watch, when } = vowTools; - - const makePacketToolsKit = zone.exoClassKit( - 'PacketToolsKit', - { - public: M.interface('PacketTools', { - sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) - .optional(M.any()) - .returns(EVow$(M.any())), - matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), - monitorTransfers: M.call(M.remotable('TargetApp')).returns( - EVow$(M.any()), - ), - }), - tap: M.interface('tap', { - // eslint-disable-next-line no-restricted-syntax - receiveUpcall: M.callWhen(M.any()).returns(M.any()), - }), - monitorRegistration: M.interface('monitorRegistration', { - // eslint-disable-next-line no-restricted-syntax - updateTargetApp: M.callWhen( - M.await(M.remotable('TargetApp')), - ).returns(), - // eslint-disable-next-line no-restricted-syntax - revoke: M.callWhen().returns(), - }), - watchPacketMatch: M.interface('watchPacketMatch', { - onFulfilled: M.call(M.any(), M.record()).returns(M.any()), - }), - watchPacketPattern: M.interface('watchPacketPattern', { - onFulfilled: M.call(M.any(), M.record()).returns(M.any()), - onRejected: M.call(M.any(), M.record()).returns(M.any()), - }), - watchDecrPendingPatterns: M.interface('watchDecrPendingPatterns', { - onFulfilled: M.call(M.any()).returns(M.any()), - onRejected: M.call(M.any()).returns(M.any()), - }), - sendPacketWatcher: M.interface('sendPacketWatcher', { - onFulfilled: M.call( - [M.record(), M.remotable('PacketSender')], - M.record(), - ).returns(M.any()), - }), - packetWasSentWatcher: M.interface('packetWasSentWatcher', { - onFulfilled: M.call( - { eventPattern: M.pattern(), resultV: Vow$(M.any()) }, - M.record(), - ).returns(M.any()), - }), - utils: M.interface('utils', { - subscribeToTransfers: M.call().returns(M.promise()), - unsubscribeFromTransfers: M.call().returns(M.undefined()), - incrPendingPatterns: M.call().returns(Vow$(M.undefined())), - decrPendingPatterns: M.call().returns(Vow$(M.undefined())), - }), - rejectResolverAndRethrowWatcher: M.interface('rejectResolverWatcher', { - onRejected: M.call(M.any(), { - resolver: M.remotable('resolver'), - }).returns(M.any()), - }), - }, - /** - * @param {LocalChainAccount} lca - */ - lca => { - const resolverToPattern = zone.detached().mapStore('resolverToPattern'); - return { - lca, - reg: /** @type {Remote | null} */ (null), - resolverToPattern, - upcallQueue: /** @type {any[] | null} */ (null), - pending: 0, - extra: null, - monitor: /** @type {Remote | null} */ (null), - }; - }, - { - public: { - /** - * @param {ERef} monitor - */ - // eslint-disable-next-line no-restricted-syntax - async monitorTransfers(monitor) { - // We set the monitor here, but we only ever subscribe our - // this.facets.tap handler to transfers. - const mreg = this.facets.monitorRegistration; - await mreg.updateTargetApp(monitor); - return mreg; - }, - /** - * @type {MatchEvent} - */ - matchFirstPacket(patternP) { - return watch( - this.facets.utils.incrPendingPatterns(), - this.facets.watchPacketMatch, - { patternP }, - ); - }, - /** - * @param {Remote} packetSender - * @param {PacketOptions} [opts] - * @returns {Vow} - */ - sendThenWaitForAck(packetSender, opts = {}) { - /** @type {import('@agoric/vow').VowKit} */ - const pattern = makeVowKit(); - - // Establish the packet matcher immediately, but don't fulfill - // the match until after pattern.vow has been resolved. - const matchV = watch( - allVows([ - this.facets.public.matchFirstPacket(pattern.vow), - packetSender, - ]), - this.facets.sendPacketWatcher, - { opts }, - ); - - // When the packet is sent, resolve the resultV for the reply. - const resultV = watch(matchV, this.facets.packetWasSentWatcher, { - opts, - patternResolver: pattern.resolver, - }); - - // If anything fails, try to reject the packet sender. - return watch(resultV, this.facets.rejectResolverAndRethrowWatcher, { - resolver: pattern.resolver, - }); - }, - }, - monitorRegistration: { - /** @type {TargetRegistration['updateTargetApp']} */ - // eslint-disable-next-line no-restricted-syntax - async updateTargetApp(tap) { - this.state.monitor = await tap; - await this.facets.utils.subscribeToTransfers(); - }, - /** @type {TargetRegistration['revoke']} */ - // eslint-disable-next-line no-restricted-syntax - async revoke() { - this.state.monitor = null; - }, - }, - tap: { - // eslint-disable-next-line no-restricted-syntax - async receiveUpcall(obj) { - const { monitor, resolverToPattern, upcallQueue, pending } = - this.state; - console.debug( - `Trying ${resolverToPattern.getSize()} current patterns and ${pending} pending patterns against`, - just(obj), - ); - - if (monitor) { - // Call the monitor (if any), but in a future turn. - void E(monitor).receiveUpcall(obj); - } - // Check all our fulfilled patterns for matches. - for (const [resolver, pattern] of resolverToPattern.entries()) { - if (matches(obj, pattern)) { - console.debug('Matched pattern:', just(pattern)); - resolver.resolve(obj); - resolverToPattern.delete(resolver); - return; - } - } - if (upcallQueue) { - // We have some pending patterns (ones that have been requested but - // haven't yet settled) that may match this object. - console.debug('Stashing object in upcallQueue'); - this.state.upcallQueue = harden(upcallQueue.concat(obj)); - } - console.debug('No match yet.'); - }, - }, - sendPacketWatcher: { - onFulfilled([{ match }, sender], ctx) { - return watch(E(sender).sendPacket(match, ctx.opts)); - }, - }, - packetWasSentWatcher: { - onFulfilled({ eventPattern, resultV }, ctx) { - const { patternResolver } = ctx; - patternResolver.resolve(eventPattern); - return resultV; - }, - }, - rejectResolverAndRethrowWatcher: { - onRejected(rej, { resolver }) { - resolver.reject(rej); - throw rej; - }, - }, - watchPacketMatch: { - onFulfilled(_, { patternP }) { - const { vow, resolver } = makeVowKit(); - const patternV = watch( - patternP, - this.facets.watchPacketPattern, - harden({ resolver }), - ); - /* void */ watch(patternV, this.facets.watchDecrPendingPatterns); - return harden({ match: vow, resolver }); - }, - }, - watchDecrPendingPatterns: { - onFulfilled() { - return this.facets.utils.decrPendingPatterns(); - }, - onRejected() { - return this.facets.utils.decrPendingPatterns(); - }, - }, - watchPacketPattern: { - onFulfilled(pattern, { resolver }) { - const { resolverToPattern, upcallQueue } = this.state; - - console.debug('watchPacketPattern onFulfilled', just(pattern)); - if (!upcallQueue) { - // Save the pattern for later. - console.debug('No upcall queue yet. Save the pattern for later.'); - resolverToPattern.init(resolver, pattern); - return; - } - - // Try matching the first in queue. - const i = upcallQueue.findIndex(obj => matches(obj, pattern)); - if (i < 0) { - // No match yet. Save the pattern for later. - console.debug('No match yet. Save the pattern for later.'); - resolverToPattern.init(resolver, pattern); - return; - } - - // Success! Remove the matched object from the queue. - console.debug( - 'Success! Remove the matched object from the queue.', - just(upcallQueue[i]), - ); - resolver.resolve(upcallQueue[i]); - this.state.upcallQueue = harden( - upcallQueue.slice(0, i).concat(upcallQueue.slice(i + 1)), - ); - }, - onRejected(reason, { resolver }) { - resolver.reject(reason); - }, - }, - - utils: { - incrPendingPatterns() { - const { pending, reg, upcallQueue } = this.state; - this.state.pending += 1; - if (!upcallQueue) { - this.state.upcallQueue = harden([]); - } - if (reg || pending > 0) { - return watch(undefined); - } - return watch(this.facets.utils.subscribeToTransfers()); - }, - decrPendingPatterns() { - this.state.pending -= 1; - if (this.state.pending > 0) { - return; - } - this.state.pending = 0; - this.state.upcallQueue = null; - // FIXME when it returns undefined this causes an error: - // In "unsubscribeFromTransfers" method of (PacketToolsKit utils): result: undefined "[undefined]" - Must be a promise - return watch(this.facets.utils.unsubscribeFromTransfers()); - }, - subscribeToTransfers() { - // Subscribe to the transfers for this account. - const { lca, reg } = this.state; - if (reg) { - return when(reg); - } - const { tap } = this.facets; - // XXX racy; fails if subscribeToTransfers is called while this promise is in flight - // e.g. 'Target "agoric1fakeLCAAddress" already registered' - return when(E(lca).monitorTransfers(tap), r => { - this.state.reg = r; - return r; - }); - }, - unsubscribeFromTransfers() { - const { reg, monitor } = this.state; - if (!reg || monitor) { - return undefined; - } - // this.state.reg = null; - // return E(reg).revoke().then(sink); - }, - }, - }, - { - finish(context) { - void context.facets.utils.subscribeToTransfers(); - }, - }, - ); - - const makePacketTools = pickFacet(makePacketToolsKit, 'public'); - return makePacketTools; -}; -harden(preparePacketTools); - -/** - * @typedef {Awaited>>} PacketTools - */ diff --git a/contract/src/exos/portfolio-holder-kit.js b/contract/src/exos/portfolio-holder-kit.js deleted file mode 100644 index a5c03ece..00000000 --- a/contract/src/exos/portfolio-holder-kit.js +++ /dev/null @@ -1,230 +0,0 @@ -import { M, mustMatch } from '@endo/patterns'; -import { E } from '@endo/far'; -import { Fail } from '@endo/errors'; -import { PublicTopicShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { makeScalarBigMapStore } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; - -const { fromEntries } = Object; - -/** - * @import {HostInterface, HostOf} from '@agoric/async-flow'; - * @import {MapStore} from '@agoric/store'; - * @import {VowTools} from '@agoric/vow'; - * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; - * @import {Zone} from '@agoric/zone'; - * @import {OrchestrationAccount, OrchestrationAccountI, MakeCombineInvitationMakers} from '@agoric/orchestration'; - */ - -/** - * @typedef {{ - * accounts: MapStore>>; - * publicTopics: MapStore>; - * }} PortfolioHolderState - */ - -const ChainNameShape = M.string(); - -const AccountEntriesShape = M.arrayOf([ - M.string(), - M.remotable('OrchestrationAccount'), -]); -const PublicTopicEntriesShape = M.arrayOf([M.string(), PublicTopicShape]); - -/** - * Kit that holds several OrchestrationAccountKits and returns a invitation - * makers. - * - * @param {Zone} zone - * @param {VowTools} vowTools - */ -const preparePortfolioHolderKit = (zone, { asVow, when }) => { - return zone.exoClassKit( - 'PortfolioHolderKit', - { - invitationMakers: M.interface('InvitationMakers', { - Proxying: M.call(ChainNameShape, M.string()) - .optional(M.arrayOf(M.any())) - .returns(M.promise()), - }), - holder: M.interface('Holder', { - asContinuingOffer: M.call().returns(VowShape), - getPublicTopics: M.call().returns(VowShape), - getAccount: M.call(ChainNameShape).returns(VowShape), - addAccount: M.call( - ChainNameShape, - M.remotable(), - PublicTopicShape, - ).returns(VowShape), - }), - }, - /** - * @param {Iterable<[string, OrchestrationAccount]>} accountEntries - * @param {Iterable<[string, ResolvedPublicTopic]>} publicTopicEntries - */ - (accountEntries, publicTopicEntries) => { - mustMatch(accountEntries, AccountEntriesShape, 'must provide accounts'); - mustMatch( - publicTopicEntries, - PublicTopicEntriesShape, - 'must provide public topics', - ); - const accounts = harden( - makeScalarBigMapStore('accounts', { durable: true }), - ); - const publicTopics = harden( - makeScalarBigMapStore('publicTopics', { durable: true }), - ); - accounts.addAll(accountEntries); - publicTopics.addAll(publicTopicEntries); - return /** @type {PortfolioHolderState} */ ( - harden({ - accounts, - publicTopics, - }) - ); - }, - { - invitationMakers: { - /** - * @template {unknown[]} IA - * @param {string} chainName key where the account is stored - * @param {string} action invitation maker name, e.g. 'Delegate' - * @param {IA} [invitationArgs] - * @returns {Promise>} - */ - Proxying(chainName, action, invitationArgs) { - const { accounts } = this.state; - accounts.has(chainName) || Fail`no account found for ${chainName}`; - const account = accounts.get(chainName); - // @ts-expect-error XXX invitationMakers - return when(E(account).asContinuingOffer(), ({ invitationMakers }) => - E(invitationMakers)[action](...(invitationArgs || [])), - ); - }, - }, - holder: { - // FIXME /** @type {HostOf} */ - asContinuingOffer() { - return asVow(() => { - const { invitationMakers } = this.facets; - const { publicTopics } = this.state; - return harden({ - publicSubscribers: fromEntries(publicTopics.entries()), - invitationMakers, - }); - }); - }, - // FIXME /** @type {HostOf} */ - getPublicTopics() { - return asVow(() => { - const { publicTopics } = this.state; - return harden(fromEntries(publicTopics.entries())); - }); - }, - /** - * @param {string} chainName key where the account is stored - * @param {HostInterface>} account - * @param {ResolvedPublicTopic} publicTopic - */ - addAccount(chainName, account, publicTopic) { - return asVow(() => { - if (this.state.accounts.has(chainName)) { - throw Fail`account already exists for ${chainName}`; - } - zone.isStorable(account) || - Fail`account for ${chainName} must be storable`; - zone.isStorable(publicTopic) || - Fail`publicTopic for ${chainName} must be storable`; - - this.state.publicTopics.init(chainName, publicTopic); - this.state.accounts.init(chainName, account); - }); - }, - /** - * @param {string} chainName key where the account is stored - */ - getAccount(chainName) { - return asVow(() => this.state.accounts.get(chainName)); - }, - }, - }, - ); -}; - -/** - * A portfolio holder stores two or more OrchestrationAccounts and combines - * ContinuingOfferResult's from each into a single result. - * - * The invitationMakers can be accessed via the `Proxy` invitationMaker, which - * calls out to other invitationMakers. - * - * See {@link MakeCombineInvitationMakers} for an exo that allows a developer to - * define extra invitationMakers to combine with platform-provided ones. - * - * @example - * - * ```js - * // in contract start/prepare - * const makePortfolioHolder = preparePortfolioHolder( - * rootZone.subZone('portfolio'), - * vowTools, - * ); - * - * // in a flow - * const accounts = { - * cosmoshub: await cosmosChain.makeAccount(), - * agoric: await agoricChain.makeAccount(), - * }; - * const accountEntries = harden(Object.entries(accounts)); - * const publicTopicEntries = harden( - * await Promise.all( - * Object.entries(accounts).map(async ([chainName, holder]) => { - * const { account } = await E(holder).getPublicTopics(); - * return [chainName, account]; - * }), - * ), - * ); - * const holder = makePortfolioHolder(accountEntries, publicTopicEntries); - * - * // return ContinuingOfferResult to client - * return E(holder).asContinuingOffer(); - * - * const { invitationMakers } = await E(holder).asContinuingOffer(); - * - * // with invitationArgs - * const delegateInv = await E(invitationMakers).Proxying( - * 'cosmoshub', - * 'Delegate', - * [ - * { - * value: 'cosmos1valoper', - * chainId: 'cosmoshub-99', - * encoding: 'bech32', - * }, - * { - * denom: 'uatom', - * value: 10n, - * }, - * ], - * ); - * - * // without invitationArgs - * const transferInv = await E(invitationMakers).Proxying( - * 'cosmoshub', - * 'Transfer', - * ); - * ``` - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @returns {( - * ...args: Parameters> - * ) => ReturnType>['holder']} - */ -export const preparePortfolioHolder = (zone, vowTools) => { - const makeKit = preparePortfolioHolderKit(zone, vowTools); - return (...args) => makeKit(...args).holder; -}; -/** @typedef {ReturnType} MakePortfolioHolder */ -/** @typedef {ReturnType} PortfolioHolder */ diff --git a/contract/src/exos/remote-chain-facade.js b/contract/src/exos/remote-chain-facade.js deleted file mode 100644 index 3efebfff..00000000 --- a/contract/src/exos/remote-chain-facade.js +++ /dev/null @@ -1,269 +0,0 @@ -/** @file Remote Chain Facade exo */ -import { makeTracer } from '@agoric/internal'; -import { E } from '@endo/far'; -import { Fail, q } from '@endo/errors'; -import { M } from '@endo/patterns'; -import { pickFacet } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; -import { - ChainAddressShape, - chainFacadeMethods, - ICQMsgShape, -} from '../typeGuards.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {Zone} from '@agoric/base-zone'; - * @import {JsonSafe} from '@agoric/cosmic-proto'; - * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; - * @import {TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - * @import {CosmosInterchainService} from './exo-interfaces.js'; - * @import {prepareCosmosOrchestrationAccount} from './cosmos-orchestration-account.js'; - * @import {CosmosChainInfo, IBCConnectionInfo, ChainAddress, IcaAccount, Chain, ICQConnection} from '../types.js'; - */ - -const trace = makeTracer('RemoteChainFacade'); - -/** - * @typedef {{ - * makeCosmosOrchestrationAccount: ReturnType< - * typeof prepareCosmosOrchestrationAccount - * >; - * orchestration: Remote; - * storageNode: Remote; - * timer: Remote; - * vowTools: VowTools; - * }} RemoteChainFacadePowers - */ - -/** - * @typedef {{ - * remoteChainInfo: CosmosChainInfo; - * connectionInfo: IBCConnectionInfo; - * icqConnection: ICQConnection | undefined; - * }} RemoteChainFacadeState - */ - -/** - * @param {Zone} zone - * @param {RemoteChainFacadePowers} powers - */ -const prepareRemoteChainFacadeKit = ( - zone, - { - makeCosmosOrchestrationAccount, - orchestration, - // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 - // consider making an `accounts` childNode - storageNode, - timer, - vowTools: { allVows, asVow, watch }, - }, -) => - zone.exoClassKit( - 'RemoteChainFacade', - { - public: M.interface('RemoteChainFacade', { - ...chainFacadeMethods, - query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), - }), - makeICQConnectionQueryWatcher: M.interface( - 'makeICQConnectionQueryWatcher', - { - onFulfilled: M.call(M.remotable(), M.arrayOf(ICQMsgShape)).returns( - VowShape, - ), - }, - ), - makeAccountAndProvideQueryConnWatcher: M.interface( - 'makeAccountAndProvideQueryConnWatcher', - { - onFulfilled: M.call([ - M.remotable(), - M.or(M.remotable(), M.undefined()), - ]).returns(VowShape), - }, - ), - getAddressesWatcher: M.interface('getAddressWatcher', { - onFulfilled: M.call( - [ChainAddressShape, M.string(), M.string()], - M.remotable(), - ).returns(VowShape), - }), - makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { - onFulfilled: M.call(M.remotable(), { - account: M.remotable(), - chainAddress: ChainAddressShape, - localAddress: M.string(), - remoteAddress: M.string(), - }).returns(M.remotable()), - }), - }, - /** - * @param {CosmosChainInfo} remoteChainInfo - * @param {IBCConnectionInfo} connectionInfo - */ - (remoteChainInfo, connectionInfo) => { - trace('making a RemoteChainFacade'); - return /** @type {RemoteChainFacadeState} */ ({ - remoteChainInfo, - connectionInfo, - icqConnection: undefined, - }); - }, - { - public: { - /** @type {HostOf} */ - getChainInfo() { - return watch(this.state.remoteChainInfo); - }, - - /** @type {HostOf} */ - makeAccount() { - return asVow(() => { - const { remoteChainInfo, connectionInfo } = this.state; - const stakingDenom = remoteChainInfo.stakingTokens?.[0]?.denom; - if (!stakingDenom) throw Fail`chain info lacks staking denom`; - - // icqConnection is ultimately retrieved from state, but let's - // create a connection if it doesn't exist - const icqConnOrUndefinedV = - remoteChainInfo.icqEnabled && !this.state.icqConnection - ? E(orchestration).provideICQConnection(connectionInfo.id) - : undefined; - - const makeAccountV = E(orchestration).makeAccount( - remoteChainInfo.chainId, - connectionInfo.counterparty.connection_id, - connectionInfo.id, - ); - - return watch( - allVows([makeAccountV, icqConnOrUndefinedV]), - this.facets.makeAccountAndProvideQueryConnWatcher, - ); - }); - }, - /** - * @type {HostOf< - * Chain['query'] - * >} - */ - query(msgs) { - return asVow(() => { - const { - remoteChainInfo: { icqEnabled, chainId }, - connectionInfo, - } = this.state; - if (!icqEnabled) { - throw Fail`Queries not available for chain ${q(chainId)}`; - } - // if none exists, make one and still send the query in the handler - if (!this.state.icqConnection) { - return watch( - E(orchestration).provideICQConnection(connectionInfo.id), - this.facets.makeICQConnectionQueryWatcher, - msgs, - ); - } - return watch(E(this.state.icqConnection).query(msgs)); - }); - }, - }, - makeAccountAndProvideQueryConnWatcher: { - /** - * @param {[IcaAccount, ICQConnection | undefined]} account - */ - onFulfilled([account, icqConnection]) { - if (icqConnection && !this.state.icqConnection) { - this.state.icqConnection = icqConnection; - // no need to pass icqConnection in ctx; we can get it from state - } - return watch( - allVows([ - E(account).getAddress(), - E(account).getLocalAddress(), - E(account).getRemoteAddress(), - ]), - this.facets.getAddressesWatcher, - account, - ); - }, - }, - makeICQConnectionQueryWatcher: { - /** - * @param {ICQConnection} icqConnection - * @param {JsonSafe[]} msgs - * @returns {Vow[]>} - */ - onFulfilled(icqConnection, msgs) { - if (!this.state.icqConnection) { - this.state.icqConnection = icqConnection; - } - return watch(E(icqConnection).query(msgs)); - }, - }, - getAddressesWatcher: { - /** - * @param {[ChainAddress, LocalIbcAddress, RemoteIbcAddress]} chainAddresses - * @param {IcaAccount} account - */ - onFulfilled([chainAddress, localAddress, remoteAddress], account) { - return watch( - E(storageNode).makeChildNode(chainAddress.value), - this.facets.makeChildNodeWatcher, - { account, chainAddress, localAddress, remoteAddress }, - ); - }, - }, - makeChildNodeWatcher: { - /** - * @param {Remote} childNode - * @param {{ - * account: IcaAccount; - * chainAddress: ChainAddress; - * localAddress: LocalIbcAddress; - * remoteAddress: RemoteIbcAddress; - * }} ctx - */ - onFulfilled( - childNode, - { account, chainAddress, localAddress, remoteAddress }, - ) { - const { icqConnection } = this.state; - - return makeCosmosOrchestrationAccount( - { - chainAddress, - localAddress, - remoteAddress, - }, - { - account, - // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 - storageNode: childNode, - icqConnection, - timer, - }, - ); - }, - }, - }, - ); -harden(prepareRemoteChainFacadeKit); - -/** - * @param {Zone} zone - * @param {RemoteChainFacadePowers} powers - */ -export const prepareRemoteChainFacade = (zone, powers) => { - const makeLocalChainFacadeKit = prepareRemoteChainFacadeKit(zone, powers); - return pickFacet(makeLocalChainFacadeKit, 'public'); -}; -harden(prepareRemoteChainFacade); - -/** @typedef {ReturnType} MakeRemoteChainFacade */ -/** @typedef {ReturnType} RemoteChainFacade */ diff --git a/contract/src/chain-info.js b/contract/src/old_chain-info.js similarity index 100% rename from contract/src/chain-info.js rename to contract/src/old_chain-info.js diff --git a/contract/src/orchestration-api.ts b/contract/src/orchestration-api.ts index 986c66ea..7777dc8d 100644 --- a/contract/src/orchestration-api.ts +++ b/contract/src/orchestration-api.ts @@ -20,7 +20,8 @@ import type { LocalAccountMethods, ICQQueryFunction, } from './types.js'; -import type { ResolvedContinuingOfferResult } from './utils/zoe-tools.js'; +import type { ResolvedContinuingOfferResult } from '@agoric/orchestration/src/utils/zoe-tools.js'; +// import type { ResolvedContinuingOfferResult } from '../utils/zoe-tools.js'; /** * A denom that designates a path to a token type on some blockchain. diff --git a/contract/test/supports.ts b/contract/test/supports.ts index dbf539c0..0d43fc53 100644 --- a/contract/test/supports.ts +++ b/contract/test/supports.ts @@ -20,10 +20,10 @@ import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; import { makeHeapZone } from '@agoric/zone'; import { E } from '@endo/far'; import type { ExecutionContext } from 'ava'; -import { registerKnownChains } from '../src/chain-info.js'; -import { makeChainHub } from '../src/exos/chain-hub.js'; -import { prepareCosmosInterchainService } from '../src/exos/cosmos-interchain-service.js'; -import fetchedChainInfo from '../src/fetched-chain-info.js'; +import { registerKnownChains } from '@agoric/orchestration/src/chain-info.js'; +import { makeChainHub } from '@agoric/orchestration/src/exos/chain-hub.js'; +import { prepareCosmosInterchainService } from '@agoric/orchestration/src/exos/cosmos-interchain-service.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; import { buildVTransferEvent } from '../tools/ibc-mocks.js'; import { setupFakeNetwork } from './network-fakes.js'; diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts index 2e20c46a..757c4c2b 100644 --- a/contract/tools/ibc-mocks.ts +++ b/contract/tools/ibc-mocks.ts @@ -21,8 +21,8 @@ import type { } from '@agoric/vats'; import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; -import type { ChainAddress } from '../src/orchestration-api.js'; -import { makeQueryPacket, makeTxPacket } from '../utils/packet.js'; +import type { ChainAddress } from '@agoric/orchestration/src/orchestration-api.js'; +import { makeQueryPacket, makeTxPacket } from '@agoric/orchestration/src/utils/packet.js'; interface EncoderI { encode: (message: T) => { diff --git a/contract/utils/address.js b/contract/utils/address.js deleted file mode 100644 index 4699afa4..00000000 --- a/contract/utils/address.js +++ /dev/null @@ -1,103 +0,0 @@ -import { Fail, q } from '@endo/errors'; - -/** - * @import {IBCConnectionID} from '@agoric/vats'; - * @import {ChainAddress} from '../src/types.js'; - * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -/** - * @typedef {object} ICAChannelAddressOpts - * @property {string} [encoding='proto3'] message encoding format for the - * channel - * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. - * currently only `ordered` is supported for ics27-1 - * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` - * @property {string} [version='ics27-1'] default is `ics27-1` - */ - -/** - * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID - * @param {IBCConnectionID} controllerConnectionId Self Connection ID - * @param {ICAChannelAddressOpts} [opts] - * @returns {RemoteIbcAddress} - */ -export const makeICAChannelAddress = ( - hostConnectionId, - controllerConnectionId, - { - version = 'ics27-1', - encoding = 'proto3', - ordering = 'ordered', - txType = 'sdk_multi_msg', - } = {}, -) => { - hostConnectionId || Fail`hostConnectionId is required`; - controllerConnectionId || Fail`controllerConnectionId is required`; - const connString = JSON.stringify({ - version, - controllerConnectionId, - hostConnectionId, - address: '', // will be provided by the counterparty after channelOpenAck - encoding, - txType, - }); - return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; -}; -harden(makeICAChannelAddress); - -export const DEFAULT_ICQ_VERSION = 'icq-1'; - -/** - * @param {IBCConnectionID} controllerConnectionId - * @param {string} version defaults to icq-1 - * @returns {RemoteIbcAddress} - */ -export const makeICQChannelAddress = ( - controllerConnectionId, - version = DEFAULT_ICQ_VERSION, -) => { - controllerConnectionId || Fail`controllerConnectionId is required`; - return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; -}; -harden(makeICQChannelAddress); - -/** - * Parse a chain address from a remote address string. Assumes the address - * string is in a JSON format and contains an "address" field. This function is - * designed to be safe against malformed inputs and unexpected data types, and - * will return `undefined` in those cases. - * - * @param {RemoteIbcAddress} remoteAddressString - remote address string, - * including version - * @returns {ChainAddress['value'] | undefined} returns undefined on error - */ -export const findAddressField = remoteAddressString => { - try { - // Extract JSON version string assuming it's always surrounded by {} - const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; - const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; - if (!jsonObj?.address?.length) return undefined; - return jsonObj.address; - } catch (error) { - return undefined; - } -}; -harden(findAddressField); - -/** - * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. - * - * see - * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) - * for reference implementation - * - * @param {string} address - */ -export const getBech32Prefix = address => { - assert(address, 'address is required'); - const split = address.lastIndexOf('1'); - if (split === -1) return Fail`No separator character for ${q(address)}`; - if (split === 0) return Fail`Missing prefix for ${q(address)}`; - return address.slice(0, split); -}; diff --git a/contract/utils/amounts.js b/contract/utils/amounts.js deleted file mode 100644 index 3974f922..00000000 --- a/contract/utils/amounts.js +++ /dev/null @@ -1,59 +0,0 @@ -import { makeError } from '@endo/errors'; - -/** - * @import {ChainHub} from "../types.js"; - * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - */ - -/** - * @param {ChainHub} chainHub - * @param {DenomArg} denomArg - * @returns {Denom} - * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom - * mapping - */ -export const coerceDenom = (chainHub, denomArg) => { - if (typeof denomArg === 'string') { - return denomArg; - } - const denom = chainHub.getDenom(denomArg); - if (!denom) { - throw makeError(`No denom for brand ${denomArg}`); - } - return denom; -}; - -/** - * @param {ChainHub} chainHub - * @param {DenomAmount | Amount<'nat'>} amount - * @returns {DenomAmount} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceDenomAmount = (chainHub, amount) => { - if ('denom' in amount) { - return amount; - } - const denom = coerceDenom(chainHub, amount.brand); - return harden({ - denom, - value: amount.value, - }); -}; - -/** - * @param {ChainHub} chainHub - * @param {AmountArg} amount - * @returns {Coin} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceCoin = (chainHub, amount) => { - const denom = - 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); - return harden({ - denom, - amount: String(amount.value), - }); -}; diff --git a/contract/utils/cosmos.js b/contract/utils/cosmos.js deleted file mode 100644 index 5082a1c5..00000000 --- a/contract/utils/cosmos.js +++ /dev/null @@ -1,82 +0,0 @@ -import { makeError } from '@endo/errors'; -import { decodeBase64 } from '@endo/base64'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; - -/** - * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' - * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; - */ - -/** maximum clock skew, in seconds, for unbonding time reported from other chain */ -export const maxClockSkew = 10n * 60n; - -/** - * @template T - * @param {string} ackStr - * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg - */ -export const tryDecodeResponse = (ackStr, fromProtoMsg) => { - try { - const any = Any.decode(decodeBase64(ackStr)); - const protoMsg = Any.decode(any.value); - - const msg = fromProtoMsg(protoMsg); - return msg; - } catch (cause) { - throw makeError(`bad response: ${ackStr}`, undefined, { cause }); - } -}; - -/** - * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - * @see {@link toTruncatedDenomAmount} for DecCoin - */ -export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); - -/** - * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by - * truncating the fractional portion. - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - */ -export const toTruncatedDenomAmount = c => ({ - denom: c.denom, - value: BigInt(c.amount.split('.')[0]), -}); - -/** - * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration - * {@link CosmosValidatorAddress} - * - * @type {( - * r: { validatorAddress: string }, - * chainId: string, - * ) => CosmosValidatorAddress} - */ -export const toCosmosValidatorAddress = (r, chainId) => ({ - encoding: 'bech32', - value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), - chainId, -}); - -/** - * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration - * {@link CosmosDelegationResponse} - * - * @type {( - * chainInfo: { chainId: string }, - * r: DelegationResponse, - * ) => CosmosDelegationResponse} - */ -export const toCosmosDelegationResponse = ({ chainId }, r) => ({ - delegator: { - chainId, - encoding: 'bech32', - value: r.delegation.delegatorAddress, - }, - validator: toCosmosValidatorAddress(r.delegation, chainId), - amount: toDenomAmount(r.balance), -}); diff --git a/contract/utils/denomHash.js b/contract/utils/denomHash.js deleted file mode 100644 index 561ee4b5..00000000 --- a/contract/utils/denomHash.js +++ /dev/null @@ -1,22 +0,0 @@ -// @ts-check -import { sha256 } from '@noble/hashes/sha256'; -import { bytesToHex } from '@noble/hashes/utils'; - -/** - * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ - * - * @param {object} opts - * @param {string} [opts.portId] - * @param {string} [opts.channelId] required unless `path` is supplied - * @param {string} [opts.path] alternative to portId, channelId - * @param {string} opts.denom base denom - */ -export const denomHash = ({ - portId = 'transfer', - channelId = /** @type {string | undefined} */ (undefined), - path = `${portId}/${channelId}`, - denom, -}) => { - const h = sha256.create().update(`${path}/${denom}`).digest(); - return bytesToHex(h).toUpperCase(); -}; diff --git a/contract/utils/orc.js b/contract/utils/orc.js deleted file mode 100644 index 47a0d260..00000000 --- a/contract/utils/orc.js +++ /dev/null @@ -1,38 +0,0 @@ -/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ - -export const orcUtils = { - /** - * unwinds denom with PFM, if necessary - * - * @param {Omit} _args - * @returns {TransferMsg} - */ - makeTransferMsg: _args => { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, - /** - * SwapExact or SwapMaxSlippage, with optional AfterAction - * - * @param {(SwapExact | SwapMaxSlippage) & - * (AfterAction | Record)} _args - * - * @returns {TransferMsg} - */ - makeOsmosisSwap(_args) { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, -}; diff --git a/contract/utils/orchestrationAccount.js b/contract/utils/orchestrationAccount.js deleted file mode 100644 index 2290af54..00000000 --- a/contract/utils/orchestrationAccount.js +++ /dev/null @@ -1,40 +0,0 @@ -import { BrandShape } from '@agoric/ertp'; -import { Shape as NetworkShape } from '@agoric/network'; -import { VowShape } from '@agoric/vow'; -import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { M } from '@endo/patterns'; -import { - AmountArgShape, - ChainAddressShape, - DenomAmountShape, - IBCTransferOptionsShape, -} from '../src/typeGuards.js'; - -/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ - -const { Vow$ } = NetworkShape; // TODO #9611 - -/** @see {OrchestrationAccountI} */ -export const orchestrationAccountMethods = { - getAddress: M.call().returns(ChainAddressShape), - getBalance: M.call(M.or(BrandShape, M.string())).returns( - Vow$(DenomAmountShape), - ), - getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), - send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), - sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( - VowShape, - ), - transfer: M.call(ChainAddressShape, AmountArgShape) - .optional(IBCTransferOptionsShape) - .returns(VowShape), - transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), - asContinuingOffer: M.call().returns( - Vow$({ - publicSubscribers: TopicsRecordShape, - invitationMakers: M.any(), - holder: M.remotable(), - }), - ), - getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), -}; diff --git a/contract/utils/packet.js b/contract/utils/packet.js deleted file mode 100644 index 70564cff..00000000 --- a/contract/utils/packet.js +++ /dev/null @@ -1,112 +0,0 @@ -import { Fail } from '@endo/errors'; -import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; -import { - RequestQuery, - ResponseQuery, -} from '@agoric/cosmic-proto/tendermint/abci/types.js'; -import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; -import { - CosmosQuery, - CosmosResponse, -} from '@agoric/cosmic-proto/icq/v1/packet.js'; -import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - -/** - * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; - * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; - */ - -/** - * Makes an IBC transaction packet from an array of messages. Expects the - * `value` of each message to be base64 encoded bytes. Skips checks for - * malformed messages in favor of interface guards. - * - * @param {AnyJson[]} msgs - * @param {Partial>} [opts] - * @returns {string} stringified InterchainAccountPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeTxPacket(msgs, opts) { - const messages = msgs.map(Any.fromJSON); - const bytes = TxBody.encode( - TxBody.fromPartial({ - messages, - ...opts, - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - type: PacketType.TYPE_EXECUTE_TX, - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeTxPacket); - -/** - * Makes an IBC query packet from an array of query messages. Expects the `data` - * of each message to be base64 encoded bytes. Skips checks for malformed - * messages in favor of interface guards. - * - * @param {JsonSafe[]} msgs - * @returns {string} stringified InterchainQueryPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeQueryPacket(msgs) { - const bytes = CosmosQuery.encode( - CosmosQuery.fromPartial({ - requests: msgs.map(RequestQuery.fromJSON), - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeQueryPacket); - -/** - * Looks for a result or error key in the response string, and returns a - * Base64Bytes string. This string can be decoded using the corresponding - * Msg*Response object. Error strings seem to be plain text and do not need - * decoding. - * - * @param {string} response - * @returns {string} - base64 encoded bytes string - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseTxPacket(response) { - const { result, error } = JSON.parse(response); - if (result) return result; - else if (error) throw Error(error); - else throw Fail`expected either result or error: ${response}`; -} -harden(parseTxPacket); - -/** - * Looks for a result or error key in the response string. If a result is found, - * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on - * the resulting entries are base64 encoded for inter-vat communication. These - * can be decoded using the corresponding Query*Response objects. Error strings - * seem to be plain text and do not need decoding. - * - * @param {string} response - * @returns {JsonSafe[]} - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseQueryPacket(response) { - const result = parseTxPacket(response); - const { data } = JSON.parse(atob(result)); - const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); - return harden(responses.map(ResponseQuery.toJSON)); -} -harden(parseQueryPacket); diff --git a/contract/utils/registry.js b/contract/utils/registry.js deleted file mode 100644 index 25789864..00000000 --- a/contract/utils/registry.js +++ /dev/null @@ -1,130 +0,0 @@ -import { - State as IBCChannelState, - Order, -} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; -import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; -import assert from 'node:assert'; - -/** - * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; - * @import {Chain, IBCInfo} from '@chain-registry/types'; - * @import {ChainRegistryClient} from '@chain-registry/client'; - * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; - */ - -/** - * @param {IBCInfo} ibcInfo - * @param {string} name - * @param {Record} chainInfo - * @returns {[string, IBCConnectionInfo] | []} - */ -function toConnectionEntry(ibcInfo, name, chainInfo) { - // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order - const fromChain1 = ibcInfo.chain_1.chain_name === name; - const [from, to] = fromChain1 - ? [ibcInfo.chain_1, ibcInfo.chain_2] - : [ibcInfo.chain_2, ibcInfo.chain_1]; - assert.equal(from.chain_name, name); - const transferChannels = ibcInfo.channels.filter( - c => - c.chain_1.port_id === 'transfer' && - // @ts-expect-error tags does not specify keys - c.tags?.preferred, - ); - if (transferChannels.length === 0) { - console.warn( - 'no transfer channel for [', - from.chain_name, - to.chain_name, - ']', - '(skipping)', - ); - return []; - } - if (transferChannels.length > 1) { - console.warn( - 'multiple preferred transfer channels [', - from.chain_name, - to.chain_name, - ']:', - transferChannels, - '(choosing first)', - ); - } - const [channel] = transferChannels; - const [channelFrom, channelTo] = fromChain1 - ? [channel.chain_1, channel.chain_2] - : [channel.chain_2, channel.chain_1]; - const record = { - id: /** @type {IBCConnectionID} */ (from.connection_id), - client_id: from.client_id, - counterparty: { - client_id: to.client_id, - connection_id: /** @type {IBCConnectionID} */ (to.connection_id), - }, - state: IBCConnectionState.STATE_OPEN, // XXX presumably - transferChannel: { - channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), - portId: channelFrom.port_id, - counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), - counterPartyPortId: channelTo.port_id, - // FIXME mapping, our guard expects a numerical enum - ordering: Order.ORDER_NONE_UNSPECIFIED, - state: IBCChannelState.STATE_OPEN, // XXX presumably - version: channel.version, - }, - }; - const destChainId = chainInfo[to.chain_name].chainId; - return [destChainId, record]; -} - -/** - * Converts the given chain info to our local config format - * - * @param {Pick} registry - */ -export const convertChainInfo = async registry => { - /** @type {Record} */ - const chainInfo = {}; - - for (const chain of registry.chains) { - console.log('processing info', chain.chain_name); - chainInfo[chain.chain_name] = { - bech32Prefix: chain.bech32_prefix, - chainId: chain.chain_id, - stakingTokens: chain.staking?.staking_tokens, - // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 - icqEnabled: chain.chain_name === 'osmosis', - }; - } - - // XXX probably easier to keep ibc separate - const ibcLookup = {}; - for (const ibc of registry.ibcData) { - ibcLookup[ibc.chain_1.chain_name] ||= []; - ibcLookup[ibc.chain_2.chain_name] ||= []; - - ibcLookup[ibc.chain_1.chain_name].push(ibc); - ibcLookup[ibc.chain_2.chain_name].push(ibc); - } - - const chainNames = registry.chains.map(c => c.chain_name).sort(); - - // iterate this after chainInfo is filled out - for (const name of chainNames) { - console.log('processing connections', name); - - const ibcData = ibcLookup[name]; - const connections = Object.fromEntries( - ibcData - .map(datum => toConnectionEntry(datum, name, chainInfo)) - .filter(entry => entry.length > 0) - // sort alphabetically for consistency - .sort(([a], [b]) => a.localeCompare(b)), - ); - chainInfo[name] = { ...chainInfo[name], connections }; - } - - // return object with insertion in alphabetical order of chain name - return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); -}; diff --git a/contract/utils/start-helper.js b/contract/utils/start-helper.js deleted file mode 100644 index 8e2a21c6..00000000 --- a/contract/utils/start-helper.js +++ /dev/null @@ -1,214 +0,0 @@ -import { prepareAsyncFlowTools } from '@agoric/async-flow'; -import { prepareVowTools } from '@agoric/vow/vat.js'; -import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; -import { makeDurableZone } from '@agoric/zone/durable.js'; -import { makeChainHub } from '../src/exos/chain-hub.js'; -import { prepareCosmosOrchestrationAccount } from '../src/exos/cosmos-orchestration-account.js'; -import { prepareLocalChainFacade } from '../src/exos/local-chain-facade.js'; -import { prepareLocalOrchestrationAccountKit } from '../src/exos/local-orchestration-account.js'; -import { prepareOrchestrator } from '../src/exos/orchestrator.js'; -import { prepareRemoteChainFacade } from '../src/exos/remote-chain-facade.js'; -import { makeOrchestrationFacade } from '../src/facade.js'; -import { makeZoeTools } from './zoe-tools.js'; -import { makeZcfTools } from './zcf-tools.js'; - -/** - * @import {LocalChain} from '@agoric/vats/src/localchain.js'; - * @import {TimerService, TimerBrand} from '@agoric/time'; - * @import {Baggage} from '@agoric/vat-data'; - * @import {NameHub} from '@agoric/vats'; - * @import {Remote} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; - */ - -/** - * @typedef {{ - * localchain: Remote; - * orchestrationService: Remote; - * storageNode: Remote; - * timerService: Remote; - * agoricNames: Remote; - * }} OrchestrationPowers - */ - -/** - * Helper that a contract start function can use to set up the objects needed - * for orchestration. - * - * TODO strip problematic operations from ZCF (e.g., getPayouts) - * - * @param {ZCF} zcf - * @param {Baggage} baggage - * @param {OrchestrationPowers} remotePowers - * @param {Marshaller} marshaller - * @internal - */ -export const provideOrchestration = ( - zcf, - baggage, - remotePowers, - marshaller, -) => { - // separate zones - const zones = (() => { - const zone = makeDurableZone(baggage); - return { - /** system names for async flow */ - asyncFlow: zone.subZone('asyncFlow'), - /** system names for orchestration implementation */ - orchestration: zone.subZone('orchestration'), - /** system names for chainHub */ - chainHub: zone.subZone('chainHub'), - /** system names for vows */ - vows: zone.subZone('vows'), - /** contract-provided names, and subzones */ - contract: zone.subZone('contract'), - }; - })(); - - const { agoricNames, timerService, localchain } = remotePowers; - - const vowTools = prepareVowTools(zones.vows); - - const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); - - const zoeTools = makeZoeTools(zcf, vowTools); - - const zcfTools = makeZcfTools(zcf, vowTools); - - const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); - const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( - zones.orchestration, - { - makeRecorderKit, - zcf, - timerService, - vowTools, - chainHub, - localchain, - zoeTools, - }, - ); - - const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { - vowTools, - }); - - const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( - zones.orchestration, - { - chainHub, - makeRecorderKit, - timerService, - vowTools, - zcf, - }, - ); - - const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { - makeCosmosOrchestrationAccount, - orchestration: remotePowers.orchestrationService, - storageNode: remotePowers.storageNode, - timer: remotePowers.timerService, - vowTools, - }); - - const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { - makeLocalOrchestrationAccountKit, - localchain: remotePowers.localchain, - // FIXME what path? - storageNode: remotePowers.storageNode, - agoricNames, - orchestration: remotePowers.orchestrationService, - timer: remotePowers.timerService, - vowTools, - }); - - const makeOrchestrator = prepareOrchestrator(zones.orchestration, { - chainHub, - makeLocalChainFacade, - makeRemoteChainFacade, - vowTools, - }); - - /** - * Create orchestrate functions in a specific zone, instead of the default - * `contract.orchestration` zone. This is used for modules that add their own - * orchestration functions (e.g., a Portfolio with orchestration flows for - * continuing offers) - * - * @param {Zone} zone - */ - const makeOrchestrateKit = zone => - makeOrchestrationFacade({ - zone, - zcf, - makeRecorderKit, - makeOrchestrator, - asyncFlowTools, - vowTools, - ...remotePowers, - }); - - // Create orchestrate functions for the default `contract.orchestration` zone - const defaultOrchestrateKit = makeOrchestrateKit( - zones.contract.subZone('orchestration'), - ); - - zcf.setTestJig(() => ({ - baggage, - chainHub, - })); - - return { - ...defaultOrchestrateKit, - makeOrchestrateKit, - chainHub, - vowTools, - asyncFlowTools, - zcfTools, - zoeTools, - zone: zones.contract, - }; -}; -harden(provideOrchestration); - -/** @typedef {Omit, 'zone'>} OrchestrationTools */ - -/** - * Simplifies contract functions for Orchestration by wrapping a simpler - * function with all the tools it needs in order to use Orchestration. - * - * @example - * - * ```js - * const contract = (zcf, privateArgs, zone, tools) => { ... }; - * export const start = withOrchestration(contract); - * ``` - * - * @template {Record} CT - * @template {OrchestrationPowers & { - * marshaller: Marshaller; - * }} PA - * @template R - * @param {( - * zcf: ZCF, - * privateArgs: PA, - * zone: Zone, - * tools: OrchestrationTools, - * ) => Promise} contractFn - * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a - * Zoe start function - */ -export const withOrchestration = - contractFn => async (zcf, privateArgs, baggage) => { - const { zone, ...tools } = provideOrchestration( - zcf, - baggage, - privateArgs, - privateArgs.marshaller, - ); - return contractFn(zcf, privateArgs, zone, tools); - }; -harden(withOrchestration); diff --git a/contract/utils/time.js b/contract/utils/time.js deleted file mode 100644 index 06f995ab..00000000 --- a/contract/utils/time.js +++ /dev/null @@ -1,48 +0,0 @@ -import { E } from '@endo/far'; -import { TimeMath } from '@agoric/time'; - -/** - * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - */ - -export const SECONDS_PER_MINUTE = 60n; -export const MILLISECONDS_PER_SECOND = 1000n; -export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; -export const NANOSECONDS_PER_SECOND = 1_000_000_000n; - -/** - * XXX should this be durable? resumable? - * - * @param {Remote} timer - */ -export function makeTimestampHelper(timer) { - return harden({ - /** - * XXX do this need to be resumable / use Vows? - * - * Takes the current time from ChainTimerService and adds a relative time to - * determine a timeout timestamp in nanoseconds. Useful for - * {@link MsgTransfer.timeoutTimestamp}. - * - * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes - * @returns {Promise} Timeout timestamp in absolute nanoseconds - * since unix epoch - */ - async getTimeoutTimestampNS(relativeTime) { - const currentTime = await E(timer).getCurrentTimestamp(); - const timeout = - relativeTime || - TimeMath.coerceRelativeTimeRecord( - SECONDS_PER_MINUTE * 5n, - currentTime.timerBrand, - ); - return ( - TimeMath.addAbsRel(currentTime, timeout).absValue * - NANOSECONDS_PER_SECOND - ); - }, - }); -} - -/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/utils/zcf-tools.js b/contract/utils/zcf-tools.js deleted file mode 100644 index bc8027e6..00000000 --- a/contract/utils/zcf-tools.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @import {HostInterface} from '@agoric/async-flow'; - * @import {VowTools} from '@agoric/vow'; - * @import {ZcfTools} from '../src/types.js'; - */ - -import { M, mustMatch } from '@endo/patterns'; - -const HandlerShape = M.remotable('OfferHandler'); - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - * @returns {HostInterface} - */ -export const makeZcfTools = (zcf, vowTools) => - harden({ - makeInvitation(offerHandler, description, customDetails, proposalShape) { - mustMatch(offerHandler, HandlerShape); - return vowTools.watch( - zcf.makeInvitation( - offerHandler, - description, - customDetails, - proposalShape, - ), - ); - }, - atomicRearrange(transfers) { - zcf.atomicRearrange(transfers); - }, - assertUniqueKeyword(keyword) { - zcf.assertUniqueKeyword(keyword); - }, - }); diff --git a/contract/utils/zoe-tools.js b/contract/utils/zoe-tools.js deleted file mode 100644 index a5cbbe38..00000000 --- a/contract/utils/zoe-tools.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file Helper functions for transferring payments between a LocalChainAccount - * and a ZCFSeat. - * - * Maintainers: This exists as an endowment for orchestrated async-flows so we - * can make use of E and promises. The logic for recovering partial failures - * is also an added convenience for developers. - * - * Functions are written using `asVow` and non-resumable promises as we expect - * each invocation to resolve promptly - there are no timers or interchain - * network calls. - * - * A promise resolved promptly is currently safe from being severed by an - * upgrade because we only trigger vat upgrades as the result of network - * input. - */ - -import { makeError, q, Fail } from '@endo/errors'; -import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; -import { E } from '@endo/far'; - -const { assign, keys, values } = Object; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; - * @import {VowTools} from '@agoric/vow'; - * @import {LocalAccountMethods} from '../types.js'; - */ - -/** - * @typedef {{ - * invitationMakers: InvitationMakers; - * publicSubscribers: Record>; - * }} ResolvedContinuingOfferResult - * - * @see {ContinuingOfferResult} - */ - -/** - * @typedef {( - * srcSeat: ZCFSeat, - * localAccount: LocalAccountMethods, - * amounts: AmountKeywordRecord, - * ) => Promise} LocalTransfer - */ - -/** - * @typedef {( - * localAccount: LocalAccountMethods, - * destSeat: ZCFSeat, - * amounts: AmountKeywordRecord, - * ) => Promise} WithdrawToSeat - */ - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - */ -export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { - /** - * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the - * deposits fail, everything will be rolled back to the `srcSeat`. Supports - * multiple items in the `amounts` {@link AmountKeywordRecord}. - * - * @type {HostOf} - */ - const localTransfer = (srcSeat, localAccount, amounts) => - asVow(async () => { - !srcSeat.hasExited() || Fail`The seat cannot have exited.`; - const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); - const userSeat = await userSeatP; - zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); - tempSeat.exit(); - // TODO (#9541) get the userSeat into baggage so it's at least recoverable - // const userSeat = await subzone.makeOnce( - // 'localTransferHelper', - // async () => { - // const { zcfSeat: tempSeat, userSeat: userSeatP } = - // zcf.makeEmptySeatKit(); - // const uSeat = await userSeatP; - // // TODO how do I store in the place for this retryable? - // atomicTransfer(zcf, srcSeat, tempSeat, amounts); - // tempSeat.exit(); - // return uSeat; - // }, - // ); - - // Now all the `amounts` are accessible, so we can move them to the localAccount - const payments = await Promise.all( - keys(amounts).map(kw => E(userSeat).getPayout(kw)), - ); - const settleDeposits = await when( - allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), - ); - // if any of the deposits to localAccount failed, unwind all of the allocations - if (settleDeposits.find(x => x.status === 'rejected')) { - const amts = values(amounts); - const errors = []; - // withdraw the successfully deposited payments - const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { - if (x.status === 'rejected') { - errors.push(x.reason); - return payments[i]; - } - return E(localAccount).withdraw(amts[i]); - }); - - // return all payments to the srcSeat - const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); - const paymentKwr = harden( - keys(amounts).reduce( - (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - srcSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - throw makeError(`One or more deposits failed ${q(errors)}`); - } - // TODO #9541 remove userSeat from baggage - }); - - /** - * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any - * of the withdrawals fail, everything will be rolled back to the - * `srcLocalAccount`. Supports multiple items in the `amounts` - * {@link PaymentKeywordRecord} - * - * @type {HostOf} - */ - const withdrawToSeat = (localAccount, destSeat, amounts) => - asVow(async () => { - !destSeat.hasExited() || Fail`The seat cannot have exited.`; - - const settledWithdrawals = await when( - allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), - ); - - // if any of the withdrawals were rejected, unwind the successful ones - if (settledWithdrawals.find(x => x.status === 'rejected')) { - const returnPaymentVs = []; - const errors = []; - for (const result of settledWithdrawals) { - if (result.status === 'fulfilled') { - returnPaymentVs.push(E(localAccount).deposit(result.value)); - } else { - errors.push(result.reason); - } - } - await when(allVows(returnPaymentVs)); - throw makeError(`One or more withdrawals failed ${q(errors)}`); - } - // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat - const paymentKwr = harden( - keys(amounts).reduce( - (acc, kw, i) => - assign(acc, { - [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] - .value, - }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - destSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - }); - - return harden({ - localTransfer, - withdrawToSeat, - }); -}; - -/** @typedef {ReturnType} ZoeTools */ diff --git a/yarn.lock b/yarn.lock index b59e68ee..b7e4a8f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,25 +58,6 @@ __metadata: languageName: node linkType: hard -"@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.1.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/cb1af5786225ee908213797d1a80dcfaf8c5cc5e0e210e14a49680d2485ecec14dd3d73f6b71daa4f1029b0814e06232153ebde3a4d95587856ca98ce470177c - languageName: node - linkType: hard - "@agoric/async-flow@npm:^0.1.1-u17.1": version: 0.1.1-upgrade-18-dev-ef001c0.0 resolution: "@agoric/async-flow@npm:0.1.1-upgrade-18-dev-ef001c0.0" @@ -96,6 +77,25 @@ __metadata: languageName: node linkType: hard +"@agoric/async-flow@npm:^0.2.0-u18.0": + version: 0.2.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/async-flow@npm:0.2.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/6db3a772f38a0c511efea75f4e5f3b1c10ff26f6b11585a9688ff198936c56ef6088c36f988e0f355883ed633b4650c6500958b172e145f576e3de6d087b62ea + languageName: node + linkType: hard + "@agoric/babel-generator@npm:^7.17.4, @agoric/babel-generator@npm:^7.17.6": version: 7.17.6 resolution: "@agoric/babel-generator@npm:7.17.6" @@ -122,21 +122,6 @@ __metadata: languageName: node linkType: hard -"@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.1.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/b30362368bd2d29b12e19f4809023844a44ed512369cba37a27107b41f66c782d68cc58fde749089465d872bf435b73991792dbcf439c9e85591e2e187c4066f - languageName: node - linkType: hard - "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.1.1-upgrade-18-dev-bf39b10.0 resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0" @@ -278,17 +263,7 @@ __metadata: languageName: node linkType: hard -"@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.5.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/init": "npm:^1.1.4" - checksum: 10c0/7b13087e41fffd9d41f3451a2efe984fe5a0ead1b04a8e8aecd3e10c11ee19bedbb3598963c5ea0232b4c7cce73b390aecce7cb9863542e448d619b2e55a74e5 - languageName: node - linkType: hard - -"@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/cosmic-proto@npm:^0.5.0-u18.1": version: 0.5.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -331,25 +306,6 @@ __metadata: languageName: node linkType: hard -"@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.16.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/7d3a80c64a1babde365f9d25ade71101dfa108392903d2a895777fd58f1f013615e22db4fc3aac0f50849d15d93a694515945a8a9abc4b595ce1db8f98a084be - languageName: node - linkType: hard - "@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.16.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0" @@ -369,7 +325,7 @@ __metadata: languageName: node linkType: hard -"@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1": +"@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1, @agoric/ertp@npm:^0.16.3-u18.0": version: 0.16.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -426,30 +382,6 @@ __metadata: languageName: node linkType: hard -"@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.10.4-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - import-meta-resolve: "npm:^2.2.1" - checksum: 10c0/617f0729472471948dc63430b8b3ce10abde44bc535246c7faa4c0328b196733e429652ec22eedffdf5b554b277a988ae089ee92390acbf69d15bd78ace6deec - languageName: node - linkType: hard - "@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.10.4-upgrade-18-dev-bf39b10.0 resolution: "@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0" @@ -619,27 +551,7 @@ __metadata: languageName: node linkType: hard -"@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.4.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/stream": "npm:^1.2.5" - anylogger: "npm:^0.21.0" - jessie.js: "npm:^0.3.4" - checksum: 10c0/141817835928f890d874aeebbddb59e0f88a8683f15691687a6888bcc44885eb678a931bfee10af5e913f77ae9c7078216eab4252dd14a0ef101c8211e7416ce - languageName: node - linkType: hard - -"@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/internal@npm:^0.4.0-u17.1": +"@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/internal@npm:^0.4.0-u17.1, @agoric/internal@npm:^0.4.0-u18.0": version: 0.4.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -675,17 +587,6 @@ __metadata: languageName: node linkType: hard -"@agoric/kmarshal@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.1.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-17-dev-ec448b0.0" - dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - checksum: 10c0/7ba05a4944d7eac6138a80b37aa07b8b08ad76b562fe49958eb9a3851313c9b98bd167865c91c42fb6749d09e0ec95a3d996f9265a59f52c91b5b137a4669cab - languageName: node - linkType: hard - "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.1.1-upgrade-18-dev-bf39b10.0 resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0" @@ -742,24 +643,7 @@ __metadata: languageName: node linkType: hard -"@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/a8a0a1af170e99616ec9dd890cabcca0f2e6680e401d38eca631b50e877d9183edd8d5ec8bb557a8ffa09f3a9b3beea635eb52a0f042f4955019fd24cdf89817 - languageName: node - linkType: hard - -"@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/network@npm:^0.2.0-u18.0": version: 0.2.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -791,22 +675,7 @@ __metadata: languageName: node linkType: hard -"@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.7.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/af93e56e082342facdd87d5265dc7988d641f2d011da03b9c63563c99a9065676dd4d9f869d0a4d83d90bdc6e2c91ce7039aa036c887b8cdd4b454ac17393905 - languageName: node - linkType: hard - -"@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/notifier@npm:^0.7.0-u18.0": version: 0.7.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -838,57 +707,30 @@ __metadata: languageName: node linkType: hard -"@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/async-flow": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" - "@noble/hashes": "npm:^1.5.0" - checksum: 10c0/0598541cb70b67490cded3972cec426ea99f86a670dad5c538edec7c46361163c03e64af5f18c700c489ced8c09e20c14750a02b7e3894216b68eaa5e471be15 - languageName: node - linkType: hard - -"@agoric/orchestration@patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/orchestration@patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch::version=0.2.0-upgrade-17-dev-ec448b0.0&hash=f122bf" - dependencies: - "@agoric/async-flow": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" +"@agoric/orchestration@npm:0.2.0-u18.1": + version: 0.2.0-u18.1 + resolution: "@agoric/orchestration@npm:0.2.0-u18.1" + dependencies: + "@agoric/async-flow": "npm:^0.2.0-u18.0" + "@agoric/cosmic-proto": "npm:^0.5.0-u18.1" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/network": "npm:^0.2.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.1" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/patterns": "npm:^1.4.6" "@noble/hashes": "npm:^1.5.0" - checksum: 10c0/b3bc83a0bf2c172b1639af82dc4cf0c60cf4a3e5fd66d46cf02d293d3b7079502161b9cc9dd4df56bd684f2e9e7fb22692d991f23072dd67c752ddd139187f20 + checksum: 10c0/6791e888aabc778c63ea3c6c49d102d0dd772c749ffacf81b00b18ad357369803b61a9f70140f9fc0a07a885ae762f8e78883eda0912f80d85ae46b7acaae7bd languageName: node linkType: hard @@ -1035,19 +877,6 @@ __metadata: languageName: node linkType: hard -"@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.9.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/marshal": "npm:^1.5.3" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/1ef22b1508979b5cdbed7a705fc84cb3f5d9d1a53afa34446d48c4b633d42a17881e7b8281e7c8458457d34889e9bab6e75acc5878bc4664390cd776dd8364a6 - languageName: node - linkType: hard - "@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.9.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0" @@ -1061,7 +890,7 @@ __metadata: languageName: node linkType: hard -"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u17.1": +"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u17.1, @agoric/store@npm:^0.9.3-u18.0": version: 0.9.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -1107,21 +936,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.9.2-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/check-bundle": "npm:^1.0.9" - "@endo/errors": "npm:^1.2.5" - "@endo/nat": "npm:^5.0.10" - better-sqlite3: "npm:^9.1.1" - checksum: 10c0/2896d1ea54a11e0064bcc7fd6e0451fcfee86c34498e1b8d4d6f0d1c430e22cf95f4e875c920dae7c5f13f1ea12b77d017055629d3a4946900201e06e85a9906 - languageName: node - linkType: hard - "@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0+ef001c0": version: 0.9.2-upgrade-18-dev-ef001c0.0 resolution: "@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0" @@ -1173,27 +987,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.10.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/6ac445b9729f737f4a2a3f43f25b255df293e0e6df710920a3879d693da4240e968580cd70b1c2e7a92e38090afc47d2c5d990ed2f2535002734de1e84c63dab - languageName: node - linkType: hard - "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.10.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0" @@ -1308,54 +1101,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.33.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/kmarshal": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swing-store": "npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/xsnap": "npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/check-bundle": "npm:^1.0.9" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/import-bundle": "npm:^1.2.2" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/ses-ava": "npm:^1.2.5" - "@endo/stream": "npm:^1.2.5" - "@endo/zip": "npm:^1.0.7" - ansi-styles: "npm:^6.2.1" - anylogger: "npm:^0.21.0" - better-sqlite3: "npm:^9.1.1" - import-meta-resolve: "npm:^2.2.1" - microtime: "npm:^3.1.0" - semver: "npm:^6.3.0" - tmp: "npm:^0.2.1" - yargs-parser: "npm:^21.1.1" - peerDependencies: - ava: ^5.3.0 - bin: - vat: bin/vat - checksum: 10c0/faa84e846fa4305b451ff42a835c5526e5ebbbd260ecc939857c4f8784b6d38ee47210bd8a684ef46b7dba3cdae11202668071b20f91a86905563060be6705f4 - languageName: node - linkType: hard - "@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.33.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0" @@ -1446,13 +1191,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.10.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0" - checksum: 10c0/0b07fb3a628f96a5e32e26db4d50fb27897340b8759405f0315e15ca60a31c484edee84853fe9d8cdcf51b2f29ab79dfe5f86eeda0358e8462cedb12c099534f - languageName: node - linkType: hard - "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.10.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0" @@ -1474,18 +1212,6 @@ __metadata: languageName: node linkType: hard -"@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/nat": "npm:^5.0.10" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/f010169a36f1ff1bf1663378577e7a9792c58083ea491ddf0bd4225f3a59e3beefe858d81f2c8f8bc6849eaf5a8800f2b818f47345aab619b48de979bd521b8d - languageName: node - linkType: hard - "@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.3.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0" @@ -1498,7 +1224,7 @@ __metadata: languageName: node linkType: hard -"@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/time@npm:^0.3.3-u17.1": +"@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/time@npm:^0.3.3-u17.1, @agoric/time@npm:^0.3.3-u18.0": version: 0.3.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -1535,20 +1261,6 @@ __metadata: languageName: node linkType: hard -"@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.5.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/6b7cf74253187971da6a79ff7e90e0256390233f79f1645f30c9267ab46095e93251bc012b8abde8161ef866904b22ce77aaf67c11976f2d7ce1ab5e0fd13c8e - languageName: node - linkType: hard - "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.5.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0" @@ -1619,38 +1331,7 @@ __metadata: languageName: node linkType: hard -"@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.16.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/governance": "npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/import-bundle": "npm:^1.2.2" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - import-meta-resolve: "npm:^2.2.1" - jessie.js: "npm:^0.3.4" - checksum: 10c0/8137baa3f735050bcfe012439dcb3f261c5ae63073ddde740c10c04f7ea009a8aa37de6a6bd1e89c0147b056b3f219d9644e4c794c5d58ce00f2478bba17eee1 - languageName: node - linkType: hard - -"@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vats@npm:^0.16.0-u17.1": +"@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vats@npm:^0.16.0-u17.1, @agoric/vats@npm:^0.16.0-u18.1": version: 0.16.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -1725,23 +1406,7 @@ __metadata: languageName: node linkType: hard -"@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/709c949b185aa583eebee07c24c1a7ab7e19a8e1323322f2d96ee5b9d4175fa13ec8aa4a6e35a8fe72cc307a422c84865037e562e5c78e9f28eee7577971c1f3 - languageName: node - linkType: hard - -"@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vow@npm:^0.2.0-u17.1": +"@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vow@npm:^0.2.0-u17.1, @agoric/vow@npm:^0.2.0-u18.0": version: 0.2.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -1775,13 +1440,6 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.14.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0" - checksum: 10c0/78c3bab502052987c88e3e3fffe87aa599a4c47a0f87ba32e5f5722d7a45be6c519eb6305f323ff877e2a911d273a03a9eebd3c9c57b7815b9510bd65ea9cb81 - languageName: node - linkType: hard - "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.14.1-upgrade-18-dev-bf39b10.0 resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0" @@ -1803,29 +1461,6 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.14.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/init": "npm:^1.1.4" - "@endo/netstring": "npm:^1.0.10" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/stream": "npm:^1.2.5" - "@endo/stream-node": "npm:^1.1.5" - glob: "npm:^7.1.6" - tmp: "npm:^0.2.1" - bin: - ava-xs: src/ava-xs.js - xsrepl: src/xsrepl - checksum: 10c0/68c6896dcd493748a2b610b7dafb5fcd9ae4108eab659f7415cdeee3748af5d22af668e378467d2ef778a378f41e6198a8a4a1c7e77d6b63afdce79acb3ff387 - languageName: node - linkType: hard - "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.14.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0" @@ -1895,39 +1530,6 @@ __metadata: languageName: node linkType: hard -"@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.26.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/far": "npm:^1.1.5" - "@endo/import-bundle": "npm:^1.2.2" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/8d3fa51faeedc72f843c80a7bd8c07006c5e74277d0e590d5f92bfd62c1cc4661fd0767d703031cc2995e013419380614d956deca6d33ee239cde593078b2c7e - languageName: node - linkType: hard - "@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.26.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0" @@ -1961,7 +1563,7 @@ __metadata: languageName: node linkType: hard -"@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/zoe@npm:^0.26.3-u17.1": +"@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/zoe@npm:^0.26.3-u17.1, @agoric/zoe@npm:^0.26.3-u18.0": version: 0.26.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -2032,20 +1634,7 @@ __metadata: languageName: node linkType: hard -"@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - checksum: 10c0/0275010c155aa3e860ffb9d4de18d56db87f06552bbb9f2a81d4c678f9c503ac19c93eebe95fc727221209d889d5dc7853eaa70dc915edadb2943c3af87637d6 - languageName: node - linkType: hard - -"@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/zone@npm:^0.3.0-u18.0": version: 0.3.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -3789,7 +3378,7 @@ __metadata: languageName: node linkType: hard -"@endo/base64@npm:^1.0.7, @endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9, @endo/base64@npm:latest": +"@endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9, @endo/base64@npm:latest": version: 1.0.9 resolution: "@endo/base64@npm:1.0.9" checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 @@ -3820,7 +3409,7 @@ __metadata: languageName: node linkType: hard -"@endo/bundle-source@npm:^3.4.0, @endo/bundle-source@npm:^3.4.2, @endo/bundle-source@npm:^3.5.0": +"@endo/bundle-source@npm:^3.4.2, @endo/bundle-source@npm:^3.5.0": version: 3.5.0 resolution: "@endo/bundle-source@npm:3.5.0" dependencies: @@ -3854,7 +3443,7 @@ __metadata: languageName: node linkType: hard -"@endo/captp@npm:^4.3.0, @endo/captp@npm:^4.4.2": +"@endo/captp@npm:^4.4.2": version: 4.4.3 resolution: "@endo/captp@npm:4.4.3" dependencies: @@ -3877,7 +3466,7 @@ __metadata: languageName: node linkType: hard -"@endo/check-bundle@npm:^1.0.11, @endo/check-bundle@npm:^1.0.9": +"@endo/check-bundle@npm:^1.0.11": version: 1.0.12 resolution: "@endo/check-bundle@npm:1.0.12" dependencies: @@ -3902,7 +3491,7 @@ __metadata: languageName: node linkType: hard -"@endo/common@npm:^1.2.5, @endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": +"@endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": version: 1.2.8 resolution: "@endo/common@npm:1.2.8" dependencies: @@ -3937,7 +3526,7 @@ __metadata: languageName: node linkType: hard -"@endo/compartment-mapper@npm:^1.2.2, @endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": +"@endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": version: 1.4.0 resolution: "@endo/compartment-mapper@npm:1.4.0" dependencies: @@ -3957,14 +3546,14 @@ __metadata: languageName: node linkType: hard -"@endo/env-options@npm:^1.1.6, @endo/env-options@npm:^1.1.7, @endo/env-options@npm:^1.1.8": +"@endo/env-options@npm:^1.1.7, @endo/env-options@npm:^1.1.8": version: 1.1.8 resolution: "@endo/env-options@npm:1.1.8" checksum: 10c0/2f519f48a5b966dbd9e66134d4abc89ff02b9791d21146b49031ceb694584f3f41c6119125b6bb4eb0d347f5bcd846473b5f3c4ae6bae3dac19402fcaf522520 languageName: node linkType: hard -"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": +"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": version: 1.2.8 resolution: "@endo/errors@npm:1.2.8" dependencies: @@ -4006,7 +3595,7 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.5, @endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": +"@endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": version: 1.2.8 resolution: "@endo/eventual-send@npm:1.2.8" dependencies: @@ -4027,7 +3616,7 @@ __metadata: languageName: node linkType: hard -"@endo/exo@npm:^1.5.3, @endo/exo@npm:^1.5.6": +"@endo/exo@npm:^1.5.6": version: 1.5.7 resolution: "@endo/exo@npm:1.5.7" dependencies: @@ -4052,7 +3641,7 @@ __metadata: languageName: node linkType: hard -"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.5, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": version: 1.1.9 resolution: "@endo/far@npm:1.1.9" dependencies: @@ -4073,7 +3662,7 @@ __metadata: languageName: node linkType: hard -"@endo/import-bundle@npm:^1.2.2, @endo/import-bundle@npm:^1.3.1": +"@endo/import-bundle@npm:^1.3.1": version: 1.3.2 resolution: "@endo/import-bundle@npm:1.3.2" dependencies: @@ -4098,7 +3687,7 @@ __metadata: languageName: node linkType: hard -"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.4, @endo/init@npm:^1.1.6, @endo/init@npm:^1.1.7": +"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.6, @endo/init@npm:^1.1.7": version: 1.1.7 resolution: "@endo/init@npm:1.1.7" dependencies: @@ -4140,7 +3729,7 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:^1.5.3, @endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": +"@endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": version: 1.6.2 resolution: "@endo/marshal@npm:1.6.2" dependencies: @@ -4174,7 +3763,7 @@ __metadata: languageName: node linkType: hard -"@endo/nat@npm:^5.0.10, @endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13, @endo/nat@npm:^5.0.9": +"@endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13, @endo/nat@npm:^5.0.9": version: 5.0.13 resolution: "@endo/nat@npm:5.0.13" checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 @@ -4192,7 +3781,7 @@ __metadata: languageName: node linkType: hard -"@endo/netstring@npm:^1.0.10, @endo/netstring@npm:^1.0.12": +"@endo/netstring@npm:^1.0.12": version: 1.0.13 resolution: "@endo/netstring@npm:1.0.13" dependencies: @@ -4214,7 +3803,7 @@ __metadata: languageName: node linkType: hard -"@endo/pass-style@npm:^1.4.3, @endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": +"@endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": version: 1.4.7 resolution: "@endo/pass-style@npm:1.4.7" dependencies: @@ -4238,7 +3827,7 @@ __metadata: languageName: node linkType: hard -"@endo/patterns@npm:^1.4.3, @endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": +"@endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": version: 1.4.7 resolution: "@endo/patterns@npm:1.4.7" dependencies: @@ -4260,7 +3849,7 @@ __metadata: languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.5, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": +"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": version: 1.1.8 resolution: "@endo/promise-kit@npm:1.1.8" dependencies: @@ -4269,7 +3858,7 @@ __metadata: languageName: node linkType: hard -"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.5, @endo/ses-ava@npm:^1.2.7": +"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.7": version: 1.2.8 resolution: "@endo/ses-ava@npm:1.2.8" dependencies: @@ -4319,7 +3908,7 @@ __metadata: languageName: node linkType: hard -"@endo/stream-node@npm:^1.1.5, @endo/stream-node@npm:^1.1.7": +"@endo/stream-node@npm:^1.1.7": version: 1.1.8 resolution: "@endo/stream-node@npm:1.1.8" dependencies: @@ -4342,7 +3931,7 @@ __metadata: languageName: node linkType: hard -"@endo/stream@npm:^1.2.5, @endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": +"@endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": version: 1.2.8 resolution: "@endo/stream@npm:1.2.8" dependencies: @@ -4381,7 +3970,7 @@ __metadata: languageName: node linkType: hard -"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.8, @endo/zip@npm:^1.0.9": +"@endo/zip@npm:^1.0.8, @endo/zip@npm:^1.0.9": version: 1.0.9 resolution: "@endo/zip@npm:1.0.9" checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc @@ -11871,7 +11460,7 @@ __metadata: "@agoric/inter-protocol": "npm:^0.17.0-u17.1" "@agoric/internal": "npm:^0.4.0-u17.1" "@agoric/network": "npm:0.1.1-dev-d1562a1.0" - "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch" + "@agoric/orchestration": "npm:0.2.0-u18.1" "@agoric/smart-wallet": "npm:^0.5.4-u17.1" "@agoric/store": "npm:^0.9.3-u17.1" "@agoric/time": "npm:^0.3.3-u17.1" From 6fa7d5109f928e5cd989b4a87a8cd46c894bb72b Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 18:52:03 +0500 Subject: [PATCH 17/31] fixup! format --- contract/tools/ibc-mocks.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts index 757c4c2b..273f0fec 100644 --- a/contract/tools/ibc-mocks.ts +++ b/contract/tools/ibc-mocks.ts @@ -22,7 +22,10 @@ import type { import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; import type { ChainAddress } from '@agoric/orchestration/src/orchestration-api.js'; -import { makeQueryPacket, makeTxPacket } from '@agoric/orchestration/src/utils/packet.js'; +import { + makeQueryPacket, + makeTxPacket, +} from '@agoric/orchestration/src/utils/packet.js'; interface EncoderI { encode: (message: T) => { From 6dbc2d30c01250cc685e61e53e9d9606b0aca037 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Thu, 21 Nov 2024 18:05:17 +0500 Subject: [PATCH 18/31] chore: factor out EXEC_AGD and EXEC_OSMO --- contract/Makefile | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/contract/Makefile b/contract/Makefile index 8a268a15..309be3b8 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -4,6 +4,8 @@ CHAINID=agoriclocal USER1ADDR=$(shell agd keys show alice -a --keyring-backend="test") ACCT_ADDR=$(USER1ADDR) BLD=000000ubld +EXEC_AGD=kubectl exec -i agoriclocal-genesis-0 -c validator -- agd +EXEC_OSMO=kubectl exec -i osmosislocal-genesis-0 -c validator -- osmosisd ATOM_DENOM=ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA ATOM=000000$(ATOM_DENOM) @@ -33,7 +35,7 @@ DEPLOY=npx --no-install tsx scripts/deploy-cli.ts # 1 fund-provision-pool: - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(PROVISION_POOL_ADDR) 1000000000uist -y -b block; + $(EXEC_AGD) tx bank send faucet $(PROVISION_POOL_ADDR) 1000000000uist -y -b block; sleep 5; # 2 @@ -41,24 +43,24 @@ fund: fund-provision-pool check-balance make fund-wallet; make check-balance; make provision-smart-wallet; - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet ${CLIENTADDR} 10000000000000ubld -y; + $(EXEC_AGD) tx bank send faucet ${CLIENTADDR} 10000000000000ubld -y; sleep 5; - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet ${CLIENTADDR} 10000000000000uist -y; + $(EXEC_AGD) tx bank send faucet ${CLIENTADDR} 10000000000000uist -y; make fund-osmo fund-osmo: - kubectl exec -i osmosislocal-genesis-0 -c validator -- osmosisd tx bank send faucet ${CLIENT_OSMO_ADDR} 9870000000uosmo --fees 1000uosmo -y; + $(EXEC_OSMO) tx bank send faucet ${CLIENT_OSMO_ADDR} 9870000000uosmo --fees 1000uosmo -y; check-balance: - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd q bank balances $(ADDR) + $(EXEC_AGD) q bank balances $(ADDR) fund-wallet: - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(ADDR) 10000000000000uist -y -b block - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(ADDR) 10000000000000ubld -y -b block + $(EXEC_AGD) tx bank send faucet $(ADDR) 10000000000000uist -y -b block + $(EXEC_AGD) tx bank send faucet $(ADDR) 10000000000000ubld -y -b block provision-smart-wallet: - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd keys list - kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx swingset provision-one wallet $(ADDR) SMART_WALLET --from ${ADDR} -y -b block + $(EXEC_AGD) keys list + $(EXEC_AGD) tx swingset provision-one wallet $(ADDR) SMART_WALLET --from ${ADDR} -y -b block e2e: $(DEPLOY) scripts/init-orca.js From 3b12483a89139b6a10f66070c6fc498924929e4e Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Thu, 21 Nov 2024 18:22:30 +0500 Subject: [PATCH 19/31] chore: update package.json --- contract/package.json | 5 +++++ contract/src/platform-goals/README.md | 5 +++++ package.json | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 contract/src/platform-goals/README.md diff --git a/contract/package.json b/contract/package.json index dc76fc97..7d5a91d3 100644 --- a/contract/package.json +++ b/contract/package.json @@ -5,6 +5,11 @@ "description": "Agoric Orchestration Contract", "type": "module", "scripts": { + "start:docker": "echo 'Please follow the instructions in the README file at https://github.com/Agoric/agoric-sdk/tree/master/multichain-testing to start a multichain environment needed for this DApp to run.' && exit 1", + "docker:logs": "kubectl logs agoriclocal-genesis-0 -c validator -f", + "docker:bash": "kubectl exec -it agoriclocal-genesis-0 -c validator -- /bin/bash", + "format": "prettier --write .", + "start": "make e2e", "test": "ava", "build": "yarn build:deployer", "build:deployer": "rollup -c rollup.config.mjs", diff --git a/contract/src/platform-goals/README.md b/contract/src/platform-goals/README.md new file mode 100644 index 00000000..8ae7a08a --- /dev/null +++ b/contract/src/platform-goals/README.md @@ -0,0 +1,5 @@ +# Platform Goals + +Work on this dapp shows some ways that the platform could be improved. + +The code in this directory shows some possible platform refinements. diff --git a/package.json b/package.json index 3c23b744..09e44e14 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,9 @@ }, "scripts": { "start:ui": "cd ui && yarn dev", + "start:docker": "echo 'Please follow the instructions in the README file at https://github.com/Agoric/agoric-sdk/tree/master/multichain-testing to start a multichain environment needed for this DApp to run.' && exit 1", + "docker:logs": "kubectl logs agoriclocal-genesis-0 -c validator -f", + "docker:bash": "kubectl exec -it agoriclocal-genesis-0 -c validator -- /bin/bash", "format": "yarn prettier --write .github contract ui", "lint:format": "yarn prettier --check .github contract ui", "lint": "yarn lint:format && yarn workspaces foreach --all run lint", From 0520f10611521de74fcc6c450003c74a2c95a576 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Fri, 6 Dec 2024 07:51:50 +0500 Subject: [PATCH 20/31] chore: adding proposal and init files for auto-stake-it --- contract/src/auto-stake-it.proposal.js | 188 +++++++++++++++++++++ contract/src/builder/init-auto-stake-it.js | 128 ++++++++++++++ 2 files changed, 316 insertions(+) create mode 100644 contract/src/auto-stake-it.proposal.js create mode 100644 contract/src/builder/init-auto-stake-it.js diff --git a/contract/src/auto-stake-it.proposal.js b/contract/src/auto-stake-it.proposal.js new file mode 100644 index 00000000..d3ee3fd4 --- /dev/null +++ b/contract/src/auto-stake-it.proposal.js @@ -0,0 +1,188 @@ +// auto-stake-it.proposal.js +import { E } from '@endo/far'; +import { makeTracer } from './tools/debug.js'; + +/// +/// + +/** + * @import {ERef} from '@endo/far'; + * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; + * @import {ChainInfo, IBCConnectionInfo} from '@agoric/orchestration'; + * @import {AutoStakeItSF} from './auto-stake-it.contract.js'; + * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; + */ + +const trace = makeTracer('ASI'); +const { entries, fromEntries } = Object; + +trace('start proposal module evaluating'); + +const contractName = 'auto-stake-it'; + +/** @type {IBCConnectionInfo} */ +const c1 = harden({ + id: 'connection-0', + client_id: 'client-0', + state: 3, + counterparty: harden({ + client_id: 'client-0', + connection_id: 'connection-0', + prefix: { + key_prefix: 'key-prefix-0', + }, + }), + transferChannel: harden({ + portId: 'transfer', + channelId: 'channel-0', + counterPartyPortId: 'transfer', + counterPartyChannelId: 'channel-1', + ordering: 2, + version: '1', + state: 3, + }), +}); + +/** @type {Record} */ +export const chainDetails = harden({ + agoric: { + chainId: 'agoriclocal', + stakingTokens: [{ denom: 'ubld' }], + connections: { osmosislocal: c1 }, + }, + osmosis: { + chainId: 'osmosislocal', + stakingTokens: [{ denom: 'uosmo' }], + }, +}); + +/** + * @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } + */ +export const allValues = async obj => { + const es = await Promise.all( + entries(obj).map(([k, vp]) => E.when(vp, v => [k, v])), + ); + return fromEntries(es); +}; + +/** + * @param {BootstrapPowers & {installation: {consume: {autoStakeIt: Installation}}}} permittedPowers + * @param {{options: {[contractName]: { + * bundleID: string; + * chainDetails: Record, + * }}}} config + */ +export const startAutoStakeItContract = async (permittedPowers, config) => { + trace('startAutoStakeItContract()...', config); + + const { + consume: { + agoricNames, + board, + chainTimerService, + localchain, + chainStorage, + cosmosInterchainService, + startUpgradable, + }, + installation: { + consume: { autoStakeIt: autoStakeItInstallation }, + }, + instance: { + produce: { autoStakeIt: produceInstance }, + }, + } = permittedPowers; + + const installation = await autoStakeItInstallation; + + const storageNode = await E(chainStorage).makeChildNode('auto-stake-it'); + const marshaller = await E(board).getPublishingMarshaller(); + + const { chainDetails: nameToInfo = chainDetails } = + config.options[contractName]; + + /** @type {StartUpgradableOpts} **/ + const startOpts = { + label: 'auto-stake-it', + installation, + terms: { chainDetails: nameToInfo }, + privateArgs: { + localchain: await localchain, + orchestrationService: await cosmosInterchainService, + storageNode, + timerService: await chainTimerService, + agoricNames: await agoricNames, + marshaller, + }, + }; + + trace('startOpts', startOpts); + const { instance } = await E(startUpgradable)(startOpts); + + trace(contractName, '(re)started WITH RESET'); + produceInstance.reset(); + produceInstance.resolve(instance); +}; + +/** @type {BootstrapManifest} */ +const autoStakeItManifest = { + [startAutoStakeItContract.name]: { + consume: { + agoricNames: true, + board: true, + chainStorage: true, + startUpgradable: true, + zoe: true, + localchain: true, + chainTimerService: true, + cosmosInterchainService: true, + }, + installation: { + produce: { autoStakeIt: true }, + consume: { autoStakeIt: true }, + }, + instance: { + produce: { autoStakeIt: true }, + }, + }, +}; +harden(autoStakeItManifest); + +export const getManifestForAutoStakeIt = ( + { restoreRef }, + { installKeys, chainDetails }, +) => { + trace('getManifestForAutoStakeIt', installKeys); + return harden({ + manifest: autoStakeItManifest, + installations: { + [contractName]: restoreRef(installKeys[contractName]), + }, + options: { + [contractName]: { chainDetails }, + }, + }); +}; + +export const permit = harden({ + consume: { + agoricNames: true, + board: true, + chainStorage: true, + startUpgradable: true, + zoe: true, + localchain: true, + chainTimerService: true, + cosmosInterchainService: true, + }, + installation: { + consume: { autoStakeIt: true }, + produce: { autoStakeIt: true }, + }, + instance: { produce: { autoStakeIt: true } }, + brand: { consume: { BLD: true, IST: true }, produce: {} }, + issuer: { consume: { BLD: true, IST: true }, produce: {} }, +}); + +export const main = startAutoStakeItContract; \ No newline at end of file diff --git a/contract/src/builder/init-auto-stake-it.js b/contract/src/builder/init-auto-stake-it.js new file mode 100644 index 00000000..953d71ba --- /dev/null +++ b/contract/src/builder/init-auto-stake-it.js @@ -0,0 +1,128 @@ +/** + * @file build core eval script to deploy auto-stake-it contract + * + * Usage: + * agoric run init-auto-stake-it.js + * or + * agoric run init-auto-stake-it.js --net emerynet \ + * --peer osmosis:connection-128:channel-115:uosmo + */ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { + CosmosChainInfoShape, + IBCConnectionInfoShape, +} from '@agoric/orchestration/src/typeGuards.js'; +import { M, mustMatch } from '@endo/patterns'; +import { execFileSync } from 'node:child_process'; +import { parseArgs } from 'node:util'; +import { + getManifestForAutoStakeIt, + startAutoStakeItContract, +} from '../../src/auto-stake-it.proposal.js'; +import { makeAgd } from '../../tools/agd-lib.js'; + +const options = { + net: { type: 'string' }, + peer: { type: 'string', multiple: true }, +}; + +export const defaultProposalBuilder = async ( + { publishRef, install }, + { chainDetails }, +) => { + return harden({ + sourceSpec: '../../src/auto-stake-it.proposal.js', + getManifestCall: [ + getManifestForAutoStakeIt.name, + { + installKeys: { + autoStakeIt: publishRef(install('../../src/auto-stake-it.contract.js')), + }, + chainDetails, + }, + ], + }); +}; + +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + const { scriptArgs } = endowments; + const { values: flags } = parseArgs({ args: scriptArgs, options }); + + const getNetConfig = net => + fetch(`https://${net}.agoric.net/network-config`) + .then(res => res.text()) + .then(s => JSON.parse(s)); + + const parsePeers = strs => { + const peerParts = strs.map(s => s.split(':')); + const badPeers = peerParts.filter(d => d.length !== 4); + if (badPeers.length) { + throw Error( + `peers must be name:connection-X:channel-Y:denom, not ${badPeers.join(', ')}`, + ); + } + return peerParts; + }; + + const chainDetails = {}; + + if (flags.net) { + if (!flags.peer) throw Error('--peer required'); + const connections = {}; + const portId = 'transfer'; + + const { chainName: chainId, rpcAddrs } = await getNetConfig(flags.net); + const agd = makeAgd({ execFileSync }).withOpts({ rpcAddrs }); + + for (const [peerName, myConn, myChan, denom] of parsePeers(flags.peer)) { + console.debug(peerName, { denom }); + const connInfo = await agd + .query(['ibc', 'connection', 'end', myConn]) + .then(x => x.connection); + const { client_id } = connInfo; + const clientState = await agd + .query(['ibc', 'client', 'state', client_id]) + .then(x => x.client_state); + const { chain_id: peerId } = clientState; + + chainDetails[peerName] = { chainId: peerId, stakingTokens: [{ denom }] }; + + const chan = await agd + .query(['ibc', 'channel', 'end', portId, myChan]) + .then(r => r.channel); + + const info = harden({ + client_id, + counterparty: { + client_id: connInfo.counterparty.client_id, + connection_id: connInfo.counterparty.connection_id, + prefix: { key_prefix: 'arbitrary - not used?' }, + }, + id: myConn, + state: connInfo.state, + transferChannel: { + channelId: myChan, + counterPartyChannelId: chan.counterparty.channel_id, + counterPartyPortId: chan.counterparty.port_id, + ordering: chan.ordering, + portId, + state: chan.state, + version: chan.version, + }, + }); + mustMatch(info, IBCConnectionInfoShape); + connections[peerId] = info; + } + + chainDetails['agoric'] = { + chainId, + stakingTokens: [{ denom: 'ubld' }], + connections, + }; + } + mustMatch(harden(chainDetails), M.recordOf(M.string(), CosmosChainInfoShape)); + await writeCoreEval(startAutoStakeItContract.name, opts => + defaultProposalBuilder(opts, { chainDetails }), + ); +}; From 505f80f2b1dbe9ac4a585e6526ebc23b2a438869 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Mon, 18 Nov 2024 12:54:47 +0500 Subject: [PATCH 21/31] chore: convert contract/flows js to ts --- contract/package.json | 2 +- contract/rollup.config.mjs | 2 +- .../{orca.contract.js => orca.contract.ts} | 48 ++--- contract/src/{orca.flows.js => orca.flows.ts} | 41 ++-- contract/src/orca.proposal.js | 2 +- contract/test/bundle-source.test.js | 2 +- contract/test/orca-contract.test.js | 4 +- contract/tsconfig.json | 6 +- yarn.lock | 181 +++++++++++++++++- 9 files changed, 224 insertions(+), 64 deletions(-) rename contract/src/{orca.contract.js => orca.contract.ts} (77%) rename contract/src/{orca.flows.js => orca.flows.ts} (69%) diff --git a/contract/package.json b/contract/package.json index 7d5a91d3..bd189019 100644 --- a/contract/package.json +++ b/contract/package.json @@ -73,7 +73,7 @@ "@agoric/store": "^0.9.3-u17.1", "@agoric/vats": "^0.16.0-u17.1", "@agoric/zoe": "^0.26.3-u17.1", - "@endo/bundle-source": "^3.4.0", + "@endo/bundle-source": "^3.5.0", "@endo/errors": "^1.2.4", "@endo/far": "^1.1.4", "@endo/init": "^1.1.3", diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index 7c5f8836..bffb741a 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -38,7 +38,7 @@ import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js const config1 = ({ name, coreEntry = `./src/${name}.proposal.js`, - contractEntry = `./src/${name}.contract.js`, + contractEntry = `./src/${name}.contract.ts`, coreScript = `bundles/deploy-${name}.js`, coreScriptOptions = undefined, permitFile = `deploy-${name}-permit.json`, diff --git a/contract/src/orca.contract.js b/contract/src/orca.contract.ts similarity index 77% rename from contract/src/orca.contract.js rename to contract/src/orca.contract.ts index 22b93311..f9a194e4 100644 --- a/contract/src/orca.contract.js +++ b/contract/src/orca.contract.ts @@ -1,20 +1,20 @@ +/// +/// + import { AmountShape } from '@agoric/ertp'; import { makeTracer } from '@agoric/internal'; import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { ChainInfoShape } from '@agoric/orchestration/src/typeGuards.js'; import { InvitationShape } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; -import * as flows from './orca.flows.js'; +import * as flows from './orca.flows.ts'; + +import type { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; +import type { CosmosChainInfo } from '@agoric/orchestration'; +import type { OrchestrationPowers, OrchestrationTools } from '@agoric/orchestration/src/utils/start-helper.js'; +import type { Zone } from '@agoric/zone'; -/** - * @import {Marshaller} from '@agoric/internal/src/lib-chainStorage.js'; - * @import {CosmosChainInfo} from '@agoric/orchestration'; - * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; - * @import {Zone} from '@agoric/zone'; - */ -/// -/// const { entries, keys } = Object; const trace = makeTracer('OrchDev1'); @@ -34,8 +34,8 @@ const OrchestrationPowersShape = M.splitRecord({ agoricNames: M.remotable('agoricNames'), }); -/** @type {ContractMeta} */ -export const meta = { + +export const meta: ContractMeta = { privateArgsShape: M.and( OrchestrationPowersShape, M.splitRecord({ @@ -48,23 +48,15 @@ export const meta = { }; harden(meta); -/** - * @typedef {{ - * chainDetails: Record - * }} OrcaTerms - * - * @param {ZCF} zcf - * @param {OrchestrationPowers & { - * marshaller: Marshaller; - * }} privateArgs - * @param {Zone} zone - * @param {OrchestrationTools} tools - */ +type OrcaTerms = { + chainDetails: Record +} + const contract = async ( - zcf, - privateArgs, - zone, - { orchestrateAll, zoeTools, chainHub }, + zcf: ZCF, + privateArgs: OrchestrationPowers & {marshaller: Marshaller}, + zone: Zone, + { orchestrateAll, zoeTools, chainHub }: OrchestrationTools, ) => { trace('orca start contract'); @@ -113,4 +105,4 @@ const contract = async ( export const start = withOrchestration(contract); harden(start); -/** @typedef {typeof start} OrcaSF */ +export type OrcaSF = typeof start; \ No newline at end of file diff --git a/contract/src/orca.flows.js b/contract/src/orca.flows.ts similarity index 69% rename from contract/src/orca.flows.js rename to contract/src/orca.flows.ts index 8349a29d..f27fbe8f 100644 --- a/contract/src/orca.flows.js +++ b/contract/src/orca.flows.ts @@ -1,13 +1,6 @@ -/** - * @import {GuestOf} from '@agoric/async-flow'; - * @import {Amount} from '@agoric/ertp/src/types.js'; - * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js'; - * @import {ChainAddress, Orchestrator} from '@agoric/orchestration'; - * @import {ZoeTools} from '@agoric/orchestration/src/utils/zoe-tools.js'; - * @import {Transfer} from './orca.contract.js'; - * @import {DenomArg} from '@agoric/orchestration'; - - */ +import type { Orchestrator } from '@agoric/orchestration'; +import type { ZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; +import type { DenomArg } from '@agoric/orchestration'; import { M, mustMatch } from '@endo/patterns'; import { makeTracer } from './debug.js'; @@ -17,13 +10,13 @@ const trace = makeTracer('OrchFlows'); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. - * - * @param {Orchestrator} orch - * @param {unknown} _ctx - * @param {ZCFSeat} seat - * @param {{ chainName: string, denom: string }} offerArgs */ -export const makeAccount = async (orch, _ctx, seat, offerArgs) => { +export const makeAccount = async ( + orch: Orchestrator, + _ctx: unknown, + seat: ZCFSeat, + offerArgs: { chainName: string; denom: string }, +) => { trace('makeAccount'); mustMatch(offerArgs, M.splitRecord({ chainName: M.string() })); const { chainName } = offerArgs; @@ -39,18 +32,12 @@ harden(makeAccount); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. - * - * @param {Orchestrator} orch - * @param {object} ctx - * @param {ZoeTools['localTransfer']} ctx.localTransfer - * @param {ZCFSeat} seat - * @param {{ chainName: string, denom: DenomArg }} offerArgs */ export const makeCreateAndFund = async ( - orch, - { localTransfer }, - seat, - { chainName, denom }, + orch: Orchestrator, + { localTransfer }: { localTransfer: ZoeTools['localTransfer'] }, + seat: ZCFSeat, + { chainName, denom }: { chainName: string; denom: DenomArg }, ) => { trace( `invoked makeCreateAndFund with chain ${chainName}, and denom ${denom}`, @@ -100,4 +87,4 @@ export const makeCreateAndFund = async ( return remoteAccount.asContinuingOffer(); }; -harden(makeCreateAndFund); +harden(makeCreateAndFund); \ No newline at end of file diff --git a/contract/src/orca.proposal.js b/contract/src/orca.proposal.js index c5db7943..68344a87 100644 --- a/contract/src/orca.proposal.js +++ b/contract/src/orca.proposal.js @@ -8,7 +8,7 @@ import { makeTracer } from './debug.js'; * @import {ERef} from '@endo/far'; * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; * @import {ChainInfo, IBCConnectionInfo,} from '@agoric/orchestration'; - * @import {OrcaSF} from './orca.contract.js'; + * @import {OrcaSF} from './orca.contract.ts'; * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; */ diff --git a/contract/test/bundle-source.test.js b/contract/test/bundle-source.test.js index 4e958445..0beed6ce 100644 --- a/contract/test/bundle-source.test.js +++ b/contract/test/bundle-source.test.js @@ -11,7 +11,7 @@ import { E, passStyleOf } from '@endo/far'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; const myRequire = createRequire(import.meta.url); -const contractPath = myRequire.resolve(`../src/orca.contract.js`); +const contractPath = myRequire.resolve(`../src/orca.contract.ts`); test('bundleSource() bundles the contract for use with zoe', async t => { const bundle = await bundleSource(contractPath); diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index 7a670a59..271c1885 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -19,12 +19,12 @@ import { installContract } from '../src/platform-goals/start-contract.js'; * @import {IcaAccount, MakeCosmosInterchainService} from '@agoric/orchestration'; * @import {LocalChain,LocalChainAccount} from '@agoric/vats/src/localchain.js'; * @import {TargetRegistration} from '@agoric/vats/src/bridge-target.js'; - * @import {OrcaSF} from '../src/orca.contract.js'; + * @import {OrcaSF} from '../src/orca.contract.ts'; */ const nodeRequire = createRequire(import.meta.url); -const contractPath = nodeRequire.resolve(`../src/orca.contract.js`); +const contractPath = nodeRequire.resolve(`../src/orca.contract.ts`); const scriptRoot = { orca: nodeRequire.resolve('../src/orca.proposal.js'), }; diff --git a/contract/tsconfig.json b/contract/tsconfig.json index 4646fe56..08a01a83 100644 --- a/contract/tsconfig.json +++ b/contract/tsconfig.json @@ -12,8 +12,10 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "outDir": "./dist" + "outDir": "./dist", + "allowImportingTsExtensions": true, + "noEmit": true }, "include": ["tools", "test"], "exclude": ["node_modules"] -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0094f4c6..cfc49b6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2953,6 +2953,13 @@ __metadata: languageName: node linkType: hard +"@endo/base64@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/base64@npm:1.0.9" + checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 + languageName: node + linkType: hard + "@endo/bundle-source@npm:2.5.2-upstream-rollup": version: 2.5.2-upstream-rollup resolution: "@endo/bundle-source@npm:2.5.2-upstream-rollup" @@ -3021,6 +3028,28 @@ __metadata: languageName: node linkType: hard +"@endo/bundle-source@npm:^3.5.0": + version: 3.5.0 + resolution: "@endo/bundle-source@npm:3.5.0" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/evasive-transform": "npm:^1.3.3" + "@endo/init": "npm:^1.1.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/where": "npm:^1.0.9" + "@rollup/plugin-commonjs": "npm:^19.0.0" + "@rollup/plugin-json": "npm:^6.1.0" + "@rollup/plugin-node-resolve": "npm:^13.0.0" + acorn: "npm:^8.2.4" + rollup: "npm:^2.79.1" + ts-blank-space: "npm:^0.4.1" + bin: + bundle-source: ./src/tool.js + checksum: 10c0/7f97194c97eb28abbde6655f7de4410d5aae5d6a2a3d712e1418b9b4fd20823333b7fe8956401c2f201280340731e51e28d9c4fbe3b5a787b0abd00e3ac13b52 + languageName: node + linkType: hard + "@endo/captp@npm:3.1.1, @endo/captp@npm:^3.1.1": version: 3.1.1 resolution: "@endo/captp@npm:3.1.1" @@ -3081,6 +3110,13 @@ __metadata: languageName: node linkType: hard +"@endo/cjs-module-analyzer@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/cjs-module-analyzer@npm:1.0.9" + checksum: 10c0/cb8c56d108b175f2f211c8292bac6cda35c44b9c16fb2763ab9a32b545895e1721633938b440bfe7a06f69e1f168e9b248ef103631a1d4c63fda8cbe580ca185 + languageName: node + linkType: hard + "@endo/common@npm:^1.2.5": version: 1.2.5 resolution: "@endo/common@npm:1.2.5" @@ -3128,6 +3164,19 @@ __metadata: languageName: node linkType: hard +"@endo/compartment-mapper@npm:^1.4.0": + version: 1.4.0 + resolution: "@endo/compartment-mapper@npm:1.4.0" + dependencies: + "@endo/cjs-module-analyzer": "npm:^1.0.9" + "@endo/module-source": "npm:^1.1.2" + "@endo/trampoline": "npm:^1.0.3" + "@endo/zip": "npm:^1.0.9" + ses: "npm:^1.10.0" + checksum: 10c0/2c4999962016f57c0f3a40ce1445a064b826eb101a972d26ba56d9dba6d3d8f66744912e3f7e24754018bd2c633663a00ea5ab0d7658c4907c9372ddd3e56464 + languageName: node + linkType: hard + "@endo/env-options@npm:^0.1.4": version: 0.1.4 resolution: "@endo/env-options@npm:0.1.4" @@ -3142,6 +3191,13 @@ __metadata: languageName: node linkType: hard +"@endo/env-options@npm:^1.1.8": + version: 1.1.8 + resolution: "@endo/env-options@npm:1.1.8" + checksum: 10c0/2f519f48a5b966dbd9e66134d4abc89ff02b9791d21146b49031ceb694584f3f41c6119125b6bb4eb0d347f5bcd846473b5f3c4ae6bae3dac19402fcaf522520 + languageName: node + linkType: hard + "@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5": version: 1.2.5 resolution: "@endo/errors@npm:1.2.5" @@ -3176,6 +3232,18 @@ __metadata: languageName: node linkType: hard +"@endo/evasive-transform@npm:^1.3.3": + version: 1.3.3 + resolution: "@endo/evasive-transform@npm:1.3.3" + dependencies: + "@agoric/babel-generator": "npm:^7.17.6" + "@babel/parser": "npm:^7.23.6" + "@babel/traverse": "npm:^7.23.6" + source-map-js: "npm:^1.2.0" + checksum: 10c0/34fae4789ab3142ab73a5c94a46954908737bbc72f1e302c338941ca2556ab2127505ecee57a1c0d11e0b9c7070b4a579ce4e7e60585990161cec64ce0955211 + languageName: node + linkType: hard + "@endo/eventual-send@npm:0.17.2": version: 0.17.2 resolution: "@endo/eventual-send@npm:0.17.2" @@ -3201,6 +3269,15 @@ __metadata: languageName: node linkType: hard +"@endo/eventual-send@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/eventual-send@npm:1.2.8" + dependencies: + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/d7c16c935441b67d029fcb6785f425a1194fb7f936e4b20dde21eb393266cb7366edf7a95d3fdfa96cd4a3246a3659a06d0dbb3c1217045e1718e1cf34c7a3bd + languageName: node + linkType: hard + "@endo/exo@npm:^0.2.2": version: 0.2.2 resolution: "@endo/exo@npm:0.2.2" @@ -3306,6 +3383,18 @@ __metadata: languageName: node linkType: hard +"@endo/init@npm:^1.1.7": + version: 1.1.7 + resolution: "@endo/init@npm:1.1.7" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/lockdown": "npm:^1.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/6cfcc244f02da9883f65a8f34da9483a628d5350192983c53d5116b12403dc5693145c6349b6c3ca381b6b8d9590cee16f90440dc0e2da5f525e13079d6c9a2f + languageName: node + linkType: hard + "@endo/lockdown@npm:^0.1.28": version: 0.1.28 resolution: "@endo/lockdown@npm:0.1.28" @@ -3333,6 +3422,15 @@ __metadata: languageName: node linkType: hard +"@endo/lockdown@npm:^1.0.13": + version: 1.0.13 + resolution: "@endo/lockdown@npm:1.0.13" + dependencies: + ses: "npm:^1.10.0" + checksum: 10c0/9df04cc477595b368088a1d445f2241d8a152cb4dcf6a79d39d4804594dd8ff472380ab2bdf262adeb5b4b7cfc73effb6cc716c5a3aeca282801d57fe8a018a0 + languageName: node + linkType: hard + "@endo/marshal@npm:0.8.5": version: 0.8.5 resolution: "@endo/marshal@npm:0.8.5" @@ -3384,6 +3482,19 @@ __metadata: languageName: node linkType: hard +"@endo/module-source@npm:^1.1.2": + version: 1.1.2 + resolution: "@endo/module-source@npm:1.1.2" + dependencies: + "@agoric/babel-generator": "npm:^7.17.6" + "@babel/parser": "npm:^7.23.6" + "@babel/traverse": "npm:^7.23.6" + "@babel/types": "npm:^7.24.0" + ses: "npm:^1.10.0" + checksum: 10c0/3d64ff5430f288531a00e124ae0620e137dab0fdaba00f2d41066b8307eb2da30e3987d84fe450d55d844e0f96feafa36a825cecc615c05d96224a209832c95c + languageName: node + linkType: hard + "@endo/nat@npm:4.1.27, @endo/nat@npm:^4.1.27": version: 4.1.27 resolution: "@endo/nat@npm:4.1.27" @@ -3512,6 +3623,15 @@ __metadata: languageName: node linkType: hard +"@endo/promise-kit@npm:^1.1.8": + version: 1.1.8 + resolution: "@endo/promise-kit@npm:1.1.8" + dependencies: + ses: "npm:^1.10.0" + checksum: 10c0/3a51755822bd4112474bec584005b81f9ffe6a6b590faa16cff7a4994010d001d6d190f58a1e890d85b0feb0eb052d79ed2c5ed88977afb0e47ca53b6b199196 + languageName: node + linkType: hard + "@endo/ses-ava@npm:0.2.40": version: 0.2.40 resolution: "@endo/ses-ava@npm:0.2.40" @@ -3616,6 +3736,13 @@ __metadata: languageName: node linkType: hard +"@endo/trampoline@npm:^1.0.3": + version: 1.0.3 + resolution: "@endo/trampoline@npm:1.0.3" + checksum: 10c0/be0c3784b17f422ae04e28a6722e2abd193a5585a82acf5eb388476094c026aa5e76a383db887bdf6a032ccf0a12c38a967f5f1e71cef44a4659606be789b548 + languageName: node + linkType: hard + "@endo/where@npm:^0.3.5": version: 0.3.5 resolution: "@endo/where@npm:0.3.5" @@ -3630,6 +3757,13 @@ __metadata: languageName: node linkType: hard +"@endo/where@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 + languageName: node + linkType: hard + "@endo/zip@npm:0.2.31, @endo/zip@npm:^0.2.31": version: 0.2.31 resolution: "@endo/zip@npm:0.2.31" @@ -3651,6 +3785,13 @@ __metadata: languageName: node linkType: hard +"@endo/zip@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc + languageName: node + linkType: hard + "@es-joy/jsdoccomment@npm:~0.41.0": version: 0.41.0 resolution: "@es-joy/jsdoccomment@npm:0.41.0" @@ -10936,7 +11077,7 @@ __metadata: "@agoric/zoe": "npm:^0.26.3-u17.1" "@agoric/zone": "npm:^0.3.0-u17.1" "@cosmjs/proto-signing": "npm:^0.32.3" - "@endo/bundle-source": "npm:^3.4.0" + "@endo/bundle-source": "npm:^3.5.0" "@endo/errors": "npm:^1.2.4" "@endo/eslint-plugin": "npm:^2.2.0" "@endo/far": "npm:^1.1.4" @@ -17617,6 +17758,15 @@ __metadata: languageName: node linkType: hard +"ses@npm:^1.10.0": + version: 1.10.0 + resolution: "ses@npm:1.10.0" + dependencies: + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/83b92bc49e27af04eeb7ee01a2196a0c4b0906e4de51e70403aa9ffc82be1d27a0c3506f2d54da8d6d260be0855f2123a13a7e2c6896e81ec85899df1a428609 + languageName: node + linkType: hard + "ses@npm:^1.8.0": version: 1.8.0 resolution: "ses@npm:1.8.0" @@ -18485,6 +18635,15 @@ __metadata: languageName: node linkType: hard +"ts-blank-space@npm:^0.4.1": + version: 0.4.3 + resolution: "ts-blank-space@npm:0.4.3" + dependencies: + typescript: "npm:5.1.6 - 5.6.x" + checksum: 10c0/362feac2e19cf8f1936cefdc658463558e0ef88568fdb7267910c50eb20b27ab2e21b4cf8100890f9ff1568a4e185daa68947c00dd4bfe176d61f554010266e1 + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -18768,6 +18927,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.1.6 - 5.6.x": + version: 5.6.3 + resolution: "typescript@npm:5.6.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 + languageName: node + linkType: hard + "typescript@npm:^5.2.2, typescript@npm:^5.3.3, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": version: 5.6.2 resolution: "typescript@npm:5.6.2" @@ -18778,6 +18947,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin": + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/ac8307bb06bbfd08ae7137da740769b7d8c3ee5943188743bb622c621f8ad61d244767480f90fbd840277fbf152d8932aa20c33f867dea1bb5e79b187ca1a92f + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": version: 5.6.2 resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=74658d" From 831f234bfae3773e455eac29a249c95784480350 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Tue, 19 Nov 2024 11:17:09 +0500 Subject: [PATCH 22/31] chore: add deps for auto-stake-it --- contract/package.json | 22 +- contract/src/auto-stake-it-tap-kit.js | 154 ++ contract/src/auto-stake-it.contract.js | 76 + contract/src/auto-stake-it.flows.js | 102 + contract/src/chain-info.js | 108 + contract/src/exos/README.md | 130 ++ contract/src/exos/chain-hub-admin.js | 84 + contract/src/exos/chain-hub.js | 488 ++++ .../src/exos/combine-invitation-makers.js | 59 + .../src/exos/cosmos-interchain-service.js | 280 +++ .../src/exos/cosmos-orchestration-account.js | 1147 ++++++++++ contract/src/exos/exo-interfaces.ts | 35 + contract/src/exos/ibc-packet.js | 219 ++ contract/src/exos/ica-account-kit.js | 231 ++ contract/src/exos/icq-connection-kit.js | 132 ++ contract/src/exos/local-chain-facade.js | 196 ++ .../src/exos/local-orchestration-account.js | 747 +++++++ contract/src/exos/orchestrator.js | 196 ++ contract/src/exos/packet-tools.js | 372 +++ contract/src/exos/portfolio-holder-kit.js | 230 ++ contract/src/exos/remote-chain-facade.js | 269 +++ contract/src/facade.js | 150 ++ contract/src/fetched-chain-info.js | 1990 +++++++++++++++++ contract/src/typeGuards.js | 197 ++ contract/src/utils/address.js | 103 + contract/src/utils/amounts.js | 59 + contract/src/utils/cosmos.js | 82 + contract/src/utils/denomHash.js | 22 + contract/src/utils/orc.js | 38 + contract/src/utils/orchestrationAccount.js | 40 + contract/src/utils/packet.js | 112 + contract/src/utils/registry.js | 130 ++ contract/src/utils/start-helper.js | 214 ++ contract/src/utils/time.js | 48 + contract/src/utils/zcf-tools.js | 35 + contract/src/utils/zoe-tools.js | 186 ++ contract/test/auto-stake-it.contract.test.ts | 154 ++ contract/test/ibc-mocks.ts | 128 ++ contract/test/supports.ts | 236 ++ contract/tools/ibc-mocks.ts | 262 +++ contract/tools/protobuf-decoder.js | 153 ++ yarn.lock | 37 +- 42 files changed, 9636 insertions(+), 17 deletions(-) create mode 100644 contract/src/auto-stake-it-tap-kit.js create mode 100644 contract/src/auto-stake-it.contract.js create mode 100644 contract/src/auto-stake-it.flows.js create mode 100644 contract/src/chain-info.js create mode 100644 contract/src/exos/README.md create mode 100644 contract/src/exos/chain-hub-admin.js create mode 100644 contract/src/exos/chain-hub.js create mode 100644 contract/src/exos/combine-invitation-makers.js create mode 100644 contract/src/exos/cosmos-interchain-service.js create mode 100644 contract/src/exos/cosmos-orchestration-account.js create mode 100644 contract/src/exos/exo-interfaces.ts create mode 100644 contract/src/exos/ibc-packet.js create mode 100644 contract/src/exos/ica-account-kit.js create mode 100644 contract/src/exos/icq-connection-kit.js create mode 100644 contract/src/exos/local-chain-facade.js create mode 100644 contract/src/exos/local-orchestration-account.js create mode 100644 contract/src/exos/orchestrator.js create mode 100644 contract/src/exos/packet-tools.js create mode 100644 contract/src/exos/portfolio-holder-kit.js create mode 100644 contract/src/exos/remote-chain-facade.js create mode 100644 contract/src/facade.js create mode 100644 contract/src/fetched-chain-info.js create mode 100644 contract/src/typeGuards.js create mode 100644 contract/src/utils/address.js create mode 100644 contract/src/utils/amounts.js create mode 100644 contract/src/utils/cosmos.js create mode 100644 contract/src/utils/denomHash.js create mode 100644 contract/src/utils/orc.js create mode 100644 contract/src/utils/orchestrationAccount.js create mode 100644 contract/src/utils/packet.js create mode 100644 contract/src/utils/registry.js create mode 100644 contract/src/utils/start-helper.js create mode 100644 contract/src/utils/time.js create mode 100644 contract/src/utils/zcf-tools.js create mode 100644 contract/src/utils/zoe-tools.js create mode 100644 contract/test/auto-stake-it.contract.test.ts create mode 100644 contract/test/ibc-mocks.ts create mode 100644 contract/test/supports.ts create mode 100644 contract/tools/ibc-mocks.ts create mode 100644 contract/tools/protobuf-decoder.js diff --git a/contract/package.json b/contract/package.json index bd189019..741145b6 100644 --- a/contract/package.json +++ b/contract/package.json @@ -27,6 +27,7 @@ "@agoric/vat-data": "^0.5.3-u17.1", "@agoric/vow": "^0.2.0-u17.1", "@agoric/zone": "^0.3.0-u17.1", + "@ava/typescript": "^5.0.0", "@cosmjs/proto-signing": "^0.32.3", "@endo/eslint-plugin": "^2.2.0", "@endo/nat": "^5.0.9", @@ -39,7 +40,7 @@ "@rollup/plugin-replace": "^5.0.5", "@rollup/plugin-typescript": "^11.1.6", "@types/fs-extra": "^11", - "@types/node": "^20.11.13", + "@types/node": "^22.9.0", "@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/parser": "^7.15.0", "agoric": "^0.22.0-u17.1", @@ -60,9 +61,10 @@ "prettier-plugin-jsdoc": "^1.0.0", "rollup": "^4.18.0", "starshipjs": "^2.4.0", + "ts-node": "^10.9.2", "tsimp": "^2.0.10", "type-coverage": "^2.26.3", - "typescript": "^5.3.3", + "typescript": "^5.6.3", "typescript-eslint": "^7.18.0" }, "dependencies": { @@ -86,15 +88,17 @@ "ts": "module" }, "files": [ - "test/**/test-*.*", - "test/**/*.test.*", - "!test/orca-multichain.test.js" + "test/**/*.test.*" + ], + "nodeArguments": [ + "--loader=ts-blank-space/register", + "--no-warnings" + ], + "require": [ + "@endo/init/debug.js" ], "timeout": "20m", - "workerThreads": false, - "match": [ - "!test/*multichain*" - ] + "workerThreads": false }, "keywords": [], "repository": { diff --git a/contract/src/auto-stake-it-tap-kit.js b/contract/src/auto-stake-it-tap-kit.js new file mode 100644 index 00000000..8e73fc74 --- /dev/null +++ b/contract/src/auto-stake-it-tap-kit.js @@ -0,0 +1,154 @@ +import { M, mustMatch } from '@endo/patterns'; +import { E } from '@endo/far'; +import { VowShape } from '@agoric/vow'; +import { makeTracer } from '@agoric/internal'; +import { atob } from '@endo/base64'; +import { ChainAddressShape } from '../typeGuards.js'; + +const trace = makeTracer('AutoStakeItTap'); + +/** + * @import {IBCChannelID, VTransferIBCEvent} from '@agoric/vats'; + * @import {VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {TargetApp} from '@agoric/vats/src/bridge-target.js'; + * @import {ChainAddress, CosmosValidatorAddress, Denom, OrchestrationAccount, StakingAccountActions} from '@agoric/orchestration'; + * @import {FungibleTokenPacketData} from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; + * @import {TypedPattern} from '@agoric/internal'; + */ + +/** + * @typedef {{ + * stakingAccount: ERef & StakingAccountActions>; + * localAccount: ERef>; + * validator: CosmosValidatorAddress; + * localChainAddress: ChainAddress; + * remoteChainAddress: ChainAddress; + * sourceChannel: IBCChannelID; + * remoteDenom: Denom; + * localDenom: Denom; + * }} StakingTapState + */ + +/** @type {TypedPattern} */ +const StakingTapStateShape = { + stakingAccount: M.remotable('CosmosOrchestrationAccount'), + localAccount: M.remotable('LocalOrchestrationAccount'), + validator: ChainAddressShape, + localChainAddress: ChainAddressShape, + remoteChainAddress: ChainAddressShape, + sourceChannel: M.string(), + remoteDenom: M.string(), + localDenom: M.string(), +}; +harden(StakingTapStateShape); + +/** + * @param {Zone} zone + * @param {VowTools} vowTools + */ +const prepareStakingTapKit = (zone, { watch }) => { + return zone.exoClassKit( + 'StakingTapKit', + { + tap: M.interface('AutoStakeItTap', { + receiveUpcall: M.call(M.record()).returns( + M.or(VowShape, M.undefined()), + ), + }), + transferWatcher: M.interface('TransferWatcher', { + onFulfilled: M.call(M.undefined()) + .optional(M.bigint()) + .returns(VowShape), + }), + }, + /** @param {StakingTapState} initialState */ + initialState => { + mustMatch(initialState, StakingTapStateShape); + return harden(initialState); + }, + { + tap: { + /** + * Transfers from localAccount to stakingAccount, then delegates from + * the stakingAccount to `validator` if the expected token (remoteDenom) + * is received. + * + * @param {VTransferIBCEvent} event + */ + receiveUpcall(event) { + trace('receiveUpcall', event); + + // ignore packets from unknown channels + if (event.packet.source_channel !== this.state.sourceChannel) { + return; + } + + const tx = /** @type {FungibleTokenPacketData} */ ( + JSON.parse(atob(event.packet.data)) + ); + trace('receiveUpcall packet data', tx); + + const { remoteDenom, localChainAddress } = this.state; + // ignore outgoing transfers + if (tx.receiver !== localChainAddress.value) { + return; + } + // only interested in transfers of `remoteDenom` + if (tx.denom !== remoteDenom) { + return; + } + + const { localAccount, localDenom, remoteChainAddress } = this.state; + return watch( + E(localAccount).transfer(remoteChainAddress, { + denom: localDenom, + value: BigInt(tx.amount), + }), + this.facets.transferWatcher, + BigInt(tx.amount), + ); + }, + }, + transferWatcher: { + /** + * @param {void} _result + * @param {bigint} value the qty of uatom to delegate + */ + onFulfilled(_result, value) { + const { stakingAccount, validator, remoteDenom } = this.state; + return watch( + E(stakingAccount).delegate(validator, { + denom: remoteDenom, + value, + }), + ); + }, + }, + }, + ); +}; + +/** + * Provides a {@link TargetApp} that reacts to an incoming IBC transfer by: + * + * 1. transferring the funds to the staking account specified at initialization + * 2. delegating the funds to the validator specified at initialization + * + * XXX consider a facet with a method for changing the validator + * + * XXX consider logic for multiple stakingAccounts + denoms + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @returns {( + * ...args: Parameters> + * ) => ReturnType>['tap']} + */ +export const prepareStakingTap = (zone, vowTools) => { + const makeKit = prepareStakingTapKit(zone, vowTools); + return (...args) => makeKit(...args).tap; +}; + +/** @typedef {ReturnType} MakeStakingTap */ +/** @typedef {ReturnType} StakingTap */ diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js new file mode 100644 index 00000000..25651fae --- /dev/null +++ b/contract/src/auto-stake-it.contract.js @@ -0,0 +1,76 @@ +import { + EmptyProposalShape, + InvitationShape, +} from '@agoric/zoe/src/typeGuards.js'; +import { M } from '@endo/patterns'; +import { prepareChainHubAdmin } from './exos/chain-hub-admin.js'; +import { preparePortfolioHolder } from './exos/portfolio-holder-kit.js'; +import { withOrchestration } from './utils/start-helper.js'; +import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; +import * as flows from './auto-stake-it.flows.js'; + +/** + * @import {Zone} from '@agoric/zone'; + * @import {OrchestrationPowers, OrchestrationTools} from './utils/start-helper.js'; + */ + +/** + * AutoStakeIt allows users to to create an auto-forwarding address that + * transfers and stakes tokens on a remote chain when received. + * + * To be wrapped with `withOrchestration`. + * + * @param {ZCF} zcf + * @param {OrchestrationPowers & { + * marshaller: Marshaller; + * }} _privateArgs + * @param {Zone} zone + * @param {OrchestrationTools} tools + */ +const contract = async ( + zcf, + _privateArgs, + zone, + { chainHub, orchestrateAll, vowTools }, +) => { + const makeStakingTap = prepareStakingTap( + zone.subZone('stakingTap'), + vowTools, + ); + const makePortfolioHolder = preparePortfolioHolder( + zone.subZone('portfolio'), + vowTools, + ); + + const { makeAccounts } = orchestrateAll(flows, { + makeStakingTap, + makePortfolioHolder, + chainHub, + }); + + const publicFacet = zone.exo( + 'AutoStakeIt Public Facet', + M.interface('AutoStakeIt Public Facet', { + makeAccountsInvitation: M.callWhen().returns(InvitationShape), + }), + { + makeAccountsInvitation() { + return zcf.makeInvitation( + makeAccounts, + 'Make Accounts', + undefined, + EmptyProposalShape, + ); + }, + }, + ); + + const creatorFacet = prepareChainHubAdmin(zone, chainHub); + + return { publicFacet, creatorFacet }; +}; + +export const start = withOrchestration(contract); +harden(start); + +/** @typedef {typeof start} AutoStakeItSF */ diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/auto-stake-it.flows.js new file mode 100644 index 00000000..74d1fc83 --- /dev/null +++ b/contract/src/auto-stake-it.flows.js @@ -0,0 +1,102 @@ +import { Fail } from '@endo/errors'; +import { denomHash } from '../utils/denomHash.js'; + +/** + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {GuestInterface} from '@agoric/async-flow'; + * @import {CosmosValidatorAddress, Orchestrator, CosmosInterchainService, Denom, OrchestrationAccount, StakingAccountActions, OrchestrationFlow} from '@agoric/orchestration'; + * @import {MakeStakingTap} from './auto-stake-it-tap-kit.js'; + * @import {MakePortfolioHolder} from '../exos/portfolio-holder-kit.js'; + * @import {ChainHub} from '../exos/chain-hub.js'; + */ + +/** + * @satisfies {OrchestrationFlow} + * @param {Orchestrator} orch + * @param {{ + * makeStakingTap: MakeStakingTap; + * makePortfolioHolder: MakePortfolioHolder; + * chainHub: GuestInterface; + * }} ctx + * @param {ZCFSeat} seat + * @param {{ + * chainName: string; + * validator: CosmosValidatorAddress; + * }} offerArgs + */ +export const makeAccounts = async ( + orch, + { makeStakingTap, makePortfolioHolder, chainHub }, + seat, + { chainName, validator }, +) => { + seat.exit(); // no funds exchanged + const [agoric, remoteChain] = await Promise.all([ + orch.getChain('agoric'), + orch.getChain(chainName), + ]); + const { chainId, stakingTokens } = await remoteChain.getChainInfo(); + const remoteDenom = stakingTokens[0].denom; + remoteDenom || + Fail`${chainId || chainName} does not have stakingTokens in config`; + if (chainId !== validator.chainId) { + Fail`validator chainId ${validator.chainId} does not match remote chainId ${chainId}`; + } + const [localAccount, stakingAccount] = await Promise.all([ + agoric.makeAccount(), + /** @type {Promise & StakingAccountActions>} */ ( + remoteChain.makeAccount() + ), + ]); + + const [localChainAddress, remoteChainAddress] = await Promise.all([ + localAccount.getAddress(), + stakingAccount.getAddress(), + ]); + const agoricChainId = (await agoric.getChainInfo()).chainId; + const { transferChannel } = await chainHub.getConnectionInfo( + agoricChainId, + chainId, + ); + assert(transferChannel.counterPartyChannelId, 'unable to find sourceChannel'); + + const localDenom = `ibc/${denomHash({ denom: remoteDenom, channelId: transferChannel.channelId })}`; + + // Every time the `localAccount` receives `remoteDenom` over IBC, delegate it. + const tap = makeStakingTap({ + localAccount, + stakingAccount, + validator, + localChainAddress, + remoteChainAddress, + sourceChannel: transferChannel.counterPartyChannelId, + remoteDenom, + localDenom, + }); + // XXX consider storing appRegistration, so we can .revoke() or .updateTargetApp() + // @ts-expect-error tap.receiveUpcall: 'Vow | undefined' not assignable to 'Promise' + await localAccount.monitorTransfers(tap); + + const accountEntries = harden( + /** @type {[string, OrchestrationAccount][]} */ ([ + ['agoric', localAccount], + [chainName, stakingAccount], + ]), + ); + const publicTopicEntries = harden( + /** @type {[string, ResolvedPublicTopic][]} */ ( + await Promise.all( + accountEntries.map(async ([name, account]) => { + const { account: topicRecord } = await account.getPublicTopics(); + return [name, topicRecord]; + }), + ) + ), + ); + const portfolioHolder = makePortfolioHolder( + accountEntries, + publicTopicEntries, + ); + return portfolioHolder.asContinuingOffer(); +}; +harden(makeAccounts); diff --git a/contract/src/chain-info.js b/contract/src/chain-info.js new file mode 100644 index 00000000..c90aebec --- /dev/null +++ b/contract/src/chain-info.js @@ -0,0 +1,108 @@ +import { E } from '@endo/far'; +import { M, mustMatch } from '@endo/patterns'; +import { HubName, normalizeConnectionInfo } from './exos/chain-hub.js'; +import fetchedChainInfo from './fetched-chain-info.js'; // Refresh with scripts/refresh-chain-info.ts +import { CosmosAssetInfoShape, CosmosChainInfoShape } from './typeGuards.js'; + +/** @import {Chain, CosmosAssetInfo, CosmosChainInfo, EthChainInfo, IBCConnectionInfo} from './types.js'; */ +/** @import {NameAdmin} from '@agoric/vats'; */ + +/** + * Info used to build a {@link Chain} object - channel, connection, and denom + * info. + * + * @typedef {CosmosChainInfo | EthChainInfo} ChainInfo + */ + +const knownChains = /** @satisfies {Record} */ ( + harden(fetchedChainInfo) +); + +/** + * @typedef {typeof knownChains} KnownChains + * @internal + */ + +// TODO(#9966, #9967): include this in registerChain +/** + * Register chain assets into agoricNames + * + * @param {ERef} agoricNamesAdmin + * @param {string} name + * @param {CosmosAssetInfo[]} assets + * @alpha + */ +export const registerChainAssets = async (agoricNamesAdmin, name, assets) => { + mustMatch(assets, M.arrayOf(CosmosAssetInfoShape)); + const { nameAdmin: assetAdmin } = await E(agoricNamesAdmin).provideChild( + HubName.ChainAssets, + ); + return E(assetAdmin).update(name, assets); +}; + +/** + * Register a chain into agoricNames + * + * @param {ERef} agoricNamesAdmin + * @param {string} name + * @param {CosmosChainInfo} chainInfo + * @param {(...messages: string[]) => void} [log] + * @param {Set} [handledConnections] connection keys that need not be + * updated + */ +export const registerChain = async ( + agoricNamesAdmin, + name, + chainInfo, + log = () => {}, + handledConnections = new Set(), +) => { + const { nameAdmin } = await E(agoricNamesAdmin).provideChild(HubName.Chain); + const { nameAdmin: connAdmin } = await E(agoricNamesAdmin).provideChild( + HubName.ChainConnection, + ); + + mustMatch(chainInfo, CosmosChainInfoShape); + const { connections = {}, ...vertex } = chainInfo; + + const promises = [ + E(nameAdmin) + .update(name, vertex) + .then(() => log(`registered agoricNames chain.${name}`)), + ]; + + const { chainId } = chainInfo; + for (const [counterChainId, connInfo] of Object.entries(connections)) { + const [key, connectionInfo] = normalizeConnectionInfo( + chainId, + counterChainId, + connInfo, + ); + if (handledConnections.has(key)) { + continue; + } + + promises.push( + E(connAdmin) + .update(key, connectionInfo) + .then(() => log(`registering agoricNames chainConnection.${key}`)), + ); + + handledConnections.add(key); + } + // Bundle to pipeline IO + await Promise.all(promises); +}; + +/** + * Register all the chains that are known statically. + * + * @param {ERef} agoricNamesAdmin + * @param {(...messages: string[]) => void} [log] + */ +export const registerKnownChains = async (agoricNamesAdmin, log) => { + const handledConnections = new Set(); + for await (const [name, info] of Object.entries(knownChains)) { + await registerChain(agoricNamesAdmin, name, info, log, handledConnections); + } +}; diff --git a/contract/src/exos/README.md b/contract/src/exos/README.md new file mode 100644 index 00000000..0599cbbb --- /dev/null +++ b/contract/src/exos/README.md @@ -0,0 +1,130 @@ +# Exo structure + +Last verified 2024-10-30 + +```mermaid +classDiagram + +%% Orchestration vat business logic (Zoe) + ICQConnection --* Port + ICQConnection --* Connection + IcaAccount --* Port + IcaAccount --* Connection + IcaAccount --* CosmosInterchainService + ICQConnection --* CosmosInterchainService + CosmosInterchainService --* PortAllocator + PortAllocator --* NetworkVat + LocalChainAccount --* LocalChainVat + + class IcaAccount { + port: Port + connection: Connection + localAddress: LocalIbcAddress + requestedRemoteAddress: string + remoteAddress: RemoteIbcAddress + chainAddress: ChainAddress + getAddress() + getLocalAddress() + getRemoteAddress() + getPort() + executeTx() + executeEncodedTx() + deactivate() + reactivate() + } + class ICQConnection { + port: Port + connection: Connection + localAddress: LocalIbcAddress + remoteAddress: RemoteIbcAddress + getLocalAddress() + getRemoteAddress() + query() + } + + class CosmosInterchainService { + portAllocator: PortAllocator + icqConnections: MapStore + sharedICQPort: Port + makeAccount() + provideICQConnection() + } + +%% In other vats + class Port { + addListener() + connect() + getLocalAddress() + removeListener() + revoke() + } + + class Connection { + getLocalAddress() + getRemoteAddress() + send() + close() + } + + class PortAllocator { + allocateCustomIBCPort() + allocateICAControllerPort() + allocateICQControllerPort() + } + + class LocalChainAccount { + deposit() + executeTx() + getBalance() + monitorTransfers() + withdraw() + } + +%% In api consumer vats + + LocalOrchestrationAccount --* LocalChainAccount + CosmosOrchestrationAccount --* IcaAccount + + class LocalOrchestrationAccount { + account: LocalChainAccount + address: ChainAddress + topicKit: RecorderKit + asContinuingOffer() + delegate() + deposit() + executeTx() + getAddress() + getBalance() + getBalances() + getPublicTopics() + monitorTransfers() + send() + sendAll() + transfer() + undelegate() + withdraw() + } + + class CosmosOrchestrationAccount { + account: LocalChainAccount + chainAddress: ChainAddress + icqConnection: ICQConnection | undefined + timer: Timer + topicKit: RecorderKit + asContinuingOffer() + deactivate() + delegate() + executeEncodedTx() + getAddress() + getBalance() + getBalances() + getPublicTopics() + reactivate() + redelegate() + send() + sendAll() + transfer() + undelegate() + withdrawReward() + } +``` diff --git a/contract/src/exos/chain-hub-admin.js b/contract/src/exos/chain-hub-admin.js new file mode 100644 index 00000000..e790257b --- /dev/null +++ b/contract/src/exos/chain-hub-admin.js @@ -0,0 +1,84 @@ +/* we expect promises to resolved promptly, */ +/* eslint-disable no-restricted-syntax */ +import { heapVowE } from '@agoric/vow/vat.js'; +import { M } from '@endo/patterns'; +import { CosmosChainInfoShape } from '../typeGuards.js'; +import { DenomDetailShape } from './chain-hub.js'; + +/** + * @import {Zone} from '@agoric/zone'; + * @import {CosmosChainInfo, Denom, IBCConnectionInfo} from '@agoric/orchestration'; + * @import {ChainHub, DenomDetail} from './chain-hub.js'; + */ + +/** + * For use with async-flow contracts: can be used as a creator facet that allows + * developers to add new chain configurations to a local chainHub, in the event + * the information is not available widely in `agoricNames`. + * + * @example + * + * ```js + * const chainHubAdmin = prepareChainHubAdmin(zone, chainHub); + * chainHubAdmin.initChain( + * 'hotNewChain', + * hotNewChainInfo, + * agoricTohotNewChainConnectionInfo, + * ); + * ``` + * + * @param {Zone} zone + * @param {ChainHub} chainHub + */ +export const prepareChainHubAdmin = (zone, chainHub) => { + const ConnectionInfoShape = M.record(); // TODO + const makeCreatorFacet = zone.exo( + 'ChainHub Admin', + M.interface('ChainHub Admin', { + registerChain: M.callWhen( + M.string(), + CosmosChainInfoShape, + ConnectionInfoShape, + ).returns(M.undefined()), + registerAsset: M.call(M.string(), DenomDetailShape).returns(M.promise()), + }), + { + /** + * Register information for a chain + * + * @param {string} chainName - must not exist in chainHub + * @param {CosmosChainInfo} chainInfo + * @param {IBCConnectionInfo} connectionInfo - from Agoric chain + */ + async registerChain(chainName, chainInfo, connectionInfo) { + // when() because chainHub methods return vows. If this were inside + // orchestrate() the membrane would wrap/unwrap automatically. + const agoricChainInfo = await heapVowE.when( + chainHub.getChainInfo('agoric'), + ); + chainHub.registerChain(chainName, chainInfo); + chainHub.registerConnection( + agoricChainInfo.chainId, + chainInfo.chainId, + connectionInfo, + ); + }, + /** + * Register an asset that may be held on a chain other than the issuing + * chain. + * + * @param {Denom} denom - on the holding chain, whose name is given in + * `detail.chainName` + * @param {DenomDetail} detail - chainName and baseName must be registered + */ + async registerAsset(denom, detail) { + // XXX async work necessary before the synchronous call + await heapVowE.when(chainHub.getChainInfo('agoric')); + chainHub.registerAsset(denom, detail); + }, + }, + ); + return makeCreatorFacet; +}; + +/** @typedef {ReturnType} ChainHubAdmin */ diff --git a/contract/src/exos/chain-hub.js b/contract/src/exos/chain-hub.js new file mode 100644 index 00000000..368ce240 --- /dev/null +++ b/contract/src/exos/chain-hub.js @@ -0,0 +1,488 @@ +import { Fail, makeError, q } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; + +import { VowShape } from '@agoric/vow'; +import { + ChainAddressShape, + CosmosChainInfoShape, + IBCConnectionInfoShape, +} from '../typeGuards.js'; +import { getBech32Prefix } from '../utils/address.js'; + +/** + * @import {NameHub} from '@agoric/vats'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CosmosAssetInfo, CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; + * @import {ChainInfo, KnownChains} from '../chain-info.js'; + * @import {ChainAddress, Denom} from '../orchestration-api.js'; + * @import {Remote} from '@agoric/internal'; + * @import {TypedPattern} from '@agoric/internal'; + */ + +/** + * If K matches a known chain, narrow the type from generic ChainInfo + * + * @template {string} K + * @typedef {K extends keyof KnownChains + * ? ChainInfo & Omit + * : ChainInfo} ActualChainInfo + * @internal + */ + +/** + * @typedef {object} DenomDetail + * @property {string} baseName - name of issuing chain; e.g. cosmoshub + * @property {Denom} baseDenom - e.g. uatom + * @property {string} chainName - name of holding chain; e.g. agoric + * @property {Brand<'nat'>} [brand] - vbank brand, if registered + * @see {ChainHub} `registerAsset` method + */ +/** @type {TypedPattern} */ +export const DenomDetailShape = M.splitRecord( + { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, + { brand: BrandShape }, +); + +/** + * @enum {(typeof HubName)[keyof typeof HubName]} + */ +export const HubName = /** @type {const} */ ({ + /** agoricNames key for ChainInfo hub */ + Chain: 'chain', + /** namehub for assets info */ + ChainAssets: 'chainAssets', + /** namehub for connection info */ + ChainConnection: 'chainConnection', +}); +harden(HubName); + +/** @deprecated use HubName.Chain */ +export const CHAIN_KEY = HubName.Chain; +/** @deprecated use HubName.ChainConnection */ +export const CONNECTIONS_KEY = HubName.ChainConnection; +/** @deprecated use HubName.ChainAssets */ +export const ASSETS_KEY = HubName.ChainAssets; + +/** + * Character used in a connection tuple key to separate the two chain ids. Valid + * because a chainId can contain only alphanumerics and dash. + * + * Vstorage keys can be only alphanumerics, dash or underscore. That leaves + * underscore as the only valid separator. + * + * @see {@link https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md} + */ +const CHAIN_ID_SEPARATOR = '_'; + +/** + * The entries of the top-level namehubs in agoricNames are reflected to + * vstorage. But only the top level. So we combine the 2 chain ids into 1 key. + * Connections are directionless, so we sort the ids. + * + * @param {string} chainId1 + * @param {string} chainId2 + */ +export const connectionKey = (chainId1, chainId2) => { + if ( + chainId1.includes(CHAIN_ID_SEPARATOR) || + chainId2.includes(CHAIN_ID_SEPARATOR) + ) { + Fail`invalid chain id ${chainId1} or ${chainId2}`; + } + return [chainId1, chainId2].sort().join(CHAIN_ID_SEPARATOR); +}; + +/** + * Utility to reverse connection info perspective. + * + * @param {IBCConnectionInfo} connInfo + * @returns {IBCConnectionInfo} + */ +const reverseConnInfo = connInfo => { + const { transferChannel } = connInfo; + return { + id: connInfo.counterparty.connection_id, + client_id: connInfo.counterparty.client_id, + counterparty: { + client_id: connInfo.client_id, + connection_id: connInfo.id, + }, + state: connInfo.state, + transferChannel: { + ...transferChannel, + channelId: transferChannel.counterPartyChannelId, + counterPartyChannelId: transferChannel.channelId, + portId: transferChannel.counterPartyPortId, + counterPartyPortId: transferChannel.portId, + }, + }; +}; + +/** + * Convert the info to an undirected form. + * + * @param {string} primaryChainId + * @param {string} counterChainId + * @param {IBCConnectionInfo} directed + * @returns {[string, IBCConnectionInfo]} + */ +export const normalizeConnectionInfo = ( + primaryChainId, + counterChainId, + directed, +) => { + const key = connectionKey(primaryChainId, counterChainId); + if (primaryChainId < counterChainId) { + return [key, directed]; + } else { + return [key, reverseConnInfo(directed)]; + } +}; + +/** + * Provide a view on the connection from the primary chain's perspective. + * + * @param {string} primaryChainId + * @param {string} counterChainId + * @param {IBCConnectionInfo} normalized + */ +const denormalizeConnectionInfo = ( + primaryChainId, + counterChainId, + normalized, +) => { + if (primaryChainId < counterChainId) { + return normalized; + } else { + return reverseConnInfo(normalized); + } +}; + +const ChainIdArgShape = M.or( + M.string(), + M.splitRecord( + { + chainId: M.string(), + }, + undefined, + M.any(), + ), +); + +const ChainHubI = M.interface('ChainHub', { + registerChain: M.call(M.string(), CosmosChainInfoShape).returns(), + getChainInfo: M.call(M.string()).returns(VowShape), + registerConnection: M.call( + M.string(), + M.string(), + IBCConnectionInfoShape, + ).returns(), + getConnectionInfo: M.call(ChainIdArgShape, ChainIdArgShape).returns(VowShape), + getChainsAndConnection: M.call(M.string(), M.string()).returns(VowShape), + registerAsset: M.call(M.string(), DenomDetailShape).returns(), + getAsset: M.call(M.string()).returns(M.or(DenomDetailShape, M.undefined())), + getDenom: M.call(BrandShape).returns(M.or(M.string(), M.undefined())), + makeChainAddress: M.call(M.string()).returns(ChainAddressShape), +}); + +/** + * Make a new ChainHub in the zone. + * + * The resulting object is an Exo singleton. It has no precious state. It's only + * state is a cache of queries to agoricNames and whatever info was provided in + * registration calls. When you need a newer version you can simply make a hub + * hub and repeat the registrations. + * + * @param {Zone} zone + * @param {Remote} agoricNames + * @param {VowTools} vowTools + */ +export const makeChainHub = (zone, agoricNames, vowTools) => { + /** @type {MapStore} */ + const chainInfos = zone.mapStore('chainInfos', { + keyShape: M.string(), + valueShape: CosmosChainInfoShape, + }); + /** @type {MapStore} */ + const connectionInfos = zone.mapStore('connectionInfos', { + keyShape: M.string(), + valueShape: IBCConnectionInfoShape, + }); + + /** @type {MapStore} */ + const denomDetails = zone.mapStore('denom', { + keyShape: M.string(), + valueShape: DenomDetailShape, + }); + /** @type {MapStore} */ + const brandDenoms = zone.mapStore('brandDenom', { + keyShape: BrandShape, + valueShape: M.string(), + }); + /** @type {MapStore} */ + const bech32PrefixToChainName = zone.mapStore('bech32PrefixToChainName', { + keyShape: M.string(), + valueShape: M.string(), + }); + + const lookupChainInfo = vowTools.retriable( + zone, + 'lookupChainInfo', + /** @param {string} chainName */ + // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices + async chainName => { + await null; + try { + const chainInfo = await E(agoricNames).lookup(HubName.Chain, chainName); + // It may have been set by another concurrent call + // TODO consider makeAtomicProvider for vows + if (!chainInfos.has(chainName)) { + chainInfos.init(chainName, chainInfo); + if (chainInfo.bech32Prefix) { + bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName); + } + } + return chainInfo; + } catch (e) { + console.error('lookupChainInfo', chainName, 'error', e); + throw makeError(`chain not found:${chainName}`); + } + }, + ); + + const lookupConnectionInfo = vowTools.retriable( + zone, + 'lookupConnectionInfo', + /** + * @param {string} chainId1 + * @param {string} chainId2 + */ + // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices + async (chainId1, chainId2) => { + await null; + const key = connectionKey(chainId1, chainId2); + try { + const connectionInfo = await E(agoricNames).lookup( + HubName.ChainConnection, + key, + ); + // It may have been set by another concurrent call + // TODO consider makeAtomicProvider for vows + if (!connectionInfos.has(key)) { + connectionInfos.init(key, connectionInfo); + } + + return denormalizeConnectionInfo(chainId1, chainId2, connectionInfo); + } catch (e) { + console.error('lookupConnectionInfo', chainId1, chainId2, 'error', e); + throw makeError(`connection not found: ${chainId1}<->${chainId2}`); + } + }, + ); + + /* eslint-disable no-use-before-define -- chainHub defined below */ + const lookupChainsAndConnection = vowTools.retriable( + zone, + 'lookupChainsAndConnection', + /** + * @template {string} C1 + * @template {string} C2 + * @param {C1} primaryName + * @param {C2} counterName + * @returns {Promise< + * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] + * >} + */ + // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices + async (primaryName, counterName) => { + const [primary, counter] = await vowTools.asPromise( + vowTools.allVows([ + chainHub.getChainInfo(primaryName), + chainHub.getChainInfo(counterName), + ]), + ); + const connectionInfo = await vowTools.asPromise( + chainHub.getConnectionInfo(primary, counter), + ); + return /** @type {[ActualChainInfo, ActualChainInfo, IBCConnectionInfo]} */ ([ + primary, + counter, + connectionInfo, + ]); + }, + ); + + const chainHub = zone.exo('ChainHub', ChainHubI, { + /** + * Register a new chain. The name will override a name in well known chain + * names. + * + * If a durable zone was not provided, registration will not survive a + * reincarnation of the vat. Then if the chain is not yet in the well known + * names at that point, it will have to be registered again. In an unchanged + * contract `start` the call will happen again naturally. + * + * @param {string} name + * @param {CosmosChainInfo} chainInfo + */ + registerChain(name, chainInfo) { + chainInfos.init(name, chainInfo); + if (chainInfo.bech32Prefix) { + bech32PrefixToChainName.init(chainInfo.bech32Prefix, name); + } + }, + /** + * @template {string} K + * @param {K} chainName + * @returns {Vow>} + */ + getChainInfo(chainName) { + // Either from registerChain or memoized remote lookup() + if (chainInfos.has(chainName)) { + return /** @type {Vow>} */ ( + vowTools.asVow(() => chainInfos.get(chainName)) + ); + } + + return lookupChainInfo(chainName); + }, + /** + * @param {string} primaryChainId + * @param {string} counterpartyChainId + * @param {IBCConnectionInfo} connectionInfo from primary to counterparty + */ + registerConnection(primaryChainId, counterpartyChainId, connectionInfo) { + const [key, normalized] = normalizeConnectionInfo( + primaryChainId, + counterpartyChainId, + connectionInfo, + ); + connectionInfos.init(key, normalized); + }, + + /** + * @param {string | { chainId: string }} primary the primary chain + * @param {string | { chainId: string }} counter the counterparty chain + * @returns {Vow} + */ + getConnectionInfo(primary, counter) { + const primaryId = typeof primary === 'string' ? primary : primary.chainId; + const counterId = typeof counter === 'string' ? counter : counter.chainId; + const key = connectionKey(primaryId, counterId); + if (connectionInfos.has(key)) { + return vowTools.asVow(() => + denormalizeConnectionInfo( + primaryId, + counterId, + connectionInfos.get(key), + ), + ); + } + + return lookupConnectionInfo(primaryId, counterId); + }, + + /** + * @template {string} C1 + * @template {string} C2 + * @param {C1} primaryName the primary chain name + * @param {C2} counterName the counterparty chain name + * @returns {Vow< + * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] + * >} + */ + getChainsAndConnection(primaryName, counterName) { + // @ts-expect-error XXX generic parameter propagation + return lookupChainsAndConnection(primaryName, counterName); + }, + + /** + * Register an asset that may be held on a chain other than the issuing + * chain. + * + * @param {Denom} denom - on the holding chain, whose name is given in + * `detail.chainName` + * @param {DenomDetail} detail - chainName and baseName must be registered + */ + registerAsset(denom, detail) { + const { chainName, baseName } = detail; + chainInfos.has(chainName) || + Fail`must register chain ${q(chainName)} first`; + chainInfos.has(baseName) || + Fail`must register chain ${q(baseName)} first`; + denomDetails.init(denom, detail); + if (detail.brand) { + brandDenoms.init(detail.brand, denom); + } + }, + /** + * Retrieve holding, issuing chain names etc. for a denom. + * + * @param {Denom} denom + * @returns {DenomDetail | undefined} + */ + getAsset(denom) { + if (denomDetails.has(denom)) { + return denomDetails.get(denom); + } + return undefined; + }, + /** + * Retrieve denom (string) for a Brand. + * + * @param {Brand} brand + * @returns {Denom | undefined} + */ + getDenom(brand) { + if (brandDenoms.has(brand)) { + return brandDenoms.get(brand); + } + return undefined; + }, + /** + * @param {string} address bech32 address + * @returns {ChainAddress} + */ + makeChainAddress(address) { + const prefix = getBech32Prefix(address); + if (!bech32PrefixToChainName.has(prefix)) { + throw makeError(`Chain info not found for bech32Prefix ${q(prefix)}`); + } + const chainName = bech32PrefixToChainName.get(prefix); + const { chainId } = chainInfos.get(chainName); + return harden({ + chainId, + value: address, + encoding: /** @type {const} */ ('bech32'), + }); + }, + }); + + return chainHub; +}; +/** @typedef {ReturnType} ChainHub */ + +/** + * Register assets with the given ChainHub so they are available for lookup + * + * @param {ChainHub} chainHub + * @param {string} name + * @param {CosmosAssetInfo[]} assets + */ +export const registerAssets = (chainHub, name, assets) => { + for (const { base, traces } of assets) { + const native = !traces; + native || traces.length === 1 || Fail`unexpected ${traces.length} traces`; + const [chainName, baseName, baseDenom] = native + ? [name, name, base] + : [ + name, + traces[0].counterparty.chain_name, + traces[0].counterparty.base_denom, + ]; + chainHub.registerAsset(base, { chainName, baseName, baseDenom }); + } +}; diff --git a/contract/src/exos/combine-invitation-makers.js b/contract/src/exos/combine-invitation-makers.js new file mode 100644 index 00000000..3dd20625 --- /dev/null +++ b/contract/src/exos/combine-invitation-makers.js @@ -0,0 +1,59 @@ +import { M } from '@endo/patterns'; +import { + prepareGuardedAttenuator, + makeSyncMethodCallback, +} from '@agoric/internal/src/callback.js'; +import { getMethodNames } from '@agoric/internal'; + +/** + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {Zone} from '@agoric/zone'; + */ + +// TODO use a helper from Endo https://github.com/endojs/endo/issues/2448 +/** + * Takes two or more InvitationMaker exos and combines them into a new one. + * Combine with `publicTopics` to form a {@link ContinuingOfferResult} that can + * be returned to a smart-wallet client. + * + * Useful for writing your own invitationMakers while preserving + * platform-provided ones like `Delegate`, `Transfer`, `Send`. + * + * @param {Zone} zone + * @param {import('@endo/patterns').InterfaceGuard[]} interfaceGuards + */ +export const prepareCombineInvitationMakers = (zone, ...interfaceGuards) => { + const methodGuards = interfaceGuards.map(ig => ig.payload.methodGuards); + const CombinedInterfaceGuard = M.interface( + 'CombinedInvitationMakers interface', + Object.assign({}, ...methodGuards), + ); + + const mixin = prepareGuardedAttenuator(zone, CombinedInterfaceGuard, { + tag: 'CombinedInvitationMakers', + }); + + /** + * @template {InvitationMakers[]} IM + * @param {IM} invitationMakers + * @returns {IM[number]} + */ + const combineInvitationMakers = (...invitationMakers) => { + const overrides = {}; + for (const invMakers of invitationMakers) { + // remove '__getInterfaceGuard__', '__getMethodNames__' + const names = getMethodNames(invMakers).filter(n => !n.startsWith('__')); + for (const key of names) { + overrides[key] = makeSyncMethodCallback(invMakers, key); + } + } + return mixin({ + overrides, + }); + }; + + return combineInvitationMakers; +}; + +/** @typedef {ReturnType} MakeCombineInvitationMakers */ +/** @typedef {ReturnType} CombinedInvitationMakers */ diff --git a/contract/src/exos/cosmos-interchain-service.js b/contract/src/exos/cosmos-interchain-service.js new file mode 100644 index 00000000..5724cc94 --- /dev/null +++ b/contract/src/exos/cosmos-interchain-service.js @@ -0,0 +1,280 @@ +/** @file Orchestration service */ + +import { Shape as NetworkShape } from '@agoric/network'; +import { pickFacet } from '@agoric/vat-data'; +import { E } from '@endo/far'; +import { M, mustMatch } from '@endo/patterns'; +import { + DEFAULT_ICQ_VERSION, + makeICAChannelAddress, + makeICQChannelAddress, +} from '../utils/address.js'; +import { prepareIcaAccountKit } from './ica-account-kit.js'; +import { prepareICQConnectionKit } from './icq-connection-kit.js'; + +/** + * @import {Zone} from '@agoric/base-zone'; + * @import {Remote} from '@agoric/internal'; + * @import {Connection, Port, PortAllocator} from '@agoric/network'; + * @import {IBCConnectionID} from '@agoric/vats'; + * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {ICQConnection, IcaAccount, ICQConnectionKit, IcaAccountKit} from '../types.js'; + * @import {ICAChannelAddressOpts} from '../utils/address.js'; + */ + +const { Vow$ } = NetworkShape; // TODO #9611 +/** + * @typedef {object} OrchestrationPowers + * @property {Remote} portAllocator + * @property {undefined} reserved reserve a state key for future use. can hold + * an additional power or a record of powers + */ + +/** @typedef {MapStore} ICQConnectionStore */ + +/** @typedef {IcaAccountKit | ICQConnectionKit} ConnectionKit */ + +/** + * @typedef {{ + * icqConnections: ICQConnectionStore; + * sharedICQPort: Remote | undefined; + * } & OrchestrationPowers} OrchestrationState + */ + +/** + * Creates a key for the icqConnections mapStore based on connectionId and + * version + * + * @param {IBCConnectionID} controllerConnectionId + * @param {string} [version] + * @returns {string} + */ +const getICQConnectionKey = (controllerConnectionId, version) => { + return `${controllerConnectionId}:${version || DEFAULT_ICQ_VERSION}`; +}; + +/** + * @param {Zone} zone + * @param {VowTools} vowTools + * @param {ReturnType} makeIcaAccountKit + * @param {ReturnType} makeICQConnectionKit + */ +const prepareCosmosOrchestrationServiceKit = ( + zone, + { watch, asVow }, + makeIcaAccountKit, + makeICQConnectionKit, +) => + zone.exoClassKit( + 'Orchestration', + { + requestICAChannelWatcher: M.interface('RequestICAChannelWatcher', { + onFulfilled: M.call(M.remotable('Port')) + .optional({ chainId: M.string(), remoteConnAddr: M.string() }) + .returns(Vow$(NetworkShape.Connection)), + }), + requestICQChannelWatcher: M.interface('RequestICQChannelWatcher', { + onFulfilled: M.call(M.remotable('Port')) + .optional({ + remoteConnAddr: M.string(), + icqLookupKey: M.string(), + }) + .returns(Vow$(NetworkShape.Connection)), + }), + channelOpenWatcher: M.interface('ChannelOpenWatcher', { + onFulfilled: M.call(M.remotable('Connection')) + .optional( + M.splitRecord( + { connectionKit: M.record(), returnFacet: M.string() }, + { icqLookupKey: M.string() }, + ), + ) + .returns(M.remotable('ConnectionKit Holder facet')), + }), + public: M.interface('CosmosInterchainService', { + makeAccount: M.call(M.string(), M.string(), M.string()) + .optional(M.record()) + .returns(Vow$(M.remotable('IcaAccountKit'))), + provideICQConnection: M.call(M.string()) + .optional(M.string()) + .returns(Vow$(M.remotable('ICQConnection'))), + }), + }, + /** @param {Partial} powers */ + powers => { + mustMatch(powers?.portAllocator, M.remotable('PortAllocator')); + const icqConnections = zone.detached().mapStore('ICQConnections'); + return /** @type {OrchestrationState} */ ({ + icqConnections, + sharedICQPort: undefined, + reserved: undefined, + ...powers, + }); + }, + { + requestICAChannelWatcher: { + /** + * @param {Port} port + * @param {{ + * chainId: string; + * remoteConnAddr: RemoteIbcAddress; + * }} watchContext + */ + onFulfilled(port, { chainId, remoteConnAddr }) { + const connectionKit = makeIcaAccountKit( + chainId, + port, + remoteConnAddr, + ); + return watch( + E(port).connect(remoteConnAddr, connectionKit.connectionHandler), + this.facets.channelOpenWatcher, + { returnFacet: 'account', connectionKit }, + ); + }, + }, + requestICQChannelWatcher: { + /** + * @param {Port} port + * @param {{ + * remoteConnAddr: RemoteIbcAddress; + * icqLookupKey: string; + * }} watchContext + */ + onFulfilled(port, { remoteConnAddr, icqLookupKey }) { + if (!this.state.sharedICQPort) { + this.state.sharedICQPort = port; + } + const connectionKit = makeICQConnectionKit(port); + return watch( + E(port).connect(remoteConnAddr, connectionKit.connectionHandler), + this.facets.channelOpenWatcher, + { + connectionKit, + returnFacet: 'connection', + icqLookupKey, + }, + ); + }, + }, + /** + * Waits for a channel (ICA, ICQ) to open and returns the consumer-facing + * facet of the ConnectionKit, specified by `returnFacet`. Saves the + * ConnectionKit if `saveICQConnection` is provided. + */ + channelOpenWatcher: { + /** + * @param {Connection} _connection + * @param {{ + * connectionKit: ConnectionKit; + * returnFacet: string; + * icqLookupKey?: string; + * }} watchContext + */ + onFulfilled(_connection, { connectionKit, returnFacet, icqLookupKey }) { + if (icqLookupKey) { + this.state.icqConnections.init( + icqLookupKey, + /** @type {ICQConnectionKit} */ (connectionKit), + ); + } + return connectionKit[returnFacet]; + }, + }, + public: { + /** + * @satisfies {CosmosInterchainService['makeAccount']} + * @param {string} chainId + * @param {IBCConnectionID} hostConnectionId the counterparty + * connection_id + * @param {IBCConnectionID} controllerConnectionId self connection_id + * @param {ICAChannelAddressOpts} [opts] optional to configure the + * channel address, such as version and ordering + * @returns {Vow} + */ + makeAccount(chainId, hostConnectionId, controllerConnectionId, opts) { + const remoteConnAddr = makeICAChannelAddress( + hostConnectionId, + controllerConnectionId, + opts, + ); + const { portAllocator } = this.state; + return watch( + E(portAllocator).allocateICAControllerPort(), + this.facets.requestICAChannelWatcher, + { + chainId, + remoteConnAddr, + }, + ); + }, + /** + * @satisfies {CosmosInterchainService['provideICQConnection']} + * @param {IBCConnectionID} controllerConnectionId + * @param {string} [version] + * @returns {Vow | ICQConnection} + */ + provideICQConnection(controllerConnectionId, version) { + const icqLookupKey = getICQConnectionKey( + controllerConnectionId, + version, + ); + if (this.state.icqConnections.has(icqLookupKey)) { + return asVow( + () => this.state.icqConnections.get(icqLookupKey).connection, + ); + } + const remoteConnAddr = makeICQChannelAddress( + controllerConnectionId, + version, + ); + const { portAllocator, sharedICQPort } = this.state; + const portOrPortVow = + sharedICQPort || E(portAllocator).allocateICQControllerPort(); + + return watch(portOrPortVow, this.facets.requestICQChannelWatcher, { + remoteConnAddr, + icqLookupKey, + }); + }, + }, + }, + { + stateShape: { + icqConnections: M.remotable('icqConnections mapStore'), + sharedICQPort: M.or(M.remotable('Port'), M.undefined()), + portAllocator: M.remotable('PortAllocator'), + reserved: M.any(), + }, + }, + ); + +/** + * Used only by vat-orchestration and tests mocking it + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @internal + */ +export const prepareCosmosInterchainService = (zone, vowTools) => { + const makeIcaAccountKit = prepareIcaAccountKit(zone, vowTools); + const makeICQConnectionKit = prepareICQConnectionKit(zone, vowTools); + const makeCosmosOrchestrationServiceKit = + prepareCosmosOrchestrationServiceKit( + zone, + vowTools, + makeIcaAccountKit, + makeICQConnectionKit, + ); + + const makeCosmosInterchainService = pickFacet( + makeCosmosOrchestrationServiceKit, + 'public', + ); + + return makeCosmosInterchainService; +}; +harden(prepareCosmosInterchainService); + +/** @typedef {ReturnType} MakeCosmosInterchainService */ diff --git a/contract/src/exos/cosmos-orchestration-account.js b/contract/src/exos/cosmos-orchestration-account.js new file mode 100644 index 00000000..cc33d39c --- /dev/null +++ b/contract/src/exos/cosmos-orchestration-account.js @@ -0,0 +1,1147 @@ +/** @file Use-object for the owner of a staking account */ +import { toRequestQueryJson } from '@agoric/cosmic-proto'; +import { + QueryAllBalancesRequest, + QueryAllBalancesResponse, + QueryBalanceRequest, + QueryBalanceResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; +import { MsgSend } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; +import { + QueryDelegationRewardsRequest, + QueryDelegationRewardsResponse, + QueryDelegationTotalRewardsRequest, + QueryDelegationTotalRewardsResponse, +} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; +import { + MsgWithdrawDelegatorReward, + MsgWithdrawDelegatorRewardResponse, +} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/tx.js'; +import { + QueryDelegationRequest, + QueryDelegationResponse, + QueryDelegatorDelegationsRequest, + QueryDelegatorDelegationsResponse, + QueryDelegatorUnbondingDelegationsRequest, + QueryDelegatorUnbondingDelegationsResponse, + QueryRedelegationsRequest, + QueryRedelegationsResponse, + QueryUnbondingDelegationRequest, + QueryUnbondingDelegationResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/query.js'; +import { + MsgBeginRedelegate, + MsgDelegate, + MsgUndelegate, + MsgUndelegateResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; +import { makeTracer } from '@agoric/internal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { M } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { decodeBase64 } from '@endo/base64'; +import { Fail, makeError, q } from '@endo/errors'; +import { E } from '@endo/far'; +import { + AmountArgShape, + ChainAddressShape, + DelegationShape, + DenomAmountShape, + IBCTransferOptionsShape, + Proto3Shape, + TxBodyOptsShape, +} from '../typeGuards.js'; +import { coerceCoin, coerceDenom } from '../utils/amounts.js'; +import { + maxClockSkew, + toCosmosDelegationResponse, + toCosmosValidatorAddress, + toDenomAmount, + toTruncatedDenomAmount, + tryDecodeResponse, +} from '../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../utils/time.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {AmountArg, IcaAccount, ChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, OrchestrationAccountI, CosmosRewardsResponse, IBCConnectionInfo, IBCMsgTransferOptions, ChainHub, CosmosDelegationResponse} from '../types.js'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + * @import {Remote} from '@agoric/internal'; + * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {TimerService} from '@agoric/time'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; + * @import {JsonSafe} from '@agoric/cosmic-proto'; + * @import {Matcher} from '@endo/patterns'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +const trace = makeTracer('ComosOrchestrationAccountHolder'); + +const { Vow$ } = NetworkShape; // TODO #9611 + +/** + * @typedef {object} ComosOrchestrationAccountNotification + * @property {ChainAddress} chainAddress + */ + +/** + * @private + * @typedef {{ + * topicKit: RecorderKit; + * account: IcaAccount; + * chainAddress: ChainAddress; + * localAddress: LocalIbcAddress; + * remoteAddress: RemoteIbcAddress; + * icqConnection: ICQConnection | undefined; + * timer: Remote; + * }} State + * Internal to the IcaAccountHolder exo + */ + +/** + * @typedef {{ + * localAddress: LocalIbcAddress; + * remoteAddress: RemoteIbcAddress; + * }} CosmosOrchestrationAccountStorageState + */ + +/** @see {StakingAccountActions} */ +const stakingAccountActionsMethods = { + delegate: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), + redelegate: M.call( + ChainAddressShape, + ChainAddressShape, + AmountArgShape, + ).returns(VowShape), + undelegate: M.call(M.arrayOf(DelegationShape)).returns(VowShape), + withdrawReward: M.call(ChainAddressShape).returns( + Vow$(M.arrayOf(DenomAmountShape)), + ), + withdrawRewards: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), +}; + +/** @see {StakingAccountQueries} */ +const stakingAccountQueriesMethods = { + getDelegation: M.call(ChainAddressShape).returns(VowShape), + getDelegations: M.call().returns(VowShape), + getUnbondingDelegation: M.call(ChainAddressShape).returns(VowShape), + getUnbondingDelegations: M.call().returns(VowShape), + getRedelegations: M.call().returns(VowShape), + getReward: M.call(ChainAddressShape).returns(VowShape), + getRewards: M.call().returns(VowShape), +}; + +/** @see {OrchestrationAccountI} */ +export const IcaAccountHolderI = M.interface('IcaAccountHolder', { + ...orchestrationAccountMethods, + ...stakingAccountActionsMethods, + ...stakingAccountQueriesMethods, + deactivate: M.call().returns(VowShape), + reactivate: M.call().returns(VowShape), + executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) + .optional(TxBodyOptsShape) + .returns(VowShape), +}); + +/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ +const PUBLIC_TOPICS = { + account: ['Staking Account holder status', M.any()], +}; + +export const CosmosOrchestrationInvitationMakersI = M.interface( + 'invitationMakers', + { + Delegate: M.call(ChainAddressShape, AmountArgShape).returns(M.promise()), + Redelegate: M.call( + ChainAddressShape, + ChainAddressShape, + AmountArgShape, + ).returns(M.promise()), + WithdrawReward: M.call(ChainAddressShape).returns(M.promise()), + Undelegate: M.call(M.arrayOf(DelegationShape)).returns(M.promise()), + DeactivateAccount: M.call().returns(M.promise()), + ReactivateAccount: M.call().returns(M.promise()), + TransferAccount: M.call().returns(M.promise()), + Send: M.call().returns(M.promise()), + SendAll: M.call().returns(M.promise()), + Transfer: M.call().returns(M.promise()), + }, +); +harden(CosmosOrchestrationInvitationMakersI); + +/** + * @param {Zone} zone + * @param {object} powers + * @param {ChainHub} powers.chainHub + * @param {MakeRecorderKit} powers.makeRecorderKit + * @param {Remote} powers.timerService + * @param {VowTools} powers.vowTools + * @param {ZCF} powers.zcf + */ +export const prepareCosmosOrchestrationAccountKit = ( + zone, + { + chainHub, + makeRecorderKit, + timerService, + vowTools: { watch, asVow, when, allVows }, + zcf, + }, +) => { + const timestampHelper = makeTimestampHelper(timerService); + const makeCosmosOrchestrationAccountKit = zone.exoClassKit( + 'Cosmos Orchestration Account Holder', + { + helper: M.interface('helper', { + owned: M.call().returns(M.remotable()), + getUpdater: M.call().returns(M.remotable()), + amountToCoin: M.call(AmountArgShape).returns(M.record()), + }), + returnVoidWatcher: M.interface('returnVoidWatcher', { + onFulfilled: M.call(M.or(M.string(), M.record())) + .optional(M.arrayOf(M.undefined())) + .returns(M.undefined()), + }), + balanceQueryWatcher: M.interface('balanceQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(M.or(M.record(), M.undefined())), + }), + allBalancesQueryWatcher: M.interface('allBalancesQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + undelegateWatcher: M.interface('undelegateWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(Vow$(M.promise())), + }), + withdrawRewardWatcher: M.interface('withdrawRewardWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(M.arrayOf(DenomAmountShape)), + }), + transferWatcher: M.interface('transferWatcher', { + onFulfilled: M.call([M.record(), M.nat()]) + .optional({ + destination: ChainAddressShape, + opts: M.or(M.undefined(), IBCTransferOptionsShape), + token: { + denom: M.string(), + amount: M.string(), + }, + }) + .returns(Vow$(M.record())), + }), + delegationQueryWatcher: M.interface('delegationQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), + }), + delegationsQueryWatcher: M.interface('delegationsQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + unbondingDelegationQueryWatcher: M.interface( + 'unbondingDelegationQueryWatcher', + { + onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), + }, + ), + unbondingDelegationsQueryWatcher: M.interface( + 'unbondingDelegationsQueryWatcher', + { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }, + ), + redelegationQueryWatcher: M.interface('redelegationQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + redelegationsQueryWatcher: M.interface('redelegationsQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + rewardQueryWatcher: M.interface('rewardQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns( + M.arrayOf(M.record()), + ), + }), + rewardsQueryWatcher: M.interface('rewardsQueryWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), + }), + holder: IcaAccountHolderI, + invitationMakers: CosmosOrchestrationInvitationMakersI, + }, + /** + * @param {object} info + * @param {ChainAddress} info.chainAddress + * @param {LocalIbcAddress} info.localAddress + * @param {RemoteIbcAddress} info.remoteAddress + * @param {object} io + * @param {IcaAccount} io.account + * @param {Remote} io.storageNode + * @param {ICQConnection | undefined} io.icqConnection + * @param {Remote} io.timer + * @returns {State} + */ + ({ chainAddress, localAddress, remoteAddress }, io) => { + const { storageNode } = io; + // must be the fully synchronous maker because the kit is held in durable state + const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); + // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 + // XXX consider parsing local/remoteAddr to portId, channelId, counterpartyPortId, counterpartyChannelId, connectionId, counterpartyConnectionId + // FIXME these values will not update if IcaAccount gets new values after reopening. + // consider having IcaAccount responsible for the owning the writer. It might choose to share it with COA. + void E(topicKit.recorder).write( + /** @type {CosmosOrchestrationAccountStorageState} */ ({ + localAddress, + remoteAddress, + }), + ); + + const { account, icqConnection, timer } = io; + return { + account, + chainAddress, + icqConnection, + localAddress, + remoteAddress, + timer, + topicKit, + }; + }, + { + helper: { + /** @throws if this holder no longer owns the account */ + owned() { + const { account } = this.state; + if (!account) { + throw Fail`Using account holder after transfer`; + } + return account; + }, + getUpdater() { + return this.state.topicKit.recorder; + }, + /** + * @param {AmountArg} amount + * @returns {Coin} + */ + amountToCoin(amount) { + return coerceCoin(chainHub, amount); + }, + }, + balanceQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { balance } = QueryBalanceResponse.decode( + decodeBase64(result.key), + ); + if (!balance) throw Fail`Result lacked balance key: ${result}`; + return harden(toDenomAmount(balance)); + }, + }, + delegationQueryWatcher: { + /** + * @param {JsonSafe[]} results + * @returns {CosmosDelegationResponse} + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { delegationResponse } = QueryDelegationResponse.decode( + decodeBase64(result.key), + ); + if (!delegationResponse) + throw Fail`Result lacked delegationResponse key: ${result}`; + const { chainAddress } = this.state; + return harden( + toCosmosDelegationResponse(chainAddress, delegationResponse), + ); + }, + }, + delegationsQueryWatcher: { + /** + * @param {JsonSafe[]} results + * @returns {CosmosDelegationResponse[]} + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { delegationResponses } = + QueryDelegatorDelegationsResponse.decode(decodeBase64(result.key)); + if (!delegationResponses) + throw Fail`Result lacked delegationResponses key: ${result}`; + const { chainAddress } = this.state; + return harden( + delegationResponses.map(r => + toCosmosDelegationResponse(chainAddress, r), + ), + ); + }, + }, + unbondingDelegationQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { unbond } = QueryUnbondingDelegationResponse.decode( + decodeBase64(result.key), + ); + if (!unbond) throw Fail`Result lacked unbond key: ${result}`; + return harden(unbond); + }, + }, + unbondingDelegationsQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { unbondingResponses } = + QueryDelegatorUnbondingDelegationsResponse.decode( + decodeBase64(result.key), + ); + if (!unbondingResponses) + throw Fail`Result lacked unbondingResponses key: ${result}`; + return harden(unbondingResponses); + }, + }, + redelegationQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { redelegationResponses } = QueryRedelegationsResponse.decode( + decodeBase64(result.key), + ); + if (!redelegationResponses) + throw Fail`Result lacked redelegationResponses key: ${result}`; + return harden(redelegationResponses); + }, + }, + redelegationsQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { redelegationResponses } = QueryRedelegationsResponse.decode( + decodeBase64(result.key), + ); + if (!redelegationResponses) + throw Fail`Result lacked redelegationResponses key: ${result}`; + return harden(redelegationResponses); + }, + }, + rewardQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { rewards } = QueryDelegationRewardsResponse.decode( + decodeBase64(result.key), + ); + if (!rewards) throw Fail`Result lacked rewards key: ${result}`; + return harden(rewards.map(toTruncatedDenomAmount)); + }, + }, + rewardsQueryWatcher: { + /** + * @param {JsonSafe[]} results + * @returns {CosmosRewardsResponse} + */ + onFulfilled([result]) { + if (!result?.key) throw Fail`Error parsing result ${result}`; + const { rewards, total } = QueryDelegationTotalRewardsResponse.decode( + decodeBase64(result.key), + ); + if (!rewards || !total) + throw Fail`Result lacked rewards or total key: ${result}`; + const { chainAddress } = this.state; + return harden({ + rewards: rewards.map(reward => ({ + validator: toCosmosValidatorAddress(reward, chainAddress.chainId), + reward: reward.reward.map(toTruncatedDenomAmount), + })), + total: total.map(toTruncatedDenomAmount), + }); + }, + }, + allBalancesQueryWatcher: { + /** + * @param {JsonSafe[]} results + */ + onFulfilled([result]) { + let response; + try { + response = QueryAllBalancesResponse.decode( + // note: an empty string for result.key is a valid result + decodeBase64(result.key), + ); + } catch (cause) { + throw makeError( + `Error parsing QueryAllBalances result ${q(result)}`, + undefined, + { cause }, + ); + } + const { balances } = response; + if (!balances) throw Fail`Result lacked balances key: ${q(result)}`; + return harden(balances.map(coin => toDenomAmount(coin))); + }, + }, + undelegateWatcher: { + /** + * @param {string} result + */ + onFulfilled(result) { + const response = tryDecodeResponse( + result, + MsgUndelegateResponse.fromProtoMsg, + ); + trace('undelegate response', response); + const { completionTime } = response; + completionTime || Fail`No completion time result ${result}`; + return watch( + // ignore nanoseconds and just use seconds from Timestamp + E(this.state.timer).wakeAt(completionTime.seconds + maxClockSkew), + ); + }, + }, + /** + * takes an array of results (from `executeEncodedTx`) and returns void + * since we are not interested in the result + */ + returnVoidWatcher: { + /** @param {string | Record} result */ + onFulfilled(result) { + trace('Result', result); + return undefined; + }, + }, + withdrawRewardWatcher: { + /** @param {string} result */ + onFulfilled(result) { + const response = tryDecodeResponse( + result, + MsgWithdrawDelegatorRewardResponse.fromProtoMsg, + ); + trace('withdrawReward response', response); + const { amount: coins } = response; + return harden(coins.map(toDenomAmount)); + }, + }, + transferWatcher: { + /** + * @param {[ + * { transferChannel: IBCConnectionInfo['transferChannel'] }, + * bigint, + * ]} results + * @param {{ + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * token: Coin; + * }} ctx + */ + onFulfilled( + [{ transferChannel }, timeoutTimestamp], + { opts, token, destination }, + ) { + const results = E(this.facets.helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgTransfer.toProtoMsg({ + sourcePort: transferChannel.portId, + sourceChannel: transferChannel.channelId, + token, + sender: this.state.chainAddress.value, + receiver: destination.value, + timeoutHeight: opts?.timeoutHeight ?? { + revisionHeight: 0n, + revisionNumber: 0n, + }, + timeoutTimestamp, + memo: opts?.memo ?? '', + }), + ), + ]); + return watch(results, this.facets.returnVoidWatcher); + }, + }, + invitationMakers: { + /** + * @param {CosmosValidatorAddress} validator + * @param {AmountArg} amount + */ + Delegate(validator, amount) { + trace('Delegate', validator, amount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.delegate(validator, amount)); + }, 'Delegate'); + }, + /** + * @param {CosmosValidatorAddress} srcValidator + * @param {CosmosValidatorAddress} dstValidator + * @param {AmountArg} amount + */ + Redelegate(srcValidator, dstValidator, amount) { + trace('Redelegate', srcValidator, dstValidator, amount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch( + this.facets.holder.redelegate(srcValidator, dstValidator, amount), + ); + }, 'Redelegate'); + }, + /** @param {CosmosValidatorAddress} validator */ + WithdrawReward(validator) { + trace('WithdrawReward', validator); + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.withdrawReward(validator)); + }, 'WithdrawReward'); + }, + /** + * @param {{ + * amount: AmountArg; + * validator: CosmosValidatorAddress; + * }[]} delegations + */ + Undelegate(delegations) { + trace('Undelegate', delegations); + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.undelegate(delegations)); + }, 'Undelegate'); + }, + DeactivateAccount() { + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.deactivate()); + }, 'DeactivateAccount'); + }, + ReactivateAccount() { + return zcf.makeInvitation(seat => { + seat.exit(); + return watch(this.facets.holder.reactivate()); + }, 'ReactivateAccount'); + }, + Send() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amount: AmountArg } + * >} + */ + const offerHandler = (seat, { toAccount, amount }) => { + seat.exit(); + return watch(this.facets.holder.send(toAccount, amount)); + }; + return zcf.makeInvitation(offerHandler, 'Send'); + }, + SendAll() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amounts: AmountArg[] } + * >} + */ + const offerHandler = (seat, { toAccount, amounts }) => { + seat.exit(); + return watch(this.facets.holder.sendAll(toAccount, amounts)); + }; + return zcf.makeInvitation(offerHandler, 'SendAll'); + }, + /** + * Starting a transfer revokes the account holder. The associated + * updater will get a special notification that the account is being + * transferred. + */ + TransferAccount() { + throw Error('not yet implemented'); + }, + Transfer() { + /** + * @type {OfferHandler< + * Vow, + * { + * amount: AmountArg; + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * } + * >} + */ + const offerHandler = (seat, { amount, destination, opts }) => { + seat.exit(); + return watch( + this.facets.holder.transfer(destination, amount, opts), + ); + }; + return zcf.makeInvitation(offerHandler, 'Transfer'); + }, + }, + holder: { + /** @type {HostOf} */ + asContinuingOffer() { + // @ts-expect-error XXX invitationMakers + // getPublicTopics resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { holder, invitationMakers: im } = this.facets; + // XXX cast to a type that has string index signature + const invitationMakers = /** @type {InvitationMakers} */ ( + /** @type {unknown} */ (im) + ); + + return harden({ + // getPublicTopics returns a vow, for membrane compatibility. + // it's safe to unwrap to a promise and get the result as we + // expect this complete in the same run + publicSubscribers: await when(holder.getPublicTopics()), + invitationMakers, + }); + }); + }, + /** @type {HostOf} */ + getPublicTopics() { + // getStoragePath resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { topicKit } = this.state; + return harden({ + account: { + description: PUBLIC_TOPICS.account[0], + subscriber: topicKit.subscriber, + storagePath: await topicKit.recorder.getStoragePath(), + }, + }); + }); + }, + + /** @type {HostOf} */ + getAddress() { + return this.state.chainAddress; + }, + /** @type {HostOf} */ + delegate(validator, amount) { + return asVow(() => { + trace('delegate', validator, amount); + const { helper } = this.facets; + const { chainAddress } = this.state; + + const amountAsCoin = helper.amountToCoin(amount); + + const results = E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgDelegate.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + amount: amountAsCoin, + }), + ), + ]); + return watch(results, this.facets.returnVoidWatcher); + }); + }, + + /** @type {HostOf} */ + redelegate(srcValidator, dstValidator, amount) { + return asVow(() => { + trace('redelegate', srcValidator, dstValidator, amount); + const { helper } = this.facets; + const { chainAddress } = this.state; + + const results = E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgBeginRedelegate.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorSrcAddress: srcValidator.value, + validatorDstAddress: dstValidator.value, + amount: helper.amountToCoin(amount), + }), + ), + ]); + + return watch( + results, + // NOTE: response, including completionTime, is currently discarded. + this.facets.returnVoidWatcher, + ); + }); + }, + /** @type {HostOf} */ + withdrawReward(validator) { + return asVow(() => { + trace('withdrawReward', validator); + const { helper } = this.facets; + const { chainAddress } = this.state; + const msg = MsgWithdrawDelegatorReward.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + }); + const account = helper.owned(); + + const results = E(account).executeEncodedTx([Any.toJSON(msg)]); + return watch(results, this.facets.withdrawRewardWatcher); + }); + }, + /** @type {HostOf} */ + getBalance(denom) { + return asVow(() => { + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryBalanceRequest.toProtoMsg({ + address: chainAddress.value, + denom: coerceDenom(chainHub, denom), + }), + ), + ]); + return watch(results, this.facets.balanceQueryWatcher); + }); + }, + + /** @type {HostOf} */ + getBalances() { + return asVow(() => { + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryAllBalancesRequest.toProtoMsg({ + address: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.allBalancesQueryWatcher); + }); + }, + + /** @type {HostOf} */ + send(toAccount, amount) { + return asVow(() => { + trace('send', toAccount, amount); + const { helper } = this.facets; + const { chainAddress } = this.state; + return watch( + E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgSend.toProtoMsg({ + fromAddress: chainAddress.value, + toAddress: toAccount.value, + amount: [helper.amountToCoin(amount)], + }), + ), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + + /** @type {HostOf} */ + sendAll(toAccount, amounts) { + return asVow(() => { + trace('sendAll', toAccount, amounts); + const { helper } = this.facets; + const { chainAddress } = this.state; + return watch( + E(helper.owned()).executeEncodedTx([ + Any.toJSON( + MsgSend.toProtoMsg({ + fromAddress: chainAddress.value, + toAddress: toAccount.value, + amount: amounts.map(x => helper.amountToCoin(x)), + }), + ), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + + /** @type {HostOf} */ + transfer(destination, amount, opts) { + trace('transfer', destination, amount, opts); + return asVow(() => { + const { helper } = this.facets; + const token = helper.amountToCoin(amount); + + const connectionInfoV = watch( + chainHub.getConnectionInfo( + this.state.chainAddress.chainId, + destination.chainId, + ), + ); + + // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` + // TODO #9324 what's a reasonable default? currently 5 minutes + const timeoutTimestampVowOrValue = + opts?.timeoutTimestamp ?? + (opts?.timeoutHeight + ? 0n + : E(timestampHelper).getTimeoutTimestampNS()); + + // Resolves when host chain successfully submits, but not when + // the receiving chain acknowledges. + // See https://github.com/Agoric/agoric-sdk/issues/9784 for a + // solution that tracks the acknowledgement on the receiving chain. + return watch( + allVows([connectionInfoV, timeoutTimestampVowOrValue]), + this.facets.transferWatcher, + { opts, token, destination }, + ); + }); + }, + + /** @type {HostOf} */ + transferSteps(amount, msg) { + console.log('transferSteps got', amount, msg); + return asVow(() => Fail`not yet implemented`); + }, + + /** @type {HostOf} */ + withdrawRewards() { + return asVow(() => Fail`Not Implemented. Try using withdrawReward.`); + }, + + /** @type {HostOf} */ + undelegate(delegations) { + return asVow(() => { + trace('undelegate', delegations); + const { helper } = this.facets; + const { chainAddress } = this.state; + + delegations.every(d => + d.delegator ? d.delegator.value === chainAddress.value : true, + ) || Fail`Some delegation record is for another delegator`; + + const undelegateV = watch( + E(helper.owned()).executeEncodedTx( + delegations.map(({ validator, amount }) => + Any.toJSON( + MsgUndelegate.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + amount: coerceCoin(chainHub, amount), + }), + ), + ), + ), + this.facets.undelegateWatcher, + ); + return watch(undelegateV, this.facets.returnVoidWatcher); + }); + }, + /** @type {HostOf} */ + deactivate() { + return asVow(() => watch(E(this.facets.helper.owned()).deactivate())); + }, + /** @type {HostOf} */ + reactivate() { + return asVow(() => watch(E(this.facets.helper.owned()).reactivate())); + }, + /** @type {HostOf} */ + getDelegation(validator) { + return asVow(() => { + trace('getDelegation', validator); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegationRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + validatorAddr: validator.value, + }), + ), + ]); + return watch(results, this.facets.delegationQueryWatcher); + }); + }, + /** @type {HostOf} */ + getDelegations() { + return asVow(() => { + trace('getDelegations'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegatorDelegationsRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.delegationsQueryWatcher); + }); + }, + /** @type {HostOf} */ + getUnbondingDelegation(validator) { + return asVow(() => { + trace('getUnbondingDelegation', validator); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryUnbondingDelegationRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + validatorAddr: validator.value, + }), + ), + ]); + return watch(results, this.facets.unbondingDelegationQueryWatcher); + }); + }, + /** @type {HostOf} */ + getUnbondingDelegations() { + return asVow(() => { + trace('getUnbondingDelegations'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegatorUnbondingDelegationsRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.unbondingDelegationsQueryWatcher); + }); + }, + /** @type {HostOf} */ + getRedelegations() { + return asVow(() => { + trace('getRedelegations'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryRedelegationsRequest.toProtoMsg({ + delegatorAddr: chainAddress.value, + // These are optional but the protobufs require values to be set + dstValidatorAddr: '', + srcValidatorAddr: '', + }), + ), + ]); + return watch(results, this.facets.redelegationsQueryWatcher); + }); + }, + /** @type {HostOf} */ + getReward(validator) { + return asVow(() => { + trace('getReward', validator); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegationRewardsRequest.toProtoMsg({ + delegatorAddress: chainAddress.value, + validatorAddress: validator.value, + }), + ), + ]); + return watch(results, this.facets.rewardQueryWatcher); + }); + }, + /** @type {HostOf} */ + getRewards() { + return asVow(() => { + trace('getRewards'); + const { chainAddress, icqConnection } = this.state; + if (!icqConnection) { + throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; + } + const results = E(icqConnection).query([ + toRequestQueryJson( + QueryDelegationTotalRewardsRequest.toProtoMsg({ + delegatorAddress: chainAddress.value, + }), + ), + ]); + return watch(results, this.facets.rewardsQueryWatcher); + }); + }, + /** @type {HostOf} */ + executeEncodedTx(msgs, opts) { + return asVow(() => + watch(E(this.facets.helper.owned()).executeEncodedTx(msgs, opts)), + ); + }, + }, + }, + ); + + return makeCosmosOrchestrationAccountKit; +}; + +/** + * @typedef {ReturnType< + * ReturnType + * >} CosmosOrchestrationAccountKit + */ + +/** + * @param {Zone} zone + * @param {object} powers + * @param {ChainHub} powers.chainHub + * @param {MakeRecorderKit} powers.makeRecorderKit + * @param {Remote} powers.timerService + * @param {VowTools} powers.vowTools + * @param {ZCF} powers.zcf + * @returns {( + * ...args: Parameters< + * ReturnType + * > + * ) => CosmosOrchestrationAccountKit['holder']} + */ +export const prepareCosmosOrchestrationAccount = ( + zone, + { chainHub, makeRecorderKit, timerService, vowTools, zcf }, +) => { + const makeKit = prepareCosmosOrchestrationAccountKit(zone, { + chainHub, + makeRecorderKit, + timerService, + vowTools, + zcf, + }); + return (...args) => makeKit(...args).holder; +}; +/** @typedef {CosmosOrchestrationAccountKit['holder']} CosmosOrchestrationAccount */ diff --git a/contract/src/exos/exo-interfaces.ts b/contract/src/exos/exo-interfaces.ts new file mode 100644 index 00000000..41f321d1 --- /dev/null +++ b/contract/src/exos/exo-interfaces.ts @@ -0,0 +1,35 @@ +import type { IBCConnectionID } from '@agoric/vats'; +import type { Vow } from '@agoric/vow'; +import type { IcaAccount } from '../cosmos-api.js'; +import type { ICAChannelAddressOpts } from '../utils/address.js'; +import type { ICQConnection } from './icq-connection-kit.js'; + +/** + * Authority to make a Cosmos interchain account or an interchain query connection. + */ +export interface CosmosInterchainService { + /** + * @param {string} chainId + * @param {IBCConnectionID} hostConnectionId the counterparty + * connection_id + * @param {IBCConnectionID} controllerConnectionId self connection_id + * @param {ICAChannelAddressOpts} [opts] optional to configure the + * channel address, such as version and ordering + * @returns {Vow} + */ + makeAccount( + chainId: string, + hostConnectionId: IBCConnectionID, + controllerConnectionId: IBCConnectionID, + opts?: ICAChannelAddressOpts | undefined, + ): Vow; + /** + * @param {IBCConnectionID} controllerConnectionId + * @param {string} [version] + * @returns {Vow | ICQConnection} + */ + provideICQConnection( + controllerConnectionId: IBCConnectionID, + version?: string | undefined, + ): Vow | ICQConnection; +} diff --git a/contract/src/exos/ibc-packet.js b/contract/src/exos/ibc-packet.js new file mode 100644 index 00000000..dd25ac55 --- /dev/null +++ b/contract/src/exos/ibc-packet.js @@ -0,0 +1,219 @@ +import { assertAllDefined } from '@agoric/internal'; +import { base64ToBytes, Shape as NetworkShape } from '@agoric/network'; +import { M } from '@endo/patterns'; +import { E } from '@endo/far'; + +// As specified in ICS20, the success result is a base64-encoded '\0x1' byte. +export const ICS20_TRANSFER_SUCCESS_RESULT = 'AQ=='; + +/** + * @import {JsonSafe, TypedJson, ResponseTo} from '@agoric/cosmic-proto'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; + * @import {PacketOptions} from './packet-tools.js'; + */ + +const { Fail, bare } = assert; +const { Vow$ } = NetworkShape; // TODO #9611 + +/** + * Create a pattern for alterative representations of a sequence number. + * + * @param {any} sequence + * @returns {Pattern} + */ +export const createSequencePattern = sequence => { + const sequencePatterns = []; + + try { + const bintSequence = BigInt(sequence); + bintSequence > 0n && sequencePatterns.push(bintSequence); + } catch (e) { + // ignore + } + + const numSequence = Number(sequence); + numSequence > 0 && + Number.isSafeInteger(numSequence) && + sequencePatterns.push(numSequence); + + const strSequence = String(sequence); + strSequence && sequencePatterns.push(strSequence); + + if (!sequencePatterns.find(seq => seq === sequence)) { + sequencePatterns.push(sequence); + } + + switch (sequencePatterns.length) { + case 0: + throw Fail`sequence ${sequence} is not valid`; + case 1: + return sequencePatterns[0]; + default: + return M.or(...sequencePatterns); + } +}; +harden(createSequencePattern); + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools & { makeIBCReplyKit: MakeIBCReplyKit }} powers + */ +export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => { + const makeIBCTransferSenderKit = zone.exoClassKit( + 'IBCTransferSenderKit', + { + public: M.interface('IBCTransferSender', { + sendPacket: M.call(Vow$(M.any()), M.any()).returns(Vow$(M.record())), + }), + responseWatcher: M.interface('responseWatcher', { + onFulfilled: M.call([M.record()], M.record()).returns(M.any()), + }), + verifyTransferSuccess: M.interface('verifyTransferSuccess', { + onFulfilled: M.call(M.any()).returns(), + }), + }, + /** + * @param {{ + * executeTx: LocalChainAccount['executeTx']; + * }} txExecutor + * @param {TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'>} transferMsg + */ + (txExecutor, transferMsg) => ({ + txExecutor, + transferMsg: harden(transferMsg), + }), + { + public: { + sendPacket(match, opts) { + const { txExecutor, transferMsg } = this.state; + return watch( + E(txExecutor).executeTx([transferMsg]), + this.facets.responseWatcher, + { opts, match }, + ); + }, + }, + responseWatcher: { + /** + * Wait for successfully sending the transfer packet. + * + * @param {[ + * JsonSafe< + * ResponseTo< + * TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'> + * > + * >, + * ]} response + * @param {Record} ctx + */ + onFulfilled([{ sequence }], ctx) { + const { match } = ctx; + const { transferMsg } = this.state; + + // Match the port/channel and sequence number. + const replyPacketPattern = M.splitRecord({ + source_port: transferMsg.sourcePort, + source_channel: transferMsg.sourceChannel, + sequence: createSequencePattern(sequence), + }); + + const { resultV: ackDataV, ...rest } = makeIBCReplyKit( + replyPacketPattern, + match, + ctx, + ); + const resultV = watch(ackDataV, this.facets.verifyTransferSuccess); + return harden({ resultV, ...rest }); + }, + }, + verifyTransferSuccess: { + onFulfilled(ackData) { + let obj; + try { + obj = JSON.parse(ackData); + } catch { + Fail`ICS20-1 transfer ack data is not JSON: ${ackData}`; + } + const { result, error } = obj; + error === undefined || Fail`ICS20-1 transfer error ${error}`; + result ?? Fail`Missing result in ICS20-1 transfer ack ${obj}`; + result === ICS20_TRANSFER_SUCCESS_RESULT || + Fail`ICS20-1 transfer unsuccessful with ack result ${result}`; + }, + }, + }, + ); + + /** + * @param {Parameters} args + */ + return (...args) => makeIBCTransferSenderKit(...args).public; +}; +harden(prepareIBCTransferSender); + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools} vowTools + */ +export const prepareIBCReplyKit = (zone, vowTools) => { + const { watch } = vowTools; + const ibcWatcher = zone.exo( + 'ibcResultWatcher', + M.interface('processIBCWatcher', { + onFulfilled: M.call(M.record(), M.record()).returns(Vow$(M.string())), + }), + { + onFulfilled({ event, acknowledgement }, { opName = 'unknown' }) { + assertAllDefined({ event, acknowledgement }); + switch (event) { + case 'acknowledgementPacket': + return base64ToBytes(acknowledgement); + case 'timeoutPacket': + throw Fail`${bare(opName)} operation received timeout packet`; + default: + throw Fail`Unexpected event: ${event}`; + } + }, + }, + ); + + /** + * @param {Pattern} replyPacketPattern + * @param {Vow} matchV + * @param {PacketOptions} opts + */ + const makeIBCReplyKit = (replyPacketPattern, matchV, opts) => { + const eventPattern = M.or( + M.splitRecord({ + event: 'acknowledgementPacket', + packet: replyPacketPattern, + acknowledgement: M.string(), + }), + M.splitRecord({ + event: 'timeoutPacket', + packet: replyPacketPattern, + }), + ); + const resultV = watch(matchV, ibcWatcher, opts); + return harden({ eventPattern, resultV }); + }; + + return makeIBCReplyKit; +}; +harden(prepareIBCReplyKit); +/** @typedef {ReturnType} MakeIBCReplyKit */ + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools} vowTools + */ +export const prepareIBCTools = (zone, vowTools) => { + const makeIBCReplyKit = prepareIBCReplyKit(zone, vowTools); + const makeIBCTransferSender = prepareIBCTransferSender(zone, { + makeIBCReplyKit, + ...vowTools, + }); + return harden({ makeIBCTransferSender, makeIBCReplyKit }); +}; +harden(prepareIBCTools); diff --git a/contract/src/exos/ica-account-kit.js b/contract/src/exos/ica-account-kit.js new file mode 100644 index 00000000..1802666b --- /dev/null +++ b/contract/src/exos/ica-account-kit.js @@ -0,0 +1,231 @@ +/** @file IcaAccount exo */ +import { Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { NonNullish, makeTracer } from '@agoric/internal'; +import { VowShape } from '@agoric/vow'; +import { + ChainAddressShape, + OutboundConnectionHandlerI, + Proto3Shape, + TxBodyOptsShape, +} from '../typeGuards.js'; +import { findAddressField } from '../utils/address.js'; +import { makeTxPacket, parseTxPacket } from '../utils/packet.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/base-zone'; + * @import {Connection, Port} from '@agoric/network'; + * @import {Remote, Vow, VowTools} from '@agoric/vow'; + * @import {AnyJson} from '@agoric/cosmic-proto'; + * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + * @import {ChainAddress, IcaAccount} from '../types.js'; + */ + +const trace = makeTracer('IcaAccountKit'); + +const UNPARSABLE_CHAIN_ADDRESS = 'UNPARSABLE_CHAIN_ADDRESS'; + +export const IcaAccountI = M.interface('IcaAccount', { + getAddress: M.call().returns(ChainAddressShape), + getLocalAddress: M.call().returns(M.string()), + getRemoteAddress: M.call().returns(M.string()), + getPort: M.call().returns(M.remotable('Port')), + executeTx: M.call(M.arrayOf(M.record())).returns(VowShape), + executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) + .optional(TxBodyOptsShape) + .returns(VowShape), + deactivate: M.call().returns(VowShape), + reactivate: M.call().returns(VowShape), +}); + +// XXX none of these modifiers are working to exclude this type from api-docs +/** + * @private + * @typedef {{ + * chainId: string; + * port: Port; + * connection: Remote | undefined; + * localAddress: LocalIbcAddress | undefined; + * requestedRemoteAddress: string; + * remoteAddress: RemoteIbcAddress | undefined; + * chainAddress: ChainAddress | undefined; + * isInitiatingClose: boolean; + * }} State + * Internal to the IcaAccountKit exo + * @internal + */ + +/** + * Used only by CosmosInterchainService + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @internal + */ +export const prepareIcaAccountKit = (zone, { watch, asVow }) => + zone.exoClassKit( + 'IcaAccountKit', + { + account: IcaAccountI, + connectionHandler: OutboundConnectionHandlerI, + parseTxPacketWatcher: M.interface('ParseTxPacketWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // does not need watcherContext + .returns(M.string()), + }), + }, + /** + * @param {string} chainId + * @param {Port} port + * @param {string} requestedRemoteAddress + */ + (chainId, port, requestedRemoteAddress) => + /** @type {State} */ ({ + chainId, + port, + connection: undefined, + requestedRemoteAddress, + remoteAddress: undefined, + chainAddress: undefined, + localAddress: undefined, + isInitiatingClose: false, + }), + { + parseTxPacketWatcher: { + /** @param {string} ack */ + onFulfilled(ack) { + return parseTxPacket(ack); + }, + }, + account: { + /** @returns {ChainAddress} */ + getAddress() { + return NonNullish( + this.state.chainAddress, + 'ICA channel creation acknowledgement not yet received.', + ); + }, + getLocalAddress() { + return NonNullish( + this.state.localAddress, + 'local address not available', + ); + }, + getRemoteAddress() { + return NonNullish( + this.state.remoteAddress, + 'remote address not available', + ); + }, + getPort() { + return this.state.port; + }, + executeTx() { + return asVow(() => Fail`not yet implemented`); + }, + /** + * Submit a transaction on behalf of the remote account for execution on + * the remote chain. + * + * @param {AnyJson[]} msgs + * @param {Omit} [opts] + * @returns {Vow} - base64 encoded bytes string. Can be decoded + * using the corresponding `Msg*Response` object. + * @throws {Error} if packet fails to send or an error is returned + */ + executeEncodedTx(msgs, opts) { + return asVow(() => { + const { connection } = this.state; + if (!connection) { + throw Fail`Account not available or deactivated.`; + } + return watch( + E(connection).send(makeTxPacket(msgs, opts)), + this.facets.parseTxPacketWatcher, + ); + }); + }, + /** @type {HostOf} */ + deactivate() { + return asVow(() => { + const { connection } = this.state; + if (!connection) throw Fail`Account not available or deactivated.`; + this.state.isInitiatingClose = true; + return E(connection).close(); + }); + }, + /** @type {HostOf} */ + reactivate() { + return asVow(() => { + const { connection, port, requestedRemoteAddress } = this.state; + if (connection) { + throw Fail`Account is already active.`; + } + return watch( + E(port).connect( + requestedRemoteAddress, + this.facets.connectionHandler, + ), + ); + }); + }, + }, + connectionHandler: { + /** + * @param {Remote} connection + * @param {LocalIbcAddress} localAddr + * @param {RemoteIbcAddress} remoteAddr + */ + async onOpen(connection, localAddr, remoteAddr) { + trace(`ICA Channel Opened for ${localAddr} at ${remoteAddr}`); + this.state.connection = connection; + this.state.remoteAddress = remoteAddr; + this.state.localAddress = localAddr; + const address = findAddressField(remoteAddr); + if (!address) { + console.error('⚠️ failed to parse chain address', remoteAddr); + } + this.state.chainAddress = harden({ + value: address || UNPARSABLE_CHAIN_ADDRESS, + chainId: this.state.chainId, + encoding: 'bech32', + }); + }, + /** + * This handler fires any time the connection (channel) closes. This + * could be due to external factors (e.g. a packet timeout), or a holder + * initiated action (`.deactivate()`). + * + * Here, if a connection is opened again, we clear the connection and + * addresses from state as they will change - a new channel will be + * established if the connection is reopened. + * + * If the holder did not initiate the closure, a new connection is + * established using the original requested remote address. This will + * result in a new channelID but the ChainAddress will be preserved. + * + * @param {Remote} _connection + * @param {unknown} reason + * @see {@link https://docs.cosmos.network/v0.45/ibc/overview.html#:~:text=In%20ORDERED%20channels%2C%20a%20timeout%20of%20a%20single%20packet%20in%20the%20channel%20closes%20the%20channel.} + */ + async onClose(_connection, reason) { + trace(`ICA Channel closed. Reason: ${reason}`); + this.state.connection = undefined; + this.state.localAddress = undefined; + this.state.remoteAddress = undefined; + if (this.state.isInitiatingClose === true) { + trace('Account deactivated by holder. Skipping reactivation.'); + this.state.isInitiatingClose = false; + } else { + trace('Account closed unexpectedly. Automatically reactivating.'); + void watch(this.facets.account.reactivate()); + } + }, + }, + }, + ); + +/** @typedef {ReturnType>} IcaAccountKit */ diff --git a/contract/src/exos/icq-connection-kit.js b/contract/src/exos/icq-connection-kit.js new file mode 100644 index 00000000..e01e4499 --- /dev/null +++ b/contract/src/exos/icq-connection-kit.js @@ -0,0 +1,132 @@ +/** @file ICQConnection Exo */ +import { Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { VowShape } from '@agoric/vow'; +import { NonNullish, makeTracer } from '@agoric/internal'; +import { makeQueryPacket, parseQueryPacket } from '../utils/packet.js'; +import { ICQMsgShape, OutboundConnectionHandlerI } from '../typeGuards.js'; + +/** + * @import {Zone} from '@agoric/base-zone'; + * @import {Connection, Port} from '@agoric/network'; + * @import {Remote, Vow, VowTools} from '@agoric/vow'; + * @import {JsonSafe} from '@agoric/cosmic-proto'; + * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +const trace = makeTracer('Orchestration:ICQConnection'); + +export const ICQConnectionI = M.interface('ICQConnection', { + getLocalAddress: M.call().returns(M.string()), + getRemoteAddress: M.call().returns(M.string()), + query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), +}); + +/** + * @typedef {{ + * port: Port; + * connection: Remote | undefined; + * localAddress: LocalIbcAddress | undefined; + * remoteAddress: RemoteIbcAddress | undefined; + * }} ICQConnectionKitState + */ + +/** + * Used only by CosmosInterchainService + * + * Prepares an ICQ Connection Kit based on the + * {@link https://github.com/cosmos/ibc-apps/blob/e9b46e4bf0ad0a66cf6bc53b5e5496f6e2b4b02b/modules/async-icq/README.md | `icq/v1` IBC application protocol}. + * + * `icq/v1`, also referred to as `async-icq`, is a protocol for asynchronous + * queries between IBC-enabled chains. It allows a chain to send queries to + * another chain and receive responses asynchronously. + * + * The ICQ connection kit provides the necessary functionality to establish and + * manage an ICQ connection between two chains. It includes methods for + * retrieving the local and remote addresses of the connection, as well as + * sending queries and handling connection events. + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @internal + */ +export const prepareICQConnectionKit = (zone, { watch, asVow }) => + zone.exoClassKit( + 'ICQConnectionKit', + { + connection: ICQConnectionI, + connectionHandler: OutboundConnectionHandlerI, + parseQueryPacketWatcher: M.interface('ParseQueryPacketWatcher', { + onFulfilled: M.call(M.string()) + .optional(M.arrayOf(M.undefined())) // does not need watcherContext + .returns(M.arrayOf(M.record())), + }), + }, + /** @param {Port} port */ + port => + /** @type {ICQConnectionKitState} */ ({ + port, + connection: undefined, + remoteAddress: undefined, + localAddress: undefined, + }), + { + connection: { + getLocalAddress() { + return NonNullish( + this.state.localAddress, + 'local address not available', + ); + }, + getRemoteAddress() { + return NonNullish( + this.state.remoteAddress, + 'remote address not available', + ); + }, + /** + * Vow rejects if packet fails to send or an error is returned + * + * @param {JsonSafe[]} msgs + * @returns {Vow[]>} + */ + query(msgs) { + return asVow(() => { + const { connection } = this.state; + if (!connection) throw Fail`connection not available`; + return watch( + E(connection).send(makeQueryPacket(msgs)), + this.facets.parseQueryPacketWatcher, + ); + }); + }, + }, + parseQueryPacketWatcher: { + /** @param {string} ack packet acknowledgement string */ + onFulfilled(ack) { + return parseQueryPacket(ack); + }, + }, + connectionHandler: { + /** + * @param {Remote} connection + * @param {LocalIbcAddress} localAddr + * @param {RemoteIbcAddress} remoteAddr + */ + async onOpen(connection, localAddr, remoteAddr) { + trace(`ICQ Channel Opened for ${localAddr} at ${remoteAddr}`); + this.state.connection = connection; + this.state.remoteAddress = remoteAddr; + this.state.localAddress = localAddr; + }, + async onClose(_connection, reason) { + trace(`ICQ Channel closed. Reason: ${reason}`); + }, + }, + }, + ); + +/** @typedef {ReturnType>} ICQConnectionKit */ +/** @typedef {ICQConnectionKit['connection']} ICQConnection */ diff --git a/contract/src/exos/local-chain-facade.js b/contract/src/exos/local-chain-facade.js new file mode 100644 index 00000000..7f4ace2d --- /dev/null +++ b/contract/src/exos/local-chain-facade.js @@ -0,0 +1,196 @@ +/** @file Localchain Facade exo */ +import { E } from '@endo/far'; +// eslint-disable-next-line no-restricted-syntax -- just the import +import { heapVowE } from '@agoric/vow/vat.js'; +import { M } from '@endo/patterns'; +import { pickFacet } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; + +import { chainFacadeMethods, TypedJsonShape } from '../typeGuards.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/base-zone'; + * @import {TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + * @import {LocalChain, LocalChainAccount, QueryManyFn} from '@agoric/vats/src/localchain.js'; + * @import {AssetInfo} from '@agoric/vats/src/vat-bank.js'; + * @import {NameHub} from '@agoric/vats'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {CosmosInterchainService} from './exo-interfaces.js'; + * @import {LocalOrchestrationAccountKit, MakeLocalOrchestrationAccountKit} from './local-orchestration-account.js'; + * @import {Chain, ChainAddress, ChainInfo, CosmosChainInfo, IBCConnectionInfo, OrchestrationAccount} from '../types.js'; + */ + +/** + * Chain facade methods unique to the Agoric (local) chain. + * + * @typedef {object} AgoricChainMethods + * @property {() => Promise} getVBankAssetInfo Get asset info from + * agoricNames.vbankAsset. + * + * Caches the query to agoricNames in the first call. + */ + +/** + * @typedef {{ + * makeLocalOrchestrationAccountKit: MakeLocalOrchestrationAccountKit; + * orchestration: Remote; + * storageNode: Remote; + * agoricNames: Remote; + * timer: Remote; + * localchain: Remote; + * vowTools: VowTools; + * }} LocalChainFacadePowers + */ + +/** + * @param {Zone} zone + * @param {LocalChainFacadePowers} powers + */ +const prepareLocalChainFacadeKit = ( + zone, + { + makeLocalOrchestrationAccountKit, + agoricNames, + localchain, + // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 + // consider making an `accounts` childNode + storageNode, + vowTools: { allVows, watch, asVow }, + }, +) => + zone.exoClassKit( + 'LocalChainFacade', + { + public: M.interface('LocalChainFacade', { + ...chainFacadeMethods, + query: M.call(M.arrayOf(TypedJsonShape)).returns(VowShape), + getVBankAssetInfo: M.call().optional(M.boolean()).returns(VowShape), + }), + vbankAssetValuesWatcher: M.interface('vbankAssetValuesWatcher', { + onFulfilled: M.call(M.arrayOf(M.record())) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(VowShape), + }), + makeAccountWatcher: M.interface('makeAccountWatcher', { + onFulfilled: M.call([M.remotable('LCA Account'), M.string()]) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(VowShape), + }), + makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { + onFulfilled: M.call(M.remotable()) + .optional({ account: M.remotable(), address: M.string() }) // empty context + .returns(M.remotable()), + }), + }, + /** + * @param {CosmosChainInfo} localChainInfo + */ + localChainInfo => { + return { + localChainInfo, + vbankAssets: /** @type {AssetInfo[] | undefined} */ (undefined), + }; + }, + { + public: { + getChainInfo() { + return watch(this.state.localChainInfo); + }, + + /** @returns {Vow} */ + makeAccount() { + const lcaP = E(localchain).makeAccount(); + return watch( + // XXX makeAccount returns a Promise for an exo but reserves being able to return a vow + // so we use heapVowE to shorten the promise path + // eslint-disable-next-line no-restricted-syntax -- will run in one turn + allVows([lcaP, heapVowE(lcaP).getAddress()]), + this.facets.makeAccountWatcher, + ); + }, + /** @type {HostOf['query']>} */ + query(requests) { + return watch(E(localchain).queryMany(requests)); + }, + /** @type {HostOf} */ + getVBankAssetInfo() { + return asVow(() => { + const { vbankAssets } = this.state; + if (vbankAssets) { + return vbankAssets; + } + const vbankAssetNameHubP = E(agoricNames).lookup('vbankAsset'); + const vbankAssetValuesP = E(vbankAssetNameHubP).values(); + const { vbankAssetValuesWatcher } = this.facets; + return watch(vbankAssetValuesP, vbankAssetValuesWatcher); + }); + }, + }, + vbankAssetValuesWatcher: { + /** + * @param {AssetInfo[]} assets + */ + onFulfilled(assets) { + const { state } = this; + return asVow(() => { + state.vbankAssets = assets; + return assets; + }); + }, + }, + makeAccountWatcher: { + /** + * @param {[LocalChainAccount, ChainAddress['value']]} results + */ + onFulfilled([account, address]) { + return watch( + E(storageNode).makeChildNode(address), + this.facets.makeChildNodeWatcher, + { account, address }, + ); + }, + }, + makeChildNodeWatcher: { + /** + * @param {Remote} childNode + * @param {{ + * account: LocalChainAccount; + * address: ChainAddress['value']; + * }} ctx + */ + onFulfilled(childNode, { account, address }) { + const { localChainInfo } = this.state; + const { holder } = makeLocalOrchestrationAccountKit({ + account, + address: harden({ + value: address, + encoding: 'bech32', + chainId: localChainInfo.chainId, + }), + // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 + storageNode: childNode, + }); + return holder; + }, + }, + }, + ); +harden(prepareLocalChainFacadeKit); + +/** + * Used only by `withOrchestration` helper + * + * @param {Zone} zone + * @param {LocalChainFacadePowers} powers + * @internal + */ +export const prepareLocalChainFacade = (zone, powers) => { + const makeLocalChainFacadeKit = prepareLocalChainFacadeKit(zone, powers); + return pickFacet(makeLocalChainFacadeKit, 'public'); +}; +harden(prepareLocalChainFacade); + +/** @typedef {ReturnType} MakeLocalChainFacade */ +/** @typedef {ReturnType} LocalChainFacade */ diff --git a/contract/src/exos/local-orchestration-account.js b/contract/src/exos/local-orchestration-account.js new file mode 100644 index 00000000..bc5e1f2a --- /dev/null +++ b/contract/src/exos/local-orchestration-account.js @@ -0,0 +1,747 @@ +/** @file Use-object for the owner of a localchain account */ +import { typedJson } from '@agoric/cosmic-proto'; +import { AmountShape, PaymentShape } from '@agoric/ertp'; +import { makeTracer } from '@agoric/internal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { M } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { E } from '@endo/far'; +import { Fail, q } from '@endo/errors'; + +import { + AmountArgShape, + AnyNatAmountsRecord, + ChainAddressShape, + DenomAmountShape, + DenomShape, + IBCTransferOptionsShape, + TimestampProtoShape, + TypedJsonShape, +} from '../typeGuards.js'; +import { maxClockSkew, toDenomAmount } from '../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../utils/time.js'; +import { preparePacketTools } from './packet-tools.js'; +import { prepareIBCTools } from './ibc-packet.js'; +import { coerceCoin, coerceDenomAmount } from '../utils/amounts.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {LocalChain, LocalChainAccount} from '@agoric/vats/src/localchain.js'; + * @import {AmountArg, ChainAddress, DenomAmount, IBCMsgTransferOptions, IBCConnectionInfo, OrchestrationAccountI, LocalAccountMethods} from '@agoric/orchestration'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. + * @import {Zone} from '@agoric/zone'; + * @import {Remote} from '@agoric/internal'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {TimerService, TimestampRecord} from '@agoric/time'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {TypedJson, JsonSafe, ResponseTo} from '@agoric/cosmic-proto'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + * @import {Matcher} from '@endo/patterns'; + * @import {ChainHub} from './chain-hub.js'; + * @import {PacketTools} from './packet-tools.js'; + * @import {ZoeTools} from '../utils/zoe-tools.js'; + */ + +const trace = makeTracer('LOA'); + +const { Vow$ } = NetworkShape; // TODO #9611 + +const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); + +/** + * @typedef {object} LocalChainAccountNotification + * @property {string} address + */ + +/** + * @private + * @typedef {{ + * topicKit: RecorderKit; + * packetTools: PacketTools; + * account: LocalChainAccount; + * address: ChainAddress; + * }} State + * Internal to the LocalOrchestrationAccount exo + */ + +const HolderI = M.interface('holder', { + ...orchestrationAccountMethods, + delegate: M.call(M.string(), AmountShape).returns(VowShape), + undelegate: M.call(M.string(), AmountShape).returns(VowShape), + deposit: M.call(PaymentShape).returns(VowShape), + withdraw: M.call(AmountShape).returns(Vow$(PaymentShape)), + executeTx: M.call(M.arrayOf(M.record())).returns(Vow$(M.record())), + sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) + .optional(M.any()) + .returns(EVow$(M.string())), + matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), + monitorTransfers: M.call(M.remotable('TargetApp')).returns(EVow$(M.any())), +}); + +/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ +const PUBLIC_TOPICS = { + account: ['Account holder status', M.any()], +}; + +/** + * @param {Zone} zone + * @param {object} powers + * @param {MakeRecorderKit} powers.makeRecorderKit + * @param {ZCF} powers.zcf + * @param {Remote} powers.timerService + * @param {VowTools} powers.vowTools + * @param {ChainHub} powers.chainHub + * @param {Remote} powers.localchain + * @param {ZoeTools} powers.zoeTools + */ +export const prepareLocalOrchestrationAccountKit = ( + zone, + { + makeRecorderKit, + zcf, + timerService, + vowTools, + chainHub, + localchain, + zoeTools, + }, +) => { + const { watch, allVows, asVow, when } = vowTools; + const { makeIBCTransferSender } = prepareIBCTools( + zone.subZone('ibcTools'), + vowTools, + ); + const makePacketTools = preparePacketTools( + zone.subZone('packetTools'), + vowTools, + ); + const timestampHelper = makeTimestampHelper(timerService); + + /** Make an object wrapping an LCA with Zoe interfaces. */ + const makeLocalOrchestrationAccountKit = zone.exoClassKit( + 'Local Orchestration Account Kit', + { + helper: M.interface('helper', { + amountToCoin: M.call(AmountArgShape).returns(M.record()), + }), + holder: HolderI, + undelegateWatcher: M.interface('undelegateWatcher', { + onFulfilled: M.call([ + M.splitRecord({ completionTime: TimestampProtoShape }), + ]) + .optional(M.arrayOf(M.undefined())) // empty context + .returns(VowShape), + }), + transferWatcher: M.interface('transferWatcher', { + onFulfilled: M.call([M.record(), M.nat()]) + .optional({ + destination: ChainAddressShape, + opts: M.or(M.undefined(), IBCTransferOptionsShape), + amount: DenomAmountShape, + }) + .returns(Vow$(M.record())), + }), + extractFirstResultWatcher: M.interface('extractFirstResultWatcher', { + onFulfilled: M.call([M.record()]) + .optional(M.arrayOf(M.undefined())) + .returns(M.any()), + }), + returnVoidWatcher: M.interface('returnVoidWatcher', { + onFulfilled: M.call(M.any()).optional(M.any()).returns(M.undefined()), + }), + seatExiterHandler: M.interface('seatExiterHandler', { + onFulfilled: M.call(M.undefined(), M.remotable()).returns( + M.undefined(), + ), + onRejected: M.call(M.error(), M.remotable()).returns(M.undefined()), + }), + getBalanceWatcher: M.interface('getBalanceWatcher', { + onFulfilled: M.call(AmountShape, DenomShape).returns(DenomAmountShape), + }), + queryBalanceWatcher: M.interface('queryBalanceWatcher', { + onFulfilled: M.call(TypedJsonShape).returns(DenomAmountShape), + }), + queryBalancesWatcher: M.interface('queryBalancesWatcher', { + onFulfilled: M.call(TypedJsonShape).returns( + M.arrayOf(DenomAmountShape), + ), + }), + invitationMakers: M.interface('invitationMakers', { + CloseAccount: M.call().returns(M.promise()), + Delegate: M.call(M.string(), AmountShape).returns(M.promise()), + Deposit: M.call().returns(M.promise()), + Send: M.call().returns(M.promise()), + SendAll: M.call().returns(M.promise()), + Transfer: M.call().returns(M.promise()), + Undelegate: M.call(M.string(), AmountShape).returns(M.promise()), + Withdraw: M.call().returns(M.promise()), + }), + }, + /** + * @param {object} initState + * @param {LocalChainAccount} initState.account + * @param {ChainAddress} initState.address + * @param {Remote} initState.storageNode + * @returns {State} + */ + ({ account, address, storageNode }) => { + // must be the fully synchronous maker because the kit is held in durable state + const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); + // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 + void E(topicKit.recorder).write(''); + const packetTools = makePacketTools(account); + + return { account, address, topicKit, packetTools }; + }, + { + helper: { + /** + * @param {AmountArg} amount + * @returns {Coin} + */ + amountToCoin(amount) { + return coerceCoin(chainHub, amount); + }, + }, + invitationMakers: { + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + */ + Delegate(validatorAddress, ertpAmount) { + trace('Delegate', validatorAddress, ertpAmount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch( + this.facets.holder.delegate(validatorAddress, ertpAmount), + ); + }, 'Delegate'); + }, + Deposit() { + trace('Deposit'); + return zcf.makeInvitation( + seat => { + const { give } = seat.getProposal(); + return watch( + zoeTools.localTransfer( + seat, + // @ts-expect-error LocalAccount vs LocalAccountMethods + this.state.account, + give, + ), + this.facets.seatExiterHandler, + seat, + ); + }, + 'Deposit', + undefined, + M.splitRecord({ give: AnyNatAmountsRecord, want: {} }), + ); + }, + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + */ + Undelegate(validatorAddress, ertpAmount) { + trace('Undelegate', validatorAddress, ertpAmount); + + return zcf.makeInvitation(seat => { + seat.exit(); + return watch( + this.facets.holder.undelegate(validatorAddress, ertpAmount), + ); + }, 'Undelegate'); + }, + CloseAccount() { + throw Error('not yet implemented'); + }, + Send() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amount: AmountArg } + * >} + */ + const offerHandler = (seat, { toAccount, amount }) => { + seat.exit(); + return watch(this.facets.holder.send(toAccount, amount)); + }; + return zcf.makeInvitation(offerHandler, 'Send'); + }, + SendAll() { + /** + * @type {OfferHandler< + * Vow, + * { toAccount: ChainAddress; amounts: AmountArg[] } + * >} + */ + const offerHandler = (seat, { toAccount, amounts }) => { + seat.exit(); + return watch(this.facets.holder.sendAll(toAccount, amounts)); + }; + return zcf.makeInvitation(offerHandler, 'SendAll'); + }, + Transfer() { + /** + * @type {OfferHandler< + * Vow, + * { + * amount: AmountArg; + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * } + * >} + */ + const offerHandler = (seat, { amount, destination, opts }) => { + seat.exit(); + return watch( + this.facets.holder.transfer(destination, amount, opts), + ); + }; + return zcf.makeInvitation(offerHandler, 'Transfer'); + }, + Withdraw() { + trace('Withdraw'); + return zcf.makeInvitation( + seat => { + const { want } = seat.getProposal(); + return watch( + zoeTools.withdrawToSeat( + // @ts-expect-error LocalAccount vs LocalAccountMethods + this.state.account, + seat, + want, + ), + this.facets.seatExiterHandler, + seat, + ); + }, + 'Withdraw', + undefined, + M.splitRecord({ give: {}, want: AnyNatAmountsRecord }), + ); + }, + }, + undelegateWatcher: { + /** + * @param {[ + * JsonSafe< + * TypedJson<'/cosmos.staking.v1beta1.MsgUndelegateResponse'> + * >, + * ]} response + */ + onFulfilled(response) { + const { completionTime } = response[0]; + return watch( + E(timerService).wakeAt( + // ignore nanoseconds and just use seconds from Timestamp + BigInt(completionTime.seconds) + maxClockSkew, + ), + this.facets.returnVoidWatcher, + ); + }, + }, + transferWatcher: { + /** + * @param {[ + * { transferChannel: IBCConnectionInfo['transferChannel'] }, + * bigint, + * ]} results + * @param {{ + * destination: ChainAddress; + * opts?: IBCMsgTransferOptions; + * amount: DenomAmount; + * }} ctx + */ + onFulfilled( + [{ transferChannel }, timeoutTimestamp], + { opts, amount, destination }, + ) { + const transferMsg = typedJson( + '/ibc.applications.transfer.v1.MsgTransfer', + { + sourcePort: transferChannel.portId, + sourceChannel: transferChannel.channelId, + token: { + amount: String(amount.value), + denom: amount.denom, + }, + sender: this.state.address.value, + receiver: destination.value, + timeoutHeight: opts?.timeoutHeight ?? { + revisionHeight: 0n, + revisionNumber: 0n, + }, + timeoutTimestamp, + memo: opts?.memo ?? '', + }, + ); + + const { holder } = this.facets; + const sender = makeIBCTransferSender( + /** @type {any} */ (holder), + transferMsg, + ); + // Begin capturing packets, send the transfer packet, then return a + // vow that rejects unless the packet acknowledgment comes back and is + // verified. + return holder.sendThenWaitForAck(sender); + }, + }, + /** + * takes an array of results (from `executeEncodedTx`) and returns the + * first result + */ + extractFirstResultWatcher: { + /** + * @param {Record[]} results + */ + onFulfilled(results) { + results.length === 1 || + Fail`expected exactly one result; got ${results}`; + return results[0]; + }, + }, + returnVoidWatcher: { + onFulfilled() { + return undefined; + }, + }, + /** + * handles a request for balance from a bank purse and returns the balance + * as a Chain Amount + */ + getBalanceWatcher: { + /** + * @param {Amount<'nat'>} natAmount + * @param {DenomAmount['denom']} denom + * @returns {DenomAmount} + */ + onFulfilled(natAmount, denom) { + return harden({ denom, value: natAmount.value }); + }, + }, + /** exits or fails a seat depending the outcome */ + seatExiterHandler: { + /** + * @param {undefined} _ + * @param {ZCFSeat} seat + */ + onFulfilled(_, seat) { + seat.exit(); + }, + /** + * @param {Error} reason + * @param {ZCFSeat} seat + */ + onRejected(reason, seat) { + seat.exit(reason); + throw reason; + }, + }, + /** + * handles a QueryBalanceRequest from localchain.query and returns the + * balance as a DenomAmount + */ + queryBalanceWatcher: { + /** + * @param {ResponseTo< + * TypedJson<'/cosmos.bank.v1beta1.QueryBalanceRequest'> + * >} result + * @returns {DenomAmount} + */ + onFulfilled(result) { + const { balance } = result; + if (!balance || !balance?.denom) { + throw Fail`Expected balance ${q(result)};`; + } + return harden(toDenomAmount(balance)); + }, + }, + /** + * handles a QueryAllBalancesRequest from localchain.query and returns the + * balances as a DenomAmounts + */ + queryBalancesWatcher: { + /** + * @param {JsonSafe< + * ResponseTo< + * TypedJson<'/cosmos.bank.v1beta1.QueryAllBalancesRequest'> + * > + * >} result + * @returns {DenomAmount[]} + */ + onFulfilled(result) { + const { balances } = result; + if (!balances || !Array.isArray(balances)) { + throw Fail`Expected balances ${q(result)};`; + } + return harden(balances.map(toDenomAmount)); + }, + }, + holder: { + /** @type {HostOf} */ + asContinuingOffer() { + // @ts-expect-error XXX invitationMakers + // getPublicTopics resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { holder, invitationMakers: im } = this.facets; + // XXX cast to a type that has string index signature + const invitationMakers = /** @type {InvitationMakers} */ ( + /** @type {unknown} */ (im) + ); + + return harden({ + // getPublicTopics returns a vow, for membrane compatibility. + // it's safe to unwrap to a promise and get the result as we + // expect this complete in the same run + publicSubscribers: await when(holder.getPublicTopics()), + invitationMakers, + }); + }); + }, + /** + * @type {HostOf} + */ + getBalance(denomArg) { + return asVow(() => { + const [brand, denom] = + typeof denomArg === 'string' + ? [chainHub.getAsset(denomArg)?.brand, denomArg] + : [denomArg, chainHub.getDenom(denomArg)]; + + if (!denom) { + throw Fail`No denom for brand: ${denomArg}`; + } + + if (brand) { + return watch( + E(this.state.account).getBalance(brand), + this.facets.getBalanceWatcher, + denom, + ); + } + + return watch( + E(localchain).query( + typedJson('/cosmos.bank.v1beta1.QueryBalanceRequest', { + address: this.state.address.value, + denom, + }), + ), + this.facets.queryBalanceWatcher, + ); + }); + }, + /** @type {HostOf} */ + getBalances() { + return watch( + E(localchain).query( + typedJson('/cosmos.bank.v1beta1.QueryAllBalancesRequest', { + address: this.state.address.value, + }), + ), + this.facets.queryBalancesWatcher, + ); + }, + + /** + * @type {HostOf} + */ + getPublicTopics() { + // getStoragePath resolves promptly (same run), so we don't need a watcher + // eslint-disable-next-line no-restricted-syntax + return asVow(async () => { + await null; + const { topicKit } = this.state; + return harden({ + account: { + description: PUBLIC_TOPICS.account[0], + subscriber: topicKit.subscriber, + storagePath: await topicKit.recorder.getStoragePath(), + }, + }); + }); + }, + // FIXME take ChainAddress to match OrchestrationAccountI + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + */ + delegate(validatorAddress, ertpAmount) { + const { account: lca } = this.state; + + const amount = coerceCoin(chainHub, ertpAmount); + + return watch( + E(lca).executeTx([ + typedJson('/cosmos.staking.v1beta1.MsgDelegate', { + amount, + validatorAddress, + delegatorAddress: this.state.address.value, + }), + ]), + this.facets.extractFirstResultWatcher, + ); + }, + // FIXME take ChainAddress to match OrchestrationAccountI + /** + * @param {string} validatorAddress + * @param {Amount<'nat'>} ertpAmount + * @returns {Vow} + */ + undelegate(validatorAddress, ertpAmount) { + const amount = coerceCoin(chainHub, ertpAmount); + const { account: lca } = this.state; + return watch( + E(lca).executeTx([ + typedJson('/cosmos.staking.v1beta1.MsgUndelegate', { + amount, + validatorAddress, + delegatorAddress: this.state.address.value, + }), + ]), + this.facets.undelegateWatcher, + ); + }, + /** + * Starting a transfer revokes the account holder. The associated + * updater will get a special notification that the account is being + * transferred. + */ + /** @type {HostOf} */ + deposit(payment) { + return watch( + E(this.state.account).deposit(payment), + this.facets.returnVoidWatcher, + ); + }, + /** @type {HostOf} */ + withdraw(amount) { + return watch(E(this.state.account).withdraw(amount)); + }, + /** @type {HostOf} */ + executeTx(messages) { + return watch(E(this.state.account).executeTx(messages)); + }, + /** @type {OrchestrationAccountI['getAddress']} */ + getAddress() { + return this.state.address; + }, + /** + * XXX consider using ERTP to send if it's vbank asset + * + * @type {HostOf} + */ + send(toAccount, amount) { + return asVow(() => { + trace('send', toAccount, amount); + const { helper } = this.facets; + return watch( + E(this.state.account).executeTx([ + typedJson('/cosmos.bank.v1beta1.MsgSend', { + amount: [helper.amountToCoin(amount)], + toAddress: toAccount.value, + fromAddress: this.state.address.value, + }), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + /** + * XXX consider using ERTP to send if it's vbank asset + * + * @type {HostOf} + */ + sendAll(toAccount, amounts) { + return asVow(() => { + trace('sendAll', toAccount, amounts); + const { helper } = this.facets; + return watch( + E(this.state.account).executeTx([ + typedJson('/cosmos.bank.v1beta1.MsgSend', { + amount: amounts.map(a => helper.amountToCoin(a)), + toAddress: toAccount.value, + fromAddress: this.state.address.value, + }), + ]), + this.facets.returnVoidWatcher, + ); + }); + }, + /** + * @param {ChainAddress} destination + * @param {AmountArg} amount an ERTP {@link Amount} or a + * {@link DenomAmount} + * @param {IBCMsgTransferOptions} [opts] if either timeoutHeight or + * timeoutTimestamp are not supplied, a default timeoutTimestamp will + * be set for 5 minutes in the future + * @returns {Vow} + */ + transfer(destination, amount, opts) { + return asVow(() => { + trace('Transferring funds from LCA over IBC'); + + const connectionInfoV = watch( + chainHub.getConnectionInfo( + this.state.address.chainId, + destination.chainId, + ), + ); + + // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` + // TODO #9324 what's a reasonable default? currently 5 minutes + const timeoutTimestampVowOrValue = + opts?.timeoutTimestamp ?? + (opts?.timeoutHeight + ? 0n + : E(timestampHelper).getTimeoutTimestampNS()); + + // don't resolve the vow until the transfer is confirmed on remote + // and reject vow if the transfer fails for any reason + const resultV = watch( + allVows([connectionInfoV, timeoutTimestampVowOrValue]), + this.facets.transferWatcher, + { + opts, + amount: coerceDenomAmount(chainHub, amount), + destination, + }, + ); + return resultV; + }); + }, + /** @type {HostOf} */ + transferSteps(amount, msg) { + return asVow(() => { + console.log('transferSteps got', amount, msg); + throw Fail`not yet implemented`; + }); + }, + /** @type {HostOf} */ + sendThenWaitForAck(sender, opts) { + return watch( + E(this.state.packetTools).sendThenWaitForAck(sender, opts), + ); + }, + /** @type {HostOf} */ + matchFirstPacket(patternV) { + return watch(E(this.state.packetTools).matchFirstPacket(patternV)); + }, + /** @type {HostOf} */ + monitorTransfers(tap) { + return watch(E(this.state.packetTools).monitorTransfers(tap)); + }, + }, + }, + ); + return makeLocalOrchestrationAccountKit; +}; + +/** @typedef {ReturnType} MakeLocalOrchestrationAccountKit */ +/** @typedef {ReturnType} LocalOrchestrationAccountKit */ diff --git a/contract/src/exos/orchestrator.js b/contract/src/exos/orchestrator.js new file mode 100644 index 00000000..70e02ee6 --- /dev/null +++ b/contract/src/exos/orchestrator.js @@ -0,0 +1,196 @@ +/** @file Orchestrator exo */ +import { AmountShape } from '@agoric/ertp'; +import { pickFacet } from '@agoric/vat-data'; +import { makeTracer } from '@agoric/internal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { Fail, q } from '@endo/errors'; +import { M } from '@endo/patterns'; +import { + DenomInfoShape, + ChainInfoShape, + DenomAmountShape, + DenomShape, +} from '../typeGuards.js'; + +/** + * @import {Zone} from '@agoric/base-zone'; + * @import {ActualChainInfo, ChainHub} from './chain-hub.js'; + * @import {AsyncFlowTools, HostInterface, HostOf} from '@agoric/async-flow'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {TimerService} from '@agoric/time'; + * @import {LocalChain} from '@agoric/vats/src/localchain.js'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. + * @import {Remote} from '@agoric/internal'; + * @import {PickFacet} from '@agoric/swingset-liveslots'; + * @import {CosmosInterchainService} from './exo-interfaces.js'; + * @import {MakeLocalChainFacade} from './local-chain-facade.js'; + * @import {MakeRemoteChainFacade} from './remote-chain-facade.js'; + * @import {Chain, ChainInfo, IBCConnectionInfo, KnownChains, Orchestrator} from '../types.js'; + */ + +const { Vow$ } = NetworkShape; // TODO #9611 +const trace = makeTracer('Orchestrator'); + +/** @see {Orchestrator} */ +export const OrchestratorI = M.interface('Orchestrator', { + getChain: M.call(M.string()).returns(Vow$(ChainInfoShape)), + getDenomInfo: M.call(DenomShape).returns(DenomInfoShape), + asAmount: M.call(DenomAmountShape).returns(AmountShape), +}); + +/** + * @param {Zone} zone + * @param {{ + * chainHub: ChainHub; + * makeLocalChainFacade: MakeLocalChainFacade; + * makeRemoteChainFacade: MakeRemoteChainFacade; + * vowTools: VowTools; + * }} powers + */ +const prepareOrchestratorKit = ( + zone, + { + chainHub, + makeLocalChainFacade, + makeRemoteChainFacade, + vowTools: { watch, asVow }, + }, +) => { + /** + * @template T + * @typedef {{ vow: Vow; pending: true } | { value: T; pending: false }} MaybePendingValue + */ + + /** @type {MapStore>>} */ + const chainByName = zone.mapStore('chainName'); + + return zone.exoClassKit( + 'Orchestrator', + { + orchestrator: OrchestratorI, + makeLocalChainFacadeWatcher: M.interface('makeLocalChainFacadeWatcher', { + onFulfilled: M.call(M.record()).returns(M.remotable()), + }), + makeRemoteChainFacadeWatcher: M.interface( + 'makeRemoteChainFacadeWatcher', + { + onFulfilled: M.call(M.any(), M.string()) + .optional(M.arrayOf(M.undefined())) // XXX needed? + .returns(M.remotable()), + }, + ), + }, + () => { + trace('making an Orchestrator'); + return {}; + }, + { + /** Waits for `chainInfo` and returns a LocalChainFacade */ + makeLocalChainFacadeWatcher: { + /** + * @param {ActualChainInfo<'agoric'>} agoricChainInfo + */ + onFulfilled(agoricChainInfo) { + const it = makeLocalChainFacade(agoricChainInfo); + chainByName.set('agoric', harden({ value: it, pending: false })); + return it; + }, + }, + /** + * Waits for `chainInfo` for `agoric` and a remote chain and returns a + * RemoteChainFacade + */ + makeRemoteChainFacadeWatcher: { + /** + * Waits for `chainInfo` for `agoric` and a remote chain and returns a + * RemoteChainFacade + * + * @param {[ChainInfo, ChainInfo, IBCConnectionInfo]} chainsAndConnection + * @param {string} name + */ + onFulfilled([_agoricChainInfo, remoteChainInfo, connectionInfo], name) { + const it = makeRemoteChainFacade(remoteChainInfo, connectionInfo); + chainByName.set(name, harden({ value: it, pending: false })); + return it; + }, + }, + orchestrator: { + /** @type {HostOf} */ + getChain(name) { + return asVow(() => { + if (chainByName.has(name)) { + const maybeChain = chainByName.get(name); + return maybeChain.pending ? maybeChain.vow : maybeChain.value; + } + const vow = + name === 'agoric' + ? watch( + chainHub.getChainInfo('agoric'), + this.facets.makeLocalChainFacadeWatcher, + ) + : watch( + chainHub.getChainsAndConnection('agoric', name), + this.facets.makeRemoteChainFacadeWatcher, + name, + ); + chainByName.init(name, harden({ vow, pending: true })); + return vow; + }); + }, + /** @type {HostOf} */ + getDenomInfo(denom) { + const denomDetail = chainHub.getAsset(denom); + if (!denomDetail) throw Fail`No denom detail for ${q(denom)}`; + const { chainName, baseName, baseDenom, brand } = denomDetail; + chainByName.has(chainName) || + Fail`use getChain(${q(chainName)}) before getDenomInfo(${q(denom)})`; + const maybeChain = chainByName.get(chainName); + if (maybeChain.pending) { + throw Fail`wait until getChain(${q(chainName)}) completes before getDenomInfo(${q(denom)})`; + } + const chain = + /** @type {HostInterface>} */ ( + maybeChain.value + ); + chainByName.has(baseName) || + Fail`use getChain(${q(baseName)}) before getDenomInfo(${q(denom)})`; + const maybeBase = chainByName.get(baseName); + if (maybeBase.pending) { + throw Fail`wait until getChain(${q(baseName)}) completes before getDenomInfo(${q(denom)})`; + } + const base = + /** @type {HostInterface>} */ ( + maybeBase.value + ); + return harden({ chain, base, brand, baseDenom }); + }, + /** @type {HostOf} */ + asAmount: () => Fail`not yet implemented`, + }, + }, + ); +}; +harden(prepareOrchestratorKit); + +/** + * @param {Zone} zone + * @param {{ + * chainHub: ChainHub; + * makeLocalChainFacade: MakeLocalChainFacade; + * makeRemoteChainFacade: MakeRemoteChainFacade; + * vowTools: VowTools; + * }} powers + */ +export const prepareOrchestrator = (zone, powers) => { + const makeOrchestratorKit = prepareOrchestratorKit(zone, powers); + return pickFacet(makeOrchestratorKit, 'orchestrator'); +}; + +/** + * Host side of the Orchestrator interface. (Methods return vows instead of + * promises as the interface within the guest function.) + * + * @typedef {ReturnType< + * ReturnType + * >['orchestrator']} HostOrchestrator + */ diff --git a/contract/src/exos/packet-tools.js b/contract/src/exos/packet-tools.js new file mode 100644 index 00000000..a4ba79c2 --- /dev/null +++ b/contract/src/exos/packet-tools.js @@ -0,0 +1,372 @@ +import { makeMarshal, decodeToJustin } from '@endo/marshal'; +import { Shape as NetworkShape } from '@agoric/network'; +import { M, matches } from '@endo/patterns'; +import { E } from '@endo/far'; +import { pickFacet } from '@agoric/vat-data'; + +const { toCapData } = makeMarshal(undefined, undefined, { + marshalName: 'JustEncoder', + serializeBodyFormat: 'capdata', +}); +const just = obj => { + const { body } = toCapData(obj); + return decodeToJustin(JSON.parse(body), true); +}; + +/** + * @import {Pattern} from '@endo/patterns'; + * @import {EVow, Remote, Vow, VowResolver, VowTools} from '@agoric/vow'; + * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; + * @import {TargetApp, TargetRegistration} from '@agoric/vats/src/bridge-target.js'; + */ + +/** + * @callback MatchEvent + * @param {EVow} pattern + * @returns {Vow<{ resolver: VowResolver; match: Vow }>} + */ + +/** + * @typedef {object} PacketSender + * @property {( + * opts: PacketOptions, + * ) => Vow<{ eventPattern: Pattern; resultV: Vow }>} sendPacket + */ + +/** + * @typedef {object} PacketOptions + * @property {string} [opName] + * @property {PacketTimeout} [timeout] + */ + +/** + * @typedef {Pick< + * import('../cosmos-api').IBCMsgTransferOptions, + * 'timeoutHeight' | 'timeoutTimestamp' + * >} PacketTimeout + */ + +const { Vow$ } = NetworkShape; // TODO #9611 + +const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); + +const sink = () => {}; +harden(sink); + +/** + * @param {import('@agoric/base-zone').Zone} zone + * @param {VowTools} vowTools + */ +export const preparePacketTools = (zone, vowTools) => { + const { allVows, makeVowKit, watch, when } = vowTools; + + const makePacketToolsKit = zone.exoClassKit( + 'PacketToolsKit', + { + public: M.interface('PacketTools', { + sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) + .optional(M.any()) + .returns(EVow$(M.any())), + matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), + monitorTransfers: M.call(M.remotable('TargetApp')).returns( + EVow$(M.any()), + ), + }), + tap: M.interface('tap', { + // eslint-disable-next-line no-restricted-syntax + receiveUpcall: M.callWhen(M.any()).returns(M.any()), + }), + monitorRegistration: M.interface('monitorRegistration', { + // eslint-disable-next-line no-restricted-syntax + updateTargetApp: M.callWhen( + M.await(M.remotable('TargetApp')), + ).returns(), + // eslint-disable-next-line no-restricted-syntax + revoke: M.callWhen().returns(), + }), + watchPacketMatch: M.interface('watchPacketMatch', { + onFulfilled: M.call(M.any(), M.record()).returns(M.any()), + }), + watchPacketPattern: M.interface('watchPacketPattern', { + onFulfilled: M.call(M.any(), M.record()).returns(M.any()), + onRejected: M.call(M.any(), M.record()).returns(M.any()), + }), + watchDecrPendingPatterns: M.interface('watchDecrPendingPatterns', { + onFulfilled: M.call(M.any()).returns(M.any()), + onRejected: M.call(M.any()).returns(M.any()), + }), + sendPacketWatcher: M.interface('sendPacketWatcher', { + onFulfilled: M.call( + [M.record(), M.remotable('PacketSender')], + M.record(), + ).returns(M.any()), + }), + packetWasSentWatcher: M.interface('packetWasSentWatcher', { + onFulfilled: M.call( + { eventPattern: M.pattern(), resultV: Vow$(M.any()) }, + M.record(), + ).returns(M.any()), + }), + utils: M.interface('utils', { + subscribeToTransfers: M.call().returns(M.promise()), + unsubscribeFromTransfers: M.call().returns(M.undefined()), + incrPendingPatterns: M.call().returns(Vow$(M.undefined())), + decrPendingPatterns: M.call().returns(Vow$(M.undefined())), + }), + rejectResolverAndRethrowWatcher: M.interface('rejectResolverWatcher', { + onRejected: M.call(M.any(), { + resolver: M.remotable('resolver'), + }).returns(M.any()), + }), + }, + /** + * @param {LocalChainAccount} lca + */ + lca => { + const resolverToPattern = zone.detached().mapStore('resolverToPattern'); + return { + lca, + reg: /** @type {Remote | null} */ (null), + resolverToPattern, + upcallQueue: /** @type {any[] | null} */ (null), + pending: 0, + extra: null, + monitor: /** @type {Remote | null} */ (null), + }; + }, + { + public: { + /** + * @param {ERef} monitor + */ + // eslint-disable-next-line no-restricted-syntax + async monitorTransfers(monitor) { + // We set the monitor here, but we only ever subscribe our + // this.facets.tap handler to transfers. + const mreg = this.facets.monitorRegistration; + await mreg.updateTargetApp(monitor); + return mreg; + }, + /** + * @type {MatchEvent} + */ + matchFirstPacket(patternP) { + return watch( + this.facets.utils.incrPendingPatterns(), + this.facets.watchPacketMatch, + { patternP }, + ); + }, + /** + * @param {Remote} packetSender + * @param {PacketOptions} [opts] + * @returns {Vow} + */ + sendThenWaitForAck(packetSender, opts = {}) { + /** @type {import('@agoric/vow').VowKit} */ + const pattern = makeVowKit(); + + // Establish the packet matcher immediately, but don't fulfill + // the match until after pattern.vow has been resolved. + const matchV = watch( + allVows([ + this.facets.public.matchFirstPacket(pattern.vow), + packetSender, + ]), + this.facets.sendPacketWatcher, + { opts }, + ); + + // When the packet is sent, resolve the resultV for the reply. + const resultV = watch(matchV, this.facets.packetWasSentWatcher, { + opts, + patternResolver: pattern.resolver, + }); + + // If anything fails, try to reject the packet sender. + return watch(resultV, this.facets.rejectResolverAndRethrowWatcher, { + resolver: pattern.resolver, + }); + }, + }, + monitorRegistration: { + /** @type {TargetRegistration['updateTargetApp']} */ + // eslint-disable-next-line no-restricted-syntax + async updateTargetApp(tap) { + this.state.monitor = await tap; + await this.facets.utils.subscribeToTransfers(); + }, + /** @type {TargetRegistration['revoke']} */ + // eslint-disable-next-line no-restricted-syntax + async revoke() { + this.state.monitor = null; + }, + }, + tap: { + // eslint-disable-next-line no-restricted-syntax + async receiveUpcall(obj) { + const { monitor, resolverToPattern, upcallQueue, pending } = + this.state; + console.debug( + `Trying ${resolverToPattern.getSize()} current patterns and ${pending} pending patterns against`, + just(obj), + ); + + if (monitor) { + // Call the monitor (if any), but in a future turn. + void E(monitor).receiveUpcall(obj); + } + // Check all our fulfilled patterns for matches. + for (const [resolver, pattern] of resolverToPattern.entries()) { + if (matches(obj, pattern)) { + console.debug('Matched pattern:', just(pattern)); + resolver.resolve(obj); + resolverToPattern.delete(resolver); + return; + } + } + if (upcallQueue) { + // We have some pending patterns (ones that have been requested but + // haven't yet settled) that may match this object. + console.debug('Stashing object in upcallQueue'); + this.state.upcallQueue = harden(upcallQueue.concat(obj)); + } + console.debug('No match yet.'); + }, + }, + sendPacketWatcher: { + onFulfilled([{ match }, sender], ctx) { + return watch(E(sender).sendPacket(match, ctx.opts)); + }, + }, + packetWasSentWatcher: { + onFulfilled({ eventPattern, resultV }, ctx) { + const { patternResolver } = ctx; + patternResolver.resolve(eventPattern); + return resultV; + }, + }, + rejectResolverAndRethrowWatcher: { + onRejected(rej, { resolver }) { + resolver.reject(rej); + throw rej; + }, + }, + watchPacketMatch: { + onFulfilled(_, { patternP }) { + const { vow, resolver } = makeVowKit(); + const patternV = watch( + patternP, + this.facets.watchPacketPattern, + harden({ resolver }), + ); + /* void */ watch(patternV, this.facets.watchDecrPendingPatterns); + return harden({ match: vow, resolver }); + }, + }, + watchDecrPendingPatterns: { + onFulfilled() { + return this.facets.utils.decrPendingPatterns(); + }, + onRejected() { + return this.facets.utils.decrPendingPatterns(); + }, + }, + watchPacketPattern: { + onFulfilled(pattern, { resolver }) { + const { resolverToPattern, upcallQueue } = this.state; + + console.debug('watchPacketPattern onFulfilled', just(pattern)); + if (!upcallQueue) { + // Save the pattern for later. + console.debug('No upcall queue yet. Save the pattern for later.'); + resolverToPattern.init(resolver, pattern); + return; + } + + // Try matching the first in queue. + const i = upcallQueue.findIndex(obj => matches(obj, pattern)); + if (i < 0) { + // No match yet. Save the pattern for later. + console.debug('No match yet. Save the pattern for later.'); + resolverToPattern.init(resolver, pattern); + return; + } + + // Success! Remove the matched object from the queue. + console.debug( + 'Success! Remove the matched object from the queue.', + just(upcallQueue[i]), + ); + resolver.resolve(upcallQueue[i]); + this.state.upcallQueue = harden( + upcallQueue.slice(0, i).concat(upcallQueue.slice(i + 1)), + ); + }, + onRejected(reason, { resolver }) { + resolver.reject(reason); + }, + }, + + utils: { + incrPendingPatterns() { + const { pending, reg, upcallQueue } = this.state; + this.state.pending += 1; + if (!upcallQueue) { + this.state.upcallQueue = harden([]); + } + if (reg || pending > 0) { + return watch(undefined); + } + return watch(this.facets.utils.subscribeToTransfers()); + }, + decrPendingPatterns() { + this.state.pending -= 1; + if (this.state.pending > 0) { + return; + } + this.state.pending = 0; + this.state.upcallQueue = null; + // FIXME when it returns undefined this causes an error: + // In "unsubscribeFromTransfers" method of (PacketToolsKit utils): result: undefined "[undefined]" - Must be a promise + return watch(this.facets.utils.unsubscribeFromTransfers()); + }, + subscribeToTransfers() { + // Subscribe to the transfers for this account. + const { lca, reg } = this.state; + if (reg) { + return when(reg); + } + const { tap } = this.facets; + // XXX racy; fails if subscribeToTransfers is called while this promise is in flight + // e.g. 'Target "agoric1fakeLCAAddress" already registered' + return when(E(lca).monitorTransfers(tap), r => { + this.state.reg = r; + return r; + }); + }, + unsubscribeFromTransfers() { + const { reg, monitor } = this.state; + if (!reg || monitor) { + return undefined; + } + // this.state.reg = null; + // return E(reg).revoke().then(sink); + }, + }, + }, + { + finish(context) { + void context.facets.utils.subscribeToTransfers(); + }, + }, + ); + + const makePacketTools = pickFacet(makePacketToolsKit, 'public'); + return makePacketTools; +}; +harden(preparePacketTools); + +/** + * @typedef {Awaited>>} PacketTools + */ diff --git a/contract/src/exos/portfolio-holder-kit.js b/contract/src/exos/portfolio-holder-kit.js new file mode 100644 index 00000000..a5c03ece --- /dev/null +++ b/contract/src/exos/portfolio-holder-kit.js @@ -0,0 +1,230 @@ +import { M, mustMatch } from '@endo/patterns'; +import { E } from '@endo/far'; +import { Fail } from '@endo/errors'; +import { PublicTopicShape } from '@agoric/zoe/src/contractSupport/topics.js'; +import { makeScalarBigMapStore } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; + +const { fromEntries } = Object; + +/** + * @import {HostInterface, HostOf} from '@agoric/async-flow'; + * @import {MapStore} from '@agoric/store'; + * @import {VowTools} from '@agoric/vow'; + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {Zone} from '@agoric/zone'; + * @import {OrchestrationAccount, OrchestrationAccountI, MakeCombineInvitationMakers} from '@agoric/orchestration'; + */ + +/** + * @typedef {{ + * accounts: MapStore>>; + * publicTopics: MapStore>; + * }} PortfolioHolderState + */ + +const ChainNameShape = M.string(); + +const AccountEntriesShape = M.arrayOf([ + M.string(), + M.remotable('OrchestrationAccount'), +]); +const PublicTopicEntriesShape = M.arrayOf([M.string(), PublicTopicShape]); + +/** + * Kit that holds several OrchestrationAccountKits and returns a invitation + * makers. + * + * @param {Zone} zone + * @param {VowTools} vowTools + */ +const preparePortfolioHolderKit = (zone, { asVow, when }) => { + return zone.exoClassKit( + 'PortfolioHolderKit', + { + invitationMakers: M.interface('InvitationMakers', { + Proxying: M.call(ChainNameShape, M.string()) + .optional(M.arrayOf(M.any())) + .returns(M.promise()), + }), + holder: M.interface('Holder', { + asContinuingOffer: M.call().returns(VowShape), + getPublicTopics: M.call().returns(VowShape), + getAccount: M.call(ChainNameShape).returns(VowShape), + addAccount: M.call( + ChainNameShape, + M.remotable(), + PublicTopicShape, + ).returns(VowShape), + }), + }, + /** + * @param {Iterable<[string, OrchestrationAccount]>} accountEntries + * @param {Iterable<[string, ResolvedPublicTopic]>} publicTopicEntries + */ + (accountEntries, publicTopicEntries) => { + mustMatch(accountEntries, AccountEntriesShape, 'must provide accounts'); + mustMatch( + publicTopicEntries, + PublicTopicEntriesShape, + 'must provide public topics', + ); + const accounts = harden( + makeScalarBigMapStore('accounts', { durable: true }), + ); + const publicTopics = harden( + makeScalarBigMapStore('publicTopics', { durable: true }), + ); + accounts.addAll(accountEntries); + publicTopics.addAll(publicTopicEntries); + return /** @type {PortfolioHolderState} */ ( + harden({ + accounts, + publicTopics, + }) + ); + }, + { + invitationMakers: { + /** + * @template {unknown[]} IA + * @param {string} chainName key where the account is stored + * @param {string} action invitation maker name, e.g. 'Delegate' + * @param {IA} [invitationArgs] + * @returns {Promise>} + */ + Proxying(chainName, action, invitationArgs) { + const { accounts } = this.state; + accounts.has(chainName) || Fail`no account found for ${chainName}`; + const account = accounts.get(chainName); + // @ts-expect-error XXX invitationMakers + return when(E(account).asContinuingOffer(), ({ invitationMakers }) => + E(invitationMakers)[action](...(invitationArgs || [])), + ); + }, + }, + holder: { + // FIXME /** @type {HostOf} */ + asContinuingOffer() { + return asVow(() => { + const { invitationMakers } = this.facets; + const { publicTopics } = this.state; + return harden({ + publicSubscribers: fromEntries(publicTopics.entries()), + invitationMakers, + }); + }); + }, + // FIXME /** @type {HostOf} */ + getPublicTopics() { + return asVow(() => { + const { publicTopics } = this.state; + return harden(fromEntries(publicTopics.entries())); + }); + }, + /** + * @param {string} chainName key where the account is stored + * @param {HostInterface>} account + * @param {ResolvedPublicTopic} publicTopic + */ + addAccount(chainName, account, publicTopic) { + return asVow(() => { + if (this.state.accounts.has(chainName)) { + throw Fail`account already exists for ${chainName}`; + } + zone.isStorable(account) || + Fail`account for ${chainName} must be storable`; + zone.isStorable(publicTopic) || + Fail`publicTopic for ${chainName} must be storable`; + + this.state.publicTopics.init(chainName, publicTopic); + this.state.accounts.init(chainName, account); + }); + }, + /** + * @param {string} chainName key where the account is stored + */ + getAccount(chainName) { + return asVow(() => this.state.accounts.get(chainName)); + }, + }, + }, + ); +}; + +/** + * A portfolio holder stores two or more OrchestrationAccounts and combines + * ContinuingOfferResult's from each into a single result. + * + * The invitationMakers can be accessed via the `Proxy` invitationMaker, which + * calls out to other invitationMakers. + * + * See {@link MakeCombineInvitationMakers} for an exo that allows a developer to + * define extra invitationMakers to combine with platform-provided ones. + * + * @example + * + * ```js + * // in contract start/prepare + * const makePortfolioHolder = preparePortfolioHolder( + * rootZone.subZone('portfolio'), + * vowTools, + * ); + * + * // in a flow + * const accounts = { + * cosmoshub: await cosmosChain.makeAccount(), + * agoric: await agoricChain.makeAccount(), + * }; + * const accountEntries = harden(Object.entries(accounts)); + * const publicTopicEntries = harden( + * await Promise.all( + * Object.entries(accounts).map(async ([chainName, holder]) => { + * const { account } = await E(holder).getPublicTopics(); + * return [chainName, account]; + * }), + * ), + * ); + * const holder = makePortfolioHolder(accountEntries, publicTopicEntries); + * + * // return ContinuingOfferResult to client + * return E(holder).asContinuingOffer(); + * + * const { invitationMakers } = await E(holder).asContinuingOffer(); + * + * // with invitationArgs + * const delegateInv = await E(invitationMakers).Proxying( + * 'cosmoshub', + * 'Delegate', + * [ + * { + * value: 'cosmos1valoper', + * chainId: 'cosmoshub-99', + * encoding: 'bech32', + * }, + * { + * denom: 'uatom', + * value: 10n, + * }, + * ], + * ); + * + * // without invitationArgs + * const transferInv = await E(invitationMakers).Proxying( + * 'cosmoshub', + * 'Transfer', + * ); + * ``` + * + * @param {Zone} zone + * @param {VowTools} vowTools + * @returns {( + * ...args: Parameters> + * ) => ReturnType>['holder']} + */ +export const preparePortfolioHolder = (zone, vowTools) => { + const makeKit = preparePortfolioHolderKit(zone, vowTools); + return (...args) => makeKit(...args).holder; +}; +/** @typedef {ReturnType} MakePortfolioHolder */ +/** @typedef {ReturnType} PortfolioHolder */ diff --git a/contract/src/exos/remote-chain-facade.js b/contract/src/exos/remote-chain-facade.js new file mode 100644 index 00000000..3efebfff --- /dev/null +++ b/contract/src/exos/remote-chain-facade.js @@ -0,0 +1,269 @@ +/** @file Remote Chain Facade exo */ +import { makeTracer } from '@agoric/internal'; +import { E } from '@endo/far'; +import { Fail, q } from '@endo/errors'; +import { M } from '@endo/patterns'; +import { pickFacet } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { + ChainAddressShape, + chainFacadeMethods, + ICQMsgShape, +} from '../typeGuards.js'; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/base-zone'; + * @import {JsonSafe} from '@agoric/cosmic-proto'; + * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; + * @import {TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + * @import {CosmosInterchainService} from './exo-interfaces.js'; + * @import {prepareCosmosOrchestrationAccount} from './cosmos-orchestration-account.js'; + * @import {CosmosChainInfo, IBCConnectionInfo, ChainAddress, IcaAccount, Chain, ICQConnection} from '../types.js'; + */ + +const trace = makeTracer('RemoteChainFacade'); + +/** + * @typedef {{ + * makeCosmosOrchestrationAccount: ReturnType< + * typeof prepareCosmosOrchestrationAccount + * >; + * orchestration: Remote; + * storageNode: Remote; + * timer: Remote; + * vowTools: VowTools; + * }} RemoteChainFacadePowers + */ + +/** + * @typedef {{ + * remoteChainInfo: CosmosChainInfo; + * connectionInfo: IBCConnectionInfo; + * icqConnection: ICQConnection | undefined; + * }} RemoteChainFacadeState + */ + +/** + * @param {Zone} zone + * @param {RemoteChainFacadePowers} powers + */ +const prepareRemoteChainFacadeKit = ( + zone, + { + makeCosmosOrchestrationAccount, + orchestration, + // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 + // consider making an `accounts` childNode + storageNode, + timer, + vowTools: { allVows, asVow, watch }, + }, +) => + zone.exoClassKit( + 'RemoteChainFacade', + { + public: M.interface('RemoteChainFacade', { + ...chainFacadeMethods, + query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), + }), + makeICQConnectionQueryWatcher: M.interface( + 'makeICQConnectionQueryWatcher', + { + onFulfilled: M.call(M.remotable(), M.arrayOf(ICQMsgShape)).returns( + VowShape, + ), + }, + ), + makeAccountAndProvideQueryConnWatcher: M.interface( + 'makeAccountAndProvideQueryConnWatcher', + { + onFulfilled: M.call([ + M.remotable(), + M.or(M.remotable(), M.undefined()), + ]).returns(VowShape), + }, + ), + getAddressesWatcher: M.interface('getAddressWatcher', { + onFulfilled: M.call( + [ChainAddressShape, M.string(), M.string()], + M.remotable(), + ).returns(VowShape), + }), + makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { + onFulfilled: M.call(M.remotable(), { + account: M.remotable(), + chainAddress: ChainAddressShape, + localAddress: M.string(), + remoteAddress: M.string(), + }).returns(M.remotable()), + }), + }, + /** + * @param {CosmosChainInfo} remoteChainInfo + * @param {IBCConnectionInfo} connectionInfo + */ + (remoteChainInfo, connectionInfo) => { + trace('making a RemoteChainFacade'); + return /** @type {RemoteChainFacadeState} */ ({ + remoteChainInfo, + connectionInfo, + icqConnection: undefined, + }); + }, + { + public: { + /** @type {HostOf} */ + getChainInfo() { + return watch(this.state.remoteChainInfo); + }, + + /** @type {HostOf} */ + makeAccount() { + return asVow(() => { + const { remoteChainInfo, connectionInfo } = this.state; + const stakingDenom = remoteChainInfo.stakingTokens?.[0]?.denom; + if (!stakingDenom) throw Fail`chain info lacks staking denom`; + + // icqConnection is ultimately retrieved from state, but let's + // create a connection if it doesn't exist + const icqConnOrUndefinedV = + remoteChainInfo.icqEnabled && !this.state.icqConnection + ? E(orchestration).provideICQConnection(connectionInfo.id) + : undefined; + + const makeAccountV = E(orchestration).makeAccount( + remoteChainInfo.chainId, + connectionInfo.counterparty.connection_id, + connectionInfo.id, + ); + + return watch( + allVows([makeAccountV, icqConnOrUndefinedV]), + this.facets.makeAccountAndProvideQueryConnWatcher, + ); + }); + }, + /** + * @type {HostOf< + * Chain['query'] + * >} + */ + query(msgs) { + return asVow(() => { + const { + remoteChainInfo: { icqEnabled, chainId }, + connectionInfo, + } = this.state; + if (!icqEnabled) { + throw Fail`Queries not available for chain ${q(chainId)}`; + } + // if none exists, make one and still send the query in the handler + if (!this.state.icqConnection) { + return watch( + E(orchestration).provideICQConnection(connectionInfo.id), + this.facets.makeICQConnectionQueryWatcher, + msgs, + ); + } + return watch(E(this.state.icqConnection).query(msgs)); + }); + }, + }, + makeAccountAndProvideQueryConnWatcher: { + /** + * @param {[IcaAccount, ICQConnection | undefined]} account + */ + onFulfilled([account, icqConnection]) { + if (icqConnection && !this.state.icqConnection) { + this.state.icqConnection = icqConnection; + // no need to pass icqConnection in ctx; we can get it from state + } + return watch( + allVows([ + E(account).getAddress(), + E(account).getLocalAddress(), + E(account).getRemoteAddress(), + ]), + this.facets.getAddressesWatcher, + account, + ); + }, + }, + makeICQConnectionQueryWatcher: { + /** + * @param {ICQConnection} icqConnection + * @param {JsonSafe[]} msgs + * @returns {Vow[]>} + */ + onFulfilled(icqConnection, msgs) { + if (!this.state.icqConnection) { + this.state.icqConnection = icqConnection; + } + return watch(E(icqConnection).query(msgs)); + }, + }, + getAddressesWatcher: { + /** + * @param {[ChainAddress, LocalIbcAddress, RemoteIbcAddress]} chainAddresses + * @param {IcaAccount} account + */ + onFulfilled([chainAddress, localAddress, remoteAddress], account) { + return watch( + E(storageNode).makeChildNode(chainAddress.value), + this.facets.makeChildNodeWatcher, + { account, chainAddress, localAddress, remoteAddress }, + ); + }, + }, + makeChildNodeWatcher: { + /** + * @param {Remote} childNode + * @param {{ + * account: IcaAccount; + * chainAddress: ChainAddress; + * localAddress: LocalIbcAddress; + * remoteAddress: RemoteIbcAddress; + * }} ctx + */ + onFulfilled( + childNode, + { account, chainAddress, localAddress, remoteAddress }, + ) { + const { icqConnection } = this.state; + + return makeCosmosOrchestrationAccount( + { + chainAddress, + localAddress, + remoteAddress, + }, + { + account, + // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 + storageNode: childNode, + icqConnection, + timer, + }, + ); + }, + }, + }, + ); +harden(prepareRemoteChainFacadeKit); + +/** + * @param {Zone} zone + * @param {RemoteChainFacadePowers} powers + */ +export const prepareRemoteChainFacade = (zone, powers) => { + const makeLocalChainFacadeKit = prepareRemoteChainFacadeKit(zone, powers); + return pickFacet(makeLocalChainFacadeKit, 'public'); +}; +harden(prepareRemoteChainFacade); + +/** @typedef {ReturnType} MakeRemoteChainFacade */ +/** @typedef {ReturnType} RemoteChainFacade */ diff --git a/contract/src/facade.js b/contract/src/facade.js new file mode 100644 index 00000000..d2fe5b59 --- /dev/null +++ b/contract/src/facade.js @@ -0,0 +1,150 @@ +/** @file Orchestration facade */ +import { assertAllDefined, deepMapObject } from '@agoric/internal'; + +/** + * @import {AsyncFlowTools, GuestInterface, HostArgs, HostOf} from '@agoric/async-flow'; + * @import {Zone} from '@agoric/zone'; + * @import {Vow, VowTools} from '@agoric/vow'; + * @import {TimerService} from '@agoric/time'; + * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. + * @import {HostOrchestrator} from './exos/orchestrator.js'; + * @import {Remote} from '@agoric/internal'; + * @import {CosmosInterchainService} from './exos/exo-interfaces.js'; + * @import {Chain, ChainInfo, CosmosChainInfo, IBCConnectionInfo, OrchestrationAccount, OrchestrationFlow, Orchestrator} from './types.js'; + */ + +/** + * For a given guest passed to orchestrate(), return the host-side form. + * + * @template {OrchestrationFlow} GF + * @typedef {GF extends ( + * orc: Orchestrator, + * ctx: any, + * ...args: infer GA + * ) => Promise + * ? (...args: HostArgs) => Vow + * : never} HostForGuest + */ + +/** + * @param {{ + * zone: Zone; + * timerService: Remote; + * zcf: ZCF; + * storageNode: Remote; + * orchestrationService: Remote; + * makeRecorderKit: MakeRecorderKit; + * makeOrchestrator: () => HostOrchestrator; + * vowTools: VowTools; + * asyncFlowTools: AsyncFlowTools; + * }} powers + */ +export const makeOrchestrationFacade = ({ + zone, + timerService, + zcf, + storageNode, + orchestrationService, + makeRecorderKit, + makeOrchestrator, + vowTools, + asyncFlowTools, +}) => { + assertAllDefined({ + zone, + timerService, + zcf, + storageNode, + orchestrationService, + makeRecorderKit, + makeOrchestrator, + vowTools, + asyncFlowTools, + }); + + const { prepareEndowment, asyncFlow } = asyncFlowTools; + + /** + * @template HC - host context + * @template {OrchestrationFlow>} GF guest fn + * @param {string} durableName - the orchestration flow identity in the zone + * (to resume across upgrades) + * @param {HC} hostCtx - values to pass through the async flow membrane + * @param {GF} guestFn + * @returns {HostForGuest} + */ + const orchestrate = (durableName, hostCtx, guestFn) => { + const subZone = zone.subZone(durableName); + const [wrappedCtx] = prepareEndowment(subZone, 'endowments', [hostCtx]); + const hostFn = asyncFlow(subZone, 'asyncFlow', guestFn); + + deepMapObject( + wrappedCtx, + val => + val === zcf && + assert.fail('do not use zcf in orchestration context; try zcfTools'), + ); + + // cast because return could be arbitrary subtype + const orcFn = /** @type {HostForGuest} */ ( + (...args) => { + // each invocation gets a new orchestrator + const hostOrc = makeOrchestrator(); + // TODO: why are the types showing the guest types for arguments? + // @ts-expect-error XXX fix broken types + return hostFn(hostOrc, wrappedCtx, ...args); + } + ); + return harden(orcFn); + }; + + /** + * Orchestrate all the guest functions. + * + * If the `guestFns` object is provided as a property of `hostCtx` the + * functions will be available within the other guests. + * + * NOTE multiple calls to this with the same guestFn name will fail + * + * @template {Record} HC - host context + * @template {{ + * [durableName: string]: OrchestrationFlow>; + * }} GFM + * guest fn map + * @param {GFM} guestFns + * @param {HC} hostCtx + * @returns {{ [N in keyof GFM]: HostForGuest }} + */ + const orchestrateAll = (guestFns, hostCtx) => { + const mappedFlows = new Map( + Object.entries(guestFns).map(([name, guestFn]) => [ + guestFn, + // eslint-disable-next-line no-use-before-define + (...args) => orcFns[name](...args), + ]), + ); + + const mappedContext = deepMapObject( + hostCtx, + val => mappedFlows.get(val) || val, + ); + + const orcFns = /** @type {{ [N in keyof GFM]: HostForGuest }} */ ( + Object.fromEntries( + Object.entries(guestFns).map(([name, guestFn]) => [ + name, + orchestrate(name, mappedContext, guestFn), + ]), + ) + ); + + return { ...orcFns }; + }; + + return harden({ + orchestrate, + orchestrateAll, + }); +}; +harden(makeOrchestrationFacade); +/** @typedef {ReturnType} OrchestrationFacade */ diff --git a/contract/src/fetched-chain-info.js b/contract/src/fetched-chain-info.js new file mode 100644 index 00000000..651633fd --- /dev/null +++ b/contract/src/fetched-chain-info.js @@ -0,0 +1,1990 @@ +/** @file Generated by fetch-chain-info.ts */ +export default /** @type {const} } */ ({ + agoric: { + bech32Prefix: 'agoric', + chainId: 'agoric-3', + stakingTokens: [ + { + denom: 'ubld', + }, + ], + icqEnabled: false, + connections: { + 'cosmoshub-4': { + id: 'connection-8', + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-927', + connection_id: 'connection-649', + }, + state: 3, + transferChannel: { + channelId: 'channel-5', + portId: 'transfer', + counterPartyChannelId: 'channel-405', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-72', + client_id: '07-tendermint-77', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-40', + }, + state: 3, + transferChannel: { + channelId: 'channel-62', + portId: 'transfer', + counterPartyChannelId: 'channel-21', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-67', + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-47', + connection_id: 'connection-40', + }, + state: 3, + transferChannel: { + channelId: 'channel-58', + portId: 'transfer', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-1', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2109', + connection_id: 'connection-1649', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-320', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-17', + client_id: '07-tendermint-17', + counterparty: { + client_id: '07-tendermint-111', + connection_id: 'connection-80', + }, + state: 3, + transferChannel: { + channelId: 'channel-10', + portId: 'transfer', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-68', + client_id: '07-tendermint-74', + counterparty: { + client_id: '07-tendermint-129', + connection_id: 'connection-118', + }, + state: 3, + transferChannel: { + channelId: 'channel-59', + portId: 'transfer', + counterPartyChannelId: 'channel-148', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-18', + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-152', + connection_id: 'connection-101', + }, + state: 3, + transferChannel: { + channelId: 'channel-11', + portId: 'transfer', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + celestia: { + bech32Prefix: 'celestia', + chainId: 'celestia', + stakingTokens: [ + { + denom: 'utia', + }, + ], + icqEnabled: false, + connections: { + 'neutron-1': { + id: 'connection-7', + client_id: '07-tendermint-29', + counterparty: { + client_id: '07-tendermint-48', + connection_id: 'connection-36', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-35', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-2', + client_id: '07-tendermint-10', + counterparty: { + client_id: '07-tendermint-3012', + connection_id: 'connection-2503', + }, + state: 3, + transferChannel: { + channelId: 'channel-2', + portId: 'transfer', + counterPartyChannelId: 'channel-6994', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-15', + client_id: '07-tendermint-52', + counterparty: { + client_id: '07-tendermint-174', + connection_id: 'connection-131', + }, + state: 3, + transferChannel: { + channelId: 'channel-14', + portId: 'transfer', + counterPartyChannelId: 'channel-91', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-56', + client_id: '07-tendermint-86', + counterparty: { + client_id: '07-tendermint-359', + connection_id: 'connection-296', + }, + state: 3, + transferChannel: { + channelId: 'channel-33', + portId: 'transfer', + counterPartyChannelId: 'channel-291', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-4', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-137', + connection_id: 'connection-125', + }, + state: 3, + transferChannel: { + channelId: 'channel-4', + portId: 'transfer', + counterPartyChannelId: 'channel-162', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + cosmoshub: { + bech32Prefix: 'cosmos', + chainId: 'cosmoshub-4', + stakingTokens: [ + { + denom: 'uatom', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-649', + client_id: '07-tendermint-927', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-8', + }, + state: 3, + transferChannel: { + channelId: 'channel-405', + portId: 'transfer', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-372', + client_id: '07-tendermint-439', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-207', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-809', + client_id: '07-tendermint-1119', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-569', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-790', + client_id: '07-tendermint-1116', + counterparty: { + client_id: '07-tendermint-4', + connection_id: 'connection-12', + }, + state: 3, + transferChannel: { + channelId: 'channel-536', + portId: 'transfer', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-501', + client_id: '07-tendermint-656', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-19', + }, + state: 3, + transferChannel: { + channelId: 'channel-306', + portId: 'transfer', + counterPartyChannelId: 'channel-12', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-257', + client_id: '07-tendermint-259', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-141', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-401', + client_id: '07-tendermint-492', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-235', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-918', + client_id: '07-tendermint-1188', + counterparty: { + client_id: '07-tendermint-320', + connection_id: 'connection-256', + }, + state: 3, + transferChannel: { + channelId: 'channel-730', + portId: 'transfer', + counterPartyChannelId: 'channel-239', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-635', + client_id: '07-tendermint-913', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-391', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + dydx: { + bech32Prefix: 'dydx', + chainId: 'dydx-mainnet-1', + stakingTokens: [ + { + denom: 'adydx', + }, + ], + icqEnabled: false, + connections: { + 'neutron-1': { + id: 'connection-17', + client_id: '07-tendermint-11', + counterparty: { + client_id: '07-tendermint-72', + connection_id: 'connection-51', + }, + state: 3, + transferChannel: { + channelId: 'channel-11', + portId: 'transfer', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-59', + connection_id: 'connection-57', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-7', + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-3009', + connection_id: 'connection-2500', + }, + state: 3, + transferChannel: { + channelId: 'channel-3', + portId: 'transfer', + counterPartyChannelId: 'channel-6787', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-1', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-133', + connection_id: 'connection-123', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-160', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-13', + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-244', + connection_id: 'connection-208', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-118', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + juno: { + bech32Prefix: 'juno', + chainId: 'juno-1', + stakingTokens: [ + { + denom: 'ujuno', + }, + ], + icqEnabled: false, + connections: { + 'cosmoshub-4': { + id: 'connection-2', + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-439', + connection_id: 'connection-372', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-207', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-524', + client_id: '07-tendermint-557', + counterparty: { + client_id: '07-tendermint-97', + connection_id: 'connection-71', + }, + state: 3, + transferChannel: { + channelId: 'channel-548', + portId: 'transfer', + counterPartyChannelId: 'channel-4328', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-322', + client_id: '07-tendermint-334', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-8', + }, + state: 3, + transferChannel: { + channelId: 'channel-224', + portId: 'transfer', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1457', + connection_id: 'connection-1142', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-68', + client_id: '07-tendermint-108', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-9', + }, + state: 3, + transferChannel: { + channelId: 'channel-48', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-30', + client_id: '07-tendermint-44', + counterparty: { + client_id: '07-tendermint-13', + connection_id: 'connection-11', + }, + state: 3, + transferChannel: { + channelId: 'channel-20', + portId: 'transfer', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-205', + client_id: '07-tendermint-263', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-19', + }, + state: 3, + transferChannel: { + channelId: 'channel-139', + portId: 'transfer', + counterPartyChannelId: 'channel-24', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + neutron: { + bech32Prefix: 'neutron', + chainId: 'neutron-1', + stakingTokens: [ + { + denom: 'untrn', + }, + ], + icqEnabled: false, + connections: { + celestia: { + id: 'connection-36', + client_id: '07-tendermint-48', + counterparty: { + client_id: '07-tendermint-29', + connection_id: 'connection-7', + }, + state: 3, + transferChannel: { + channelId: 'channel-35', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1119', + connection_id: 'connection-809', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-569', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-51', + client_id: '07-tendermint-72', + counterparty: { + client_id: '07-tendermint-11', + connection_id: 'connection-17', + }, + state: 3, + transferChannel: { + channelId: 'channel-48', + portId: 'transfer', + counterPartyChannelId: 'channel-11', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-71', + client_id: '07-tendermint-97', + counterparty: { + client_id: '07-tendermint-557', + connection_id: 'connection-524', + }, + state: 3, + transferChannel: { + channelId: 'channel-4328', + portId: 'transfer', + counterPartyChannelId: 'channel-548', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-31', + client_id: '07-tendermint-40', + counterparty: { + client_id: '07-tendermint-25', + connection_id: 'connection-34', + }, + state: 3, + transferChannel: { + channelId: 'channel-30', + portId: 'transfer', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-18', + client_id: '07-tendermint-19', + counterparty: { + client_id: '07-tendermint-2823', + connection_id: 'connection-2338', + }, + state: 3, + transferChannel: { + channelId: 'channel-10', + portId: 'transfer', + counterPartyChannelId: 'channel-874', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-63', + client_id: '07-tendermint-85', + counterparty: { + client_id: '07-tendermint-199', + connection_id: 'connection-192', + }, + state: 3, + transferChannel: { + channelId: 'channel-1551', + portId: 'transfer', + counterPartyChannelId: 'channel-144', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-23', + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-283', + connection_id: 'connection-211', + }, + state: 3, + transferChannel: { + channelId: 'channel-18', + portId: 'transfer', + counterPartyChannelId: 'channel-191', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-15', + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-125', + connection_id: 'connection-113', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + noble: { + bech32Prefix: 'noble', + chainId: 'noble-1', + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-40', + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-77', + connection_id: 'connection-72', + }, + state: 3, + transferChannel: { + channelId: 'channel-21', + portId: 'transfer', + counterPartyChannelId: 'channel-62', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-12', + client_id: '07-tendermint-4', + counterparty: { + client_id: '07-tendermint-1116', + connection_id: 'connection-790', + }, + state: 3, + transferChannel: { + channelId: 'channel-4', + portId: 'transfer', + counterPartyChannelId: 'channel-536', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-57', + client_id: '07-tendermint-59', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-33', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-8', + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-334', + connection_id: 'connection-322', + }, + state: 3, + transferChannel: { + channelId: 'channel-3', + portId: 'transfer', + counterPartyChannelId: 'channel-224', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-34', + client_id: '07-tendermint-25', + counterparty: { + client_id: '07-tendermint-40', + connection_id: 'connection-31', + }, + state: 3, + transferChannel: { + channelId: 'channel-18', + portId: 'transfer', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-65', + client_id: '07-tendermint-68', + counterparty: { + client_id: '07-tendermint-51', + connection_id: 'connection-49', + }, + state: 3, + transferChannel: { + channelId: 'channel-44', + portId: 'transfer', + counterPartyChannelId: 'channel-38', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-2', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-2704', + connection_id: 'connection-2241', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-750', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-33', + client_id: '07-tendermint-24', + counterparty: { + client_id: '07-tendermint-170', + connection_id: 'connection-127', + }, + state: 3, + transferChannel: { + channelId: 'channel-17', + portId: 'transfer', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-25', + client_id: '07-tendermint-16', + counterparty: { + client_id: '07-tendermint-287', + connection_id: 'connection-214', + }, + state: 3, + transferChannel: { + channelId: 'channel-11', + portId: 'transfer', + counterPartyChannelId: 'channel-204', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-74', + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-248', + connection_id: 'connection-210', + }, + state: 3, + transferChannel: { + channelId: 'channel-51', + portId: 'transfer', + counterPartyChannelId: 'channel-120', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + omniflixhub: { + bech32Prefix: 'omniflix', + chainId: 'omniflixhub-1', + stakingTokens: [ + { + denom: 'uflix', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-40', + client_id: '07-tendermint-47', + counterparty: { + client_id: '07-tendermint-73', + connection_id: 'connection-67', + }, + state: 3, + transferChannel: { + channelId: 'channel-30', + portId: 'transfer', + counterPartyChannelId: 'channel-58', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-19', + client_id: '07-tendermint-23', + counterparty: { + client_id: '07-tendermint-656', + connection_id: 'connection-501', + }, + state: 3, + transferChannel: { + channelId: 'channel-12', + portId: 'transfer', + counterPartyChannelId: 'channel-306', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-49', + client_id: '07-tendermint-51', + counterparty: { + client_id: '07-tendermint-68', + connection_id: 'connection-65', + }, + state: 3, + transferChannel: { + channelId: 'channel-38', + portId: 'transfer', + counterPartyChannelId: 'channel-44', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-8', + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-1829', + connection_id: 'connection-1431', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-199', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + osmosis: { + bech32Prefix: 'osmo', + chainId: 'osmosis-1', + stakingTokens: [ + { + denom: 'uosmo', + }, + ], + icqEnabled: true, + connections: { + 'agoric-3': { + id: 'connection-1649', + client_id: '07-tendermint-2109', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-320', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + celestia: { + id: 'connection-2503', + client_id: '07-tendermint-3012', + counterparty: { + client_id: '07-tendermint-10', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-6994', + portId: 'transfer', + counterPartyChannelId: 'channel-2', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-1', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-259', + connection_id: 'connection-257', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-141', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-2500', + client_id: '07-tendermint-3009', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-7', + }, + state: 3, + transferChannel: { + channelId: 'channel-6787', + portId: 'transfer', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-1142', + client_id: '07-tendermint-1457', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-42', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-2338', + client_id: '07-tendermint-2823', + counterparty: { + client_id: '07-tendermint-19', + connection_id: 'connection-18', + }, + state: 3, + transferChannel: { + channelId: 'channel-874', + portId: 'transfer', + counterPartyChannelId: 'channel-10', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-2241', + client_id: '07-tendermint-2704', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-750', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1': { + id: 'connection-1431', + client_id: '07-tendermint-1829', + counterparty: { + client_id: '07-tendermint-8', + connection_id: 'connection-8', + }, + state: 3, + transferChannel: { + channelId: 'channel-199', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-1244', + client_id: '07-tendermint-1588', + counterparty: { + client_id: '07-tendermint-2', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-88', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-1223', + client_id: '07-tendermint-1562', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-75', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-1657', + client_id: '07-tendermint-2119', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-2', + }, + state: 3, + transferChannel: { + channelId: 'channel-326', + portId: 'transfer', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-1410', + client_id: '07-tendermint-1805', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-0', + }, + state: 3, + transferChannel: { + channelId: 'channel-184', + portId: 'transfer', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + secretnetwork: { + bech32Prefix: 'secret', + chainId: 'secret-4', + stakingTokens: [ + { + denom: 'uscrt', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-80', + client_id: '07-tendermint-111', + counterparty: { + client_id: '07-tendermint-17', + connection_id: 'connection-17', + }, + state: 3, + transferChannel: { + channelId: 'channel-51', + portId: 'transfer', + counterPartyChannelId: 'channel-10', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + celestia: { + id: 'connection-131', + client_id: '07-tendermint-174', + counterparty: { + client_id: '07-tendermint-52', + connection_id: 'connection-15', + }, + state: 3, + transferChannel: { + channelId: 'channel-91', + portId: 'transfer', + counterPartyChannelId: 'channel-14', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-0', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-492', + connection_id: 'connection-401', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-235', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-9', + client_id: '07-tendermint-23', + counterparty: { + client_id: '07-tendermint-108', + connection_id: 'connection-68', + }, + state: 3, + transferChannel: { + channelId: 'channel-8', + portId: 'transfer', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-192', + client_id: '07-tendermint-199', + counterparty: { + client_id: '07-tendermint-85', + connection_id: 'connection-63', + }, + state: 3, + transferChannel: { + channelId: 'channel-144', + portId: 'transfer', + counterPartyChannelId: 'channel-1551', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-127', + client_id: '07-tendermint-170', + counterparty: { + client_id: '07-tendermint-24', + connection_id: 'connection-33', + }, + state: 3, + transferChannel: { + channelId: 'channel-88', + portId: 'transfer', + counterPartyChannelId: 'channel-17', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-1', + client_id: '07-tendermint-2', + counterparty: { + client_id: '07-tendermint-1588', + connection_id: 'connection-1244', + }, + state: 3, + transferChannel: { + channelId: 'channel-1', + portId: 'transfer', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-25', + client_id: '07-tendermint-43', + counterparty: { + client_id: '07-tendermint-177', + connection_id: 'connection-110', + }, + state: 3, + transferChannel: { + channelId: 'channel-19', + portId: 'transfer', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-40', + client_id: '07-tendermint-75', + counterparty: { + client_id: '07-tendermint-37', + connection_id: 'connection-25', + }, + state: 3, + transferChannel: { + channelId: 'channel-37', + portId: 'transfer', + counterPartyChannelId: 'channel-40', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-188', + client_id: '07-tendermint-193', + counterparty: { + client_id: '07-tendermint-249', + connection_id: 'connection-213', + }, + state: 3, + transferChannel: { + channelId: 'channel-126', + portId: 'transfer', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + stargaze: { + bech32Prefix: 'stars', + chainId: 'stargaze-1', + stakingTokens: [ + { + denom: 'ustars', + }, + ], + icqEnabled: false, + connections: { + celestia: { + id: 'connection-296', + client_id: '07-tendermint-359', + counterparty: { + client_id: '07-tendermint-86', + connection_id: 'connection-56', + }, + state: 3, + transferChannel: { + channelId: 'channel-291', + portId: 'transfer', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-256', + client_id: '07-tendermint-320', + counterparty: { + client_id: '07-tendermint-1188', + connection_id: 'connection-918', + }, + state: 3, + transferChannel: { + channelId: 'channel-239', + portId: 'transfer', + counterPartyChannelId: 'channel-730', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-11', + client_id: '07-tendermint-13', + counterparty: { + client_id: '07-tendermint-44', + connection_id: 'connection-30', + }, + state: 3, + transferChannel: { + channelId: 'channel-5', + portId: 'transfer', + counterPartyChannelId: 'channel-20', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-211', + client_id: '07-tendermint-283', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-23', + }, + state: 3, + transferChannel: { + channelId: 'channel-191', + portId: 'transfer', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-214', + client_id: '07-tendermint-287', + counterparty: { + client_id: '07-tendermint-16', + connection_id: 'connection-25', + }, + state: 3, + transferChannel: { + channelId: 'channel-204', + portId: 'transfer', + counterPartyChannelId: 'channel-11', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1562', + connection_id: 'connection-1223', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-75', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-110', + client_id: '07-tendermint-177', + counterparty: { + client_id: '07-tendermint-43', + connection_id: 'connection-25', + }, + state: 3, + transferChannel: { + channelId: 'channel-48', + portId: 'transfer', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-128', + client_id: '07-tendermint-195', + counterparty: { + client_id: '07-tendermint-30', + connection_id: 'connection-18', + }, + state: 3, + transferChannel: { + channelId: 'channel-106', + portId: 'transfer', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + stride: { + bech32Prefix: 'stride', + chainId: 'stride-1', + stakingTokens: [ + { + denom: 'ustrd', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-118', + client_id: '07-tendermint-129', + counterparty: { + client_id: '07-tendermint-74', + connection_id: 'connection-68', + }, + state: 3, + transferChannel: { + channelId: 'channel-148', + portId: 'transfer', + counterPartyChannelId: 'channel-59', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + celestia: { + id: 'connection-125', + client_id: '07-tendermint-137', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-4', + }, + state: 3, + transferChannel: { + channelId: 'channel-162', + portId: 'transfer', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4': { + id: 'connection-0', + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-913', + connection_id: 'connection-635', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-391', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-123', + client_id: '07-tendermint-133', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + state: 3, + transferChannel: { + channelId: 'channel-160', + portId: 'transfer', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1': { + id: 'connection-19', + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-263', + connection_id: 'connection-205', + }, + state: 3, + transferChannel: { + channelId: 'channel-24', + portId: 'transfer', + counterPartyChannelId: 'channel-139', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1': { + id: 'connection-113', + client_id: '07-tendermint-125', + counterparty: { + client_id: '07-tendermint-18', + connection_id: 'connection-15', + }, + state: 3, + transferChannel: { + channelId: 'channel-123', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-2', + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2119', + connection_id: 'connection-1657', + }, + state: 3, + transferChannel: { + channelId: 'channel-5', + portId: 'transfer', + counterPartyChannelId: 'channel-326', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-25', + client_id: '07-tendermint-37', + counterparty: { + client_id: '07-tendermint-75', + connection_id: 'connection-40', + }, + state: 3, + transferChannel: { + channelId: 'channel-40', + portId: 'transfer', + counterPartyChannelId: 'channel-37', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1': { + id: 'connection-18', + client_id: '07-tendermint-30', + counterparty: { + client_id: '07-tendermint-195', + connection_id: 'connection-128', + }, + state: 3, + transferChannel: { + channelId: 'channel-19', + portId: 'transfer', + counterPartyChannelId: 'channel-106', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'umee-1': { + id: 'connection-20', + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-64', + connection_id: 'connection-45', + }, + state: 3, + transferChannel: { + channelId: 'channel-29', + portId: 'transfer', + counterPartyChannelId: 'channel-34', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, + umee: { + bech32Prefix: 'umee', + chainId: 'umee-1', + stakingTokens: [ + { + denom: 'uumee', + }, + ], + icqEnabled: false, + connections: { + 'agoric-3': { + id: 'connection-101', + client_id: '07-tendermint-152', + counterparty: { + client_id: '07-tendermint-18', + connection_id: 'connection-18', + }, + state: 3, + transferChannel: { + channelId: 'channel-42', + portId: 'transfer', + counterPartyChannelId: 'channel-11', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1': { + id: 'connection-208', + client_id: '07-tendermint-244', + counterparty: { + client_id: '07-tendermint-8', + connection_id: 'connection-13', + }, + state: 3, + transferChannel: { + channelId: 'channel-118', + portId: 'transfer', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1': { + id: 'connection-210', + client_id: '07-tendermint-248', + counterparty: { + client_id: '07-tendermint-73', + connection_id: 'connection-74', + }, + state: 3, + transferChannel: { + channelId: 'channel-120', + portId: 'transfer', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1': { + id: 'connection-0', + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-1805', + connection_id: 'connection-1410', + }, + state: 3, + transferChannel: { + channelId: 'channel-0', + portId: 'transfer', + counterPartyChannelId: 'channel-184', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4': { + id: 'connection-213', + client_id: '07-tendermint-249', + counterparty: { + client_id: '07-tendermint-193', + connection_id: 'connection-188', + }, + state: 3, + transferChannel: { + channelId: 'channel-123', + portId: 'transfer', + counterPartyChannelId: 'channel-126', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1': { + id: 'connection-45', + client_id: '07-tendermint-64', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-20', + }, + state: 3, + transferChannel: { + channelId: 'channel-34', + portId: 'transfer', + counterPartyChannelId: 'channel-29', + counterPartyPortId: 'transfer', + ordering: 0, + state: 3, + version: 'ics20-1', + }, + }, + }, + }, +}); diff --git a/contract/src/typeGuards.js b/contract/src/typeGuards.js new file mode 100644 index 00000000..995754dd --- /dev/null +++ b/contract/src/typeGuards.js @@ -0,0 +1,197 @@ +import { VowShape } from '@agoric/vow'; +import { M } from '@endo/patterns'; + +/** + * @import {TypedPattern} from '@agoric/internal'; + * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; + * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; + * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {TypedJson} from '@agoric/cosmic-proto'; + */ + +/** + * Used for IBC Channel Connections that only send outgoing transactions. If + * your channel expects incoming transactions, please extend this interface to + * include the `onReceive` handler. + */ +export const OutboundConnectionHandlerI = M.interface( + 'OutboundConnectionHandler', + { + onOpen: M.callWhen(M.any(), M.string(), M.string(), M.any()).returns( + M.any(), + ), + onClose: M.callWhen(M.any(), M.any(), M.any()).returns(M.any()), + }, +); + +/** @type {TypedPattern} */ +export const ChainAddressShape = { + chainId: M.string(), + encoding: M.string(), + value: M.string(), +}; +harden(ChainAddressShape); + +/** @type {TypedPattern} */ +export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; +harden(ChainAddressShape); + +/** @internal */ +export const IBCTransferOptionsShape = M.splitRecord( + {}, + { + timeoutTimestamp: M.bigint(), + timeoutHeight: { + revisionHeight: M.bigint(), + revisionNumber: M.bigint(), + }, + memo: M.string(), + }, +); + +/** @internal */ +export const IBCChannelIDShape = M.string(); + +/** @internal */ +export const IBCChannelInfoShape = M.splitRecord({ + portId: M.string(), + channelId: IBCChannelIDShape, + counterPartyPortId: M.string(), + counterPartyChannelId: IBCChannelIDShape, + ordering: M.scalar(), // XXX + state: M.scalar(), // XXX + version: M.string(), +}); + +/** @internal */ +export const IBCConnectionIDShape = M.string(); + +/** @internal */ +export const IBCConnectionInfoShape = M.splitRecord({ + id: IBCConnectionIDShape, + client_id: M.string(), + state: M.scalar(), // XXX STATE_OPEN or... + counterparty: { + client_id: M.string(), + connection_id: IBCConnectionIDShape, + }, + transferChannel: IBCChannelInfoShape, +}); + +/** @type {TypedPattern} */ +export const CosmosAssetInfoShape = M.splitRecord({ + base: M.string(), + name: M.string(), + display: M.string(), + symbol: M.string(), + denom_units: M.arrayOf( + M.splitRecord({ denom: M.string(), exponent: M.number() }), + ), +}); + +/** @type {TypedPattern} */ +export const CosmosChainInfoShape = M.splitRecord( + { + chainId: M.string(), + }, + { + bech32Prefix: M.string(), + connections: M.record(), + stakingTokens: M.arrayOf({ denom: M.string() }), + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: M.boolean(), + }, +); + +/** @type {TypedPattern} */ +export const ChainInfoShape = M.splitRecord({ + chainId: M.string(), +}); +export const DenomShape = M.string(); + +/** @type {TypedPattern>} */ +export const DenomInfoShape = { + chain: M.remotable('Chain'), + base: M.remotable('Chain'), + brand: M.or(M.remotable('Brand'), M.undefined()), + baseDenom: M.string(), +}; +harden(DenomInfoShape); + +/** @type {TypedPattern} */ +export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; +harden(DenomAmountShape); + +/** @type {TypedPattern>} */ +export const AnyNatAmountShape = { + brand: M.remotable('Brand'), + value: M.nat(), +}; +harden(AnyNatAmountShape); + +/** @type {TypedPattern} */ +export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); + +/** + * @type {TypedPattern<{ + * validator: CosmosValidatorAddress; + * amount: AmountArg; + * }>} + */ +export const DelegationShape = M.splitRecord( + { + validator: ChainAddressShape, + amount: AmountArgShape, + }, + { delegator: ChainAddressShape }, +); + +/** Approximately @see RequestQuery */ +export const ICQMsgShape = M.splitRecord( + { path: M.string(), data: M.string() }, + { height: M.string(), prove: M.boolean() }, +); + +/** @type {TypedPattern} */ +export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); + +/** @see {Chain} */ +export const chainFacadeMethods = { + getChainInfo: M.call().returns(VowShape), + makeAccount: M.call().returns(VowShape), +}; +harden(chainFacadeMethods); + +/** + * for google/protobuf/timestamp.proto, not to be confused with TimestampShape + * from `@agoric/time` + * + * `seconds` is a big integer but since it goes through JSON it is encoded as + * string + */ +export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; +harden(TimestampProtoShape); + +/** + * see {@link TxBody} for more details + * + * @internal + */ +export const TxBodyOptsShape = M.splitRecord( + {}, + { + memo: M.string(), + timeoutHeight: M.bigint(), + extensionOptions: M.arrayOf(M.any()), + nonCriticalExtensionOptions: M.arrayOf(M.any()), + }, +); + +/** + * Ensures at least one {@link AmountKeywordRecord} entry is present and only + * permits Nat (fungible) amounts. + */ +export const AnyNatAmountsRecord = M.and( + M.recordOf(M.string(), AnyNatAmountShape), + M.not({}), +); diff --git a/contract/src/utils/address.js b/contract/src/utils/address.js new file mode 100644 index 00000000..8d39ed5a --- /dev/null +++ b/contract/src/utils/address.js @@ -0,0 +1,103 @@ +import { Fail, q } from '@endo/errors'; + +/** + * @import {IBCConnectionID} from '@agoric/vats'; + * @import {ChainAddress} from '../types.js'; + * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +/** + * @typedef {object} ICAChannelAddressOpts + * @property {string} [encoding='proto3'] message encoding format for the + * channel + * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. + * currently only `ordered` is supported for ics27-1 + * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` + * @property {string} [version='ics27-1'] default is `ics27-1` + */ + +/** + * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID + * @param {IBCConnectionID} controllerConnectionId Self Connection ID + * @param {ICAChannelAddressOpts} [opts] + * @returns {RemoteIbcAddress} + */ +export const makeICAChannelAddress = ( + hostConnectionId, + controllerConnectionId, + { + version = 'ics27-1', + encoding = 'proto3', + ordering = 'ordered', + txType = 'sdk_multi_msg', + } = {}, +) => { + hostConnectionId || Fail`hostConnectionId is required`; + controllerConnectionId || Fail`controllerConnectionId is required`; + const connString = JSON.stringify({ + version, + controllerConnectionId, + hostConnectionId, + address: '', // will be provided by the counterparty after channelOpenAck + encoding, + txType, + }); + return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; +}; +harden(makeICAChannelAddress); + +export const DEFAULT_ICQ_VERSION = 'icq-1'; + +/** + * @param {IBCConnectionID} controllerConnectionId + * @param {string} version defaults to icq-1 + * @returns {RemoteIbcAddress} + */ +export const makeICQChannelAddress = ( + controllerConnectionId, + version = DEFAULT_ICQ_VERSION, +) => { + controllerConnectionId || Fail`controllerConnectionId is required`; + return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; +}; +harden(makeICQChannelAddress); + +/** + * Parse a chain address from a remote address string. Assumes the address + * string is in a JSON format and contains an "address" field. This function is + * designed to be safe against malformed inputs and unexpected data types, and + * will return `undefined` in those cases. + * + * @param {RemoteIbcAddress} remoteAddressString - remote address string, + * including version + * @returns {ChainAddress['value'] | undefined} returns undefined on error + */ +export const findAddressField = remoteAddressString => { + try { + // Extract JSON version string assuming it's always surrounded by {} + const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; + const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; + if (!jsonObj?.address?.length) return undefined; + return jsonObj.address; + } catch (error) { + return undefined; + } +}; +harden(findAddressField); + +/** + * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. + * + * see + * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) + * for reference implementation + * + * @param {string} address + */ +export const getBech32Prefix = address => { + assert(address, 'address is required'); + const split = address.lastIndexOf('1'); + if (split === -1) return Fail`No separator character for ${q(address)}`; + if (split === 0) return Fail`Missing prefix for ${q(address)}`; + return address.slice(0, split); +}; diff --git a/contract/src/utils/amounts.js b/contract/src/utils/amounts.js new file mode 100644 index 00000000..3974f922 --- /dev/null +++ b/contract/src/utils/amounts.js @@ -0,0 +1,59 @@ +import { makeError } from '@endo/errors'; + +/** + * @import {ChainHub} from "../types.js"; + * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + */ + +/** + * @param {ChainHub} chainHub + * @param {DenomArg} denomArg + * @returns {Denom} + * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom + * mapping + */ +export const coerceDenom = (chainHub, denomArg) => { + if (typeof denomArg === 'string') { + return denomArg; + } + const denom = chainHub.getDenom(denomArg); + if (!denom) { + throw makeError(`No denom for brand ${denomArg}`); + } + return denom; +}; + +/** + * @param {ChainHub} chainHub + * @param {DenomAmount | Amount<'nat'>} amount + * @returns {DenomAmount} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceDenomAmount = (chainHub, amount) => { + if ('denom' in amount) { + return amount; + } + const denom = coerceDenom(chainHub, amount.brand); + return harden({ + denom, + value: amount.value, + }); +}; + +/** + * @param {ChainHub} chainHub + * @param {AmountArg} amount + * @returns {Coin} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceCoin = (chainHub, amount) => { + const denom = + 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); + return harden({ + denom, + amount: String(amount.value), + }); +}; diff --git a/contract/src/utils/cosmos.js b/contract/src/utils/cosmos.js new file mode 100644 index 00000000..5082a1c5 --- /dev/null +++ b/contract/src/utils/cosmos.js @@ -0,0 +1,82 @@ +import { makeError } from '@endo/errors'; +import { decodeBase64 } from '@endo/base64'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; + +/** + * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' + * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; + */ + +/** maximum clock skew, in seconds, for unbonding time reported from other chain */ +export const maxClockSkew = 10n * 60n; + +/** + * @template T + * @param {string} ackStr + * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg + */ +export const tryDecodeResponse = (ackStr, fromProtoMsg) => { + try { + const any = Any.decode(decodeBase64(ackStr)); + const protoMsg = Any.decode(any.value); + + const msg = fromProtoMsg(protoMsg); + return msg; + } catch (cause) { + throw makeError(`bad response: ${ackStr}`, undefined, { cause }); + } +}; + +/** + * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + * @see {@link toTruncatedDenomAmount} for DecCoin + */ +export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); + +/** + * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by + * truncating the fractional portion. + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + */ +export const toTruncatedDenomAmount = c => ({ + denom: c.denom, + value: BigInt(c.amount.split('.')[0]), +}); + +/** + * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration + * {@link CosmosValidatorAddress} + * + * @type {( + * r: { validatorAddress: string }, + * chainId: string, + * ) => CosmosValidatorAddress} + */ +export const toCosmosValidatorAddress = (r, chainId) => ({ + encoding: 'bech32', + value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), + chainId, +}); + +/** + * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration + * {@link CosmosDelegationResponse} + * + * @type {( + * chainInfo: { chainId: string }, + * r: DelegationResponse, + * ) => CosmosDelegationResponse} + */ +export const toCosmosDelegationResponse = ({ chainId }, r) => ({ + delegator: { + chainId, + encoding: 'bech32', + value: r.delegation.delegatorAddress, + }, + validator: toCosmosValidatorAddress(r.delegation, chainId), + amount: toDenomAmount(r.balance), +}); diff --git a/contract/src/utils/denomHash.js b/contract/src/utils/denomHash.js new file mode 100644 index 00000000..561ee4b5 --- /dev/null +++ b/contract/src/utils/denomHash.js @@ -0,0 +1,22 @@ +// @ts-check +import { sha256 } from '@noble/hashes/sha256'; +import { bytesToHex } from '@noble/hashes/utils'; + +/** + * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ + * + * @param {object} opts + * @param {string} [opts.portId] + * @param {string} [opts.channelId] required unless `path` is supplied + * @param {string} [opts.path] alternative to portId, channelId + * @param {string} opts.denom base denom + */ +export const denomHash = ({ + portId = 'transfer', + channelId = /** @type {string | undefined} */ (undefined), + path = `${portId}/${channelId}`, + denom, +}) => { + const h = sha256.create().update(`${path}/${denom}`).digest(); + return bytesToHex(h).toUpperCase(); +}; diff --git a/contract/src/utils/orc.js b/contract/src/utils/orc.js new file mode 100644 index 00000000..47a0d260 --- /dev/null +++ b/contract/src/utils/orc.js @@ -0,0 +1,38 @@ +/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ + +export const orcUtils = { + /** + * unwinds denom with PFM, if necessary + * + * @param {Omit} _args + * @returns {TransferMsg} + */ + makeTransferMsg: _args => { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, + /** + * SwapExact or SwapMaxSlippage, with optional AfterAction + * + * @param {(SwapExact | SwapMaxSlippage) & + * (AfterAction | Record)} _args + * + * @returns {TransferMsg} + */ + makeOsmosisSwap(_args) { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, +}; diff --git a/contract/src/utils/orchestrationAccount.js b/contract/src/utils/orchestrationAccount.js new file mode 100644 index 00000000..23f5337d --- /dev/null +++ b/contract/src/utils/orchestrationAccount.js @@ -0,0 +1,40 @@ +import { BrandShape } from '@agoric/ertp'; +import { Shape as NetworkShape } from '@agoric/network'; +import { VowShape } from '@agoric/vow'; +import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; +import { M } from '@endo/patterns'; +import { + AmountArgShape, + ChainAddressShape, + DenomAmountShape, + IBCTransferOptionsShape, +} from '../typeGuards.js'; + +/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ + +const { Vow$ } = NetworkShape; // TODO #9611 + +/** @see {OrchestrationAccountI} */ +export const orchestrationAccountMethods = { + getAddress: M.call().returns(ChainAddressShape), + getBalance: M.call(M.or(BrandShape, M.string())).returns( + Vow$(DenomAmountShape), + ), + getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), + send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), + sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( + VowShape, + ), + transfer: M.call(ChainAddressShape, AmountArgShape) + .optional(IBCTransferOptionsShape) + .returns(VowShape), + transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), + asContinuingOffer: M.call().returns( + Vow$({ + publicSubscribers: TopicsRecordShape, + invitationMakers: M.any(), + holder: M.remotable(), + }), + ), + getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), +}; diff --git a/contract/src/utils/packet.js b/contract/src/utils/packet.js new file mode 100644 index 00000000..70564cff --- /dev/null +++ b/contract/src/utils/packet.js @@ -0,0 +1,112 @@ +import { Fail } from '@endo/errors'; +import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; +import { + CosmosQuery, + CosmosResponse, +} from '@agoric/cosmic-proto/icq/v1/packet.js'; +import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + +/** + * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; + * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; + */ + +/** + * Makes an IBC transaction packet from an array of messages. Expects the + * `value` of each message to be base64 encoded bytes. Skips checks for + * malformed messages in favor of interface guards. + * + * @param {AnyJson[]} msgs + * @param {Partial>} [opts] + * @returns {string} stringified InterchainAccountPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeTxPacket(msgs, opts) { + const messages = msgs.map(Any.fromJSON); + const bytes = TxBody.encode( + TxBody.fromPartial({ + messages, + ...opts, + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + type: PacketType.TYPE_EXECUTE_TX, + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeTxPacket); + +/** + * Makes an IBC query packet from an array of query messages. Expects the `data` + * of each message to be base64 encoded bytes. Skips checks for malformed + * messages in favor of interface guards. + * + * @param {JsonSafe[]} msgs + * @returns {string} stringified InterchainQueryPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeQueryPacket(msgs) { + const bytes = CosmosQuery.encode( + CosmosQuery.fromPartial({ + requests: msgs.map(RequestQuery.fromJSON), + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeQueryPacket); + +/** + * Looks for a result or error key in the response string, and returns a + * Base64Bytes string. This string can be decoded using the corresponding + * Msg*Response object. Error strings seem to be plain text and do not need + * decoding. + * + * @param {string} response + * @returns {string} - base64 encoded bytes string + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseTxPacket(response) { + const { result, error } = JSON.parse(response); + if (result) return result; + else if (error) throw Error(error); + else throw Fail`expected either result or error: ${response}`; +} +harden(parseTxPacket); + +/** + * Looks for a result or error key in the response string. If a result is found, + * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on + * the resulting entries are base64 encoded for inter-vat communication. These + * can be decoded using the corresponding Query*Response objects. Error strings + * seem to be plain text and do not need decoding. + * + * @param {string} response + * @returns {JsonSafe[]} + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseQueryPacket(response) { + const result = parseTxPacket(response); + const { data } = JSON.parse(atob(result)); + const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); + return harden(responses.map(ResponseQuery.toJSON)); +} +harden(parseQueryPacket); diff --git a/contract/src/utils/registry.js b/contract/src/utils/registry.js new file mode 100644 index 00000000..25789864 --- /dev/null +++ b/contract/src/utils/registry.js @@ -0,0 +1,130 @@ +import { + State as IBCChannelState, + Order, +} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; +import assert from 'node:assert'; + +/** + * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; + * @import {Chain, IBCInfo} from '@chain-registry/types'; + * @import {ChainRegistryClient} from '@chain-registry/client'; + * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; + */ + +/** + * @param {IBCInfo} ibcInfo + * @param {string} name + * @param {Record} chainInfo + * @returns {[string, IBCConnectionInfo] | []} + */ +function toConnectionEntry(ibcInfo, name, chainInfo) { + // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order + const fromChain1 = ibcInfo.chain_1.chain_name === name; + const [from, to] = fromChain1 + ? [ibcInfo.chain_1, ibcInfo.chain_2] + : [ibcInfo.chain_2, ibcInfo.chain_1]; + assert.equal(from.chain_name, name); + const transferChannels = ibcInfo.channels.filter( + c => + c.chain_1.port_id === 'transfer' && + // @ts-expect-error tags does not specify keys + c.tags?.preferred, + ); + if (transferChannels.length === 0) { + console.warn( + 'no transfer channel for [', + from.chain_name, + to.chain_name, + ']', + '(skipping)', + ); + return []; + } + if (transferChannels.length > 1) { + console.warn( + 'multiple preferred transfer channels [', + from.chain_name, + to.chain_name, + ']:', + transferChannels, + '(choosing first)', + ); + } + const [channel] = transferChannels; + const [channelFrom, channelTo] = fromChain1 + ? [channel.chain_1, channel.chain_2] + : [channel.chain_2, channel.chain_1]; + const record = { + id: /** @type {IBCConnectionID} */ (from.connection_id), + client_id: from.client_id, + counterparty: { + client_id: to.client_id, + connection_id: /** @type {IBCConnectionID} */ (to.connection_id), + }, + state: IBCConnectionState.STATE_OPEN, // XXX presumably + transferChannel: { + channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), + portId: channelFrom.port_id, + counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), + counterPartyPortId: channelTo.port_id, + // FIXME mapping, our guard expects a numerical enum + ordering: Order.ORDER_NONE_UNSPECIFIED, + state: IBCChannelState.STATE_OPEN, // XXX presumably + version: channel.version, + }, + }; + const destChainId = chainInfo[to.chain_name].chainId; + return [destChainId, record]; +} + +/** + * Converts the given chain info to our local config format + * + * @param {Pick} registry + */ +export const convertChainInfo = async registry => { + /** @type {Record} */ + const chainInfo = {}; + + for (const chain of registry.chains) { + console.log('processing info', chain.chain_name); + chainInfo[chain.chain_name] = { + bech32Prefix: chain.bech32_prefix, + chainId: chain.chain_id, + stakingTokens: chain.staking?.staking_tokens, + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: chain.chain_name === 'osmosis', + }; + } + + // XXX probably easier to keep ibc separate + const ibcLookup = {}; + for (const ibc of registry.ibcData) { + ibcLookup[ibc.chain_1.chain_name] ||= []; + ibcLookup[ibc.chain_2.chain_name] ||= []; + + ibcLookup[ibc.chain_1.chain_name].push(ibc); + ibcLookup[ibc.chain_2.chain_name].push(ibc); + } + + const chainNames = registry.chains.map(c => c.chain_name).sort(); + + // iterate this after chainInfo is filled out + for (const name of chainNames) { + console.log('processing connections', name); + + const ibcData = ibcLookup[name]; + const connections = Object.fromEntries( + ibcData + .map(datum => toConnectionEntry(datum, name, chainInfo)) + .filter(entry => entry.length > 0) + // sort alphabetically for consistency + .sort(([a], [b]) => a.localeCompare(b)), + ); + chainInfo[name] = { ...chainInfo[name], connections }; + } + + // return object with insertion in alphabetical order of chain name + return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); +}; diff --git a/contract/src/utils/start-helper.js b/contract/src/utils/start-helper.js new file mode 100644 index 00000000..902c7194 --- /dev/null +++ b/contract/src/utils/start-helper.js @@ -0,0 +1,214 @@ +import { prepareAsyncFlowTools } from '@agoric/async-flow'; +import { prepareVowTools } from '@agoric/vow'; +import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { makeChainHub } from '../exos/chain-hub.js'; +import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; +import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; +import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; +import { prepareOrchestrator } from '../exos/orchestrator.js'; +import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; +import { makeOrchestrationFacade } from '../facade.js'; +import { makeZoeTools } from './zoe-tools.js'; +import { makeZcfTools } from './zcf-tools.js'; + +/** + * @import {LocalChain} from '@agoric/vats/src/localchain.js'; + * @import {TimerService, TimerBrand} from '@agoric/time'; + * @import {Baggage} from '@agoric/vat-data'; + * @import {NameHub} from '@agoric/vats'; + * @import {Remote} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; + */ + +/** + * @typedef {{ + * localchain: Remote; + * orchestrationService: Remote; + * storageNode: Remote; + * timerService: Remote; + * agoricNames: Remote; + * }} OrchestrationPowers + */ + +/** + * Helper that a contract start function can use to set up the objects needed + * for orchestration. + * + * TODO strip problematic operations from ZCF (e.g., getPayouts) + * + * @param {ZCF} zcf + * @param {Baggage} baggage + * @param {OrchestrationPowers} remotePowers + * @param {Marshaller} marshaller + * @internal + */ +export const provideOrchestration = ( + zcf, + baggage, + remotePowers, + marshaller, +) => { + // separate zones + const zones = (() => { + const zone = makeDurableZone(baggage); + return { + /** system names for async flow */ + asyncFlow: zone.subZone('asyncFlow'), + /** system names for orchestration implementation */ + orchestration: zone.subZone('orchestration'), + /** system names for chainHub */ + chainHub: zone.subZone('chainHub'), + /** system names for vows */ + vows: zone.subZone('vows'), + /** contract-provided names, and subzones */ + contract: zone.subZone('contract'), + }; + })(); + + const { agoricNames, timerService, localchain } = remotePowers; + + const vowTools = prepareVowTools(zones.vows); + + const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); + + const zoeTools = makeZoeTools(zcf, vowTools); + + const zcfTools = makeZcfTools(zcf, vowTools); + + const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); + const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( + zones.orchestration, + { + makeRecorderKit, + zcf, + timerService, + vowTools, + chainHub, + localchain, + zoeTools, + }, + ); + + const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { + vowTools, + }); + + const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( + zones.orchestration, + { + chainHub, + makeRecorderKit, + timerService, + vowTools, + zcf, + }, + ); + + const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { + makeCosmosOrchestrationAccount, + orchestration: remotePowers.orchestrationService, + storageNode: remotePowers.storageNode, + timer: remotePowers.timerService, + vowTools, + }); + + const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { + makeLocalOrchestrationAccountKit, + localchain: remotePowers.localchain, + // FIXME what path? + storageNode: remotePowers.storageNode, + agoricNames, + orchestration: remotePowers.orchestrationService, + timer: remotePowers.timerService, + vowTools, + }); + + const makeOrchestrator = prepareOrchestrator(zones.orchestration, { + chainHub, + makeLocalChainFacade, + makeRemoteChainFacade, + vowTools, + }); + + /** + * Create orchestrate functions in a specific zone, instead of the default + * `contract.orchestration` zone. This is used for modules that add their own + * orchestration functions (e.g., a Portfolio with orchestration flows for + * continuing offers) + * + * @param {Zone} zone + */ + const makeOrchestrateKit = zone => + makeOrchestrationFacade({ + zone, + zcf, + makeRecorderKit, + makeOrchestrator, + asyncFlowTools, + vowTools, + ...remotePowers, + }); + + // Create orchestrate functions for the default `contract.orchestration` zone + const defaultOrchestrateKit = makeOrchestrateKit( + zones.contract.subZone('orchestration'), + ); + + zcf.setTestJig(() => ({ + baggage, + chainHub, + })); + + return { + ...defaultOrchestrateKit, + makeOrchestrateKit, + chainHub, + vowTools, + asyncFlowTools, + zcfTools, + zoeTools, + zone: zones.contract, + }; +}; +harden(provideOrchestration); + +/** @typedef {Omit, 'zone'>} OrchestrationTools */ + +/** + * Simplifies contract functions for Orchestration by wrapping a simpler + * function with all the tools it needs in order to use Orchestration. + * + * @example + * + * ```js + * const contract = (zcf, privateArgs, zone, tools) => { ... }; + * export const start = withOrchestration(contract); + * ``` + * + * @template {Record} CT + * @template {OrchestrationPowers & { + * marshaller: Marshaller; + * }} PA + * @template R + * @param {( + * zcf: ZCF, + * privateArgs: PA, + * zone: Zone, + * tools: OrchestrationTools, + * ) => Promise} contractFn + * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a + * Zoe start function + */ +export const withOrchestration = + contractFn => async (zcf, privateArgs, baggage) => { + const { zone, ...tools } = provideOrchestration( + zcf, + baggage, + privateArgs, + privateArgs.marshaller, + ); + return contractFn(zcf, privateArgs, zone, tools); + }; +harden(withOrchestration); diff --git a/contract/src/utils/time.js b/contract/src/utils/time.js new file mode 100644 index 00000000..06f995ab --- /dev/null +++ b/contract/src/utils/time.js @@ -0,0 +1,48 @@ +import { E } from '@endo/far'; +import { TimeMath } from '@agoric/time'; + +/** + * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + */ + +export const SECONDS_PER_MINUTE = 60n; +export const MILLISECONDS_PER_SECOND = 1000n; +export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; +export const NANOSECONDS_PER_SECOND = 1_000_000_000n; + +/** + * XXX should this be durable? resumable? + * + * @param {Remote} timer + */ +export function makeTimestampHelper(timer) { + return harden({ + /** + * XXX do this need to be resumable / use Vows? + * + * Takes the current time from ChainTimerService and adds a relative time to + * determine a timeout timestamp in nanoseconds. Useful for + * {@link MsgTransfer.timeoutTimestamp}. + * + * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes + * @returns {Promise} Timeout timestamp in absolute nanoseconds + * since unix epoch + */ + async getTimeoutTimestampNS(relativeTime) { + const currentTime = await E(timer).getCurrentTimestamp(); + const timeout = + relativeTime || + TimeMath.coerceRelativeTimeRecord( + SECONDS_PER_MINUTE * 5n, + currentTime.timerBrand, + ); + return ( + TimeMath.addAbsRel(currentTime, timeout).absValue * + NANOSECONDS_PER_SECOND + ); + }, + }); +} + +/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/src/utils/zcf-tools.js b/contract/src/utils/zcf-tools.js new file mode 100644 index 00000000..d3843695 --- /dev/null +++ b/contract/src/utils/zcf-tools.js @@ -0,0 +1,35 @@ +/** + * @import {HostInterface} from '@agoric/async-flow'; + * @import {VowTools} from '@agoric/vow'; + * @import {ZcfTools} from '../types.js'; + */ + +import { M, mustMatch } from '@endo/patterns'; + +const HandlerShape = M.remotable('OfferHandler'); + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + * @returns {HostInterface} + */ +export const makeZcfTools = (zcf, vowTools) => + harden({ + makeInvitation(offerHandler, description, customDetails, proposalShape) { + mustMatch(offerHandler, HandlerShape); + return vowTools.watch( + zcf.makeInvitation( + offerHandler, + description, + customDetails, + proposalShape, + ), + ); + }, + atomicRearrange(transfers) { + zcf.atomicRearrange(transfers); + }, + assertUniqueKeyword(keyword) { + zcf.assertUniqueKeyword(keyword); + }, + }); diff --git a/contract/src/utils/zoe-tools.js b/contract/src/utils/zoe-tools.js new file mode 100644 index 00000000..a5cbbe38 --- /dev/null +++ b/contract/src/utils/zoe-tools.js @@ -0,0 +1,186 @@ +/** + * @file Helper functions for transferring payments between a LocalChainAccount + * and a ZCFSeat. + * + * Maintainers: This exists as an endowment for orchestrated async-flows so we + * can make use of E and promises. The logic for recovering partial failures + * is also an added convenience for developers. + * + * Functions are written using `asVow` and non-resumable promises as we expect + * each invocation to resolve promptly - there are no timers or interchain + * network calls. + * + * A promise resolved promptly is currently safe from being severed by an + * upgrade because we only trigger vat upgrades as the result of network + * input. + */ + +import { makeError, q, Fail } from '@endo/errors'; +import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; +import { E } from '@endo/far'; + +const { assign, keys, values } = Object; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {VowTools} from '@agoric/vow'; + * @import {LocalAccountMethods} from '../types.js'; + */ + +/** + * @typedef {{ + * invitationMakers: InvitationMakers; + * publicSubscribers: Record>; + * }} ResolvedContinuingOfferResult + * + * @see {ContinuingOfferResult} + */ + +/** + * @typedef {( + * srcSeat: ZCFSeat, + * localAccount: LocalAccountMethods, + * amounts: AmountKeywordRecord, + * ) => Promise} LocalTransfer + */ + +/** + * @typedef {( + * localAccount: LocalAccountMethods, + * destSeat: ZCFSeat, + * amounts: AmountKeywordRecord, + * ) => Promise} WithdrawToSeat + */ + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + */ +export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { + /** + * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the + * deposits fail, everything will be rolled back to the `srcSeat`. Supports + * multiple items in the `amounts` {@link AmountKeywordRecord}. + * + * @type {HostOf} + */ + const localTransfer = (srcSeat, localAccount, amounts) => + asVow(async () => { + !srcSeat.hasExited() || Fail`The seat cannot have exited.`; + const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); + const userSeat = await userSeatP; + zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); + tempSeat.exit(); + // TODO (#9541) get the userSeat into baggage so it's at least recoverable + // const userSeat = await subzone.makeOnce( + // 'localTransferHelper', + // async () => { + // const { zcfSeat: tempSeat, userSeat: userSeatP } = + // zcf.makeEmptySeatKit(); + // const uSeat = await userSeatP; + // // TODO how do I store in the place for this retryable? + // atomicTransfer(zcf, srcSeat, tempSeat, amounts); + // tempSeat.exit(); + // return uSeat; + // }, + // ); + + // Now all the `amounts` are accessible, so we can move them to the localAccount + const payments = await Promise.all( + keys(amounts).map(kw => E(userSeat).getPayout(kw)), + ); + const settleDeposits = await when( + allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), + ); + // if any of the deposits to localAccount failed, unwind all of the allocations + if (settleDeposits.find(x => x.status === 'rejected')) { + const amts = values(amounts); + const errors = []; + // withdraw the successfully deposited payments + const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { + if (x.status === 'rejected') { + errors.push(x.reason); + return payments[i]; + } + return E(localAccount).withdraw(amts[i]); + }); + + // return all payments to the srcSeat + const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); + const paymentKwr = harden( + keys(amounts).reduce( + (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + srcSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + throw makeError(`One or more deposits failed ${q(errors)}`); + } + // TODO #9541 remove userSeat from baggage + }); + + /** + * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any + * of the withdrawals fail, everything will be rolled back to the + * `srcLocalAccount`. Supports multiple items in the `amounts` + * {@link PaymentKeywordRecord} + * + * @type {HostOf} + */ + const withdrawToSeat = (localAccount, destSeat, amounts) => + asVow(async () => { + !destSeat.hasExited() || Fail`The seat cannot have exited.`; + + const settledWithdrawals = await when( + allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), + ); + + // if any of the withdrawals were rejected, unwind the successful ones + if (settledWithdrawals.find(x => x.status === 'rejected')) { + const returnPaymentVs = []; + const errors = []; + for (const result of settledWithdrawals) { + if (result.status === 'fulfilled') { + returnPaymentVs.push(E(localAccount).deposit(result.value)); + } else { + errors.push(result.reason); + } + } + await when(allVows(returnPaymentVs)); + throw makeError(`One or more withdrawals failed ${q(errors)}`); + } + // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat + const paymentKwr = harden( + keys(amounts).reduce( + (acc, kw, i) => + assign(acc, { + [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] + .value, + }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + destSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + }); + + return harden({ + localTransfer, + withdrawToSeat, + }); +}; + +/** @typedef {ReturnType} ZoeTools */ diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts new file mode 100644 index 00000000..c0cae528 --- /dev/null +++ b/contract/test/auto-stake-it.contract.test.ts @@ -0,0 +1,154 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { setUpZoeForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import { createRequire } from 'module'; +import { E } from '@endo/far'; +import { heapVowE } from '@agoric/vow/vat.js'; +import path from 'path'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { MsgDelegateResponse } from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import type { IBCEvent } from '@agoric/vats'; +import type { AutoStakeItSF } from '../src/auto-stake-it.contract.js'; +import { commonSetup } from './supports.js'; +import { + buildMsgResponseString, + buildVTransferEvent, +} from '../tools/ibc-mocks.js'; + +const dirname = path.dirname(new URL(import.meta.url).pathname); + +const nodeRequire = createRequire(import.meta.url); + +const contractFile = nodeRequire.resolve('../src/auto-stake-it.contract.js'); +const contractName = 'auto-stake-it'; +// const contractFile = `${dirname}/../src/${contractName}.contract.js`; +// const contractFile = '/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js'; +// type StartFn = + // typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; + +test('make accounts, register tap, return invitationMakers', async t => { + t.log('bootstrap, orchestration core-eval'); + const { + bootstrap: { storage }, + commonPrivateArgs, + mocks: { transferBridge }, + utils: { inspectLocalBridge, inspectDibcBridge, transmitTransferAck }, + } = await commonSetup(t); + + const { zoe, bundleAndInstall } = await setUpZoeForTest(); + + t.log('contract coreEval', contractName); + const installation: Installation = + await bundleAndInstall(contractFile); + const storageNode = await E(storage.rootNode).makeChildNode(contractName); + const autoAutoStakeItKit = await E(zoe).startInstance( + installation, + undefined, + {}, + { ...commonPrivateArgs, storageNode }, + ); + const publicFacet = await E(zoe).getPublicFacet(autoAutoStakeItKit.instance); + + // make an offer to create an LocalOrchAcct and a CosmosOrchAccount + const inv = E(publicFacet).makeAccountsInvitation(); + const userSeat = E(zoe).offer(inv, {}, undefined, { + chainName: 'cosmoshub', + validator: { + chainId: 'cosmoshub-4', + value: 'cosmosvaloper1test', + encoding: 'bech32', + }, + }); + const result = await heapVowE(userSeat).getOfferResult(); + + const { + publicSubscribers: { agoric, cosmoshub }, + } = result; + + const loaAddress = agoric.storagePath.split('.').pop()!; + const icaAddress = cosmoshub.storagePath.split('.').pop()!; + t.regex(loaAddress, /^agoric/); + t.regex(icaAddress, /^cosmos/); + + // simulate incoming transfers with upcall from golang to VM to initiate the + // incoming transfer Tap + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: 'agoric1fakeLCAAddress', + amount: 10n, + denom: 'unknown-token', + }), + ); + await eventLoopIteration(); + { + const { messages } = inspectLocalBridge().at(-1); + // we do not expect to see MsgTransfer for unknown tokens + t.not(messages?.length, 1, 'unknown-token is ignored'); + } + + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: 'agoric1fakeLCAAddress', + amount: 10n, + denom: 'unknown-token', + sourceChannel: 'channel-0', + }), + ); + await eventLoopIteration(); + { + const { messages } = inspectLocalBridge().at(-1); + // we do not expect to see MsgTransfer for an sourceChannel + t.not(messages?.length, 1, 'unknown sourceChannel is ignored'); + } + + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: 'agoric1fakeLCAAddress', + amount: 10n, + denom: 'uatom', + }), + ); + await eventLoopIteration(); + + const { messages, address: execAddr } = inspectLocalBridge().at(-1); + t.is(messages?.length, 1, 'transfer message sent'); + t.like( + messages[0], + { + '@type': '/ibc.applications.transfer.v1.MsgTransfer', + receiver: 'cosmos1test', + sender: execAddr, + sourceChannel: 'channel-5', + token: { + amount: '10', + }, + }, + 'tokens transferred from LOA to COA', + ); + await transmitTransferAck(); + const { acknowledgement } = (await inspectDibcBridge()).bridgeEvents.at( + -1, + ) as IBCEvent<'acknowledgementPacket'>; + // XXX consider checking ICA (dest|source)_channel, to verify the sender of + // MsgDelegate, once available in vstorage + t.is( + acknowledgement, + buildMsgResponseString(MsgDelegateResponse, {}), + 'COA delegated the received funds', + ); + + // second user can make an account + const inv2 = E(publicFacet).makeAccountsInvitation(); + const userSeat2 = E(zoe).offer(inv2, {}, undefined, { + chainName: 'cosmoshub', + validator: { + chainId: 'cosmoshub-4', + value: 'cosmosvaloper1test', + encoding: 'bech32', + }, + }); + const { publicSubscribers: pubSubs2 } = + await heapVowE(userSeat2).getOfferResult(); + + t.regex(pubSubs2.agoric.storagePath.split('.').pop()!, /^agoric/); + t.regex(pubSubs2.cosmoshub.storagePath.split('.').pop()!, /^cosmos/); +}); diff --git a/contract/test/ibc-mocks.ts b/contract/test/ibc-mocks.ts new file mode 100644 index 00000000..6992227e --- /dev/null +++ b/contract/test/ibc-mocks.ts @@ -0,0 +1,128 @@ +/** @file The mocks used in these tests */ +import { + QueryBalanceRequest, + QueryBalanceResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; +import { + MsgBeginRedelegate, + MsgBeginRedelegateResponse, + MsgDelegate, + MsgDelegateResponse, + MsgUndelegate, + MsgUndelegateResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import { + MsgWithdrawDelegatorReward, + MsgWithdrawDelegatorRewardResponse, +} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/tx.js'; +import type { Timestamp } from '@agoric/cosmic-proto/google/protobuf/timestamp.js'; +import { + MsgSend, + MsgSendResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; +import { + buildMsgResponseString, + buildQueryResponseString, + buildMsgErrorString, + buildTxPacketString, + buildQueryPacketString, + createMockAckMap, +} from '../tools/ibc-mocks.js'; + +/** + * TODO: provide mappings to cosmos error codes (and module specific error codes) + * see https://github.com/Agoric/agoric-sdk/issues/9629 for more details about + * error messages over ibc + */ +export const errorAcknowledgments = { + error5: buildMsgErrorString( + 'ABCI code: 5: error handling packet: see events for details', + ), +}; + +const delegation = { + amount: { + denom: 'uatom', + amount: '10', + }, + delegatorAddress: 'cosmos1test', + validatorAddress: 'cosmosvaloper1test', +}; +const redelegation = { + delegatorAddress: 'cosmos1test', + validatorSrcAddress: 'cosmosvaloper1test', + validatorDstAddress: 'cosmosvaloper2test', + amount: { + denom: 'uatom', + amount: '10', + }, +}; +const bankSend = { + fromAddress: 'cosmos1test', + toAddress: 'cosmos99test', + amount: [{ denom: 'uatom', amount: '10' }], +}; +const bankSendMulti = { + fromAddress: 'cosmos1test', + toAddress: 'cosmos99test', + amount: [ + { denom: 'uatom', amount: '10' }, + { denom: 'ibc/1234', amount: '10' }, + ], +}; + +export const UNBOND_PERIOD_SECONDS = 5n; + +const getUnbondingTime = (): Timestamp => ({ + seconds: UNBOND_PERIOD_SECONDS, + nanos: 0, +}); + +export const protoMsgMocks = { + delegate: { + msg: buildTxPacketString([MsgDelegate.toProtoMsg(delegation)]), + ack: buildMsgResponseString(MsgDelegateResponse, {}), + }, + undelegate: { + msg: buildTxPacketString([MsgUndelegate.toProtoMsg(delegation)]), + ack: buildMsgResponseString(MsgUndelegateResponse, { + completionTime: getUnbondingTime(), + }), + }, + redelegate: { + msg: buildTxPacketString([MsgBeginRedelegate.toProtoMsg(redelegation)]), + ack: buildMsgResponseString(MsgBeginRedelegateResponse, { + completionTime: getUnbondingTime(), + }), + }, + withdrawReward: { + msg: buildTxPacketString([ + MsgWithdrawDelegatorReward.toProtoMsg(delegation), + ]), + ack: buildMsgResponseString(MsgWithdrawDelegatorRewardResponse, { + amount: [{ amount: '1', denom: 'uatom' }], + }), + }, + queryBalance: { + msg: buildQueryPacketString([ + QueryBalanceRequest.toProtoMsg({ + address: 'cosmos1test', + denom: 'uatom', + }), + ]), + ack: buildQueryResponseString(QueryBalanceResponse, { + balance: { amount: '0', denom: 'uatom' }, + }), + }, + bankSend: { + msg: buildTxPacketString([MsgSend.toProtoMsg(bankSend)]), + ack: buildMsgResponseString(MsgSendResponse, {}), + }, + bankSendMulti: { + msg: buildTxPacketString([MsgSend.toProtoMsg(bankSendMulti)]), + ack: buildMsgResponseString(MsgSendResponse, {}), + }, +}; + +export const defaultMockAckMap: Record = + createMockAckMap(protoMsgMocks); diff --git a/contract/test/supports.ts b/contract/test/supports.ts new file mode 100644 index 00000000..dbf539c0 --- /dev/null +++ b/contract/test/supports.ts @@ -0,0 +1,236 @@ +import { makeIssuerKit } from '@agoric/ertp'; +import { VTRANSFER_IBC_EVENT } from '@agoric/internal/src/action-types.js'; +import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { makeNameHubKit } from '@agoric/vats'; +import { prepareBridgeTargetModule } from '@agoric/vats/src/bridge-target.js'; +import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; +import { prepareLocalChainTools } from '@agoric/vats/src/localchain.js'; +import { prepareTransferTools } from '@agoric/vats/src/transfer.js'; +import { makeFakeBankManagerKit } from '@agoric/vats/tools/bank-utils.js'; +import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; +import { + makeFakeLocalchainBridge, + makeFakeTransferBridge, +} from '@agoric/vats/tools/fake-bridge.js'; +import { prepareSwingsetVowTools } from '@agoric/vow/vat.js'; +import type { Installation } from '@agoric/zoe/src/zoeService/utils.js'; +import { buildZoeManualTimer } from '@agoric/zoe/tools/manualTimer.js'; +import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; +import { makeHeapZone } from '@agoric/zone'; +import { E } from '@endo/far'; +import type { ExecutionContext } from 'ava'; +import { registerKnownChains } from '../src/chain-info.js'; +import { makeChainHub } from '../src/exos/chain-hub.js'; +import { prepareCosmosInterchainService } from '../src/exos/cosmos-interchain-service.js'; +import fetchedChainInfo from '../src/fetched-chain-info.js'; +import { buildVTransferEvent } from '../tools/ibc-mocks.js'; +import { setupFakeNetwork } from './network-fakes.js'; + +export { + makeFakeLocalchainBridge, + makeFakeTransferBridge, +} from '@agoric/vats/tools/fake-bridge.js'; + +export const commonSetup = async (t: ExecutionContext) => { + t.log('bootstrap vat dependencies'); + // The common setup cannot support a durable zone because many of the fakes are not durable. + // They were made before we had durable kinds (and thus don't take a zone or baggage). + // To test durability in unit tests, test a particular entity with `relaxDurabilityRules: false`. + // To test durability integrating multiple vats, use a RunUtils/bootstrap test. + const rootZone = makeHeapZone(); + + const { nameHub: agoricNames, nameAdmin: agoricNamesAdmin } = + makeNameHubKit(); + + const bld = withAmountUtils(makeIssuerKit('BLD')); + const ist = withAmountUtils(makeIssuerKit('IST')); + const bankBridgeMessages = [] as any[]; + const { bankManager, pourPayment } = await makeFakeBankManagerKit({ + onToBridge: obj => bankBridgeMessages.push(obj), + }); + await E(bankManager).addAsset('ubld', 'BLD', 'Staking Token', bld.issuerKit); + await E(bankManager).addAsset( + 'uist', + 'IST', + 'Inter Stable Token', + ist.issuerKit, + ); + // These mints no longer stay in sync with bankManager. + // Use pourPayment() for IST. + const { mint: _b, ...bldSansMint } = bld; + const { mint: _i, ...istSansMint } = ist; + // XXX real bankManager does this. fake should too? + // TODO https://github.com/Agoric/agoric-sdk/issues/9966 + await makeWellKnownSpaces(agoricNamesAdmin, t.log, ['vbankAsset']); + await E(E(agoricNamesAdmin).lookupAdmin('vbankAsset')).update( + 'uist', + /** @type {AssetInfo} */ harden({ + brand: ist.brand, + issuer: ist.issuer, + issuerName: 'IST', + denom: 'uist', + proposedName: 'IST', + displayInfo: { IOU: true }, + }), + ); + await E(E(agoricNamesAdmin).lookupAdmin('vbankAsset')).update( + 'ubld', + /** @type {AssetInfo} */ harden({ + brand: bld.brand, + issuer: bld.issuer, + issuerName: 'BLD', + denom: 'ubld', + proposedName: 'BLD', + displayInfo: { IOU: true }, + }), + ); + + const vowTools = prepareSwingsetVowTools(rootZone.subZone('vows')); + + const transferBridge = makeFakeTransferBridge(rootZone); + const { makeBridgeTargetKit } = prepareBridgeTargetModule( + rootZone.subZone('bridge'), + ); + const { makeTransferMiddlewareKit } = prepareTransferTools( + rootZone.subZone('transfer'), + vowTools, + ); + + const { finisher, interceptorFactory, transferMiddleware } = + makeTransferMiddlewareKit(); + const bridgeTargetKit = makeBridgeTargetKit( + transferBridge, + VTRANSFER_IBC_EVENT, + interceptorFactory, + ); + finisher.useRegistry(bridgeTargetKit.targetRegistry); + await E(transferBridge).initHandler(bridgeTargetKit.bridgeHandler); + + const localBridgeMessages = [] as any[]; + const localchainBridge = makeFakeLocalchainBridge(rootZone, obj => + localBridgeMessages.push(obj), + ); + const localchain = prepareLocalChainTools( + rootZone.subZone('localchain'), + vowTools, + ).makeLocalChain({ + bankManager, + system: localchainBridge, + transfer: transferMiddleware, + }); + const timer = buildZoeManualTimer(t.log); + const marshaller = makeFakeBoard().getReadonlyMarshaller(); + const storage = makeFakeStorageKit('mockChainStorageRoot', { + sequence: false, + }); + + const { portAllocator, setupIBCProtocol, ibcBridge } = setupFakeNetwork( + rootZone.subZone('network'), + { vowTools }, + ); + await setupIBCProtocol(); + + const makeCosmosInterchainService = prepareCosmosInterchainService( + rootZone.subZone('orchestration'), + vowTools, + ); + const cosmosInterchainService = makeCosmosInterchainService({ + portAllocator, + }); + + await registerKnownChains(agoricNamesAdmin, () => {}); + + let ibcSequenceNonce = 0n; + /** simulate incoming message as if the transfer completed over IBC */ + const transmitTransferAck = async () => { + // assume this is called after each outgoing IBC transfer + ibcSequenceNonce += 1n; + // let the promise for the transfer start + await eventLoopIteration(); + const lastMsgTransfer = localBridgeMessages.at(-1).messages[0]; + await E(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: lastMsgTransfer.receiver, + sender: lastMsgTransfer.sender, + target: lastMsgTransfer.sender, + sourceChannel: lastMsgTransfer.sourceChannel, + sequence: ibcSequenceNonce, + }), + ); + // let the bridge handler finish + await eventLoopIteration(); + }; + + const chainHub = makeChainHub( + rootZone.subZone('chainHub'), + agoricNames, + vowTools, + ); + + /** + * Register BLD if it's not already registered. + * Does not work with `withOrchestration` contracts, as these have their own + * ChainHub. Use `ChainHubAdmin` instead. + */ + const registerAgoricBld = () => { + if (!chainHub.getAsset('ubld')) { + chainHub.registerChain('agoric', fetchedChainInfo.agoric); + chainHub.registerAsset('ubld', { + chainName: 'agoric', + baseName: 'agoric', + baseDenom: 'ubld', + brand: bld.brand, + }); + } + }; + + return { + bootstrap: { + agoricNames, + agoricNamesAdmin, + bankManager, + timer, + localchain, + cosmosInterchainService, + // TODO remove; bootstrap doesn't have a zone + rootZone: rootZone.subZone('contract'), + storage, + // TODO remove; bootstrap doesn't have vowTools + vowTools, + }, + brands: { + bld: bldSansMint, + ist: istSansMint, + }, + mocks: { + ibcBridge, + transferBridge, + }, + commonPrivateArgs: { + agoricNames, + localchain, + orchestrationService: cosmosInterchainService, + storageNode: storage.rootNode, + marshaller, + timerService: timer, + }, + facadeServices: { + agoricNames, + chainHub, + localchain, + orchestrationService: cosmosInterchainService, + timerService: timer, + }, + utils: { + pourPayment, + inspectLocalBridge: () => harden([...localBridgeMessages]), + inspectDibcBridge: () => E(ibcBridge).inspectDibcBridge(), + inspectBankBridge: () => harden([...bankBridgeMessages]), + registerAgoricBld, + transmitTransferAck, + }, + }; +}; + +export const makeDefaultContext = (contract: Installation) => {}; diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts new file mode 100644 index 00000000..96995b9e --- /dev/null +++ b/contract/tools/ibc-mocks.ts @@ -0,0 +1,262 @@ +/** @file Tools to support making IBC mocks */ +import { type JsonSafe, toRequestQueryJson } from '@agoric/cosmic-proto'; +import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { FungibleTokenPacketData } from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; +import type { PacketSDKType } from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import { CosmosResponse } from '@agoric/cosmic-proto/icq/v1/packet.js'; +import { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import { + IBC_EVENT, + VTRANSFER_IBC_EVENT, +} from '@agoric/internal/src/action-types.js'; +import type { + IBCChannelID, + IBCEvent, + IBCPacket, + VTransferIBCEvent, +} from '@agoric/vats'; +import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; +import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; +import type { ChainAddress } from '../src/orchestration-api.js'; +import { makeQueryPacket, makeTxPacket } from '../src/utils/packet.js'; + +interface EncoderI { + encode: (message: T) => { + finish: () => Uint8Array; + }; + fromPartial: (partial: Partial) => T; + typeUrl: string; +} + +const toPacket = (obj: Record): string => + btoa(JSON.stringify(obj)); + +/** + * Build a response "packet bytes string" we'd expect to see from a Msg + * Response + * + * XXX support multiple responses in a single message + * + * @param Encoder + * @param message + */ +export function buildMsgResponseString( + Encoder: EncoderI, + message: Partial, +): string { + const encodedMsg = Encoder.encode(Encoder.fromPartial(message)).finish(); + + // cosmos-sdk double Any encodes + const encodedAny = Any.encode( + Any.fromPartial({ + value: Any.encode( + Any.fromPartial({ + typeUrl: Encoder.typeUrl, + value: encodedMsg, + }), + ).finish(), + }), + ).finish(); + + return toPacket({ + result: encodeBase64(encodedAny), + }); +} + +/** + * Build an example error packet for a failed Tx Msg + * @param msg + */ +export function buildMsgErrorString( + msg = 'ABCI code: 5: error handling packet: see events for details', +): string { + return toPacket({ + error: msg, + }); +} + +/** + * Build a response "packet bytes string" we'd expect to see from a Query + * request + * + * XXX accept multiple queries at once + * + * @param Encoder + * @param query + * @param opts + */ +export function buildQueryResponseString( + Encoder: EncoderI, + query: Partial, + opts: Omit = { + value: new Uint8Array(), + height: 0n, + index: 0n, + code: 0, + log: '', + info: '', + codespace: '', + }, +): string { + const encodedResp = CosmosResponse.encode( + CosmosResponse.fromPartial({ + responses: [ + { + key: Encoder.encode(Encoder.fromPartial(query)).finish(), + ...opts, + }, + ], + }), + ).finish(); + + return toPacket({ + result: toPacket({ data: encodeBase64(encodedResp) }), + }); +} + +/** + * Build a tx packet string for the mocked dibc bridge handler + * @param msgs + * @returns {string} + */ +export function buildTxPacketString( + msgs: { value: Uint8Array; typeUrl: string }[], +): string { + return btoa(makeTxPacket(msgs.map(Any.toJSON))); +} + +/** + * Parse an outgoing ica tx packet. Useful for testing when inspecting + * outgoing dibc bridge messages. + * + * @param b64 base64 encoded string + */ +export const parseOutgoingTxPacket = (b64: string) => { + return TxBody.decode(decodeBase64(JSON.parse(atob(b64)).data)); +}; + +/** + * Build a query packet string for the mocked dibc bridge handler + * @param msgs + * @param opts + * @returns {string} + */ +export function buildQueryPacketString( + msgs: Any[], + opts: Partial> = {}, +): string { + return btoa(makeQueryPacket(msgs.map(msg => toRequestQueryJson(msg, opts)))); +} + +type BuildVTransferEventParams = { + event?: VTransferIBCEvent['event']; + /* defaults to cosmos1AccAddress. set to `agoric1fakeLCAAddress` to simulate an outgoing transfer event */ + sender?: ChainAddress['value']; + /* defaults to agoric1fakeLCAAddress. set to a different value to simulate an outgoing transfer event */ + receiver?: ChainAddress['value']; + target?: ChainAddress['value']; + amount?: bigint; + denom?: string; + destinationChannel?: IBCChannelID; + sourceChannel?: IBCChannelID; + /* support bigint and string, to facilitate bootstrap testing */ + sequence?: PacketSDKType['sequence'] | JsonSafe; +}; + +/** + * `buildVTransferEvent` can be used with `transferBridge` to simulate incoming + * and outgoing IBC fungible tokens transfers to a LocalChain account. + * + * It defaults to simulating incoming transfers. To simulate an outgoing one, + * ensure `sender=agoric1fakeLCAAddress` and this after LocalChainBridge + * receives the outgoing MsgTransfer, + * + * @example + * ```js + * const { mocks: { transferBridge } = await commonSetup(t); + * await E(transferBridge).fromBridge( + * buildVTransferEvent({ + * receiver: 'agoric1fakeLCAAddress', + * amount: 10n, + * denom: 'uatom', + * }), + * ); + * ``` + * + * XXX integrate vlocalchain and vtransfer ScopedBridgeManagers + * in test supports. + * + * @param {{BuildVTransferEventParams}} args + */ +export const buildVTransferEvent = ({ + event = 'acknowledgementPacket' as const, + sender = 'cosmos1AccAddress', + receiver = LOCALCHAIN_DEFAULT_ADDRESS, + target = LOCALCHAIN_DEFAULT_ADDRESS, + amount = 10n, + denom = 'uatom', + destinationChannel = 'channel-0' as IBCChannelID, + sourceChannel = 'channel-405' as IBCChannelID, + sequence = 0n, +}: BuildVTransferEventParams = {}): VTransferIBCEvent => ({ + type: VTRANSFER_IBC_EVENT, + blockHeight: 0, + blockTime: 0, + event, + acknowledgement: btoa(JSON.stringify({ result: 'AQ==' })), + relayer: 'agoric123', + target, + packet: { + data: btoa( + JSON.stringify( + FungibleTokenPacketData.fromPartial({ + amount: String(amount), + denom, + sender, + receiver, + }), + ), + ), + destination_channel: destinationChannel, + source_channel: sourceChannel, + destination_port: 'transfer', + source_port: 'transfer', + sequence, + } as IBCPacket, +}); + +export function createMockAckMap( + mockMap: Record, +) { + const res = Object.values(mockMap).reduce((acc, { msg, ack }) => { + acc[msg] = ack; + return acc; + }, {}); + return res; +} + +/** + * Simulate an IBC channelCloseConfirm event. This can be used to simulate an + * ICA channel closing for an unexpected reason from a remote chain, _or + * anything besides the Connection holder calling `.close()`_. If `close()` is + * called, we'd instead expect to see a Downcall for channelCloseInit. + * + * @param {Pick, 'portID' | 'channelID'>} event + */ +export const buildChannelCloseConfirmEvent = ({ + channelID = 'channel-0', + portID = 'icacontroller-1', +}: Partial> = {}): Partial< + IBCEvent<'channelCloseConfirm'> +> => ({ + blockHeight: 0, + blockTime: 0, + channelID, + event: 'channelCloseConfirm', + portID, + type: IBC_EVENT, +}); diff --git a/contract/tools/protobuf-decoder.js b/contract/tools/protobuf-decoder.js new file mode 100644 index 00000000..a7b68896 --- /dev/null +++ b/contract/tools/protobuf-decoder.js @@ -0,0 +1,153 @@ +/* eslint-env node */ +/* eslint-disable -- generated by Sonnet, easier to leave alone */ + +const WIRE_TYPES = { + VARINT: 0, + FIXED64: 1, + LENGTH_DELIMITED: 2, + START_GROUP: 3, + END_GROUP: 4, + FIXED32: 5, +}; + +function decodeVarint(buffer, offset) { + let result = 0n; + let shift = 0; + let byte; + + do { + if (offset >= buffer.length) { + throw new Error('Buffer overflow while decoding varint'); + } + byte = buffer[offset]; + result |= BigInt(byte & 0x7f) << BigInt(shift); + shift += 7; + offset++; + } while (byte & 0x80); + + return { value: result, bytesRead: shift / 7 }; +} + +function decodeFixed32(buffer, offset) { + if (offset + 4 > buffer.length) { + throw new Error('Buffer overflow while decoding fixed32'); + } + return { + value: buffer.readUInt32LE(offset), + bytesRead: 4, + }; +} + +function decodeFixed64(buffer, offset) { + if (offset + 8 > buffer.length) { + throw new Error('Buffer overflow while decoding fixed64'); + } + const low = buffer.readUInt32LE(offset); + const high = buffer.readUInt32LE(offset + 4); + return { + value: BigInt(high) * 2n ** 32n + BigInt(low), + bytesRead: 8, + }; +} + +function decodeString(buffer, offset, length) { + if (offset + length > buffer.length) { + throw new Error('Buffer overflow while decoding string'); + } + return { + value: buffer.toString('utf8', offset, offset + length), + bytesRead: length, + }; +} + +function decodeField(buffer, offset) { + const tag = decodeVarint(buffer, offset); + offset += tag.bytesRead; + + const fieldNumber = Number(tag.value >> 3n); + const wireType = Number(tag.value & 0x7n); + + let value; + let bytesRead; + + switch (wireType) { + case WIRE_TYPES.VARINT: + ({ value, bytesRead } = decodeVarint(buffer, offset)); + break; + case WIRE_TYPES.FIXED64: + ({ value, bytesRead } = decodeFixed64(buffer, offset)); + break; + case WIRE_TYPES.LENGTH_DELIMITED: + const length = decodeVarint(buffer, offset); + offset += length.bytesRead; + // Try to decode as a nested message first + try { + ({ value, bytesRead } = decodeProtobuf( + buffer.slice(offset, offset + Number(length.value)), + )); + } catch (e) { + // If it fails, decode as a string + ({ value, bytesRead } = decodeString( + buffer, + offset, + Number(length.value), + )); + } + bytesRead += length.bytesRead; + break; + case WIRE_TYPES.FIXED32: + ({ value, bytesRead } = decodeFixed32(buffer, offset)); + break; + default: + throw new Error(`Unsupported wire type: ${wireType}`); + } + + return { + fieldNumber, + wireType, + value, + bytesRead: tag.bytesRead + bytesRead, + }; +} + +function getFieldName(fieldNumber, wireType) { + const typePrefix = + wireType === WIRE_TYPES.LENGTH_DELIMITED + ? 'subMessage' + : wireType === WIRE_TYPES.VARINT + ? 'int' + : wireType === WIRE_TYPES.FIXED32 + ? 'fixed32' + : wireType === WIRE_TYPES.FIXED64 + ? 'fixed64' + : 'string'; + return `${typePrefix}_${fieldNumber}`; +} + +/** + * Decodes a protobuf message from the given buffer. + * + * @param {Buffer} buffer + */ +export function decodeProtobuf(buffer) { + let offset = 0; + const message = {}; + + while (offset < buffer.length) { + const field = decodeField(buffer, offset); + const fieldName = getFieldName(field.fieldNumber, field.wireType); + message[fieldName] = field.value; + offset += field.bytesRead; + } + + return { value: message, bytesRead: offset }; +} +/** + * Decodes a protobuf message from the given base64-encoded data. + * + * @param {string} base64String + */ +export function decodeProtobufBase64(base64String) { + const buffer = Buffer.from(base64String, 'base64'); + return decodeProtobuf(buffer); +} diff --git a/yarn.lock b/yarn.lock index cfc49b6a..589e7ef3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1211,6 +1211,16 @@ __metadata: languageName: node linkType: hard +"@ava/typescript@npm:^5.0.0": + version: 5.0.0 + resolution: "@ava/typescript@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + execa: "npm:^8.0.1" + checksum: 10c0/4f0f9fbcf34f632a95d5565d2c0f7b397873cdc9b55288c54bc7d1dde58fbf600beaa470639e5367aceb99841efa3d4b8c0b5b4bf4778fe8fe5f7e926e4a3fad + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" @@ -8220,7 +8230,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:20.16.8, @types/node@npm:>=13.7.0, @types/node@npm:^20.11.13": +"@types/node@npm:*, @types/node@npm:20.16.8, @types/node@npm:>=13.7.0": version: 20.16.8 resolution: "@types/node@npm:20.16.8" dependencies: @@ -8243,6 +8253,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.9.0": + version: 22.9.0 + resolution: "@types/node@npm:22.9.0" + dependencies: + undici-types: "npm:~6.19.8" + checksum: 10c0/3f46cbe0a49bab4ba30494025e4c8a6e699b98ac922857aa1f0209ce11a1313ee46e6808b8f13fe5b8b960a9d7796b77c8d542ad4e9810e85ef897d5593b5d51 + languageName: node + linkType: hard + "@types/prop-types@npm:*": version: 15.7.13 resolution: "@types/prop-types@npm:15.7.13" @@ -11076,6 +11095,7 @@ __metadata: "@agoric/vow": "npm:^0.2.0-u17.1" "@agoric/zoe": "npm:^0.26.3-u17.1" "@agoric/zone": "npm:^0.3.0-u17.1" + "@ava/typescript": "npm:^5.0.0" "@cosmjs/proto-signing": "npm:^0.32.3" "@endo/bundle-source": "npm:^3.5.0" "@endo/errors": "npm:^1.2.4" @@ -11094,7 +11114,7 @@ __metadata: "@rollup/plugin-replace": "npm:^5.0.5" "@rollup/plugin-typescript": "npm:^11.1.6" "@types/fs-extra": "npm:^11" - "@types/node": "npm:^20.11.13" + "@types/node": "npm:^22.9.0" "@typescript-eslint/eslint-plugin": "npm:^7.0.2" "@typescript-eslint/parser": "npm:^7.15.0" agoric: "npm:^0.22.0-u17.1" @@ -11115,9 +11135,10 @@ __metadata: prettier-plugin-jsdoc: "npm:^1.0.0" rollup: "npm:^4.18.0" starshipjs: "npm:^2.4.0" + ts-node: "npm:^10.9.2" tsimp: "npm:^2.0.10" type-coverage: "npm:^2.26.3" - typescript: "npm:^5.3.3" + typescript: "npm:^5.6.3" typescript-eslint: "npm:^7.18.0" languageName: unknown linkType: soft @@ -18927,7 +18948,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.6 - 5.6.x": +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": version: 5.6.3 resolution: "typescript@npm:5.6.3" bin: @@ -18937,7 +18958,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2, typescript@npm:^5.3.3, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": +"typescript@npm:^5.2.2, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": version: 5.6.2 resolution: "typescript@npm:5.6.2" bin: @@ -18947,7 +18968,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin": +"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": version: 5.6.3 resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" bin: @@ -18957,7 +18978,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": +"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": version: 5.6.2 resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=74658d" bin: @@ -19009,7 +19030,7 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": +"undici-types@npm:~6.19.2, undici-types@npm:~6.19.8": version: 6.19.8 resolution: "undici-types@npm:6.19.8" checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 From 22d8b248c459757746432d2d0833a7724bdc344b Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 14:40:57 +0500 Subject: [PATCH 23/31] chore: fixing unit tests for auto-stake-it --- contract/package.json | 41 +- contract/src/auto-stake-it.contract.js | 1 + contract/src/auto-stake-it.flows.js | 4 +- .../src/exos/cosmos-interchain-service.js | 4 +- contract/src/types-index.d.ts | 1 + contract/src/types-index.js | 1 + contract/src/types.ts | 24 + contract/test/auto-stake-it.contract.test.ts | 18 +- contract/test/network-fakes.ts | 389 + ...{network-fakes.js => old_network-fakes.js} | 8 +- contract/test/orca-contract.test.js | 2 +- contract/typeGuards.js | 197 + contract/utils/address.js | 103 + contract/utils/amounts.js | 59 + contract/utils/cosmos.js | 82 + contract/utils/denomHash.js | 22 + contract/utils/orc.js | 38 + contract/utils/orchestrationAccount.js | 40 + contract/utils/packet.js | 112 + contract/utils/registry.js | 130 + contract/utils/start-helper.js | 214 + contract/utils/time.js | 48 + contract/utils/zcf-tools.js | 35 + contract/utils/zoe-tools.js | 186 + yarn.lock | 8226 +++++++++-------- 25 files changed, 6171 insertions(+), 3814 deletions(-) create mode 100644 contract/src/types-index.d.ts create mode 100644 contract/src/types-index.js create mode 100644 contract/src/types.ts create mode 100644 contract/test/network-fakes.ts rename contract/test/{network-fakes.js => old_network-fakes.js} (95%) create mode 100644 contract/typeGuards.js create mode 100644 contract/utils/address.js create mode 100644 contract/utils/amounts.js create mode 100644 contract/utils/cosmos.js create mode 100644 contract/utils/denomHash.js create mode 100644 contract/utils/orc.js create mode 100644 contract/utils/orchestrationAccount.js create mode 100644 contract/utils/packet.js create mode 100644 contract/utils/registry.js create mode 100644 contract/utils/start-helper.js create mode 100644 contract/utils/time.js create mode 100644 contract/utils/zcf-tools.js create mode 100644 contract/utils/zoe-tools.js diff --git a/contract/package.json b/contract/package.json index 741145b6..8329cb22 100644 --- a/contract/package.json +++ b/contract/package.json @@ -16,24 +16,40 @@ "lint": "tsc && eslint '**/*.js'", "lint:fix": "eslint --fix '**/*.js'" }, - "devDependencies": { + "dependencies": { "@agoric/async-flow": "^0.1.1-u17.1", + "@agoric/cosmic-proto": "latest", "@agoric/deploy-script-support": "^0.10.4-u17.1", + "@agoric/ertp": "^0.16.3-u17.1", "@agoric/eslint-config": "^0.4.1-u17.1", + "@agoric/governance": "^0.10.4-u17.1", "@agoric/inter-protocol": "^0.17.0-u17.1", + "@agoric/internal": "^0.4.0-u17.1", + "@agoric/network": "0.1.1-dev-d1562a1.0", + "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch", "@agoric/smart-wallet": "^0.5.4-u17.1", "@agoric/store": "^0.9.3-u17.1", "@agoric/time": "^0.3.3-u17.1", "@agoric/vat-data": "^0.5.3-u17.1", + "@agoric/vats": "^0.16.0-u17.1", "@agoric/vow": "^0.2.0-u17.1", - "@agoric/zone": "^0.3.0-u17.1", + "@agoric/zoe": "^0.26.3-u17.1", + "@agoric/zone": "latest", "@ava/typescript": "^5.0.0", "@cosmjs/proto-signing": "^0.32.3", + "@endo/base64": "latest", + "@endo/bundle-source": "^3.5.0", + "@endo/errors": "^1.2.4", "@endo/eslint-plugin": "^2.2.0", + "@endo/far": "^1.1.4", + "@endo/init": "^1.1.3", + "@endo/marshal": "^1.6.1", "@endo/nat": "^5.0.9", + "@endo/patterns": "^1.4.6", "@endo/promise-kit": "^1.1.4", "@endo/ses-ava": "^1.2.2", "@jessie.js/eslint-plugin": "^0.4.1", + "@noble/hashes": "latest", "@rollup/plugin-commonjs": "^25.0.8", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", @@ -67,20 +83,13 @@ "typescript": "^5.6.3", "typescript-eslint": "^7.18.0" }, - "dependencies": { - "@agoric/ertp": "^0.16.3-u17.1", - "@agoric/governance": "^0.10.4-u17.1", - "@agoric/internal": "^0.4.0-u17.1", - "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch", - "@agoric/store": "^0.9.3-u17.1", - "@agoric/vats": "^0.16.0-u17.1", - "@agoric/zoe": "^0.26.3-u17.1", - "@endo/bundle-source": "^3.5.0", - "@endo/errors": "^1.2.4", - "@endo/far": "^1.1.4", - "@endo/init": "^1.1.3", - "@endo/marshal": "^1.5.2", - "@endo/patterns": "^1.4.2" + "resolutions": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "ava": { "extensions": { diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js index 25651fae..a78f7bb5 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/auto-stake-it.contract.js @@ -12,6 +12,7 @@ import * as flows from './auto-stake-it.flows.js'; /** * @import {Zone} from '@agoric/zone'; * @import {OrchestrationPowers, OrchestrationTools} from './utils/start-helper.js'; + * @import { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; */ /** diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/auto-stake-it.flows.js index 74d1fc83..16b10212 100644 --- a/contract/src/auto-stake-it.flows.js +++ b/contract/src/auto-stake-it.flows.js @@ -6,8 +6,8 @@ import { denomHash } from '../utils/denomHash.js'; * @import {GuestInterface} from '@agoric/async-flow'; * @import {CosmosValidatorAddress, Orchestrator, CosmosInterchainService, Denom, OrchestrationAccount, StakingAccountActions, OrchestrationFlow} from '@agoric/orchestration'; * @import {MakeStakingTap} from './auto-stake-it-tap-kit.js'; - * @import {MakePortfolioHolder} from '../exos/portfolio-holder-kit.js'; - * @import {ChainHub} from '../exos/chain-hub.js'; + * @import {MakePortfolioHolder} from './exos/portfolio-holder-kit.js'; + * @import {ChainHub} from './exos/chain-hub.js'; */ /** diff --git a/contract/src/exos/cosmos-interchain-service.js b/contract/src/exos/cosmos-interchain-service.js index 5724cc94..c6d72b96 100644 --- a/contract/src/exos/cosmos-interchain-service.js +++ b/contract/src/exos/cosmos-interchain-service.js @@ -8,7 +8,7 @@ import { DEFAULT_ICQ_VERSION, makeICAChannelAddress, makeICQChannelAddress, -} from '../utils/address.js'; +} from '../../utils/address.js'; import { prepareIcaAccountKit } from './ica-account-kit.js'; import { prepareICQConnectionKit } from './icq-connection-kit.js'; @@ -20,7 +20,7 @@ import { prepareICQConnectionKit } from './icq-connection-kit.js'; * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; * @import {Vow, VowTools} from '@agoric/vow'; * @import {ICQConnection, IcaAccount, ICQConnectionKit, IcaAccountKit} from '../types.js'; - * @import {ICAChannelAddressOpts} from '../utils/address.js'; + * @import {ICAChannelAddressOpts} from '../../utils/address.js'; */ const { Vow$ } = NetworkShape; // TODO #9611 diff --git a/contract/src/types-index.d.ts b/contract/src/types-index.d.ts new file mode 100644 index 00000000..06c33f56 --- /dev/null +++ b/contract/src/types-index.d.ts @@ -0,0 +1 @@ +export type * from './types.js'; diff --git a/contract/src/types-index.js b/contract/src/types-index.js new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/contract/src/types-index.js @@ -0,0 +1 @@ +export {}; diff --git a/contract/src/types.ts b/contract/src/types.ts new file mode 100644 index 00000000..905892a2 --- /dev/null +++ b/contract/src/types.ts @@ -0,0 +1,24 @@ +/** @file Rollup of all type definitions in the package, for local import and external export */ + +export type * from './chain-info.js'; +export type * from './cosmos-api.js'; +export type * from './ethereum-api.js'; +export type * from './exos/chain-hub.js'; +export type * from './exos/combine-invitation-makers.js'; +export type * from './exos/cosmos-interchain-service.js'; +export type * from './exos/exo-interfaces.js'; +export type * from './exos/ica-account-kit.js'; +export type * from './exos/icq-connection-kit.js'; +export type * from './exos/local-chain-facade.js'; +export type * from './exos/portfolio-holder-kit.js'; +export type * from './orchestration-api.js'; +export type * from './vat-orchestration.js'; + +/** + * ({@link ZCF})-like tools for use in {@link OrchestrationFlow}s. + */ +export interface ZcfTools { + assertUniqueKeyword: ZCF['assertUniqueKeyword']; + atomicRearrange: ZCF['atomicRearrange']; + makeInvitation: ZCF['makeInvitation']; +} diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index c0cae528..8df36680 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -1,13 +1,11 @@ -import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { test } from './prepare-test-env-ava.js'; import { setUpZoeForTest } from '@agoric/zoe/tools/setup-zoe.js'; -import { createRequire } from 'module'; import { E } from '@endo/far'; import { heapVowE } from '@agoric/vow/vat.js'; import path from 'path'; import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; import { MsgDelegateResponse } from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; import type { IBCEvent } from '@agoric/vats'; -import type { AutoStakeItSF } from '../src/auto-stake-it.contract.js'; import { commonSetup } from './supports.js'; import { buildMsgResponseString, @@ -15,15 +13,11 @@ import { } from '../tools/ibc-mocks.js'; const dirname = path.dirname(new URL(import.meta.url).pathname); - -const nodeRequire = createRequire(import.meta.url); - -const contractFile = nodeRequire.resolve('../src/auto-stake-it.contract.js'); const contractName = 'auto-stake-it'; -// const contractFile = `${dirname}/../src/${contractName}.contract.js`; -// const contractFile = '/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js'; -// type StartFn = - // typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; +const contractFile = `${dirname}/../src/${contractName}.contract.js`; + +type StartFn = + typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); @@ -37,7 +31,7 @@ test('make accounts, register tap, return invitationMakers', async t => { const { zoe, bundleAndInstall } = await setUpZoeForTest(); t.log('contract coreEval', contractName); - const installation: Installation = + const installation: Installation = await bundleAndInstall(contractFile); const storageNode = await E(storage.rootNode).makeChildNode(contractName); const autoAutoStakeItKit = await E(zoe).startInstance( diff --git a/contract/test/network-fakes.ts b/contract/test/network-fakes.ts new file mode 100644 index 00000000..b137a619 --- /dev/null +++ b/contract/test/network-fakes.ts @@ -0,0 +1,389 @@ +import { inspect } from 'node:util'; + +import type { VowTools } from '@agoric/vow'; +import { + base64ToBytes, + prepareEchoConnectionKit, + prepareLoopbackProtocolHandler, + prepareNetworkPowers, + preparePortAllocator, + prepareRouterProtocol, +} from '@agoric/network'; +import type { Zone } from '@agoric/zone'; +import type { + IBCChannelID, + IBCMethod, + IBCEvent, + ScopedBridgeManagerMethods, + IBCConnectionID, + IBCPortID, +} from '@agoric/vats'; +import { + prepareCallbacks as prepareIBCCallbacks, + prepareIBCProtocol, +} from '@agoric/vats/src/ibc.js'; +import { BridgeId, makeTracer } from '@agoric/internal'; +import { E, Far } from '@endo/far'; +import type { Guarded } from '@endo/exo'; +import { defaultMockAckMap, errorAcknowledgments } from './ibc-mocks.js'; +import { decodeProtobufBase64 } from '../tools/protobuf-decoder.js'; + +const trace = makeTracer('NetworkFakes'); + +/** + * Mimic IBC Channel version negotation + * + * As part of the IBC Channel initialization, the version field is negotiated + * with the host. `version` is a String or JSON string as determined by the IBC + * Application protol. + * + * @param version requested version string + * @param params mock parameters to add to version string + * @param params.address for ICS-27, the bech32 address provided by the host + */ +const addParamsIfJsonVersion = ( + version: string, + params: { address: string }, +): string => { + try { + const parsed = JSON.parse(version); + return JSON.stringify({ + ...parsed, + ...params, + }); + } catch { + return version; + } +}; + +type ImplementedIBCEvents = 'channelOpenAck' | 'acknowledgementPacket'; + +export const ibcBridgeMocks: { + [T in ImplementedIBCEvents]: T extends 'channelOpenAck' + ? ( + obj: IBCMethod<'startChannelOpenInit'>, + opts: { + channelID: IBCChannelID; + counterpartyChannelID: IBCChannelID; + mockChainAddress: string; + }, + ) => IBCEvent<'channelOpenAck'> + : T extends 'acknowledgementPacket' + ? ( + obj: IBCMethod<'sendPacket'>, + opts: { sequence: bigint; acknowledgement: string }, + ) => IBCEvent<'acknowledgementPacket'> + : never; +} = { + channelOpenAck: ( + obj: IBCMethod<'startChannelOpenInit'>, + { + channelID, + counterpartyChannelID, + mockChainAddress, + }: { + channelID: IBCChannelID; + counterpartyChannelID: IBCChannelID; + mockChainAddress: string; + }, + ): IBCEvent<'channelOpenAck'> => { + return { + type: 'IBC_EVENT', + blockHeight: 99, + blockTime: 1711571357, + event: 'channelOpenAck', + portID: obj.packet.source_port, + channelID, + counterparty: { + port_id: obj.packet.destination_port, + channel_id: counterpartyChannelID, + }, + counterpartyVersion: addParamsIfJsonVersion(obj.version, { + address: mockChainAddress, + }), + connectionHops: obj.hops, + order: obj.order, + version: obj.version, + }; + }, + + acknowledgementPacket: ( + obj: IBCMethod<'sendPacket'>, + opts: { sequence: bigint; acknowledgement: string }, + ): IBCEvent<'acknowledgementPacket'> => { + const { sequence, acknowledgement } = opts; + return { + acknowledgement, + blockHeight: 289, + blockTime: 1712180320, + event: 'acknowledgementPacket', + packet: { + data: obj.packet.data, + destination_channel: obj.packet.destination_channel, + destination_port: obj.packet.destination_port, + sequence, + source_channel: obj.packet.source_channel, + source_port: obj.packet.source_port, + timeout_timestamp: 1712183910866313000n, + }, + relayer: 'agoric1gtkg0g6x8lqc734ht3qe2sdkrfugpdp2h7fuu0', + type: 'IBC_EVENT', + }; + }, +}; + +type BridgeEvents = Array< + | IBCEvent<'channelOpenAck'> + | IBCEvent<'acknowledgementPacket'> + | IBCEvent<'channelCloseConfirm'> + | IBCEvent<'sendPacket'> +>; + +type BridgeDowncalls = Array< + | IBCMethod<'startChannelOpenInit'> + | IBCMethod<'startChannelCloseInit'> + | IBCMethod<'bindPort'> + | IBCMethod<'sendPacket'> +>; + +/** + * Make a fake IBC Bridge, extended from the dibc ScopedBridgeManager. + * + * Has extra `setMockAck` and `setAddressPrefix` met + * + * @param zone + */ +export const makeFakeIBCBridge = ( + zone: Zone, +): Guarded< + ScopedBridgeManagerMethods<'dibc'> & { + addMockAck: (msgData: string, ackData: string) => void; + setMockAck: (mockAckMap: Record) => void; + setAddressPrefix: (addressPrefix: string) => void; + inspectDibcBridge: () => { + bridgeEvents: BridgeEvents; + bridgeDowncalls: BridgeDowncalls; + }; + } +> => { + let bridgeHandler: any; + /** + * Intended to mock an individual account's sequence, but is global for all + * accounts. + * XXX teach this about IBCConnections and store sequence on a + * per-channel basis. + * @type {bigint} + */ + let ibcSequenceNonce = 0n; + /** + * The number of channels created. Currently used as a proxy to increment + * fake account addresses and channels. + * @type {nubmer} + */ + let channelCount = 0; + let icaAccountCount = 0; + let bech32Prefix = 'cosmos'; + + /** + * Keep track channels requested by remote chain. Used as a proxy for + * counterpaty channel ids + */ + const remoteChannelMap: Record = {}; + + /** + * Packet byte string map of requests to responses + * @type {Record} + */ + let mockAckMap = defaultMockAckMap; + let bridgeEvents: BridgeEvents = []; + let bridgeDowncalls: BridgeDowncalls = []; + + /** + * Store remote mock addresses that have been distributed. + * If there's a `channelOpenInit` request for a PortId:ConnnectionId + * pair that's been previously established, let's reuse it to mimic + * the behavior of the ICS-27 protocol. + */ + type AddressKey = `${IBCPortID}:${IBCConnectionID}`; + const getAddressKey = ( + obj: IBCMethod<'startChannelOpenInit'>, + ): AddressKey => { + return `${obj.packet.source_port as IBCPortID}:${obj.hops[0] as IBCConnectionID}`; + }; + const addressMap = new Map(); + + return zone.exo('Fake IBC Bridge Manager', undefined, { + getBridgeId: () => BridgeId.DIBC, + toBridge: async obj => { + trace( + 'toBridge', + obj, + obj.packet?.data ? base64ToBytes(obj.packet.data) : undefined, + ); + if (obj.type === 'IBC_METHOD') { + bridgeDowncalls = bridgeDowncalls.concat(obj); + switch (obj.method) { + case 'startChannelOpenInit': { + const connectionChannelCount = remoteChannelMap[obj.hops[0]] || 0; + const addressKey = getAddressKey(obj); + let mockChainAddress; + if (addressMap.has(addressKey)) { + mockChainAddress = addressMap.get(addressKey); + } else { + mockChainAddress = + icaAccountCount > 0 + ? `${bech32Prefix}1test${icaAccountCount}` + : `${bech32Prefix}1test`; + addressMap.set(addressKey, mockChainAddress); + } + const ackEvent = ibcBridgeMocks.channelOpenAck(obj, { + mockChainAddress, + channelID: `channel-${channelCount}`, + counterpartyChannelID: `channel-${connectionChannelCount}`, + }); + bridgeHandler?.fromBridge(ackEvent); + bridgeEvents = bridgeEvents.concat(ackEvent); + channelCount += 1; + if (obj.packet.source_port.includes('icacontroller')) { + icaAccountCount += 1; + } + remoteChannelMap[obj.hops[0]] = connectionChannelCount + 1; + return undefined; + } + case 'sendPacket': { + const mockAckMapHasData = obj.packet.data in mockAckMap; + if (!mockAckMapHasData) { + trace( + `sendPacket acking err because no mock ack for b64 data key: '${obj.packet.data}'`, + ); + try { + const decoded = decodeProtobufBase64( + JSON.parse(base64ToBytes(obj.packet.data)).data, + ); + trace( + 'Fix the source of this request or define a ack mapping for it:', + inspect(decoded, { depth: null }), + ); + } catch (err) { + trace('Could not decode packet data', err); + } + } + const ackEvent = ibcBridgeMocks.acknowledgementPacket(obj, { + sequence: ibcSequenceNonce, + acknowledgement: mockAckMapHasData + ? mockAckMap[obj.packet.data] + : errorAcknowledgments.error5, + }); + bridgeEvents = bridgeEvents.concat(ackEvent); + ibcSequenceNonce += 1n; + bridgeHandler?.fromBridge(ackEvent); + return ackEvent.packet; + } + default: + return undefined; + } + } + return undefined; + }, + fromBridge: async obj => { + trace('fromBridge', obj); + bridgeEvents = bridgeEvents.concat(obj); + if (!bridgeHandler) throw Error('no handler!'); + return bridgeHandler.fromBridge(obj); + }, + initHandler: handler => { + if (bridgeHandler) throw Error('already init'); + bridgeHandler = handler; + }, + setHandler: handler => { + if (!bridgeHandler) throw Error('must init first'); + bridgeHandler = handler; + }, + /** + * Set a map of requests to responses to simulate different scenarios. Defaults to `defaultMockAckMap`. + * See `@agoric/orchestration/tools/ibc-mocks.js` for helpers to build this map. + * + * @param ackMap + */ + setMockAck: (ackMap: typeof mockAckMap) => { + trace('setMockAck', ackMap); + mockAckMap = ackMap; + }, + addMockAck: (msgData: string, ackData: string) => { + trace('addMockAck', msgData, ackData); + mockAckMap[msgData] = ackData; + }, + /** + * Set a new bech32 prefix for the mocked ICA channel. Defaults to `cosmos`. + * + * @param newPrefix + */ + setAddressPrefix: (newPrefix: typeof bech32Prefix) => { + trace('setAddressPrefix', newPrefix); + bech32Prefix = newPrefix; + }, + /** + * for debugging and testing + */ + inspectDibcBridge() { + return { bridgeEvents, bridgeDowncalls }; + }, + }); +}; + +export const setupFakeNetwork = ( + zone: Zone, + { vowTools }: { vowTools: VowTools }, +) => { + const powers = prepareNetworkPowers(zone, vowTools); + const makeRouterProtocol = prepareRouterProtocol(zone, powers); + const makePortAllocator = preparePortAllocator(zone, powers); + const makeLoopbackProtocolHandler = prepareLoopbackProtocolHandler( + zone, + vowTools, + ); + const makeEchoConnectionKit = prepareEchoConnectionKit(zone); + const makeIBCProtocolHandler = prepareIBCProtocol(zone, vowTools); + + const protocol = makeRouterProtocol(); + const portAllocator = makePortAllocator({ protocol }); + const ibcBridge = makeFakeIBCBridge(zone); + + const networkVat = Far('vat-network', { + registerProtocolHandler: (prefixes, handler) => + protocol.registerProtocolHandler(prefixes, handler), + makeLoopbackProtocolHandler, + makeEchoConnectionKit, + unregisterProtocolHandler: (prefix, handler) => + protocol.unregisterProtocolHandler(prefix, handler), + getPortAllocator: () => portAllocator, + }); + + const ibcVat = Far('vat-ibc', { + makeCallbacks: prepareIBCCallbacks(zone), + createHandlers(callbacks) { + const ibcHandler = makeIBCProtocolHandler(callbacks); + return harden(ibcHandler); + }, + }); + + const setupIBCProtocol = async () => { + const callbacks = await E(ibcVat).makeCallbacks(ibcBridge); + const { protocolHandler, bridgeHandler } = + await E(ibcVat).createHandlers(callbacks); + await E(ibcBridge).initHandler(bridgeHandler); + await E(networkVat).registerProtocolHandler( + ['/ibc-port', '/ibc-hop'], + protocolHandler, + ); + }; + + return { + portAllocator, + protocol, + ibcBridge, + networkVat, + ibcVat, + setupIBCProtocol, + }; +}; diff --git a/contract/test/network-fakes.js b/contract/test/old_network-fakes.js similarity index 95% rename from contract/test/network-fakes.js rename to contract/test/old_network-fakes.js index ab5859d7..4e9b5e93 100644 --- a/contract/test/network-fakes.js +++ b/contract/test/old_network-fakes.js @@ -2,6 +2,7 @@ import { prepareEchoConnectionKit, prepareLoopbackProtocolHandler, + prepareNetworkPowers, preparePortAllocator, prepareRouterProtocol, } from '@agoric/network'; @@ -211,8 +212,11 @@ export const makeFakeIBCBridge = zone => { }; export const setupFakeNetwork = (zone, { vowTools }) => { - const makeRouterProtocol = prepareRouterProtocol(zone, vowTools); - const makePortAllocator = preparePortAllocator(zone, vowTools); + const powers = prepareNetworkPowers(zone, vowTools); + const makeRouterProtocol = prepareRouterProtocol(zone, powers); + const makePortAllocator = preparePortAllocator(zone, powers); + // const makeRouterProtocol = prepareRouterProtocol(zone, vowTools); + // const makePortAllocator = preparePortAllocator(zone, vowTools); const makeLoopbackProtocolHandler = prepareLoopbackProtocolHandler( zone, vowTools, diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index 271c1885..a363101e 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -1,7 +1,6 @@ // @ts-check import { test as anyTest } from './prepare-test-env-ava.js'; - import { createRequire } from 'module'; import { E, Far, passStyleOf } from '@endo/far'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; @@ -365,6 +364,7 @@ const orchestrationAccountAndFundScenario = test.macro({ ); let offerResult; + offerResult = await E(seat).getOfferResult(); await t.throwsAsync( async () => (offerResult = await vt.when(E(seat).getOfferResult())), { message: /TODO: use IBC mocks or something/ }, diff --git a/contract/typeGuards.js b/contract/typeGuards.js new file mode 100644 index 00000000..995754dd --- /dev/null +++ b/contract/typeGuards.js @@ -0,0 +1,197 @@ +import { VowShape } from '@agoric/vow'; +import { M } from '@endo/patterns'; + +/** + * @import {TypedPattern} from '@agoric/internal'; + * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; + * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; + * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {TypedJson} from '@agoric/cosmic-proto'; + */ + +/** + * Used for IBC Channel Connections that only send outgoing transactions. If + * your channel expects incoming transactions, please extend this interface to + * include the `onReceive` handler. + */ +export const OutboundConnectionHandlerI = M.interface( + 'OutboundConnectionHandler', + { + onOpen: M.callWhen(M.any(), M.string(), M.string(), M.any()).returns( + M.any(), + ), + onClose: M.callWhen(M.any(), M.any(), M.any()).returns(M.any()), + }, +); + +/** @type {TypedPattern} */ +export const ChainAddressShape = { + chainId: M.string(), + encoding: M.string(), + value: M.string(), +}; +harden(ChainAddressShape); + +/** @type {TypedPattern} */ +export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; +harden(ChainAddressShape); + +/** @internal */ +export const IBCTransferOptionsShape = M.splitRecord( + {}, + { + timeoutTimestamp: M.bigint(), + timeoutHeight: { + revisionHeight: M.bigint(), + revisionNumber: M.bigint(), + }, + memo: M.string(), + }, +); + +/** @internal */ +export const IBCChannelIDShape = M.string(); + +/** @internal */ +export const IBCChannelInfoShape = M.splitRecord({ + portId: M.string(), + channelId: IBCChannelIDShape, + counterPartyPortId: M.string(), + counterPartyChannelId: IBCChannelIDShape, + ordering: M.scalar(), // XXX + state: M.scalar(), // XXX + version: M.string(), +}); + +/** @internal */ +export const IBCConnectionIDShape = M.string(); + +/** @internal */ +export const IBCConnectionInfoShape = M.splitRecord({ + id: IBCConnectionIDShape, + client_id: M.string(), + state: M.scalar(), // XXX STATE_OPEN or... + counterparty: { + client_id: M.string(), + connection_id: IBCConnectionIDShape, + }, + transferChannel: IBCChannelInfoShape, +}); + +/** @type {TypedPattern} */ +export const CosmosAssetInfoShape = M.splitRecord({ + base: M.string(), + name: M.string(), + display: M.string(), + symbol: M.string(), + denom_units: M.arrayOf( + M.splitRecord({ denom: M.string(), exponent: M.number() }), + ), +}); + +/** @type {TypedPattern} */ +export const CosmosChainInfoShape = M.splitRecord( + { + chainId: M.string(), + }, + { + bech32Prefix: M.string(), + connections: M.record(), + stakingTokens: M.arrayOf({ denom: M.string() }), + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: M.boolean(), + }, +); + +/** @type {TypedPattern} */ +export const ChainInfoShape = M.splitRecord({ + chainId: M.string(), +}); +export const DenomShape = M.string(); + +/** @type {TypedPattern>} */ +export const DenomInfoShape = { + chain: M.remotable('Chain'), + base: M.remotable('Chain'), + brand: M.or(M.remotable('Brand'), M.undefined()), + baseDenom: M.string(), +}; +harden(DenomInfoShape); + +/** @type {TypedPattern} */ +export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; +harden(DenomAmountShape); + +/** @type {TypedPattern>} */ +export const AnyNatAmountShape = { + brand: M.remotable('Brand'), + value: M.nat(), +}; +harden(AnyNatAmountShape); + +/** @type {TypedPattern} */ +export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); + +/** + * @type {TypedPattern<{ + * validator: CosmosValidatorAddress; + * amount: AmountArg; + * }>} + */ +export const DelegationShape = M.splitRecord( + { + validator: ChainAddressShape, + amount: AmountArgShape, + }, + { delegator: ChainAddressShape }, +); + +/** Approximately @see RequestQuery */ +export const ICQMsgShape = M.splitRecord( + { path: M.string(), data: M.string() }, + { height: M.string(), prove: M.boolean() }, +); + +/** @type {TypedPattern} */ +export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); + +/** @see {Chain} */ +export const chainFacadeMethods = { + getChainInfo: M.call().returns(VowShape), + makeAccount: M.call().returns(VowShape), +}; +harden(chainFacadeMethods); + +/** + * for google/protobuf/timestamp.proto, not to be confused with TimestampShape + * from `@agoric/time` + * + * `seconds` is a big integer but since it goes through JSON it is encoded as + * string + */ +export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; +harden(TimestampProtoShape); + +/** + * see {@link TxBody} for more details + * + * @internal + */ +export const TxBodyOptsShape = M.splitRecord( + {}, + { + memo: M.string(), + timeoutHeight: M.bigint(), + extensionOptions: M.arrayOf(M.any()), + nonCriticalExtensionOptions: M.arrayOf(M.any()), + }, +); + +/** + * Ensures at least one {@link AmountKeywordRecord} entry is present and only + * permits Nat (fungible) amounts. + */ +export const AnyNatAmountsRecord = M.and( + M.recordOf(M.string(), AnyNatAmountShape), + M.not({}), +); diff --git a/contract/utils/address.js b/contract/utils/address.js new file mode 100644 index 00000000..8d39ed5a --- /dev/null +++ b/contract/utils/address.js @@ -0,0 +1,103 @@ +import { Fail, q } from '@endo/errors'; + +/** + * @import {IBCConnectionID} from '@agoric/vats'; + * @import {ChainAddress} from '../types.js'; + * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; + */ + +/** + * @typedef {object} ICAChannelAddressOpts + * @property {string} [encoding='proto3'] message encoding format for the + * channel + * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. + * currently only `ordered` is supported for ics27-1 + * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` + * @property {string} [version='ics27-1'] default is `ics27-1` + */ + +/** + * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID + * @param {IBCConnectionID} controllerConnectionId Self Connection ID + * @param {ICAChannelAddressOpts} [opts] + * @returns {RemoteIbcAddress} + */ +export const makeICAChannelAddress = ( + hostConnectionId, + controllerConnectionId, + { + version = 'ics27-1', + encoding = 'proto3', + ordering = 'ordered', + txType = 'sdk_multi_msg', + } = {}, +) => { + hostConnectionId || Fail`hostConnectionId is required`; + controllerConnectionId || Fail`controllerConnectionId is required`; + const connString = JSON.stringify({ + version, + controllerConnectionId, + hostConnectionId, + address: '', // will be provided by the counterparty after channelOpenAck + encoding, + txType, + }); + return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; +}; +harden(makeICAChannelAddress); + +export const DEFAULT_ICQ_VERSION = 'icq-1'; + +/** + * @param {IBCConnectionID} controllerConnectionId + * @param {string} version defaults to icq-1 + * @returns {RemoteIbcAddress} + */ +export const makeICQChannelAddress = ( + controllerConnectionId, + version = DEFAULT_ICQ_VERSION, +) => { + controllerConnectionId || Fail`controllerConnectionId is required`; + return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; +}; +harden(makeICQChannelAddress); + +/** + * Parse a chain address from a remote address string. Assumes the address + * string is in a JSON format and contains an "address" field. This function is + * designed to be safe against malformed inputs and unexpected data types, and + * will return `undefined` in those cases. + * + * @param {RemoteIbcAddress} remoteAddressString - remote address string, + * including version + * @returns {ChainAddress['value'] | undefined} returns undefined on error + */ +export const findAddressField = remoteAddressString => { + try { + // Extract JSON version string assuming it's always surrounded by {} + const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; + const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; + if (!jsonObj?.address?.length) return undefined; + return jsonObj.address; + } catch (error) { + return undefined; + } +}; +harden(findAddressField); + +/** + * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. + * + * see + * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) + * for reference implementation + * + * @param {string} address + */ +export const getBech32Prefix = address => { + assert(address, 'address is required'); + const split = address.lastIndexOf('1'); + if (split === -1) return Fail`No separator character for ${q(address)}`; + if (split === 0) return Fail`Missing prefix for ${q(address)}`; + return address.slice(0, split); +}; diff --git a/contract/utils/amounts.js b/contract/utils/amounts.js new file mode 100644 index 00000000..3974f922 --- /dev/null +++ b/contract/utils/amounts.js @@ -0,0 +1,59 @@ +import { makeError } from '@endo/errors'; + +/** + * @import {ChainHub} from "../types.js"; + * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + */ + +/** + * @param {ChainHub} chainHub + * @param {DenomArg} denomArg + * @returns {Denom} + * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom + * mapping + */ +export const coerceDenom = (chainHub, denomArg) => { + if (typeof denomArg === 'string') { + return denomArg; + } + const denom = chainHub.getDenom(denomArg); + if (!denom) { + throw makeError(`No denom for brand ${denomArg}`); + } + return denom; +}; + +/** + * @param {ChainHub} chainHub + * @param {DenomAmount | Amount<'nat'>} amount + * @returns {DenomAmount} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceDenomAmount = (chainHub, amount) => { + if ('denom' in amount) { + return amount; + } + const denom = coerceDenom(chainHub, amount.brand); + return harden({ + denom, + value: amount.value, + }); +}; + +/** + * @param {ChainHub} chainHub + * @param {AmountArg} amount + * @returns {Coin} + * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain + * Brand:Denom mapping + */ +export const coerceCoin = (chainHub, amount) => { + const denom = + 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); + return harden({ + denom, + amount: String(amount.value), + }); +}; diff --git a/contract/utils/cosmos.js b/contract/utils/cosmos.js new file mode 100644 index 00000000..5082a1c5 --- /dev/null +++ b/contract/utils/cosmos.js @@ -0,0 +1,82 @@ +import { makeError } from '@endo/errors'; +import { decodeBase64 } from '@endo/base64'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; + +/** + * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' + * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; + */ + +/** maximum clock skew, in seconds, for unbonding time reported from other chain */ +export const maxClockSkew = 10n * 60n; + +/** + * @template T + * @param {string} ackStr + * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg + */ +export const tryDecodeResponse = (ackStr, fromProtoMsg) => { + try { + const any = Any.decode(decodeBase64(ackStr)); + const protoMsg = Any.decode(any.value); + + const msg = fromProtoMsg(protoMsg); + return msg; + } catch (cause) { + throw makeError(`bad response: ${ackStr}`, undefined, { cause }); + } +}; + +/** + * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + * @see {@link toTruncatedDenomAmount} for DecCoin + */ +export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); + +/** + * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by + * truncating the fractional portion. + * + * @type {(c: { denom: string; amount: string }) => DenomAmount} + */ +export const toTruncatedDenomAmount = c => ({ + denom: c.denom, + value: BigInt(c.amount.split('.')[0]), +}); + +/** + * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration + * {@link CosmosValidatorAddress} + * + * @type {( + * r: { validatorAddress: string }, + * chainId: string, + * ) => CosmosValidatorAddress} + */ +export const toCosmosValidatorAddress = (r, chainId) => ({ + encoding: 'bech32', + value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), + chainId, +}); + +/** + * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration + * {@link CosmosDelegationResponse} + * + * @type {( + * chainInfo: { chainId: string }, + * r: DelegationResponse, + * ) => CosmosDelegationResponse} + */ +export const toCosmosDelegationResponse = ({ chainId }, r) => ({ + delegator: { + chainId, + encoding: 'bech32', + value: r.delegation.delegatorAddress, + }, + validator: toCosmosValidatorAddress(r.delegation, chainId), + amount: toDenomAmount(r.balance), +}); diff --git a/contract/utils/denomHash.js b/contract/utils/denomHash.js new file mode 100644 index 00000000..561ee4b5 --- /dev/null +++ b/contract/utils/denomHash.js @@ -0,0 +1,22 @@ +// @ts-check +import { sha256 } from '@noble/hashes/sha256'; +import { bytesToHex } from '@noble/hashes/utils'; + +/** + * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ + * + * @param {object} opts + * @param {string} [opts.portId] + * @param {string} [opts.channelId] required unless `path` is supplied + * @param {string} [opts.path] alternative to portId, channelId + * @param {string} opts.denom base denom + */ +export const denomHash = ({ + portId = 'transfer', + channelId = /** @type {string | undefined} */ (undefined), + path = `${portId}/${channelId}`, + denom, +}) => { + const h = sha256.create().update(`${path}/${denom}`).digest(); + return bytesToHex(h).toUpperCase(); +}; diff --git a/contract/utils/orc.js b/contract/utils/orc.js new file mode 100644 index 00000000..47a0d260 --- /dev/null +++ b/contract/utils/orc.js @@ -0,0 +1,38 @@ +/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ + +export const orcUtils = { + /** + * unwinds denom with PFM, if necessary + * + * @param {Omit} _args + * @returns {TransferMsg} + */ + makeTransferMsg: _args => { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, + /** + * SwapExact or SwapMaxSlippage, with optional AfterAction + * + * @param {(SwapExact | SwapMaxSlippage) & + * (AfterAction | Record)} _args + * + * @returns {TransferMsg} + */ + makeOsmosisSwap(_args) { + // FIXME mocked, so typescript is happy + return { + toAccount: { + chainId: 'osmosis-test', + value: 'osmo1234', + encoding: 'bech32', + }, + }; + }, +}; diff --git a/contract/utils/orchestrationAccount.js b/contract/utils/orchestrationAccount.js new file mode 100644 index 00000000..23f5337d --- /dev/null +++ b/contract/utils/orchestrationAccount.js @@ -0,0 +1,40 @@ +import { BrandShape } from '@agoric/ertp'; +import { Shape as NetworkShape } from '@agoric/network'; +import { VowShape } from '@agoric/vow'; +import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; +import { M } from '@endo/patterns'; +import { + AmountArgShape, + ChainAddressShape, + DenomAmountShape, + IBCTransferOptionsShape, +} from '../typeGuards.js'; + +/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ + +const { Vow$ } = NetworkShape; // TODO #9611 + +/** @see {OrchestrationAccountI} */ +export const orchestrationAccountMethods = { + getAddress: M.call().returns(ChainAddressShape), + getBalance: M.call(M.or(BrandShape, M.string())).returns( + Vow$(DenomAmountShape), + ), + getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), + send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), + sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( + VowShape, + ), + transfer: M.call(ChainAddressShape, AmountArgShape) + .optional(IBCTransferOptionsShape) + .returns(VowShape), + transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), + asContinuingOffer: M.call().returns( + Vow$({ + publicSubscribers: TopicsRecordShape, + invitationMakers: M.any(), + holder: M.remotable(), + }), + ), + getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), +}; diff --git a/contract/utils/packet.js b/contract/utils/packet.js new file mode 100644 index 00000000..70564cff --- /dev/null +++ b/contract/utils/packet.js @@ -0,0 +1,112 @@ +import { Fail } from '@endo/errors'; +import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; +import { + CosmosQuery, + CosmosResponse, +} from '@agoric/cosmic-proto/icq/v1/packet.js'; +import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + +/** + * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; + * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; + * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; + */ + +/** + * Makes an IBC transaction packet from an array of messages. Expects the + * `value` of each message to be base64 encoded bytes. Skips checks for + * malformed messages in favor of interface guards. + * + * @param {AnyJson[]} msgs + * @param {Partial>} [opts] + * @returns {string} stringified InterchainAccountPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeTxPacket(msgs, opts) { + const messages = msgs.map(Any.fromJSON); + const bytes = TxBody.encode( + TxBody.fromPartial({ + messages, + ...opts, + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + type: PacketType.TYPE_EXECUTE_TX, + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeTxPacket); + +/** + * Makes an IBC query packet from an array of query messages. Expects the `data` + * of each message to be base64 encoded bytes. Skips checks for malformed + * messages in favor of interface guards. + * + * @param {JsonSafe[]} msgs + * @returns {string} stringified InterchainQueryPacketData + * @throws {Error} if malformed messages are provided + */ +export function makeQueryPacket(msgs) { + const bytes = CosmosQuery.encode( + CosmosQuery.fromPartial({ + requests: msgs.map(RequestQuery.fromJSON), + }), + ).finish(); + + return JSON.stringify( + /** @type {JsonSafe} */ ({ + data: encodeBase64(bytes), + memo: '', + }), + ); +} +harden(makeQueryPacket); + +/** + * Looks for a result or error key in the response string, and returns a + * Base64Bytes string. This string can be decoded using the corresponding + * Msg*Response object. Error strings seem to be plain text and do not need + * decoding. + * + * @param {string} response + * @returns {string} - base64 encoded bytes string + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseTxPacket(response) { + const { result, error } = JSON.parse(response); + if (result) return result; + else if (error) throw Error(error); + else throw Fail`expected either result or error: ${response}`; +} +harden(parseTxPacket); + +/** + * Looks for a result or error key in the response string. If a result is found, + * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on + * the resulting entries are base64 encoded for inter-vat communication. These + * can be decoded using the corresponding Query*Response objects. Error strings + * seem to be plain text and do not need decoding. + * + * @param {string} response + * @returns {JsonSafe[]} + * @throws {Error} if error key is detected in response string, or result key is + * not found + */ +export function parseQueryPacket(response) { + const result = parseTxPacket(response); + const { data } = JSON.parse(atob(result)); + const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); + return harden(responses.map(ResponseQuery.toJSON)); +} +harden(parseQueryPacket); diff --git a/contract/utils/registry.js b/contract/utils/registry.js new file mode 100644 index 00000000..25789864 --- /dev/null +++ b/contract/utils/registry.js @@ -0,0 +1,130 @@ +import { + State as IBCChannelState, + Order, +} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; +import assert from 'node:assert'; + +/** + * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; + * @import {Chain, IBCInfo} from '@chain-registry/types'; + * @import {ChainRegistryClient} from '@chain-registry/client'; + * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; + */ + +/** + * @param {IBCInfo} ibcInfo + * @param {string} name + * @param {Record} chainInfo + * @returns {[string, IBCConnectionInfo] | []} + */ +function toConnectionEntry(ibcInfo, name, chainInfo) { + // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order + const fromChain1 = ibcInfo.chain_1.chain_name === name; + const [from, to] = fromChain1 + ? [ibcInfo.chain_1, ibcInfo.chain_2] + : [ibcInfo.chain_2, ibcInfo.chain_1]; + assert.equal(from.chain_name, name); + const transferChannels = ibcInfo.channels.filter( + c => + c.chain_1.port_id === 'transfer' && + // @ts-expect-error tags does not specify keys + c.tags?.preferred, + ); + if (transferChannels.length === 0) { + console.warn( + 'no transfer channel for [', + from.chain_name, + to.chain_name, + ']', + '(skipping)', + ); + return []; + } + if (transferChannels.length > 1) { + console.warn( + 'multiple preferred transfer channels [', + from.chain_name, + to.chain_name, + ']:', + transferChannels, + '(choosing first)', + ); + } + const [channel] = transferChannels; + const [channelFrom, channelTo] = fromChain1 + ? [channel.chain_1, channel.chain_2] + : [channel.chain_2, channel.chain_1]; + const record = { + id: /** @type {IBCConnectionID} */ (from.connection_id), + client_id: from.client_id, + counterparty: { + client_id: to.client_id, + connection_id: /** @type {IBCConnectionID} */ (to.connection_id), + }, + state: IBCConnectionState.STATE_OPEN, // XXX presumably + transferChannel: { + channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), + portId: channelFrom.port_id, + counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), + counterPartyPortId: channelTo.port_id, + // FIXME mapping, our guard expects a numerical enum + ordering: Order.ORDER_NONE_UNSPECIFIED, + state: IBCChannelState.STATE_OPEN, // XXX presumably + version: channel.version, + }, + }; + const destChainId = chainInfo[to.chain_name].chainId; + return [destChainId, record]; +} + +/** + * Converts the given chain info to our local config format + * + * @param {Pick} registry + */ +export const convertChainInfo = async registry => { + /** @type {Record} */ + const chainInfo = {}; + + for (const chain of registry.chains) { + console.log('processing info', chain.chain_name); + chainInfo[chain.chain_name] = { + bech32Prefix: chain.bech32_prefix, + chainId: chain.chain_id, + stakingTokens: chain.staking?.staking_tokens, + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled: chain.chain_name === 'osmosis', + }; + } + + // XXX probably easier to keep ibc separate + const ibcLookup = {}; + for (const ibc of registry.ibcData) { + ibcLookup[ibc.chain_1.chain_name] ||= []; + ibcLookup[ibc.chain_2.chain_name] ||= []; + + ibcLookup[ibc.chain_1.chain_name].push(ibc); + ibcLookup[ibc.chain_2.chain_name].push(ibc); + } + + const chainNames = registry.chains.map(c => c.chain_name).sort(); + + // iterate this after chainInfo is filled out + for (const name of chainNames) { + console.log('processing connections', name); + + const ibcData = ibcLookup[name]; + const connections = Object.fromEntries( + ibcData + .map(datum => toConnectionEntry(datum, name, chainInfo)) + .filter(entry => entry.length > 0) + // sort alphabetically for consistency + .sort(([a], [b]) => a.localeCompare(b)), + ); + chainInfo[name] = { ...chainInfo[name], connections }; + } + + // return object with insertion in alphabetical order of chain name + return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); +}; diff --git a/contract/utils/start-helper.js b/contract/utils/start-helper.js new file mode 100644 index 00000000..902c7194 --- /dev/null +++ b/contract/utils/start-helper.js @@ -0,0 +1,214 @@ +import { prepareAsyncFlowTools } from '@agoric/async-flow'; +import { prepareVowTools } from '@agoric/vow'; +import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { makeChainHub } from '../exos/chain-hub.js'; +import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; +import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; +import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; +import { prepareOrchestrator } from '../exos/orchestrator.js'; +import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; +import { makeOrchestrationFacade } from '../facade.js'; +import { makeZoeTools } from './zoe-tools.js'; +import { makeZcfTools } from './zcf-tools.js'; + +/** + * @import {LocalChain} from '@agoric/vats/src/localchain.js'; + * @import {TimerService, TimerBrand} from '@agoric/time'; + * @import {Baggage} from '@agoric/vat-data'; + * @import {NameHub} from '@agoric/vats'; + * @import {Remote} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; + */ + +/** + * @typedef {{ + * localchain: Remote; + * orchestrationService: Remote; + * storageNode: Remote; + * timerService: Remote; + * agoricNames: Remote; + * }} OrchestrationPowers + */ + +/** + * Helper that a contract start function can use to set up the objects needed + * for orchestration. + * + * TODO strip problematic operations from ZCF (e.g., getPayouts) + * + * @param {ZCF} zcf + * @param {Baggage} baggage + * @param {OrchestrationPowers} remotePowers + * @param {Marshaller} marshaller + * @internal + */ +export const provideOrchestration = ( + zcf, + baggage, + remotePowers, + marshaller, +) => { + // separate zones + const zones = (() => { + const zone = makeDurableZone(baggage); + return { + /** system names for async flow */ + asyncFlow: zone.subZone('asyncFlow'), + /** system names for orchestration implementation */ + orchestration: zone.subZone('orchestration'), + /** system names for chainHub */ + chainHub: zone.subZone('chainHub'), + /** system names for vows */ + vows: zone.subZone('vows'), + /** contract-provided names, and subzones */ + contract: zone.subZone('contract'), + }; + })(); + + const { agoricNames, timerService, localchain } = remotePowers; + + const vowTools = prepareVowTools(zones.vows); + + const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); + + const zoeTools = makeZoeTools(zcf, vowTools); + + const zcfTools = makeZcfTools(zcf, vowTools); + + const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); + const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( + zones.orchestration, + { + makeRecorderKit, + zcf, + timerService, + vowTools, + chainHub, + localchain, + zoeTools, + }, + ); + + const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { + vowTools, + }); + + const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( + zones.orchestration, + { + chainHub, + makeRecorderKit, + timerService, + vowTools, + zcf, + }, + ); + + const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { + makeCosmosOrchestrationAccount, + orchestration: remotePowers.orchestrationService, + storageNode: remotePowers.storageNode, + timer: remotePowers.timerService, + vowTools, + }); + + const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { + makeLocalOrchestrationAccountKit, + localchain: remotePowers.localchain, + // FIXME what path? + storageNode: remotePowers.storageNode, + agoricNames, + orchestration: remotePowers.orchestrationService, + timer: remotePowers.timerService, + vowTools, + }); + + const makeOrchestrator = prepareOrchestrator(zones.orchestration, { + chainHub, + makeLocalChainFacade, + makeRemoteChainFacade, + vowTools, + }); + + /** + * Create orchestrate functions in a specific zone, instead of the default + * `contract.orchestration` zone. This is used for modules that add their own + * orchestration functions (e.g., a Portfolio with orchestration flows for + * continuing offers) + * + * @param {Zone} zone + */ + const makeOrchestrateKit = zone => + makeOrchestrationFacade({ + zone, + zcf, + makeRecorderKit, + makeOrchestrator, + asyncFlowTools, + vowTools, + ...remotePowers, + }); + + // Create orchestrate functions for the default `contract.orchestration` zone + const defaultOrchestrateKit = makeOrchestrateKit( + zones.contract.subZone('orchestration'), + ); + + zcf.setTestJig(() => ({ + baggage, + chainHub, + })); + + return { + ...defaultOrchestrateKit, + makeOrchestrateKit, + chainHub, + vowTools, + asyncFlowTools, + zcfTools, + zoeTools, + zone: zones.contract, + }; +}; +harden(provideOrchestration); + +/** @typedef {Omit, 'zone'>} OrchestrationTools */ + +/** + * Simplifies contract functions for Orchestration by wrapping a simpler + * function with all the tools it needs in order to use Orchestration. + * + * @example + * + * ```js + * const contract = (zcf, privateArgs, zone, tools) => { ... }; + * export const start = withOrchestration(contract); + * ``` + * + * @template {Record} CT + * @template {OrchestrationPowers & { + * marshaller: Marshaller; + * }} PA + * @template R + * @param {( + * zcf: ZCF, + * privateArgs: PA, + * zone: Zone, + * tools: OrchestrationTools, + * ) => Promise} contractFn + * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a + * Zoe start function + */ +export const withOrchestration = + contractFn => async (zcf, privateArgs, baggage) => { + const { zone, ...tools } = provideOrchestration( + zcf, + baggage, + privateArgs, + privateArgs.marshaller, + ); + return contractFn(zcf, privateArgs, zone, tools); + }; +harden(withOrchestration); diff --git a/contract/utils/time.js b/contract/utils/time.js new file mode 100644 index 00000000..06f995ab --- /dev/null +++ b/contract/utils/time.js @@ -0,0 +1,48 @@ +import { E } from '@endo/far'; +import { TimeMath } from '@agoric/time'; + +/** + * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; + * @import {Remote} from '@agoric/internal'; + */ + +export const SECONDS_PER_MINUTE = 60n; +export const MILLISECONDS_PER_SECOND = 1000n; +export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; +export const NANOSECONDS_PER_SECOND = 1_000_000_000n; + +/** + * XXX should this be durable? resumable? + * + * @param {Remote} timer + */ +export function makeTimestampHelper(timer) { + return harden({ + /** + * XXX do this need to be resumable / use Vows? + * + * Takes the current time from ChainTimerService and adds a relative time to + * determine a timeout timestamp in nanoseconds. Useful for + * {@link MsgTransfer.timeoutTimestamp}. + * + * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes + * @returns {Promise} Timeout timestamp in absolute nanoseconds + * since unix epoch + */ + async getTimeoutTimestampNS(relativeTime) { + const currentTime = await E(timer).getCurrentTimestamp(); + const timeout = + relativeTime || + TimeMath.coerceRelativeTimeRecord( + SECONDS_PER_MINUTE * 5n, + currentTime.timerBrand, + ); + return ( + TimeMath.addAbsRel(currentTime, timeout).absValue * + NANOSECONDS_PER_SECOND + ); + }, + }); +} + +/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/utils/zcf-tools.js b/contract/utils/zcf-tools.js new file mode 100644 index 00000000..d3843695 --- /dev/null +++ b/contract/utils/zcf-tools.js @@ -0,0 +1,35 @@ +/** + * @import {HostInterface} from '@agoric/async-flow'; + * @import {VowTools} from '@agoric/vow'; + * @import {ZcfTools} from '../types.js'; + */ + +import { M, mustMatch } from '@endo/patterns'; + +const HandlerShape = M.remotable('OfferHandler'); + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + * @returns {HostInterface} + */ +export const makeZcfTools = (zcf, vowTools) => + harden({ + makeInvitation(offerHandler, description, customDetails, proposalShape) { + mustMatch(offerHandler, HandlerShape); + return vowTools.watch( + zcf.makeInvitation( + offerHandler, + description, + customDetails, + proposalShape, + ), + ); + }, + atomicRearrange(transfers) { + zcf.atomicRearrange(transfers); + }, + assertUniqueKeyword(keyword) { + zcf.assertUniqueKeyword(keyword); + }, + }); diff --git a/contract/utils/zoe-tools.js b/contract/utils/zoe-tools.js new file mode 100644 index 00000000..a5cbbe38 --- /dev/null +++ b/contract/utils/zoe-tools.js @@ -0,0 +1,186 @@ +/** + * @file Helper functions for transferring payments between a LocalChainAccount + * and a ZCFSeat. + * + * Maintainers: This exists as an endowment for orchestrated async-flows so we + * can make use of E and promises. The logic for recovering partial failures + * is also an added convenience for developers. + * + * Functions are written using `asVow` and non-resumable promises as we expect + * each invocation to resolve promptly - there are no timers or interchain + * network calls. + * + * A promise resolved promptly is currently safe from being severed by an + * upgrade because we only trigger vat upgrades as the result of network + * input. + */ + +import { makeError, q, Fail } from '@endo/errors'; +import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; +import { E } from '@endo/far'; + +const { assign, keys, values } = Object; + +/** + * @import {HostOf} from '@agoric/async-flow'; + * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; + * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; + * @import {VowTools} from '@agoric/vow'; + * @import {LocalAccountMethods} from '../types.js'; + */ + +/** + * @typedef {{ + * invitationMakers: InvitationMakers; + * publicSubscribers: Record>; + * }} ResolvedContinuingOfferResult + * + * @see {ContinuingOfferResult} + */ + +/** + * @typedef {( + * srcSeat: ZCFSeat, + * localAccount: LocalAccountMethods, + * amounts: AmountKeywordRecord, + * ) => Promise} LocalTransfer + */ + +/** + * @typedef {( + * localAccount: LocalAccountMethods, + * destSeat: ZCFSeat, + * amounts: AmountKeywordRecord, + * ) => Promise} WithdrawToSeat + */ + +/** + * @param {ZCF} zcf + * @param {VowTools} vowTools + */ +export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { + /** + * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the + * deposits fail, everything will be rolled back to the `srcSeat`. Supports + * multiple items in the `amounts` {@link AmountKeywordRecord}. + * + * @type {HostOf} + */ + const localTransfer = (srcSeat, localAccount, amounts) => + asVow(async () => { + !srcSeat.hasExited() || Fail`The seat cannot have exited.`; + const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); + const userSeat = await userSeatP; + zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); + tempSeat.exit(); + // TODO (#9541) get the userSeat into baggage so it's at least recoverable + // const userSeat = await subzone.makeOnce( + // 'localTransferHelper', + // async () => { + // const { zcfSeat: tempSeat, userSeat: userSeatP } = + // zcf.makeEmptySeatKit(); + // const uSeat = await userSeatP; + // // TODO how do I store in the place for this retryable? + // atomicTransfer(zcf, srcSeat, tempSeat, amounts); + // tempSeat.exit(); + // return uSeat; + // }, + // ); + + // Now all the `amounts` are accessible, so we can move them to the localAccount + const payments = await Promise.all( + keys(amounts).map(kw => E(userSeat).getPayout(kw)), + ); + const settleDeposits = await when( + allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), + ); + // if any of the deposits to localAccount failed, unwind all of the allocations + if (settleDeposits.find(x => x.status === 'rejected')) { + const amts = values(amounts); + const errors = []; + // withdraw the successfully deposited payments + const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { + if (x.status === 'rejected') { + errors.push(x.reason); + return payments[i]; + } + return E(localAccount).withdraw(amts[i]); + }); + + // return all payments to the srcSeat + const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); + const paymentKwr = harden( + keys(amounts).reduce( + (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + srcSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + throw makeError(`One or more deposits failed ${q(errors)}`); + } + // TODO #9541 remove userSeat from baggage + }); + + /** + * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any + * of the withdrawals fail, everything will be rolled back to the + * `srcLocalAccount`. Supports multiple items in the `amounts` + * {@link PaymentKeywordRecord} + * + * @type {HostOf} + */ + const withdrawToSeat = (localAccount, destSeat, amounts) => + asVow(async () => { + !destSeat.hasExited() || Fail`The seat cannot have exited.`; + + const settledWithdrawals = await when( + allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), + ); + + // if any of the withdrawals were rejected, unwind the successful ones + if (settledWithdrawals.find(x => x.status === 'rejected')) { + const returnPaymentVs = []; + const errors = []; + for (const result of settledWithdrawals) { + if (result.status === 'fulfilled') { + returnPaymentVs.push(E(localAccount).deposit(result.value)); + } else { + errors.push(result.reason); + } + } + await when(allVows(returnPaymentVs)); + throw makeError(`One or more withdrawals failed ${q(errors)}`); + } + // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat + const paymentKwr = harden( + keys(amounts).reduce( + (acc, kw, i) => + assign(acc, { + [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] + .value, + }), + {}, + ), + ); + const depositResponse = await depositToSeat( + zcf, + destSeat, + amounts, + paymentKwr, + ); + console.debug(depositResponse); + }); + + return harden({ + localTransfer, + withdrawToSeat, + }); +}; + +/** @typedef {ReturnType} ZoeTools */ diff --git a/yarn.lock b/yarn.lock index 589e7ef3..b59e68ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,13 +15,6 @@ __metadata: languageName: node linkType: hard -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 10c0/53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f - languageName: node - linkType: hard - "@adraffy/ens-normalize@npm:1.10.0": version: 1.10.0 resolution: "@adraffy/ens-normalize@npm:1.10.0" @@ -29,14 +22,21 @@ __metadata: languageName: node linkType: hard -"@agoric/access-token@npm:0.4.22-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.4.22-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/access-token@npm:0.4.22-upgrade-17-dev-ec448b0.0" +"@adraffy/ens-normalize@npm:^1.10.1": + version: 1.11.0 + resolution: "@adraffy/ens-normalize@npm:1.11.0" + checksum: 10c0/5111d0f1a273468cb5661ed3cf46ee58de8f32f84e2ebc2365652e66c1ead82649df94c736804e2b9cfa831d30ef24e1cc3575d970dbda583416d3a98d8870a6 + languageName: node + linkType: hard + +"@agoric/access-token@npm:0.4.22-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.4.22-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/access-token@npm:0.4.22-upgrade-18-dev-bf39b10.0" dependencies: n-readlines: "npm:^1.0.0" proper-lockfile: "npm:^4.1.2" tmp: "npm:^0.2.1" - checksum: 10c0/668cd1fcf4661da652aa66af88c0deb65e82d8e2b72cd12824ab036edb651130961dd7266f95b624756cf5371bd0e7094bc9935ff7eaa0b34a0fe3404ef583ab + checksum: 10c0/825688202025ddde3e90b3d52cab71cbc153628c3b9ed5280d67fd540961851de01e6f41df8103772a28c35ad708a0b7396407af3bbfa4429e84a4902e30777f languageName: node linkType: hard @@ -58,14 +58,7 @@ __metadata: languageName: node linkType: hard -"@agoric/assert@npm:^0.6.1-u11wf.0": - version: 0.6.1-upgrade-16a-dev-fb592e4.0 - resolution: "@agoric/assert@npm:0.6.1-upgrade-16a-dev-fb592e4.0" - checksum: 10c0/cb43433b33e74db3b9dbb01d3be2d737002eda0af4a387725355bcd22edcbda606e062f295a75722a7bb68705adcd329126d78c0695143967b94352dfe1d566e - languageName: node - linkType: hard - -"@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/async-flow@npm:^0.1.1-u17.1": +"@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.1.1-upgrade-17-dev-ec448b0.0 resolution: "@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0" dependencies: @@ -84,6 +77,25 @@ __metadata: languageName: node linkType: hard +"@agoric/async-flow@npm:^0.1.1-u17.1": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/async-flow@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/6f754d60efe6516f53c4e89c500954dd421c8bb6a742fe56cc861dcc91bb63aab3c5a8a8b71f90452eab6d9f84fa421d9392e0b26102ff6cef6247c008bf794f + languageName: node + linkType: hard + "@agoric/babel-generator@npm:^7.17.4, @agoric/babel-generator@npm:^7.17.6": version: 7.17.6 resolution: "@agoric/babel-generator@npm:7.17.6" @@ -95,6 +107,21 @@ __metadata: languageName: node linkType: hard +"@agoric/base-zone@npm:0.1.1-dev-d1562a1.0+d1562a1": + version: 0.1.1-dev-d1562a1.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-d1562a1.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/312265b75f8151bac076d24ba0c4ebfb7eafa74f10f2906dc066d072474c93ff19411a6b6653a7f3deddf3fc0daa0e255073430a6cce218c55a3d9fdca80dfdc + languageName: node + linkType: hard + "@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.1.1-upgrade-17-dev-ec448b0.0 resolution: "@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0" @@ -110,17 +137,47 @@ __metadata: languageName: node linkType: hard -"@agoric/cache@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/cache@npm:0.3.3-upgrade-17-dev-ec448b0.0" +"@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.1.1-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - checksum: 10c0/062a3b1942ed480e9d4ddfc2d53fc44c4f9d325e82fbba4ae1467d2d42162a92038c5dbce016d1872d688cb71da132bbd9277a282e261f6984aa597ef15e9c43 + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/96a42740cf32bd841a519ccc75b465f35381cf009a413142211f3f916c94ed2df77c87bea30957bef6a0c3791cd98005906b36fd709198ddbf3f04a0193b4996 + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/base-zone@npm:^0.1.1-u18.0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/0df4eba4133cf41c8a3e4edbfe5ba74a0976fde58687c50a1fb32b932160538ec1af077495c375b3ee223df271086500e571b02086275c8ea5be2d5c6c658702 + languageName: node + linkType: hard + +"@agoric/cache@npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.3.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/cache@npm:0.3.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/fb8c24680abdcd15c75ce193a11dda0772503ed681681505ab71141fc6389f8fcc1f45f284bb425abd108040177b0580f6739aa05b73d4e1f01990973d400299 languageName: node linkType: hard @@ -138,25 +195,45 @@ __metadata: languageName: node linkType: hard -"@agoric/casting@npm:0.4.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/casting@npm:^0.4.3-u13.0": - version: 0.4.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/casting@npm:0.4.3-upgrade-17-dev-ec448b0.0" +"@agoric/casting@npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.4.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/casting@npm:0.4.3-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" "@cosmjs/encoding": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" "@cosmjs/stargate": "npm:^0.32.3" "@cosmjs/tendermint-rpc": "npm:^0.32.3" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/lockdown": "npm:^1.0.10" - "@endo/marshal": "npm:^1.5.3" - "@endo/promise-kit": "npm:^1.1.5" - node-fetch: "npm:^2.6.0" - checksum: 10c0/cefa79ff785f9d06c29fe920d56ac808b40436fdd7cdaf2e8058e7201967d9c09339a139cf4646b9508e3a5a7d0fa1ff0000f04be855f7c76f361732fc0019e7 + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/lockdown": "npm:^1.0.12" + "@endo/marshal": "npm:^1.6.1" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/a268b949154c0a7ac0c1b1682881ee0276bc61598f5f09d50ea5ed2106079416cc2831364d5a274775848247ef5368f503ef993695ae51627f59adf269f89c40 + languageName: node + linkType: hard + +"@agoric/casting@npm:0.4.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/casting@npm:^0.4.3-u13.0": + version: 0.4.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/casting@npm:0.4.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@cosmjs/encoding": "npm:^0.32.3" + "@cosmjs/proto-signing": "npm:^0.32.3" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/lockdown": "npm:^1.0.12" + "@endo/marshal": "npm:^1.6.1" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/48ffbc1ac898bd012b66a40c3498d99cac5b39c84ef19da4ee38c34eaf72dec9bbd3dc24d4a3c581132805565a48bbaee00c490003bf5e67f0c1e80a9ee2e0f0 languageName: node linkType: hard @@ -191,6 +268,16 @@ __metadata: languageName: node linkType: hard +"@agoric/cosmic-proto@npm:0.4.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.4.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/cosmic-proto@npm:0.4.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/95f603201792d7ff36e834efe5c1cbd6949c23535b953c9fa5ab00e9bb8f463985309f0d6048447d56032e3678127ebe224793c0e5d2e3725e01eec0797e8ed9 + languageName: node + linkType: hard + "@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.5.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0" @@ -201,30 +288,50 @@ __metadata: languageName: node linkType: hard -"@agoric/deploy-script-support@npm:^0.10.4-u17.1": - version: 0.10.4-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/deploy-script-support@npm:0.10.4-upgrade-17-dev-ec448b0.0" +"@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.5.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/import-manager": "npm:0.3.12-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/zip": "npm:^1.0.7" - checksum: 10c0/83603c12a4de1e9f5ae3580dd9143eeded85810b722ccdae16eeef023b8918f8b6a4d2f71810bf37648f4e70c819e7269b6c45dc668959122ce4f51b3d34f67e + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/2f1da76916fad1c4de4f0a2330c4618ce3a9f7cc13ea50c8e616190919f85b2f07842f70980a183fe7d908f66429524edc67d52c249af4a65d4152b3bf1974d8 languageName: node linkType: hard -"@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1": +"@agoric/cosmic-proto@npm:latest": + version: 0.5.0-u18.1 + resolution: "@agoric/cosmic-proto@npm:0.5.0-u18.1" + dependencies: + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/56a40d7021396274835135bdc4c1839e5d9c59c2ad541b9cf3d3a5cc20c7e0fa1866e166cd64b218beb6fd8e05a0cfe8a4e61a2ff3bbe75a9e61b0a6af84396f + languageName: node + linkType: hard + +"@agoric/deploy-script-support@npm:^0.10.4-u17.1": + version: 0.10.4-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/deploy-script-support@npm:0.10.4-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/import-manager": "npm:0.3.12-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/zip": "npm:^1.0.8" + checksum: 10c0/5b8c28f081e0ef6f7c6b362b99197137a9a87cad79f09ce755eb3ed47220fa4d8711cc423a83c8d7177b22594c1387954ec7684957c21121eb371cae9d0388ae + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.16.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -243,6 +350,44 @@ __metadata: languageName: node linkType: hard +"@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.16.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/ac40fd99b27b546f4a8538d3f2228c1c8614cf52ad40319f6e69a078476a105b565d9f02dfbda10c8461ef6cff1250e6df49e25b251707c12019bf2879e7b549 + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1": + version: 0.16.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/7566481669eb6c39bc6a5b379f5cc1d7498fa5d90311b5c01ff3f72f7a51d6e65ee59cd9587c226179504473d88be20adcfaeaeab0482cb3b46f8f0612455965 + languageName: node + linkType: hard + "@agoric/ertp@npm:^0.16.2": version: 0.16.2 resolution: "@agoric/ertp@npm:0.16.2" @@ -262,10 +407,10 @@ __metadata: linkType: hard "@agoric/eslint-config@npm:^0.4.1-u17.1": - version: 0.4.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/eslint-config@npm:0.4.1-upgrade-17-dev-ec448b0.0" + version: 0.4.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/eslint-config@npm:0.4.1-upgrade-18-dev-ef001c0.0" peerDependencies: - "@endo/eslint-plugin": ^2.2.1 + "@endo/eslint-plugin": ^2.2.2 "@jessie.js/eslint-plugin": ^0.4.1 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 @@ -277,11 +422,11 @@ __metadata: eslint-plugin-prettier: ^5.0.0 prettier: ^3.0.3 typescript-eslint: ^7.13.1 - checksum: 10c0/4c95f380553a7218001d6e1ae6a7e11482c7f5e260be20de4e346732593a4b95b77e24e2dee33192b2cfaf7b91ef59e8d3e49eb27a6bee8e29def800041bf44e + checksum: 10c0/170140325359540e2a1c6684c0f6a0adabd645d85c416299ca243ecc7cabfac1ae26b1a9b30356da53dabd061161c74fb16cb133809b99f667fb3c23f1536449 languageName: node linkType: hard -"@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/governance@npm:^0.10.4-u17.1": +"@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.10.4-upgrade-17-dev-ec448b0.0 resolution: "@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0" dependencies: @@ -305,6 +450,54 @@ __metadata: languageName: node linkType: hard +"@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.4-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/7e9863d71c2bffe632649da59d8f9cc2d95a4cc09eb27691e66442fe343ad7ee95c1978fb5c20981f1617d694ac3eda54ff1b12ae6b9b33e28b3a37b2d2de222 + languageName: node + linkType: hard + +"@agoric/governance@npm:0.10.4-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/governance@npm:^0.10.4-u17.1": + version: 0.10.4-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/governance@npm:0.10.4-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/1828672b4b731a0fca06a03e2d462c3189ef2ed79487ebad6cbe6bd3f19546509f53c036176b87ec6f83231d859e64418cb4f9c3ed5b39f490a8fa2654272d50 + languageName: node + linkType: hard + "@agoric/governance@npm:^0.10.3": version: 0.10.3 resolution: "@agoric/governance@npm:0.10.3" @@ -329,35 +522,35 @@ __metadata: languageName: node linkType: hard -"@agoric/import-manager@npm:0.3.12-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.12-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/import-manager@npm:0.3.12-upgrade-17-dev-ec448b0.0" - checksum: 10c0/3be6ffbf106dbd6d9b3bdc367b31641e5f4ec1b4e6180bc4b524f29caf89a5f3cecad9845d7ec24e5201754082f330d6b20d90d3cdb0f66da141914c31136b0e +"@agoric/import-manager@npm:0.3.12-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.3.12-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/import-manager@npm:0.3.12-upgrade-18-dev-ef001c0.0" + checksum: 10c0/70d202ad0b64ddd0f04ca4820e2cf829cb8b145fda6afea8125d292312de7d8be8ddc1f2ba6e15597e220b2ea197d68103a1e76baf27c5100c0ef83825b05d99 languageName: node linkType: hard -"@agoric/inter-protocol@npm:0.17.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/inter-protocol@npm:^0.17.0-u17.1": - version: 0.17.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/inter-protocol@npm:0.17.0-upgrade-17-dev-ec448b0.0" +"@agoric/inter-protocol@npm:0.17.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/inter-protocol@npm:^0.17.0-u17.1": + version: 0.17.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/inter-protocol@npm:0.17.0-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/governance": "npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/captp": "npm:^4.3.0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/captp": "npm:^4.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" jessie.js: "npm:^0.3.4" - checksum: 10c0/5a709d4889f39e56bc25d41c485cc0910ffd38829f91284de1a3688b993f2b08d29a6a71b0add834a3df50ee2360abc95a4407d7c448f6e8e1457294ba4e298d + checksum: 10c0/d46793425b122c8c997831d461352653137787094b5eec6649bb01e4d080db53a81fd69b67bc705398e3e0ff05f74984f3e1018b6ceff0cad700f857da34a28d languageName: node linkType: hard @@ -386,7 +579,47 @@ __metadata: languageName: node linkType: hard -"@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/internal@npm:^0.4.0-u14.0, @agoric/internal@npm:^0.4.0-u17.1": +"@agoric/internal@npm:0.3.3-dev-d1562a1.0+d1562a1": + version: 0.3.3-dev-d1562a1.0 + resolution: "@agoric/internal@npm:0.3.3-dev-d1562a1.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-d1562a1.0+d1562a1" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/9c03201492935032a7497aba420cf2e1feff814ef40bf656cb7d4e10794b9fd6d173463118569a06f5110d35c34daffee0a2fbd64478345d81a3a79713303021 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.3.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/internal@npm:0.3.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/570f7168206cce15e52574f8e5f241945866a83fe3ccb20ce99e09567961c5878d44a3a5486221865a727499d1219c5c4d65c637da6b934497dc592307e0d34a + languageName: node + linkType: hard + +"@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.4.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -406,6 +639,26 @@ __metadata: languageName: node linkType: hard +"@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/internal@npm:^0.4.0-u17.1": + version: 0.4.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/629845b02bbd185678fdf83baac2eea878a54ca002f9d105eb3000bf95e31a9fdefa9f15e9ef278a9058d10f7a32a978df63f264ef9cac524891f44acec641d3 + languageName: node + linkType: hard + "@agoric/internal@npm:^0.3.2": version: 0.3.2 resolution: "@agoric/internal@npm:0.3.2" @@ -433,6 +686,62 @@ __metadata: languageName: node linkType: hard +"@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.1.1-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/2dc5d6dc0c9765e63e83dccb660797e0c70d702bad826c35cc481685903e43eb3a7a3e48bd2f49915e3b3f261395b0786b3e1fb820ee9c44fb4b7c997cc3386e + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/5a4230e63cb585a9c4268bcf55091129fdb27f9cb9d97dc72bb6de9de7183ccb2a16dc2641475888c1065c96ab1f81700000f9a34368a0e3cd013065b9ba82c2 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-dev-d1562a1.0": + version: 0.1.1-dev-d1562a1.0 + resolution: "@agoric/network@npm:0.1.1-dev-d1562a1.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-d1562a1.0+d1562a1" + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@agoric/vat-data": "npm:0.5.3-dev-d1562a1.0+d1562a1" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/94602d4a769b9cc8b05e961961771ed0be0fa6bfc8d2bd71e303cdf20313433ced0bb97ff4d36e93ca390c33c47afc7ae8a491c49f2d8b1b733f800dd9ec5223 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/network@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/f33dac0dcb7a9d04a982ba57a1906281c7780b904148199c22bcad4ba71f1b7f4eaec2506508d29015d044452b956786ee6c1d199bc1662ced184b32b87ca8ae + languageName: node + linkType: hard + "@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.2.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0" @@ -450,6 +759,38 @@ __metadata: languageName: node linkType: hard +"@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.2.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/62b6f8354b2982d444a2cd48f9eee5dfc5d36a7b084eaa01a69c675b2694af7f049dc1fb8d8901a4ceb01e945585f802cd0aba5a771ea826822751396662e3bf + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/notifier@npm:^0.6.3-dev-8c14632.0": + version: 0.6.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/notifier@npm:0.6.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/3b840205b44b389acd7c3fc0faa6972a28d93536ebbc8171bd38a5c211395346e383eb0efd5dffb38e225cd82a23dec9a99ca8e652c81b7a27b2c72e156c6aa8 + languageName: node + linkType: hard + "@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.7.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0" @@ -465,6 +806,21 @@ __metadata: languageName: node linkType: hard +"@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.7.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/5894cfcc10dd8cdcf92db2f1c33589af5ec4c82810cef33a7a77703b2306d0d7b8db3bd1ba87a595c60e6679e4a23d88d6ba53bbe1aa1438f20a0a2bb19d66fa + languageName: node + linkType: hard + "@agoric/notifier@npm:^0.6.2": version: 0.6.2 resolution: "@agoric/notifier@npm:0.6.2" @@ -482,23 +838,6 @@ __metadata: languageName: node linkType: hard -"@agoric/notifier@npm:^0.6.3-dev-8c14632.0": - version: 0.6.3-u14.0 - resolution: "@agoric/notifier@npm:0.6.3-u14.0" - dependencies: - "@agoric/assert": "npm:^0.6.1-u11wf.0" - "@agoric/internal": "npm:^0.4.0-u14.0" - "@agoric/store": "npm:^0.9.3-u14.0" - "@agoric/swing-store": "npm:^0.9.2-u14.0" - "@agoric/swingset-vat": "npm:^0.32.3-u14.0" - "@agoric/vat-data": "npm:^0.5.3-u14.0" - "@endo/far": "npm:0.2.18" - "@endo/marshal": "npm:0.8.5" - "@endo/promise-kit": "npm:0.2.56" - checksum: 10c0/55869104b0ff17a387f00dded01f94e1b7cfbecf45604eef75c2126eb6c3e68881092b8c413ae56fcff98d2260fb5b6e59a7b8256590673e624cb6333d528d14 - languageName: node - linkType: hard - "@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0": version: 0.2.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0" @@ -600,27 +939,27 @@ __metadata: languageName: node linkType: hard -"@agoric/smart-wallet@npm:0.5.4-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/smart-wallet@npm:^0.5.4-u17.1": - version: 0.5.4-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/smart-wallet@npm:0.5.4-upgrade-17-dev-ec448b0.0" +"@agoric/smart-wallet@npm:0.5.4-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.5.4-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-upgrade-18-dev-bf39b10.0" dependencies: - "@agoric/casting": "npm:0.4.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/066430978f56f1c2628084ec8935d5eed92cdf43000c07007b37cafc2713039982c9a9cbd09c8aa1954d6d70d60ebce07e0c83a2dbbfea9389af7009c0fd0a5e + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/852a0f57814496356996f0a095748758ac5270c28a6234e75355452b8df0c743ab151cb05063976d421ea5027b0db1b6b158f8da8bb893076391bed87d80165f languageName: node linkType: hard @@ -647,6 +986,30 @@ __metadata: languageName: node linkType: hard +"@agoric/smart-wallet@npm:^0.5.4-u17.1": + version: 0.5.4-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vats": "npm:0.15.2-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/ff0dde21aa164afb661f6ab728765518fe2abc9c2d4ad672ccf1f4e4fa4222085e3f82efbb3409f90f61673fd2bf759f62b14f1c62d5e8b0ca723bfddc65d0b2 + languageName: node + linkType: hard + "@agoric/spawner@npm:^0.6.8": version: 0.6.8 resolution: "@agoric/spawner@npm:0.6.8" @@ -659,7 +1022,20 @@ __metadata: languageName: node linkType: hard -"@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/store@npm:^0.9.3-u14.0, @agoric/store@npm:^0.9.3-u17.1": +"@agoric/store@npm:0.9.3-dev-d1562a1.0+d1562a1": + version: 0.9.3-dev-d1562a1.0 + resolution: "@agoric/store@npm:0.9.3-dev-d1562a1.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/e970c4a39dc9261e8f466dcd4ad54e30cd17a81c76d6e28fe3130fe09b1a19d3cd5a5d047052da67e51f1d68babb5f05def469bf89be3ce2c1b638ad5c5cf61d + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.9.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -672,6 +1048,32 @@ __metadata: languageName: node linkType: hard +"@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.9.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/1b96441baba7d1b3c50d09f8a34e267330069a708c00a91451445c4f96f8cdea1238553385eae0085d49e50cf2c6f18244e77720c5b4e4215a466d74488700d8 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u17.1": + version: 0.9.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/8ca7d3a1b4fe909b98146d6c91c0a79a812f1df27ce298d791a0a1b1224f344eacb756be7a6c5c5abc16a875855b99eeddb0d058bcdcea01a55ccf0e2b8bc8ff + languageName: node + linkType: hard + "@agoric/store@npm:^0.9.2": version: 0.9.2 resolution: "@agoric/store@npm:0.9.2" @@ -690,7 +1092,22 @@ __metadata: languageName: node linkType: hard -"@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/swing-store@npm:^0.9.2-u14.0": +"@agoric/swing-store@npm:0.10.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swing-store@npm:0.10.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/1348d898ebadf1f5689e0357d35bb4677a2a68b27b8b00ab3b24dafc70faff96e97d792698b2c172ddd32bf6e6b77f6799d778513968d2dcd2a1089646d8ca3e + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.9.2-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0" dependencies: @@ -705,6 +1122,21 @@ __metadata: languageName: node linkType: hard +"@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.9.2-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/3b43376a909e608b2e7503ce6e3e52de8c927aec0d137031bd39aaa5380c7825b3148da7b36d309b3850548f2aa9a08ec7e0c51da0400aac7a972afcf4ccf1ea + languageName: node + linkType: hard + "@agoric/swing-store@npm:^0.9.1": version: 0.9.1 resolution: "@agoric/swing-store@npm:0.9.1" @@ -720,7 +1152,28 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/swingset-liveslots@npm:^0.10.3-u14.0": +"@agoric/swingset-liveslots@npm:0.10.3-dev-d1562a1.0+d1562a1": + version: 0.10.3-dev-d1562a1.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-d1562a1.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-d1562a1.0+d1562a1" + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/49130ffe7b99f7fb1effa5cb603a8f51bf95df9fab71cb66da6a70e39cfb0a52664d4442cb6bcc593c4412f4a4156eb71ae1070733ba518edc688ff54364f84f + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.10.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -741,6 +1194,48 @@ __metadata: languageName: node linkType: hard +"@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/bc919c04de8afc89bf377e5959b4b9d80216cba0467ceb8deddd64ded59e2ff6020437ea02bc7074472dfed85e7f20855caf8151928b314e134b916e0d1cfb7d + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.10.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/5f2f024274f69112d29b242f86c5db630f2285bbfc4dfdf776af14bcd50d04795e30978753ce74f70021f1a582aed778e6b2dc1ea636cd0955bd6519f326b48a + languageName: node + linkType: hard + "@agoric/swingset-liveslots@npm:^0.10.2": version: 0.10.2 resolution: "@agoric/swingset-liveslots@npm:0.10.2" @@ -765,6 +1260,54 @@ __metadata: languageName: node linkType: hard +"@agoric/swingset-vat@npm:0.32.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.32.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/kmarshal": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swing-store": "npm:0.9.2-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/xsnap": "npm:0.14.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/compartment-mapper": "npm:^1.3.1" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/ses-ava": "npm:^1.2.7" + "@endo/stream": "npm:^1.2.7" + "@endo/zip": "npm:^1.0.8" + ansi-styles: "npm:^6.2.1" + anylogger: "npm:^0.21.0" + better-sqlite3: "npm:^9.1.1" + import-meta-resolve: "npm:^2.2.1" + microtime: "npm:^3.1.0" + semver: "npm:^6.3.0" + tmp: "npm:^0.2.1" + yargs-parser: "npm:^21.1.1" + peerDependencies: + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/6c53fb399bb6f500a0696c6c98c5d71b2d51b38a85ebf6088b4e98ed90f155aee765d0f24edb878f494aed643dc64c0b6376b5d04a5b4cedae42f2477318683f + languageName: node + linkType: hard + "@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.33.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0" @@ -813,6 +1356,54 @@ __metadata: languageName: node linkType: hard +"@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.33.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/kmarshal": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swing-store": "npm:0.10.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/xsnap": "npm:0.14.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/base64": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/check-bundle": "npm:^1.0.11" + "@endo/compartment-mapper": "npm:^1.3.1" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/ses-ava": "npm:^1.2.7" + "@endo/stream": "npm:^1.2.7" + "@endo/zip": "npm:^1.0.8" + ansi-styles: "npm:^6.2.1" + anylogger: "npm:^0.21.0" + better-sqlite3: "npm:^9.1.1" + import-meta-resolve: "npm:^2.2.1" + microtime: "npm:^3.1.0" + semver: "npm:^6.3.0" + tmp: "npm:^0.2.1" + yargs-parser: "npm:^21.1.1" + peerDependencies: + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/6b556ea7e54d4706c551508c293d2546c661f1b49182af29f5ddeb8f94f89fa33dd5ba894d29ee603f1a33d54605df10b3af8f4d9a29762ac151eb7a0a0aa760 + languageName: node + linkType: hard + "@agoric/swingset-vat@npm:^0.32.2": version: 0.32.2 resolution: "@agoric/swingset-vat@npm:0.32.2" @@ -855,55 +1446,27 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-vat@npm:^0.32.3-u14.0": - version: 0.32.3-u14.0 - resolution: "@agoric/swingset-vat@npm:0.32.3-u14.0" - dependencies: - "@agoric/assert": "npm:^0.6.1-u11wf.0" - "@agoric/internal": "npm:^0.4.0-u14.0" - "@agoric/store": "npm:^0.9.3-u14.0" - "@agoric/swing-store": "npm:^0.9.2-u14.0" - "@agoric/swingset-liveslots": "npm:^0.10.3-u14.0" - "@agoric/swingset-xsnap-supervisor": "npm:^0.10.3-u14.0" - "@agoric/time": "npm:^0.3.3-u14.0" - "@agoric/vat-data": "npm:^0.5.3-u14.0" - "@agoric/xsnap": "npm:^0.14.3-u14.0" - "@agoric/xsnap-lockdown": "npm:^0.14.1-u13.0" - "@endo/base64": "npm:0.2.31" - "@endo/bundle-source": "npm:2.5.2-upstream-rollup" - "@endo/captp": "npm:3.1.1" - "@endo/check-bundle": "npm:0.2.18" - "@endo/compartment-mapper": "npm:0.8.4" - "@endo/eventual-send": "npm:0.17.2" - "@endo/far": "npm:0.2.18" - "@endo/import-bundle": "npm:0.3.4" - "@endo/init": "npm:0.5.56" - "@endo/marshal": "npm:0.8.5" - "@endo/nat": "npm:4.1.27" - "@endo/promise-kit": "npm:0.2.56" - "@endo/ses-ava": "npm:0.2.40" - "@endo/zip": "npm:0.2.31" - ansi-styles: "npm:^6.2.1" - anylogger: "npm:^0.21.0" - import-meta-resolve: "npm:^2.2.1" - microtime: "npm:^3.1.0" - semver: "npm:^6.3.0" - tmp: "npm:^0.2.1" - peerDependencies: - ava: ^5.2.0 - bin: - vat: bin/vat - checksum: 10c0/8c75cab17d8352e49f14f9865ffa696e8d856474b8ec878ed2e464d74bc0002026f72e7ce8149f921eba0db17f99676588ce952d6f58a8c92971c5b969a41d24 - languageName: node - linkType: hard - -"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/swingset-xsnap-supervisor@npm:^0.10.3-u14.0": +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.10.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0" checksum: 10c0/0b07fb3a628f96a5e32e26db4d50fb27897340b8759405f0315e15ca60a31c484edee84853fe9d8cdcf51b2f29ab79dfe5f86eeda0358e8462cedb12c099534f languageName: node linkType: hard +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.10.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0" + checksum: 10c0/947bc103a17f14a510642329229cab6d781e34af0e047db232d9df7f9e38addd89e4291e7c5c11f1dd894c46213a694b4ab0efeb4f9cebefe3a596908d25ded2 + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.10.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-ef001c0.0" + checksum: 10c0/82da2192be835df39f2d11ab7b6dacbd42a871ee8b3cf8bd27ec8f1b60e92dd2414fefe446f5992d9ffad77ac8096ab31c11952caee287fe9df8f3928d55a400 + languageName: node + linkType: hard + "@agoric/swingset-xsnap-supervisor@npm:^0.10.2": version: 0.10.2 resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.2" @@ -911,7 +1474,7 @@ __metadata: languageName: node linkType: hard -"@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/time@npm:^0.3.3-u14.0, @agoric/time@npm:^0.3.3-u17.1": +"@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.3.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -923,6 +1486,30 @@ __metadata: languageName: node linkType: hard +"@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.3.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/06841385d5020152656b1f8a5762e71c73f051ef35dc5f5a5d16ce0bb1812b9ffe9dbff4d176fc260094a8341d0a1dd4d565cb72bee89e1dbea3412693cefa2b + languageName: node + linkType: hard + +"@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/time@npm:^0.3.3-u17.1": + version: 0.3.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/ca2332206ee1c794918b4e135c924fb52c472f464f5f7bbd17d24d69e20d81485089b7629137f08416accddff0847bf5b4a0a1303be0a514a3c9a1fc9bf2a83e + languageName: node + linkType: hard + "@agoric/time@npm:^0.3.2": version: 0.3.2 resolution: "@agoric/time@npm:0.3.2" @@ -934,7 +1521,21 @@ __metadata: languageName: node linkType: hard -"@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/vat-data@npm:^0.5.3-u14.0, @agoric/vat-data@npm:^0.5.3-u17.1": +"@agoric/vat-data@npm:0.5.3-dev-d1562a1.0+d1562a1": + version: 0.5.3-dev-d1562a1.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-d1562a1.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-d1562a1.0+d1562a1" + "@agoric/store": "npm:0.9.3-dev-d1562a1.0+d1562a1" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-d1562a1.0+d1562a1" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/bf1026d6966184476bfbd040d2eefcfbcbd682b25e5376fb6846ea776b7b191f9f1cea0c9d8d74897aaec90c34a657d85da3cb4ba148256266ec115679d02666 + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.5.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -948,6 +1549,34 @@ __metadata: languageName: node linkType: hard +"@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.5.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/1d79f0bd47e2198eb61bae67b638540076fad31d26cbce078617936132f0802dcb26f650c3ed2c9786f7d3227d7cd829bd3ac8c3cdddea76e3fb5a22bf82dcc0 + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/vat-data@npm:^0.5.3-u17.1, @agoric/vat-data@npm:^0.5.3-u18.0": + version: 0.5.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/91ed6756e482a6718f9b49139a99a99e87aaaad312fe744088b117d86fd960485b79757592102b44038c376a1664a1e86ad5e9e5671e0268e8524cec65d7b983 + languageName: node + linkType: hard + "@agoric/vat-data@npm:^0.5.2": version: 0.5.2 resolution: "@agoric/vat-data@npm:0.5.2" @@ -959,7 +1588,38 @@ __metadata: languageName: node linkType: hard -"@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/vats@npm:^0.16.0-u17.1": +"@agoric/vats@npm:0.15.2-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.15.2-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/vats@npm:0.15.2-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.4.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/network": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-vat": "npm:0.32.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/3ea78bf0c688cdff2d925b09ccd0cdb3927b78b93bdc1639535d112029c03da4160f007ea24adb5e0802995abc35b391f5a2d6a28a8fb7db6b27dc330e76fdd2 + languageName: node + linkType: hard + +"@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.16.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -990,6 +1650,37 @@ __metadata: languageName: node linkType: hard +"@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vats@npm:^0.16.0-u17.1": + version: 0.16.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/network": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/7a1d0a15d51d78394e3ef03c19adf6a5b31a6565c2ce8bdbc7495d2ed729672e0f069dd9ada490de9981409484fb359c8e11b6d5059a07a94704c652179b4fc7 + languageName: node + linkType: hard + "@agoric/vats@npm:^0.15.1": version: 0.15.1 resolution: "@agoric/vats@npm:0.15.1" @@ -1018,7 +1709,23 @@ __metadata: languageName: node linkType: hard -"@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/vow@npm:^0.2.0-u17.1": +"@agoric/vow@npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.1.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/vow@npm:0.1.1-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/67613e5832eacef41f13bd3e2072b734cbe804215765b2a32178f63aa16e614fc33f5084877b2e5c9aeb4d0ac69d3650d96b338d81c0237c09b85a43f4dd159c + languageName: node + linkType: hard + +"@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.2.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -1034,6 +1741,22 @@ __metadata: languageName: node linkType: hard +"@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vow@npm:^0.2.0-u17.1": + version: 0.2.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/e03fe8a5dec4472333eff34815dc0dea45030918763ec8a0628625aae45912957d02043e07e4b0a180bd3cc59116ce674a76aafe9a4d7cbcce1d19864dd850e5 + languageName: node + linkType: hard + "@agoric/web-components@npm:0.16.1-dev-e6f79e0.0+e6f79e0": version: 0.16.1-dev-e6f79e0.0 resolution: "@agoric/web-components@npm:0.16.1-dev-e6f79e0.0" @@ -1052,13 +1775,27 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/xsnap-lockdown@npm:^0.14.1-u13.0": +"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.14.1-upgrade-17-dev-ec448b0.0 resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0" checksum: 10c0/78c3bab502052987c88e3e3fffe87aa599a4c47a0f87ba32e5f5722d7a45be6c519eb6305f323ff877e2a911d273a03a9eebd3c9c57b7815b9510bd65ea9cb81 languageName: node linkType: hard +"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.14.1-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0" + checksum: 10c0/17dbbf38efe154128208fe64a96a8864fec25515582e685b32b91f72144e3e8969ce3da5d32b65214aedf5ba9838904b009583f96f17cf623f79fde8f70d2b5e + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.14.1-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-ef001c0.0" + checksum: 10c0/4b895d2f7c0fff1ec900b03a5c66a37d3138262cd70dc5607ea9f5d904a87d056aa55e8d03cc45fb9ac7705d99f64afc9ad66ded71705b6a66ff23d129228053 + languageName: node + linkType: hard + "@agoric/xsnap-lockdown@npm:^0.14.0": version: 0.14.0 resolution: "@agoric/xsnap-lockdown@npm:0.14.0" @@ -1066,7 +1803,7 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/xsnap@npm:^0.14.3-u14.0": +"@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.14.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -1085,7 +1822,53 @@ __metadata: bin: ava-xs: src/ava-xs.js xsrepl: src/xsrepl - checksum: 10c0/68c6896dcd493748a2b610b7dafb5fcd9ae4108eab659f7415cdeee3748af5d22af668e378467d2ef778a378f41e6198a8a4a1c7e77d6b63afdce79acb3ff387 + checksum: 10c0/68c6896dcd493748a2b610b7dafb5fcd9ae4108eab659f7415cdeee3748af5d22af668e378467d2ef778a378f41e6198a8a4a1c7e77d6b63afdce79acb3ff387 + languageName: node + linkType: hard + +"@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.14.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/init": "npm:^1.1.6" + "@endo/netstring": "npm:^1.0.12" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + "@endo/stream-node": "npm:^1.1.7" + glob: "npm:^7.1.6" + tmp: "npm:^0.2.1" + bin: + ava-xs: src/ava-xs.js + xsrepl: src/xsrepl + checksum: 10c0/e74815bf71d3bec2564550ed0faf886870b27f3b19c57488718ea444674f1290bdf82f1d2e846c5cc25d3091e0ca91f96360dde3ab02d928acf9f0782c636881 + languageName: node + linkType: hard + +"@agoric/xsnap@npm:0.14.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.14.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/init": "npm:^1.1.6" + "@endo/netstring": "npm:^1.0.12" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.7" + "@endo/stream-node": "npm:^1.1.7" + glob: "npm:^7.1.6" + tmp: "npm:^0.2.1" + bin: + ava-xs: src/ava-xs.js + xsrepl: src/xsrepl + checksum: 10c0/21850ed2023f835b97cd6a3565645349901eaa312bdc3343024cd627bd40832ab9e048336198379921f4bf57a50ab7cea650506077dca674c299f7536fb0baf2 languageName: node linkType: hard @@ -1112,7 +1895,7 @@ __metadata: languageName: node linkType: hard -"@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/zoe@npm:^0.26.3-u17.1": +"@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.26.3-upgrade-17-dev-ec448b0.0 resolution: "@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0" dependencies: @@ -1145,6 +1928,72 @@ __metadata: languageName: node linkType: hard +"@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.26.3-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/notifier": "npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/b576e9f1e9abc314a279f59fece757f4c2d1813a54e3a10536795b9352536977bc43607f5e31b7e451e1e6fbeae54484b0792b1f462289a500e29303c5d37138 + languageName: node + linkType: hard + +"@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/zoe@npm:^0.26.3-u17.1": + version: 0.26.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/internal": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/notifier": "npm:0.6.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/swingset-vat": "npm:0.32.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/time": "npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vow": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/zone": "npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/far": "npm:^1.1.8" + "@endo/import-bundle": "npm:^1.3.1" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/59bf8dd8a88f31cd42abc8d5613f6996368dedc3a129ca8df54fea6ffcac77a50c8f8554e612c56521546f42503c722ec6a5cdf313806e74850120bcd6607adc + languageName: node + linkType: hard + "@agoric/zoe@npm:^0.26.2": version: 0.26.2 resolution: "@agoric/zoe@npm:0.26.2" @@ -1170,7 +2019,20 @@ __metadata: languageName: node linkType: hard -"@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0, @agoric/zone@npm:^0.3.0-u17.1": +"@agoric/zone@npm:0.2.3-upgrade-18-dev-ef001c0.0+ef001c0": + version: 0.2.3-upgrade-18-dev-ef001c0.0 + resolution: "@agoric/zone@npm:0.2.3-upgrade-18-dev-ef001c0.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-ef001c0.0+ef001c0" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-ef001c0.0+ef001c0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/8241c80ea1075bf8baade37a5de78c7d53e21ee60e49ebddf9547e0902eec142da9117060247c0eace227e7947bb7ce52189421f23a5f94ae5f2d68d3e68d776 + languageName: node + linkType: hard + +"@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0": version: 0.3.0-upgrade-17-dev-ec448b0.0 resolution: "@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0" dependencies: @@ -1183,6 +2045,19 @@ __metadata: languageName: node linkType: hard +"@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10": + version: 0.3.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vat-data": "npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/c846261129da453c0cf234477165f66918ea0617d8f248922fa03b8721d2412e430ed4f8d29ac75c141e9d0bd47f9778f5c023f3d4f5df9c665760223da78e0a + languageName: node + linkType: hard + "@agoric/zone@npm:^0.2.2": version: 0.2.2 resolution: "@agoric/zone@npm:0.2.2" @@ -1194,6 +2069,19 @@ __metadata: languageName: node linkType: hard +"@agoric/zone@npm:latest": + version: 0.3.0-u18.0 + resolution: "@agoric/zone@npm:0.3.0-u18.0" + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/3f841b56e3387d2b37103600c598f40f25b3262c7be4dd36d02558bda76e90aa6ce22ab5d15a36d1a1b618cb6a0264ccd401dd572cd439c4ea5b29bd6a81fe2c + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -1221,247 +2109,209 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" +"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.24.1 - resolution: "@babel/compat-data@npm:7.24.1" - checksum: 10c0/8a1935450345c326b14ea632174696566ef9b353bd0d6fb682456c0774342eeee7654877ced410f24a731d386fdcbf980b75083fc764964d6f816b65792af2f5 +"@babel/compat-data@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/compat-data@npm:7.26.2" + checksum: 10c0/c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 languageName: node linkType: hard -"@babel/core@npm:^7.23.5": - version: 7.24.3 - resolution: "@babel/core@npm:7.24.3" +"@babel/core@npm:^7.25.2": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.1" - "@babel/parser": "npm:^7.24.1" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/e6e756b6de27d0312514a005688fa1915c521ad4269a388913eff2120a546538078f8488d6d16e86f851872f263cb45a6bbae08738297afb9382600d2ac342a9 + checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e languageName: node linkType: hard -"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/f89282cce4ddc63654470b98086994d219407d025497f483eb03ba102086e11e2b685b27122f6ff2e1d93b5b5fa0c3a6b7e974fbf2e4a75b685041a746a4291e + jsesc: "npm:^3.0.2" + checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 + checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/helper-plugin-utils@npm:7.24.0" - checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" - dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/b3445860ae749fc664682b291f092285e949114e8336784ae29f88eb4c176279b01cc6740005a017a0389ae4b4e928d5bbbc01de7da7e400c972e3d6f792063a +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.1" +"@babel/plugin-transform-react-jsx-self@npm:^7.24.7": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ea362ff94b535c753f560eb1f5e063dc72bbbca17ed58837a949a7b289d5eacc7b0a28296d1932c94429b168d6040cdee5484a59b9e3c021f169e0ee137e6a27 + checksum: 10c0/ce0e289f6af93d7c4dc6b385512199c5bb138ae61507b4d5117ba88b6a6b5092f704f1bdf80080b7d69b1b8c36649f2a0b250e8198667d4d30c08bbb1546bd99 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.1" +"@babel/plugin-transform-react-jsx-source@npm:^7.24.7": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ea8e3263c0dc51fbc97c156cc647150a757cc56de10781287353d0ce9b2dcd6b6d93d573c0142d7daf5d6fb554c74fa1971ae60764924ea711161d8458739b63 + checksum: 10c0/fc9ee08efc9be7cbd2cc6788bbf92579adf3cab37912481f1b915221be3d22b0613b5b36a721df5f4c0ab65efe8582fcf8673caab83e6e1ce4cc04ceebf57dfa languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/runtime@npm:7.24.5" +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.21.0": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/05730e43e8ba6550eae9fd4fb5e7d9d3cb91140379425abcb2a1ff9cebad518a280d82c4c4b0f57ada26a863106ac54a748d90c775790c0e2cd0ddd85ccdf346 + checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 languageName: node linkType: hard -"@babel/template@npm:^7.24.0, @babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab languageName: node linkType: hard -"@babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.23.6, @babel/traverse@npm:^7.24.1": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" +"@babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.23.6, @babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.6" - "@babel/parser": "npm:^7.25.6" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 languageName: node linkType: hard @@ -1478,61 +2328,49 @@ __metadata: languageName: node linkType: hard -"@chain-registry/client@npm:^1.18.0, @chain-registry/client@npm:^1.48.1": - version: 1.48.81 - resolution: "@chain-registry/client@npm:1.48.81" +"@chain-registry/client@npm:^1.18.0, @chain-registry/client@npm:^1.49.11": + version: 1.53.17 + resolution: "@chain-registry/client@npm:1.53.17" dependencies: - "@chain-registry/types": "npm:^0.45.81" - "@chain-registry/utils": "npm:^1.46.81" + "@chain-registry/types": "npm:^0.50.17" + "@chain-registry/utils": "npm:^1.51.17" bfs-path: "npm:^1.0.2" cross-fetch: "npm:^3.1.5" - checksum: 10c0/328c2f1445754b8e64470796455216799d5cea4a2dc023774b8203c12fddee9fd3d9a0dc93b9b28669458ad32b13b2b6f0fc8838ad3ba1273b9fb2be21b7a21b + checksum: 10c0/1f8d460a60d41cc413b00eab8d7b92b3b9878273c6b2f56ecf1467f9a8100045f83c827762c741cde1f5991fe587d659d91f6d085fd952fee70b108f08420ffc languageName: node linkType: hard -"@chain-registry/cosmostation@npm:1.66.2": - version: 1.66.2 - resolution: "@chain-registry/cosmostation@npm:1.66.2" +"@chain-registry/cosmostation@npm:1.67.13": + version: 1.67.13 + resolution: "@chain-registry/cosmostation@npm:1.67.13" dependencies: - "@chain-registry/types": "npm:^0.45.1" - "@chain-registry/utils": "npm:^1.46.1" + "@chain-registry/types": "npm:^0.46.11" + "@chain-registry/utils": "npm:^1.47.11" "@cosmostation/extension-client": "npm:0.1.15" - checksum: 10c0/6ec2bdfd32b05e93bfef23ee72dd65c2c0a539ae70c5cf22fc7e73602e0172bda1a8343352cf4025e410dfec88aa3abe2a59a76e88fc69f2fe5d867eca9408f9 + checksum: 10c0/d9cb615ab21fc868eb02a877f0ccd4744478a65e2993d1d936c84f67a97a036e363e081193ea1e5c712e59cde985112f66b67012230a5d5d5f49466e8fbbcce6 languageName: node linkType: hard -"@chain-registry/cosmostation@npm:^1.66.2": - version: 1.66.101 - resolution: "@chain-registry/cosmostation@npm:1.66.101" +"@chain-registry/cosmostation@npm:^1.67.13": + version: 1.72.38 + resolution: "@chain-registry/cosmostation@npm:1.72.38" dependencies: - "@chain-registry/types": "npm:^0.45.81" - "@chain-registry/utils": "npm:^1.46.81" + "@chain-registry/types": "npm:^0.50.17" + "@chain-registry/utils": "npm:^1.51.17" "@cosmostation/extension-client": "npm:0.1.15" - checksum: 10c0/ed2932cddd109bc5254027453ae3c474c7eaf868be14981ac3537b8d7dac0c7f13b51d39144c53a19e60ed7f3397bed8e4e31cbdd917fd640dd8c140f63f5d69 - languageName: node - linkType: hard - -"@chain-registry/keplr@npm:1.68.2": - version: 1.68.2 - resolution: "@chain-registry/keplr@npm:1.68.2" - dependencies: - "@chain-registry/types": "npm:^0.45.1" - "@keplr-wallet/cosmos": "npm:0.12.28" - "@keplr-wallet/crypto": "npm:0.12.28" - semver: "npm:^7.5.0" - checksum: 10c0/a155f2029f7fb366b6aa6169b8774d01a57150af0ca6925024a77d401e9c0302860208520a7dd5fead08a47b65025b1eddd65c77f10d73cbd7be71b2cda8132d + checksum: 10c0/7298e76b0617aa4283e32deaf1586b06ceb1ad14b17446b1408a893c12cedff51735e9bd3d2daf71005be835a9114e4f436a5ccf61978cc2651c25d96f050df3 languageName: node linkType: hard -"@chain-registry/keplr@npm:^1.68.2": - version: 1.68.101 - resolution: "@chain-registry/keplr@npm:1.68.101" +"@chain-registry/keplr@npm:^1.69.13": + version: 1.74.38 + resolution: "@chain-registry/keplr@npm:1.74.38" dependencies: - "@chain-registry/types": "npm:^0.45.81" + "@chain-registry/types": "npm:^0.50.17" "@keplr-wallet/cosmos": "npm:0.12.28" "@keplr-wallet/crypto": "npm:0.12.28" semver: "npm:^7.5.0" - checksum: 10c0/529b1069f35d13e30ff854f247e3a919006ed5fcba51874ebcfaeae815ce50d75e5278a6b2b51b888c6ed77b30a6bf95aa331f7ee7d4cbe46aeb25da4b00c156 + checksum: 10c0/95cdacb4365f0d84137cb25397fddb3afa85d39c957da049bc7055370aeb6d37aca0d9d7a75ed3810cbb7a332177411fc4ad59e7ebbaae08f9d7a0306bf11e34 languageName: node linkType: hard @@ -1545,10 +2383,10 @@ __metadata: languageName: node linkType: hard -"@chain-registry/types@npm:0.45.1": - version: 0.45.1 - resolution: "@chain-registry/types@npm:0.45.1" - checksum: 10c0/d2008c36e2b9d5b4dfbeae2e4038b956789cf7a70bff85d936fdb76a34a16609952b8b233bd09c3e93eeb9ccde26a5492230d1f3e450b2a7a7b8474df76835a5 +"@chain-registry/types@npm:0.46.11": + version: 0.46.11 + resolution: "@chain-registry/types@npm:0.46.11" + checksum: 10c0/bcce836cd6ada20a4cdc033cc9494b0ee0d3d5d8537e3ac5426485c30fbd2dd36e630808cfa8363f6897a4671cde623e4a076c7ae46b725e41ad7bea894d1c38 languageName: node linkType: hard @@ -1562,29 +2400,36 @@ __metadata: linkType: hard "@chain-registry/types@npm:^0.18.0": - version: 0.18.12 - resolution: "@chain-registry/types@npm:0.18.12" + version: 0.18.19 + resolution: "@chain-registry/types@npm:0.18.19" dependencies: "@babel/runtime": "npm:^7.21.0" - checksum: 10c0/6c98d87a59884d5384e5c1dfeb98a68a035e2c20273ea8ddd2640404a54db1e9e39f2022daaa72a97bebbb1fa894a7b1d06feddda8476646566b8fbe84d3844d + checksum: 10c0/43bd8806889a00e4e4cf5f7a4dd8956f96c27d1c92b5831a9ac47098f37b337abef174299f8526b8ea8db094d50afb159d0db88ae0d06666f5e30d85e4db2c2d languageName: node linkType: hard -"@chain-registry/types@npm:^0.45.1, @chain-registry/types@npm:^0.45.81": - version: 0.45.81 - resolution: "@chain-registry/types@npm:0.45.81" - checksum: 10c0/14257fc1441ab80e59aa7e8065db0c991534a9fdbcfc312d269f05e31a93ca8c0c450e23b531db952563dc96cf534566e13e37f16d2e4a5fe28439a3f80ed28b +"@chain-registry/types@npm:^0.46.11": + version: 0.46.15 + resolution: "@chain-registry/types@npm:0.46.15" + checksum: 10c0/11655ead021fcc78f317f682842a73666e080216d22f87be5b9fffa9341130b3e8b8a3b1d2d77ec3c41841af4c1fbdf24af467ef12df552fa2e99fe2eae5f1e1 languageName: node linkType: hard -"@chain-registry/utils@npm:^1.17.0, @chain-registry/utils@npm:^1.46.1, @chain-registry/utils@npm:^1.46.81": - version: 1.46.81 - resolution: "@chain-registry/utils@npm:1.46.81" +"@chain-registry/types@npm:^0.50.17": + version: 0.50.17 + resolution: "@chain-registry/types@npm:0.50.17" + checksum: 10c0/1f7363bb5927511baf99b7c1ae7e9ff2f5504b6b0dedf13318cf6d94abdcc383f6c88afbf9f3f023fecb8bc5fd3975d034e69f8c9aff46e6b48ec49969db2d5b + languageName: node + linkType: hard + +"@chain-registry/utils@npm:^1.17.0, @chain-registry/utils@npm:^1.47.11, @chain-registry/utils@npm:^1.51.17": + version: 1.51.17 + resolution: "@chain-registry/utils@npm:1.51.17" dependencies: - "@chain-registry/types": "npm:^0.45.81" + "@chain-registry/types": "npm:^0.50.17" bignumber.js: "npm:9.1.2" sha.js: "npm:^2.4.11" - checksum: 10c0/30632124686eeecf56946f5bf4099811768946c1f0ef12f75b67b6f082bd7e3ea79f976245d9da018c77ad8de87364c960d64ea2f915d3a8d7167da455aeeebc + checksum: 10c0/eb6c3b7a3f41152436c4f9420c8bd8b58fa8db3b9d46cb9bd9cb4a2855fdfd07dc4515321c08639fc14378a2159347387aefa767f1e77f05b1af3a35ba64a288 languageName: node linkType: hard @@ -1601,27 +2446,19 @@ __metadata: linkType: hard "@coinbase/wallet-sdk@npm:^3.6.6": - version: 3.7.2 - resolution: "@coinbase/wallet-sdk@npm:3.7.2" + version: 3.9.3 + resolution: "@coinbase/wallet-sdk@npm:3.9.3" dependencies: - "@metamask/safe-event-emitter": "npm:2.0.0" - "@solana/web3.js": "npm:^1.70.1" - bind-decorator: "npm:^1.0.11" - bn.js: "npm:^5.1.1" + bn.js: "npm:^5.2.1" buffer: "npm:^6.0.3" - clsx: "npm:^1.1.0" - eth-block-tracker: "npm:6.1.0" - eth-json-rpc-filters: "npm:5.1.0" - eth-rpc-errors: "npm:4.0.2" - json-rpc-engine: "npm:6.1.0" - keccak: "npm:^3.0.1" - preact: "npm:^10.5.9" - qs: "npm:^6.10.3" - rxjs: "npm:^6.6.3" + clsx: "npm:^1.2.1" + eth-block-tracker: "npm:^7.1.0" + eth-json-rpc-filters: "npm:^6.0.0" + eventemitter3: "npm:^5.0.1" + keccak: "npm:^3.0.3" + preact: "npm:^10.16.0" sha.js: "npm:^2.4.11" - stream-browserify: "npm:^3.0.0" - util: "npm:^0.12.4" - checksum: 10c0/0b76bc5b032e2ae39ba8f6e2c758c77c9cb366675822a50ab89d0d176e9b654b1a65a7f1363f9272fd04c8e01a01ad78523b8cac0ca95ef8f6e9a781e3fb20b6 + checksum: 10c0/a34b7f3e84f1d12f8235d57b3fd2e06d04e9ad9d999944b43bf0a3b0e79bc1cff336e9097f4555f85e7085ac7a1be2907732cda6a79cad1b60521d996f390b99 languageName: node linkType: hard @@ -2242,70 +3079,70 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/cdcwallet-extension@npm:^2.13.2": - version: 2.13.2 - resolution: "@cosmos-kit/cdcwallet-extension@npm:2.13.2" +"@cosmos-kit/cdcwallet-extension@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/cdcwallet-extension@npm:2.15.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/2c159f90a568ed1a94495950ddc9d5674249276e803eff784143c2b35986933b95a8a8735d6fcd670070651e8bf3c8de67013cd5f58e62dae95f488bfd1a85d9 + checksum: 10c0/c5e56f759539bc3b3f9026ed328396fdd53d43e93878c7fe9e14bf2a04041ebf46f0a7183b38fe24079963f94a70d5ab0f74b38b814aabacab189f2350b6af41 languageName: node linkType: hard -"@cosmos-kit/cdcwallet@npm:^2.13.2": - version: 2.13.2 - resolution: "@cosmos-kit/cdcwallet@npm:2.13.2" +"@cosmos-kit/cdcwallet@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/cdcwallet@npm:2.15.1" dependencies: - "@cosmos-kit/cdcwallet-extension": "npm:^2.13.2" - checksum: 10c0/d9d0d888a771810356154bc4fbfb1b4530cb97831ce7ff1e35c46a2b388864660dc9e0a7c7b76dff720c0a922645a519877e3f0e69180633f48e06ac0f8a5bf5 + "@cosmos-kit/cdcwallet-extension": "npm:^2.15.1" + checksum: 10c0/5793f05bb2dbdd5c4c20f0666be67de916f1449b110c23dd278ffbc04b234f1d0d692c9aaef9f24efe13cb7b812990a30bbc8c7a2aa4b87005d39a9b6c595026 languageName: node linkType: hard -"@cosmos-kit/coin98-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/coin98-extension@npm:2.12.2" +"@cosmos-kit/coin98-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/coin98-extension@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" cosmjs-types: "npm:>=0.9.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/1a1423dd45288f77b7cb615342fa9750a11cfd741d5047ef6737d258d6af115f5e2ef6eac4cc41b5ed7599db7d21d02fb7682e02b0f1b533625714a8316794da + checksum: 10c0/44b81ced4985cd2c3e9e94bac72570136bd0ac414a5cbb8b186efdcefcdd71a710bd9a68771da95dcf5820de96a58d57ce8416b004d61924e5f5e4f826d54a10 languageName: node linkType: hard -"@cosmos-kit/coin98@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/coin98@npm:2.11.2" +"@cosmos-kit/coin98@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/coin98@npm:2.13.1" dependencies: - "@cosmos-kit/coin98-extension": "npm:^2.12.2" - checksum: 10c0/7b9cf76b26e816743e17011eb3f1780bf9b49cbcdb7a8d2534322189c4e8e785212fe20794903ffbcfd11c532ab1828463d2527bba85b4a27f921bb8f63e1c9a + "@cosmos-kit/coin98-extension": "npm:^2.14.1" + checksum: 10c0/aabe8cb290cb3f9f765f4f768c1607e1fcfe147f354a6da6e6595a487668fd499a730f199893eddb1703e40c6bab4ebf0c06e73350c74cdbfba6d7c69a18737f languageName: node linkType: hard -"@cosmos-kit/compass-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/compass-extension@npm:2.11.2" +"@cosmos-kit/compass-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/compass-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/663087e375619b271e0a0c41e45679c5e45ba17d0c6bd12a354316471ad186454583d15ff5076c106660b9becd723ed6ad3645a502352309a453053955cea8cf + checksum: 10c0/12638b14627a75af9b2f81a46a690ce12247cd6698a00ef3a2b0248db4f52885455fc81aa11c2a0eba8d5ed60c190a3932e57ea6f18a744a01a474544d3f7ff1 languageName: node linkType: hard -"@cosmos-kit/compass@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/compass@npm:2.11.2" +"@cosmos-kit/compass@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/compass@npm:2.13.1" dependencies: - "@cosmos-kit/compass-extension": "npm:^2.11.2" - checksum: 10c0/35fe8f1cfe889425cfd85ed41e8299839677a12a4fe3228b78cf2cf5e9389990aeb737b7cea3c9fb7b316a72abfa4bcd441fe07a4065f14e7f59b96d108b7ffe + "@cosmos-kit/compass-extension": "npm:^2.13.1" + checksum: 10c0/dcaec805c224efd83966ad9315bba1b5d812885fa3c82620945b3d5305378916d7a21ede0d89fb298b502f9c106b48b709d293c284ac22d2bea44ac505ede958 languageName: node linkType: hard @@ -2328,13 +3165,13 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/core@npm:^2.13.1, @cosmos-kit/core@npm:^2.8.9": - version: 2.13.1 - resolution: "@cosmos-kit/core@npm:2.13.1" +"@cosmos-kit/core@npm:^2.15.0, @cosmos-kit/core@npm:^2.8.9": + version: 2.15.0 + resolution: "@cosmos-kit/core@npm:2.15.0" dependencies: - "@chain-registry/client": "npm:^1.48.1" - "@chain-registry/keplr": "npm:^1.68.2" - "@chain-registry/types": "npm:^0.45.1" + "@chain-registry/client": "npm:^1.49.11" + "@chain-registry/keplr": "npm:^1.69.13" + "@chain-registry/types": "npm:^0.46.11" "@cosmjs/amino": "npm:^0.32.3" "@cosmjs/cosmwasm-stargate": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" @@ -2346,309 +3183,312 @@ __metadata: events: "npm:3.3.0" nock: "npm:13.5.4" uuid: "npm:^9.0.1" - checksum: 10c0/5295440b213fed8d1853023253888652dd57624ea7dee86720c04964f00209078fafc843359686daffac78fc8e52b68078fbbdf4552dd2e8903315f2ab0e22d5 + checksum: 10c0/d5af19c633a7ca7863c0e5a5e5a52c3bc41086844f93c814342d2f2fe32cd1dcce8aab9ab2c2df516ed1c90ac2231d6d17f0d407e0143f740ecc0c7e24c23193 languageName: node linkType: hard -"@cosmos-kit/cosmostation-extension@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/cosmostation-extension@npm:2.13.0" +"@cosmos-kit/cosmostation-extension@npm:^2.15.0": + version: 2.15.0 + resolution: "@cosmos-kit/cosmostation-extension@npm:2.15.0" dependencies: - "@chain-registry/cosmostation": "npm:^1.66.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/cosmostation": "npm:^1.67.13" + "@cosmos-kit/core": "npm:^2.15.0" cosmjs-types: "npm:^0.9.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/af0e4e250041a6ea75c208c791f20a2d8d78bd5d11fe6f3264ae03c340a2d1ef3133dff9fd997c0f08e8402f4b658c3b22c73a36f2fe48119b7329617ec1919f + checksum: 10c0/efc951a5fd0a73c9d842153e86304b8073c7908fb51d8288cb5e5bac82aaff4f3f3cf108b52cedae2d53c95b9bbd39218ad821f0c61ae77c3c500ed051b97b0c languageName: node linkType: hard -"@cosmos-kit/cosmostation-mobile@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/cosmostation-mobile@npm:2.11.2" +"@cosmos-kit/cosmostation-mobile@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/cosmostation-mobile@npm:2.13.0" dependencies: - "@chain-registry/cosmostation": "npm:1.66.2" - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" - checksum: 10c0/a52d1ae62b1797b809251715e3c88c74646053e34f9e9b96d9d170c252ecf18118bf55e58ca59a8fd50fa7503cd5aebd5a59546de1dabfa618f09733ff3c5439 + "@chain-registry/cosmostation": "npm:1.67.13" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" + checksum: 10c0/ff816262bab05455ad547de8da06bba525519b64e3f6a957027d381f4936e045715c2a777bd6c51077cd9954a50b8567e5a041d20a9553ae893ad07744a872a9 languageName: node linkType: hard -"@cosmos-kit/cosmostation@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/cosmostation@npm:2.12.0" +"@cosmos-kit/cosmostation@npm:^2.14.0": + version: 2.14.0 + resolution: "@cosmos-kit/cosmostation@npm:2.14.0" dependencies: - "@cosmos-kit/cosmostation-extension": "npm:^2.13.0" - "@cosmos-kit/cosmostation-mobile": "npm:^2.11.2" - checksum: 10c0/dd1ae4a8968557c16fc2c07c8e58df7d8ed22e68a3ae728f06d18eddb72eafccae00896fd574eb839ef44e0fcae159d0b5c75b3941b71013c4b372e57dc9e2e2 + "@cosmos-kit/cosmostation-extension": "npm:^2.15.0" + "@cosmos-kit/cosmostation-mobile": "npm:^2.13.0" + checksum: 10c0/d029149858baef6bdad0132b8dac0c0fc247e199f0e7654e1456cd0e8bd803ddc397230c58d1d3e2a77b2ef572a4edd12f42315e7cf80fd7c3017e72c2695934 languageName: node linkType: hard -"@cosmos-kit/exodus-extension@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/exodus-extension@npm:2.10.2" +"@cosmos-kit/exodus-extension@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/exodus-extension@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" react-icons: "npm:4.4.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/a6b7716472fd28a3172a99471d8e8f9c557344f0c9ea36e5e031f2424e9674ba5de16998fcb2bd0b72d5037a93bfae662f687d83f04268647042462707de3c6c + checksum: 10c0/c613f9c3ddea0cfcc0f5922aa77a59255f93d1ba76ad0c9191052c355c6c3335c94d1f89ea990c5db000c440f00ac64d25087fb3a8d4447f5004e5ef8ad83ef8 languageName: node linkType: hard -"@cosmos-kit/exodus@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/exodus@npm:2.10.2" +"@cosmos-kit/exodus@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/exodus@npm:2.12.0" dependencies: - "@cosmos-kit/exodus-extension": "npm:^2.10.2" - checksum: 10c0/5733c78fbf176824881124b97a0404d95faf366d39b13fa4e3eecc1119edc9932f7f1469bd2c66d7f7c41d28d70392bf66deaebc76ba3c0a6f353f6e7d557502 + "@cosmos-kit/exodus-extension": "npm:^2.12.0" + checksum: 10c0/0cae2118f444984d614d79af4bcc9017ad2da739ae0caafbe789f085d121d607488e9f974bcce9e862ec6fbcfc70be2741e8037dc2f0cd2c19911e73f29140c2 languageName: node linkType: hard -"@cosmos-kit/fin-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/fin-extension@npm:2.11.2" +"@cosmos-kit/fin-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/fin-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/314968c6c2c637fbc4d7785dd3fb2e12203ea9566583f7b8bc101833c59497d9ce3bd0216236b5dbcbb787d0492b80f9e501bd54d898f5a150b8f76fa46d4537 + checksum: 10c0/daf29837efc81ad552665f59aade1b553c268e42d3766e08e5bd91a84bc994498281e5de45d372e90bb2dc807d443526f924a82188246a63698b29771695fc20 languageName: node linkType: hard -"@cosmos-kit/fin@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/fin@npm:2.11.2" +"@cosmos-kit/fin@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/fin@npm:2.13.1" dependencies: - "@cosmos-kit/fin-extension": "npm:^2.11.2" - checksum: 10c0/f24e13e27baf5caf37f1bd18474dad022f4b987fd0213974c7fdd4510cfce3eab428d69ed73ed134115f3b91aa208ec29451ab92f71146660a510ea92f08a025 + "@cosmos-kit/fin-extension": "npm:^2.13.1" + checksum: 10c0/32b1ef95ef91e8873f37dfacbba00e58869f994be661da25e9693f0ec5c9b501603e1f000dad5403df7c5130b85cc6163af3a939b91ca289dc0342670b6a42fb languageName: node linkType: hard -"@cosmos-kit/frontier-extension@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/frontier-extension@npm:2.10.2" +"@cosmos-kit/frontier-extension@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/frontier-extension@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/ae6ceeaaded9367d0a46932d534c051c0ec8d49a76dd80144c61f8de5d9ddbf3cdfe03b682a2ea66756ce93e46e2e1142251a31174ffbc45f688a1aff9cc3155 + checksum: 10c0/cba46d7b502185da8f240f62c03916eff00a069e9fe946a3b5d9d45b89b4141267ad3cfc1d0fa32a8c7f66119b25d25483eb250c18b2ce471f7de3e4b75e9855 languageName: node linkType: hard -"@cosmos-kit/frontier@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/frontier@npm:2.10.2" +"@cosmos-kit/frontier@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/frontier@npm:2.12.0" dependencies: - "@cosmos-kit/frontier-extension": "npm:^2.10.2" - checksum: 10c0/617ed26dd6cecf960b511180f9a15b4a1360ae7293467ea165b25a4ce89e192d98dc47d77d4086af79abd7ca682a26d2311ac61c3c3cf164b0007a87bca994f5 + "@cosmos-kit/frontier-extension": "npm:^2.12.0" + checksum: 10c0/2f8a7ef4f994fc007cb2b88b4a44dc99e2fc1d1dd8830ef7e201d7b57a38d1794829ee9cb8964417680811ff646f3af0556551b3848aff18a007e5bb51c549b2 languageName: node linkType: hard -"@cosmos-kit/galaxy-station-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/galaxy-station-extension@npm:2.11.2" +"@cosmos-kit/galaxy-station-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/galaxy-station-extension@npm:2.13.0" dependencies: - "@chain-registry/types": "npm:0.45.1" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/types": "npm:0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" "@hexxagon/feather.js": "npm:^1.0.9-beta.8" "@hexxagon/station-connector": "npm:^1.0.17" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/6c481b17504935ed589583d18cda708a9d81efde41e66c589b16ee401b8ae72a887b016a106a3a0f2ce9afd12560244474ccd11f818143d342169cea769ca073 + checksum: 10c0/3931e875aef0527b695c9b39d18e91d02120cd1ac90fe0f7066ded8aba587b6f315baf5d5d4efcd6171975224ffdf8ad41a49c3c8480597c3fc73ac47f1e57d2 languageName: node linkType: hard -"@cosmos-kit/galaxy-station@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/galaxy-station@npm:2.10.2" +"@cosmos-kit/galaxy-station@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/galaxy-station@npm:2.12.0" dependencies: - "@cosmos-kit/galaxy-station-extension": "npm:^2.11.2" - checksum: 10c0/86721b41a710dae0c8ec22c0466def90ef8b61cd09505e648d145bcd48997413e996cda4330bfce96e2e788cfcd572bbed556ad1d4d8ef693a1e7a6a3cb765d4 + "@cosmos-kit/galaxy-station-extension": "npm:^2.13.0" + checksum: 10c0/655f76ad80b0ca1bf9d7f36b26ea6847404372be8dfc6604eb7033dfae91462fed433064ea204b6b2f4b40fb34b68bc267e5539bbedc0b2a9294bd308737cbe9 languageName: node linkType: hard -"@cosmos-kit/keplr-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/keplr-extension@npm:2.12.2" +"@cosmos-kit/keplr-extension@npm:^2.14.0": + version: 2.14.0 + resolution: "@cosmos-kit/keplr-extension@npm:2.14.0" dependencies: - "@chain-registry/keplr": "npm:^1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" "@keplr-wallet/provider-extension": "npm:^0.12.95" "@keplr-wallet/types": "npm:^0.12.95" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/679a71402b31a520dfe4a14ac18b7d3bc2aec75132760f4d3ad67ae91170a52e5c33587fb8208126ffec8ac911fe07413d37edf2d99c4637fec8d836d6338753 + checksum: 10c0/9ecd7d5e5f49d31122b2f604667b1e25c0bf4807b6db97fbf3cebd8b8bf4d2d7e884ef9d76c6619602b6f514aa2197beed00a55803d442643fd50ec15871f258 languageName: node linkType: hard -"@cosmos-kit/keplr-mobile@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/keplr-mobile@npm:2.12.2" +"@cosmos-kit/keplr-mobile@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/keplr-mobile@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/keplr-extension": "npm:^2.12.2" - "@cosmos-kit/walletconnect": "npm:^2.10.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/keplr-extension": "npm:^2.14.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" "@keplr-wallet/provider-extension": "npm:^0.12.95" "@keplr-wallet/wc-client": "npm:^0.12.95" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/9e8ece5399bd206089e796812018e36ba76be39282e6b397316cb8c102512ee3e866d7b297530067f1705aa808095e016ae785295f0f8cc5d3ae2b780c943090 + checksum: 10c0/66d20fb38347caa2b8b76d2eafbe6a2757401eaaa65bc26388abf3493848f820a0031f2d60c900b152db01127b5d40288fb91154ddec56ce3c5eedf99de1ed59 languageName: node linkType: hard -"@cosmos-kit/keplr@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/keplr@npm:2.12.2" +"@cosmos-kit/keplr@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/keplr@npm:2.14.1" dependencies: - "@cosmos-kit/keplr-extension": "npm:^2.12.2" - "@cosmos-kit/keplr-mobile": "npm:^2.12.2" - checksum: 10c0/7bc3c2f6b8c360ab0d8fedc02353341d2ad64351d4f309e2a8374484170975e2cdb1a6866af58a2edb1957cc5e4e28012b43f283d23e4e3e9f0478d2db2770ae + "@cosmos-kit/keplr-extension": "npm:^2.14.0" + "@cosmos-kit/keplr-mobile": "npm:^2.14.1" + checksum: 10c0/a0d695fb4daaf4667a42a6d121a7b2d4420b3a95c7220102171263b2365aa1d48b8357bd5c5cbda8329b3cfb63a1e6a46273b18cff1a96b2115eb257b4583aa0 languageName: node linkType: hard -"@cosmos-kit/leap-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/leap-extension@npm:2.12.2" +"@cosmos-kit/leap-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/leap-extension@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/5d7130cefbf5d29e05f7b792ac8f4d31ffd962088a25531d5be7cae5221309755a8a978982baf627d069d9ff315a6de592c527539657ee3dcf6f6957d205d223 + checksum: 10c0/bbf0cb9c5468be17be52848bbe14b6bf7bf0ddc12fe7ec9522180b921b0949006b0b7718de31c4b0cecd361e932e494305be3f011605e3453762e3163f89cc66 languageName: node linkType: hard -"@cosmos-kit/leap-metamask-cosmos-snap@npm:^0.12.2": - version: 0.12.2 - resolution: "@cosmos-kit/leap-metamask-cosmos-snap@npm:0.12.2" +"@cosmos-kit/leap-metamask-cosmos-snap@npm:^0.14.1": + version: 0.14.1 + resolution: "@cosmos-kit/leap-metamask-cosmos-snap@npm:0.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" "@leapwallet/cosmos-snap-provider": "npm:0.1.26" "@metamask/providers": "npm:^11.1.1" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" cosmjs-types: ">=0.9.0" - checksum: 10c0/123838d21fb83fce13f4635bf34c6484dd8f5e9f6d24d5ce674afd196e0a67c9f6e3e6068c873160060377c8c231d3089a40e5d93a51c9526eed1bd91d8a0080 + checksum: 10c0/69e2a7c2ed8423fcc0b8101dcc2fb05e25c7f2813b73b18a8457cb4ad4fc6d8a381cfe692f16523c7347a042be6d45460ec78fa0437dcfba4c9f32e510a048d3 languageName: node linkType: hard -"@cosmos-kit/leap-mobile@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/leap-mobile@npm:2.11.2" +"@cosmos-kit/leap-mobile@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/leap-mobile@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" - checksum: 10c0/b00131dcdf4155dd6fde16afc3233accf64b31a1dbfbc854b95d7b89642fe95c39d182477cbd102b335b59a59f659072238a29f84e970f3e126694ee22d74596 + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" + checksum: 10c0/195b6e084a5ce77146d1cde73d730e9cca75f174b8abc2fde71975a99c4eba6d689ba360c35e7b4826901172e82e713cb1f92d3e9daea48df6176ee0b79b79f7 languageName: node linkType: hard -"@cosmos-kit/leap@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/leap@npm:2.12.2" +"@cosmos-kit/leap@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/leap@npm:2.14.1" dependencies: - "@cosmos-kit/leap-extension": "npm:^2.12.2" - "@cosmos-kit/leap-metamask-cosmos-snap": "npm:^0.12.2" - "@cosmos-kit/leap-mobile": "npm:^2.11.2" - checksum: 10c0/cf146378bfd82c7ca84ed4dbd95371ab02b496cd98aa041e5047dfa529f7c9723aae57cc74811f810ebbd737902ea84ea4677d82d9099ab7b2d5c1df19c3a104 + "@cosmos-kit/leap-extension": "npm:^2.14.1" + "@cosmos-kit/leap-metamask-cosmos-snap": "npm:^0.14.1" + "@cosmos-kit/leap-mobile": "npm:^2.13.1" + checksum: 10c0/3e269494ae903fa5337cfdceed844abdd78888986051046cb008fd93c5c1bb624630133d0bed004fcb81499faf36431b6974a951b67c41f2cb0ef9224229a754 languageName: node linkType: hard -"@cosmos-kit/ledger@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/ledger@npm:2.11.2" +"@cosmos-kit/ledger@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/ledger@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" "@ledgerhq/hw-app-cosmos": "npm:^6.28.1" "@ledgerhq/hw-transport-webhid": "npm:^6.27.15" "@ledgerhq/hw-transport-webusb": "npm:^6.27.15" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/96bacf4e41569bb274d10871e1974d156bc2a58e2e3bdf7ae7ee1b73630d2267f6a852c114e9ee30cda03ddda9f7e3d74ed2b937e9c575f84f87919804f985ec + checksum: 10c0/05f7dd48b6e33cd0f4fd8958f89dc98253ec72f5ba7c5b8570f1a6578069b4ce9cd40ba0f1ab6f5643796a9b4b0dd646a8771be479a320c5516439ba8eb9b815 languageName: node linkType: hard -"@cosmos-kit/okxwallet-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/okxwallet-extension@npm:2.11.2" +"@cosmos-kit/okxwallet-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/okxwallet-extension@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/f2b2bd0067eed702f6a16cf8ef716e1c6a7aa42d8f263b90f4fb8e2346c41a275221a544c4fd42bb50a83d13c254de90d428e1f0b22c3591075e0daf37d069eb + checksum: 10c0/b4c4a45fc30d9c0f36f7e917d87d499054364b0bb1112e32937a9f469711bf02f8bd7e973acd34afe8fa59606057841b1b373bf619639652eaa8cc33dc2e8acc languageName: node linkType: hard -"@cosmos-kit/omni-mobile@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/omni-mobile@npm:2.10.2" +"@cosmos-kit/omni-mobile@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/omni-mobile@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/71a780a4f7a9ffa60be8c35c0515123c4e657a4f4495df23c0343d870838ebac64a65678a15748774b166f60cde5894075534213e354f54d4e12d09cbada3cf3 + checksum: 10c0/06a81c803ae3a189152bd93c248b1c886214c3d65f6be8883dae82424ebe1d985398d2a6e587c8ca54b8050157a7b07d6359dcccf0ca85f5c669e033d50f10e9 languageName: node linkType: hard -"@cosmos-kit/omni@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/omni@npm:2.10.2" +"@cosmos-kit/omni@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/omni@npm:2.12.0" dependencies: - "@cosmos-kit/omni-mobile": "npm:^2.10.2" - checksum: 10c0/d33c64f53f740cf4c50bbdf04a195c8f676d1acfb94aac82b996cd183afdd405602904ac1ff11c41daddcde2a56691f959d528259e7d26d0a57b18ce61d4807e + "@cosmos-kit/omni-mobile": "npm:^2.12.0" + checksum: 10c0/44bdc747d54327062fa9f3573dadbf4834a7f3b9185ef7c61c9b60762cc1e835ed9d9d46a8dd667ae2a4d701b36d5f7656abdd727fdfa9a91669a2eaf18da662 languageName: node linkType: hard -"@cosmos-kit/owallet-extension@npm:^2.12.2": - version: 2.12.2 - resolution: "@cosmos-kit/owallet-extension@npm:2.12.2" +"@cosmos-kit/owallet-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/owallet-extension@npm:2.14.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" "@keplr-wallet/types": "npm:^0.12.90" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/c6e10fa9caff33c3a8788ec1be4a12ee2c25d906a4fb24b0b08c387d6ea6c6b6b3d0e2a77e980c0839513a42ef790db897a310327ba0354a0ed79987f98ca285 + checksum: 10c0/1a56ee0f2c30e52eda14412130d9d7f40dcbaffe8cada568c03e2e946f41806853415ca30d7061cff2479187e95fcf1aa9d99a793129cde68c04ef41798a52e7 languageName: node linkType: hard -"@cosmos-kit/owallet@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/owallet@npm:2.11.2" +"@cosmos-kit/owallet@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/owallet@npm:2.13.1" dependencies: - "@cosmos-kit/owallet-extension": "npm:^2.12.2" - checksum: 10c0/06d2a2b086d932ac18824a926674e6f102c99e4cd8ebfb79e5e0254d594c2ef82b2e44da550144ce56bd685c44a84b6c4cecc421b062b7a1ed07a07ae9f0e52a + "@cosmos-kit/owallet-extension": "npm:^2.14.1" + checksum: 10c0/a041da49fddb45419b8f77aec83432f31a936780cfb21d4d52ec9d1b2f7780d47f9af835fef96cbea6075d5558f8446c08aeadc42c89e068cdd6a3c41a520a45 languageName: node linkType: hard "@cosmos-kit/react-lite@npm:^2.6.9": - version: 2.6.9 - resolution: "@cosmos-kit/react-lite@npm:2.6.9" + version: 2.15.1 + resolution: "@cosmos-kit/react-lite@npm:2.15.1" dependencies: - "@chain-registry/types": "npm:0.17.0" - "@cosmos-kit/core": "npm:^2.8.9" + "@chain-registry/types": "npm:^0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" + "@dao-dao/cosmiframe": "npm:^0.1.0" peerDependencies: + "@types/react": ">= 17" + "@types/react-dom": ">= 17" react: ^18 react-dom: ^18 - checksum: 10c0/b71edf7380a53999e75bd6c736c083decd8a24701bd9512095ee67ea415a62020834db3a199012748b124403dcf1ecc2b4ba953546697777fd11573a613d8914 + checksum: 10c0/f7dd5370579e01fbf73737091f66400128bb01a989fb0fb1d2d19bc7a8d7259b18e9becb943283e481b8c46f145731e9b445e64ce7875a19e981be8acaf71f4f languageName: node linkType: hard @@ -2668,33 +3508,33 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/shell-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/shell-extension@npm:2.11.2" +"@cosmos-kit/shell-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/shell-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/c708c603aab2c7c289f8decfc8cb7b833595734e147f8905f8cd30a4bf288391f0c3366f2a8e4855041b12495ed70a40cb98470edd446a495277d00b4e91518c + checksum: 10c0/141f3277d9ac1dd660b61c914d90dbd8325987197a34cb8bf2c36df6587aa0d16d7493e855694751b9e08d4533885b9f2ea012e596da0c15d84b95c5819a3bd4 languageName: node linkType: hard -"@cosmos-kit/shell@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/shell@npm:2.11.2" +"@cosmos-kit/shell@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/shell@npm:2.13.1" dependencies: - "@cosmos-kit/shell-extension": "npm:^2.11.2" - checksum: 10c0/cc531070a980b4fa57a34ee96b54d070fe9782e4477ff9da997ae37e6f30d3ea5921ea523768bd70f72e0eddf46f67ba592e4b7fe75b99679bc7da562797ccf0 + "@cosmos-kit/shell-extension": "npm:^2.13.1" + checksum: 10c0/b381de609a4ec49e4b34c4f09807c8ed32c7bd02be7e280123ab7d534c5c2dd6a0978ab1f8605719ceec172239e6f64f79857eb83fadb4159072cf9641212526 languageName: node linkType: hard -"@cosmos-kit/station-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/station-extension@npm:2.11.2" +"@cosmos-kit/station-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/station-extension@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" "@terra-money/feather.js": "npm:^1.0.8" "@terra-money/station-connector": "npm:^1.1.0" "@terra-money/wallet-types": "npm:^3.11.2" @@ -2702,128 +3542,128 @@ __metadata: "@chain-registry/types": ">= 0.17" "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/0532961a303ab7cad2319f27c71c80f9662ec9f7a5d957f27dc49c8753417dbc94c4ec175010b9b616af1512e42dc09144a12c5c143a5ab64bb2015d0fc6768e + checksum: 10c0/9c868508c6fd0e5b1c87b9fb18e65ab1e905f262b8f3681af5f60455083f9824b8c6c7cbb8fb84ca853e9b11c9c1f3fb1aa033be112e5c7893936eaa9e687435 languageName: node linkType: hard -"@cosmos-kit/station@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/station@npm:2.10.2" +"@cosmos-kit/station@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/station@npm:2.12.0" dependencies: - "@cosmos-kit/station-extension": "npm:^2.11.2" - checksum: 10c0/1d0e1a05e9fd2528d1c105fba340244adff25460b536d75fcc2454f56f317efd6edced3eddee9cc8b9d897338114f9469af272fd1a5f7f1c317273acfc5f29b4 + "@cosmos-kit/station-extension": "npm:^2.13.0" + checksum: 10c0/055c326d33acf642dd7a58e90243718300ceeb6913768da03e501924ba780571b396cdbdb89f14c639cccad51baa24bb1cd54c47c8dfeda5269098fc7c23d065 languageName: node linkType: hard -"@cosmos-kit/tailwind-extension@npm:^1.5.2": - version: 1.5.2 - resolution: "@cosmos-kit/tailwind-extension@npm:1.5.2" +"@cosmos-kit/tailwind-extension@npm:^1.7.0": + version: 1.7.0 + resolution: "@cosmos-kit/tailwind-extension@npm:1.7.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" - checksum: 10c0/a8facdddc4df41814ae5048423b3c9da8c223503f16fb6728038238790fd143a2ebda727c813f9ae2c1190c0d0da07e942a8c0181ea2e1268f9580435550d2ed + "@cosmos-kit/core": "npm:^2.15.0" + checksum: 10c0/f146cceca975b6ddadaeb6ece7e30fae2a3f65f04b48fd3c7d397fd52dcd6663405efff5297f09950bb87e2375dba578700c5ba3183a28708d78734ed260ba22 languageName: node linkType: hard -"@cosmos-kit/tailwind@npm:^1.5.2": - version: 1.5.2 - resolution: "@cosmos-kit/tailwind@npm:1.5.2" +"@cosmos-kit/tailwind@npm:^1.7.0": + version: 1.7.0 + resolution: "@cosmos-kit/tailwind@npm:1.7.0" dependencies: - "@cosmos-kit/tailwind-extension": "npm:^1.5.2" - checksum: 10c0/79d9ce43765e90c990f52d72049d4705322d3fc9175214f80aec7d24cbce24460cf37aaab9baf424aa965ff2b9398e3c84c32f8ac2bb5c4a35370ebddefc4733 + "@cosmos-kit/tailwind-extension": "npm:^1.7.0" + checksum: 10c0/f18d5f3266aa23d3bd49af9de5651849ab317920eecd0a7e8015bafa210f52c8a6eeb47ec9b8c4459fb174e390354dfb808358ac861ec0cf2755a24cabd40768 languageName: node linkType: hard -"@cosmos-kit/trust-extension@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/trust-extension@npm:2.10.2" +"@cosmos-kit/trust-extension@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/trust-extension@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/4a56176642f984aa07a3b46f4dfed59113e4012350c45b854c4ea96cedd2dbf8cbf07e7c9a943ffaf85d624c0f8612d3eb6dd2518926ce82289a48a208859f13 + checksum: 10c0/bbc3ebe2e7bc43c4a41736ea8e2ac3bc41d8eb30ef52b935eb4da9f97a662fb2e211836443d41c2fc3a1f59281496cfd03f4e13af04ea68767bfdd2e587af22a languageName: node linkType: hard -"@cosmos-kit/trust-mobile@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/trust-mobile@npm:2.10.2" +"@cosmos-kit/trust-mobile@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/trust-mobile@npm:2.12.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" - "@cosmos-kit/walletconnect": "npm:^2.10.1" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/walletconnect": "npm:^2.12.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/6ed367a52d75355add3bddcbefc47e589110da9e1d42f7b65fdd7e02398786d083403f685539ea03a0b65f9a9813e1703d2c53a67aa834c091170e488b77205c + checksum: 10c0/e542a881a71ee5c879a63cba657be12f35e027f8999a7bf7b895d827659e78bc5ec9d1fc09a785ebc9df7be7b58a12e3ae76c52f7c613f1035e1f07ef4cae419 languageName: node linkType: hard -"@cosmos-kit/trust@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/trust@npm:2.11.2" +"@cosmos-kit/trust@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/trust@npm:2.13.0" dependencies: - "@cosmos-kit/trust-extension": "npm:^2.10.2" - "@cosmos-kit/trust-mobile": "npm:^2.10.2" - checksum: 10c0/68824bdab267de17b5ed0689a6b2a4881b06d5ec292bc1d12d9890552039229f6768eaf0e0ac8017633f67e9140a56da62df514f13f9aa6de09e7a55cc350132 + "@cosmos-kit/trust-extension": "npm:^2.12.0" + "@cosmos-kit/trust-mobile": "npm:^2.12.0" + checksum: 10c0/ee65807edf6ba32ed9cee964e9c25c8a05e95364c0f70782a18875fd429ebef195ae49925fd25b42c01f013185dd1378692d2c3f9fee506060efc91faa32f096 languageName: node linkType: hard -"@cosmos-kit/vectis-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/vectis-extension@npm:2.11.2" +"@cosmos-kit/vectis-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/vectis-extension@npm:2.13.1" dependencies: - "@chain-registry/keplr": "npm:1.68.2" - "@cosmos-kit/core": "npm:^2.13.1" + "@chain-registry/keplr": "npm:^1.69.13" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/d150dd1f8845073b98d4ebf1d59f8459881cfc3e7b954fe0cd1932852bc7cb1986da6c44cbea7d06ce57c971fd8a1d5b7daa7c27fb0d31abfb4b1fdc786bd2b4 + checksum: 10c0/4dfc0395a3881b0348da53d6a74fcc22e4c5a5095dd755d40940b55de53360dcee47e8ef08bee539b8d57c76839ddcbe85d822d7f6a5c3776a55d0eeaabb59c3 languageName: node linkType: hard -"@cosmos-kit/vectis@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/vectis@npm:2.11.2" +"@cosmos-kit/vectis@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/vectis@npm:2.13.1" dependencies: - "@cosmos-kit/vectis-extension": "npm:^2.11.2" - checksum: 10c0/e9baa032280d35fc6da13a771bb7e4180decede89f052d9297e702d9ea3aaed7ce92d98865e2bb3b60f8a86ae7770add714db8072d64c89fd8d00449887ddee7 + "@cosmos-kit/vectis-extension": "npm:^2.13.1" + checksum: 10c0/6ac2dd7e2acc4f81dfd8f2ad283b334bd789edd3c5a76d43622ce5f4fc386b4dc05b8b6954c48470703d2aff10589a790d3a34e3e286230a600b0375c0eb668a languageName: node linkType: hard -"@cosmos-kit/walletconnect@npm:^2.10.1": - version: 2.10.1 - resolution: "@cosmos-kit/walletconnect@npm:2.10.1" +"@cosmos-kit/walletconnect@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/walletconnect@npm:2.12.0" dependencies: "@cosmjs/proto-signing": "npm:^0.32.3" - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" "@walletconnect/sign-client": "npm:^2.9.0" "@walletconnect/utils": "npm:^2.9.0" events: "npm:3.3.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@walletconnect/types": 2.11.0 - checksum: 10c0/5940d33dfebb75f029b57cfa1de9206d2fc3c36e406cef29786ac5c0cd749cd0f5c06e5953d096bc522f45d8c1903cb1aa4429ee07425f261cc3167dcb6b35b6 + checksum: 10c0/2f38c52b5e689ed59018cde4f9a9ca9200e5436d1ec2dc3de0bee0ff9d44ea29ea4d39752354ffc4062ad523ffbac0efeeb605ea51a124444b75a7902c36804f languageName: node linkType: hard -"@cosmos-kit/xdefi-extension@npm:^2.11.2": - version: 2.11.2 - resolution: "@cosmos-kit/xdefi-extension@npm:2.11.2" +"@cosmos-kit/xdefi-extension@npm:^2.13.0": + version: 2.13.0 + resolution: "@cosmos-kit/xdefi-extension@npm:2.13.0" dependencies: - "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/73afc1fb1ed406c5fa44081baf2c0b3d0fd90e6d162427e66040f8319a10ef72c756bd180861400f0f1b51cdd8d54c4a4fdb56fb71eda1aef2003d3131a7404a + checksum: 10c0/37193ca50144f8db952ef46faae2ce9e5129ddc45211ce85b4a0318e3b40312660f9d48c4c9f5ef1c33da41c83c622b2933acd2d071c4afddec6315d0cccc883 languageName: node linkType: hard -"@cosmos-kit/xdefi@npm:^2.10.2": - version: 2.10.2 - resolution: "@cosmos-kit/xdefi@npm:2.10.2" +"@cosmos-kit/xdefi@npm:^2.12.0": + version: 2.12.0 + resolution: "@cosmos-kit/xdefi@npm:2.12.0" dependencies: - "@cosmos-kit/xdefi-extension": "npm:^2.11.2" - checksum: 10c0/a7dcb2a6234d4828f60fa835247627a6183fe000f4e2106f8c6a1e2bff5c2c842a887a5ddae188e2d500b807e1d4580fddfb318499683914f0abf6ffa2f72faa + "@cosmos-kit/xdefi-extension": "npm:^2.13.0" + checksum: 10c0/310ee781d1658e287cd4fa7635938642c1b113cb406f23beb94419d08cf5979968e0fce0e1f12899899bea5057be2dc08c0024c798da6c4bbac8678beb9b416d languageName: node linkType: hard @@ -2866,33 +3706,33 @@ __metadata: languageName: node linkType: hard -"@datadog/native-appsec@npm:7.1.0": - version: 7.1.0 - resolution: "@datadog/native-appsec@npm:7.1.0" +"@datadog/native-appsec@npm:7.1.1": + version: 7.1.1 + resolution: "@datadog/native-appsec@npm:7.1.1" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^3.9.0" - checksum: 10c0/961e5af948fe265bb1c8d05dbc75a899a61f55c424e1a0ec22a6cb5c0a73aa65bd487aa645d544ff5d6fbad626394a55adeeeafa80a91a4b23095ed0bc6909aa + checksum: 10c0/f7eaf00eb6199a4cf0077fe78f01ff33d90e25aa487bd4a645b537d03ee3fbf7e3b312a8cbff09edcee8558812f0843ae1c8b22bb8ffc9d8ce7b3de9f87322b8 languageName: node linkType: hard -"@datadog/native-iast-rewriter@npm:2.3.0": - version: 2.3.0 - resolution: "@datadog/native-iast-rewriter@npm:2.3.0" +"@datadog/native-iast-rewriter@npm:2.3.1": + version: 2.3.1 + resolution: "@datadog/native-iast-rewriter@npm:2.3.1" dependencies: lru-cache: "npm:^7.14.0" node-gyp-build: "npm:^4.5.0" - checksum: 10c0/3841fd370ff21ee6b39c629b24123b78453eefbd87bf2500616b9e9b8e7cfd0e649112cdef19dc98c1ebec27d428dfd15e4de41f1e32356bc0cbfa1853bdf4a0 + checksum: 10c0/3d33908828d9fe19ea1be7ed6ecaf07259928d4dfea22526f3de293493b61ee8cf6f10e940627fe28b0287daee64893aba705aa27b6ff3471fb28989c0d0ac43 languageName: node linkType: hard -"@datadog/native-iast-taint-tracking@npm:1.7.0": - version: 1.7.0 - resolution: "@datadog/native-iast-taint-tracking@npm:1.7.0" +"@datadog/native-iast-taint-tracking@npm:2.1.0": + version: 2.1.0 + resolution: "@datadog/native-iast-taint-tracking@npm:2.1.0" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^3.9.0" - checksum: 10c0/6eed1a0d018971ffd4d3fc6722446ce9eb5ebece583c3e29cbbbaa033b363740eda77fb359a5ec1f9b49966e818f7049a644a2c2b15de2d8c0ada43f29c859c9 + checksum: 10c0/3e978cb43dbd097cb7c2c4fab4a5083900f1b0568f458f16ae7312b81943eddec905f5257bf79b06b661ad8e2912e57504c862a10e5cfe2686d205358998383c languageName: node linkType: hard @@ -2922,9 +3762,9 @@ __metadata: linkType: hard "@datadog/sketches-js@npm:^2.1.0": - version: 2.1.0 - resolution: "@datadog/sketches-js@npm:2.1.0" - checksum: 10c0/6eae378c375e9df445b4d7190d713b3b1c975547293ba9190db2e35745764496e73576206d4fea1585a264bb4ed7d165a3b886ede8f5b225185e5499030620ac + version: 2.1.1 + resolution: "@datadog/sketches-js@npm:2.1.1" + checksum: 10c0/4b930240202e4e94ac49fc95298a7111202492566f76672e0ec43425a1710a0e3650a20f858a6358509ab08363d39fce5db210c88d94b4225f96b3bfe645cc5c languageName: node linkType: hard @@ -2936,63 +3776,26 @@ __metadata: linkType: hard "@emotion/hash@npm:^0.9.0": - version: 0.9.1 - resolution: "@emotion/hash@npm:0.9.1" - checksum: 10c0/cdafe5da63fc1137f3db6e232fdcde9188b2b47ee66c56c29137199642a4086f42382d866911cfb4833cae2cc00271ab45cad3946b024f67b527bb7fac7f4c9d - languageName: node - linkType: hard - -"@endo/base64@npm:0.2.31, @endo/base64@npm:^0.2.31": - version: 0.2.31 - resolution: "@endo/base64@npm:0.2.31" - checksum: 10c0/6fb87ef466ed97e7c676e6e52203434a2881f43bbd95609e44385e4002fcc0869ad6f5c673423a4c060298b2e90c26cb671f03463f287a347b37cdb079caed32 + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 languageName: node linkType: hard -"@endo/base64@npm:^0.2.35": +"@endo/base64@npm:^0.2.31, @endo/base64@npm:^0.2.32, @endo/base64@npm:^0.2.35": version: 0.2.35 resolution: "@endo/base64@npm:0.2.35" checksum: 10c0/5935cd609cbe3da91e9bdbc1c3a2be0460c58302d0b92ae63054e537aa9e2e5648a238810ec548d7367166c72094c38e2dbf0b16a37c6987c8d7353d1b0123a1 languageName: node linkType: hard -"@endo/base64@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/base64@npm:1.0.7" - checksum: 10c0/aab10f433f8ea588ebd1786188b6660c0be3a743c119ef2df52ee23afd4ce3844b1d954028952569a747f6657287aeced875afe8e136ea8bff4ba146a60578bd - languageName: node - linkType: hard - -"@endo/base64@npm:^1.0.9": +"@endo/base64@npm:^1.0.7, @endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9, @endo/base64@npm:latest": version: 1.0.9 resolution: "@endo/base64@npm:1.0.9" checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 languageName: node linkType: hard -"@endo/bundle-source@npm:2.5.2-upstream-rollup": - version: 2.5.2-upstream-rollup - resolution: "@endo/bundle-source@npm:2.5.2-upstream-rollup" - dependencies: - "@agoric/babel-generator": "npm:^7.17.4" - "@babel/parser": "npm:^7.17.3" - "@babel/traverse": "npm:^7.17.3" - "@endo/base64": "npm:^0.2.31" - "@endo/compartment-mapper": "npm:^0.8.4" - "@endo/init": "npm:^0.5.56" - "@endo/promise-kit": "npm:^0.2.56" - "@rollup/plugin-commonjs": "npm:^19.0.0" - "@rollup/plugin-node-resolve": "npm:^13.0.0" - acorn: "npm:^8.2.4" - jessie.js: "npm:^0.3.2" - rollup: "npm:^2.79.1" - source-map: "npm:^0.7.3" - bin: - bundle-source: src/tool.js - checksum: 10c0/223dceb6d95f826a377d1d376dfd4dd8906cc0efbdf34ad8e05afaae402180ddda0110d2eff18079ab4ceca1e5c2a1211212d66a570ad3adcd505db69552df98 - languageName: node - linkType: hard - "@endo/bundle-source@npm:^2.5.1": version: 2.8.0 resolution: "@endo/bundle-source@npm:2.8.0" @@ -3017,28 +3820,7 @@ __metadata: languageName: node linkType: hard -"@endo/bundle-source@npm:^3.4.0": - version: 3.4.0 - resolution: "@endo/bundle-source@npm:3.4.0" - dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/evasive-transform": "npm:^1.3.0" - "@endo/init": "npm:^1.1.4" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/where": "npm:^1.0.7" - "@rollup/plugin-commonjs": "npm:^19.0.0" - "@rollup/plugin-json": "npm:^6.1.0" - "@rollup/plugin-node-resolve": "npm:^13.0.0" - acorn: "npm:^8.2.4" - rollup: "npm:^2.79.1" - bin: - bundle-source: ./src/tool.js - checksum: 10c0/c21ee24b7beaf4e9b935c853f6917e42f2c22250697c02ceea97288cb142d8ba863491fd934c49c337a14cf94960d9edde84eb91355c679d27d303e89d429a46 - languageName: node - linkType: hard - -"@endo/bundle-source@npm:^3.5.0": +"@endo/bundle-source@npm:^3.4.0, @endo/bundle-source@npm:^3.4.2, @endo/bundle-source@npm:^3.5.0": version: 3.5.0 resolution: "@endo/bundle-source@npm:3.5.0" dependencies: @@ -3060,66 +3842,59 @@ __metadata: languageName: node linkType: hard -"@endo/captp@npm:3.1.1, @endo/captp@npm:^3.1.1": - version: 3.1.1 - resolution: "@endo/captp@npm:3.1.1" +"@endo/captp@npm:^3.1.1": + version: 3.1.5 + resolution: "@endo/captp@npm:3.1.5" dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/marshal": "npm:^0.8.5" - "@endo/nat": "npm:^4.1.27" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/45cbcd647843c4a22bc8ca2718a493afaae805c68cbbe959cb4d6828afd53c5714d6e13c0a7f327561f5c5e9fc3ee2fab0a228e6b4e4f74f1fb163af8a6adbdc + "@endo/eventual-send": "npm:^0.17.6" + "@endo/marshal": "npm:^0.8.9" + "@endo/nat": "npm:^4.1.31" + "@endo/promise-kit": "npm:^0.2.60" + checksum: 10c0/bbae2b1ef1d509bb91373c0a05426b1b93a56bcd7371532025f64e524ae2878cf48bd89f442c4524a61caea06f8ee91956df3ba29a357d4bdb2ec352821e74a7 languageName: node linkType: hard -"@endo/captp@npm:^4.3.0": - version: 4.3.0 - resolution: "@endo/captp@npm:4.3.0" +"@endo/captp@npm:^4.3.0, @endo/captp@npm:^4.4.2": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/87579ee6f6ccf6935361776f921c4de6476cb38144a99c7c2a0ef4c811748bf371296dc5c841351110ed3cb6262d4101a106608df015600699e1a470382eea98 + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/0647dd6acc39c7a54a42d9f168861d11dc28248321be72529dd8574b52989957be8f7a5ec9985fc76a24b37cd6b6d190e5bfbbc1481594e367c8517c31fce0e2 languageName: node linkType: hard -"@endo/check-bundle@npm:0.2.18, @endo/check-bundle@npm:^0.2.18": - version: 0.2.18 - resolution: "@endo/check-bundle@npm:0.2.18" +"@endo/check-bundle@npm:^0.2.18": + version: 0.2.22 + resolution: "@endo/check-bundle@npm:0.2.22" dependencies: - "@endo/base64": "npm:^0.2.31" - "@endo/compartment-mapper": "npm:^0.8.4" - checksum: 10c0/bf5c1a2974a790da3db158440686a6eec7cb67025082cd1382baf927f3744fd788be6c93aceed6dbe8cae1ff82b5412c3a8cbe331b488d552e5214888c128f98 + "@endo/base64": "npm:^0.2.35" + "@endo/compartment-mapper": "npm:^0.9.2" + checksum: 10c0/aae5081aff9e75391100ec6e436a5c0e1811e6406019b835491a4d9a4b0a0fa4b94dab8c92450ea98e2692e6563f4b0ccd62c2785cfeeead7e4b19859c95ed3b languageName: node linkType: hard -"@endo/check-bundle@npm:^1.0.9": - version: 1.0.9 - resolution: "@endo/check-bundle@npm:1.0.9" +"@endo/check-bundle@npm:^1.0.11, @endo/check-bundle@npm:^1.0.9": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/errors": "npm:^1.2.5" - checksum: 10c0/ae0072e258b8e6449dc96edb54edccdaff07607affcd28842c05764cfbd39e328b36aed510ad09a2354e446cc779c572887bec9dcd81fffe6dd1180e1e623183 + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + checksum: 10c0/73e146d9d4d5ee23936b0df368e51ebb3658eecc5efe308a1894f70339502e6de8fa065185e8518d1445bf8fbc4c5fae54fc7dab8794f02397f6694a7ab9af9c languageName: node linkType: hard -"@endo/cjs-module-analyzer@npm:^0.2.31, @endo/cjs-module-analyzer@npm:^0.2.35": +"@endo/cjs-module-analyzer@npm:^0.2.32, @endo/cjs-module-analyzer@npm:^0.2.35": version: 0.2.35 resolution: "@endo/cjs-module-analyzer@npm:0.2.35" checksum: 10c0/26d571803afe889ba327979c9208a037d8cbbb6e689cf20e10bd8d0658936a35b37d61b86180dbed6ac49ac284307177b16eeb10d6afe61c7674d4c6507913ab languageName: node linkType: hard -"@endo/cjs-module-analyzer@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/cjs-module-analyzer@npm:1.0.7" - checksum: 10c0/b7f93776dc83e44a3b346479efcd8749488ce1591aae4cefc832ec4280834cc8577d322bfb3ecdc7120dd2aa99509cb6ef1ac680b2dba4a4863483624a920ba6 - languageName: node - linkType: hard - "@endo/cjs-module-analyzer@npm:^1.0.9": version: 1.0.9 resolution: "@endo/cjs-module-analyzer@npm:1.0.9" @@ -3127,26 +3902,26 @@ __metadata: languageName: node linkType: hard -"@endo/common@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/common@npm:1.2.5" +"@endo/common@npm:^1.2.5, @endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/104ca2febd87d05b97a77037cb0f281157082b722a39f3fbfca94e36984ad8bc8622e900aeba861d7ed6e6b5d103971599ec2b804eb236537576d498f9ab1fe5 + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/c9465721095d9f06278b6550909a02c330c7a69223f11aff29759067586d41b86054127639fa2c2c0345d0d0aa43518e5b72d5c547b67bfe8e802cd21756d87b languageName: node linkType: hard -"@endo/compartment-mapper@npm:0.8.4, @endo/compartment-mapper@npm:^0.8.4": - version: 0.8.4 - resolution: "@endo/compartment-mapper@npm:0.8.4" +"@endo/compartment-mapper@npm:^0.8.4, @endo/compartment-mapper@npm:^0.8.5": + version: 0.8.5 + resolution: "@endo/compartment-mapper@npm:0.8.5" dependencies: - "@endo/cjs-module-analyzer": "npm:^0.2.31" - "@endo/static-module-record": "npm:^0.7.19" - "@endo/zip": "npm:^0.2.31" - ses: "npm:^0.18.4" - checksum: 10c0/08c1959c927d04983a4f150a9eb37175dcbe33a1f97b916ce7ebfe0df71f72578d9d0916555915017f647e51ab11c1ec13cfcbfa9c09f3f669b6642d43f2745d + "@endo/cjs-module-analyzer": "npm:^0.2.32" + "@endo/static-module-record": "npm:^0.7.20" + "@endo/zip": "npm:^0.2.32" + ses: "npm:^0.18.5" + checksum: 10c0/81e8c1c8052319ddd2d6328bc7f120e41593e01961a318192b71f12990a4fa5a014f56d5ef146f390c09a615118b61f4daae790972aa47530598b74189ead541 languageName: node linkType: hard @@ -3162,19 +3937,7 @@ __metadata: languageName: node linkType: hard -"@endo/compartment-mapper@npm:^1.2.2": - version: 1.2.2 - resolution: "@endo/compartment-mapper@npm:1.2.2" - dependencies: - "@endo/cjs-module-analyzer": "npm:^1.0.7" - "@endo/module-source": "npm:^1.0.2" - "@endo/zip": "npm:^1.0.7" - ses: "npm:^1.8.0" - checksum: 10c0/e16d6b19dbc273e72bb33e05b9fbcc7df38d8d43bc56b2e0af62b72d724d4a530468b81c1418163c54a4dff2645f5a04b58d1c3bc9e37845bbce959d651dece0 - languageName: node - linkType: hard - -"@endo/compartment-mapper@npm:^1.4.0": +"@endo/compartment-mapper@npm:^1.2.2, @endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": version: 1.4.0 resolution: "@endo/compartment-mapper@npm:1.4.0" dependencies: @@ -3194,51 +3957,31 @@ __metadata: languageName: node linkType: hard -"@endo/env-options@npm:^1.1.6": - version: 1.1.6 - resolution: "@endo/env-options@npm:1.1.6" - checksum: 10c0/0001b1cba6954cccfa40104f819378f2f5c8babc89103213a8a5da4f8f94248c8389bfa06ec37cecae81edabe570428558399313d649c64ad7c90743f563dea2 - languageName: node - linkType: hard - -"@endo/env-options@npm:^1.1.8": +"@endo/env-options@npm:^1.1.6, @endo/env-options@npm:^1.1.7, @endo/env-options@npm:^1.1.8": version: 1.1.8 resolution: "@endo/env-options@npm:1.1.8" checksum: 10c0/2f519f48a5b966dbd9e66134d4abc89ff02b9791d21146b49031ceb694584f3f41c6119125b6bb4eb0d347f5bcd846473b5f3c4ae6bae3dac19402fcaf522520 languageName: node linkType: hard -"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/errors@npm:1.2.5" +"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/errors@npm:1.2.8" dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/32eac3b332139ddec8a85a0013645482541e4f3cc0c484073dde430087f27bb683cde8b0a6e399c5b7f07af007c3b6aa589cf31935a8b8d69e5f869bf71a1662 + ses: "npm:^1.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 languageName: node linkType: hard "@endo/eslint-plugin@npm:^2.2.0": - version: 2.2.1 - resolution: "@endo/eslint-plugin@npm:2.2.1" + version: 2.2.3 + resolution: "@endo/eslint-plugin@npm:2.2.3" dependencies: requireindex: "npm:~1.1.0" - ts-api-utils: "npm:~1.0.1" tsutils: "npm:~3.21.0" - typescript: "npm:~5.6.1-rc" + typescript: "npm:~5.6.3" typescript-eslint: "npm:^7.3.1" - checksum: 10c0/87876a7ae461e5a358f085af51c8d1f7b52d685a0a3b3a700961449a8375905c65ad2bb63fac188cf1d5f5e482175c7e7f39de1d6629966de8db62c8dac7a206 - languageName: node - linkType: hard - -"@endo/evasive-transform@npm:^1.3.0": - version: 1.3.0 - resolution: "@endo/evasive-transform@npm:1.3.0" - dependencies: - "@agoric/babel-generator": "npm:^7.17.6" - "@babel/parser": "npm:^7.23.6" - "@babel/traverse": "npm:^7.23.6" - source-map-js: "npm:^1.2.0" - checksum: 10c0/caca5f99423f4dcd57bce5fe8dc197019bfcaca657929016b1e91a6d4efe7a6d73e8b7c16cff83f56c03b035ca16e08565996a3459d30a65a83b632ef7d8d0a3 + checksum: 10c0/7c0283b9969ec252b6166313ffb0036728ff18218f6d2f576fb6f6a1c7287f8bf9fa072b5f8c3d195db23aefa8d6dc1f2afca75e055fc84ebe9bcd383599a1c1 languageName: node linkType: hard @@ -3254,13 +3997,6 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:0.17.2": - version: 0.17.2 - resolution: "@endo/eventual-send@npm:0.17.2" - checksum: 10c0/e86fdd5a085d736b1840196dc9ee5b5bc1ed65bbaa4e2d7c9dcc1962e986f4e5385186fb4f2ab2a89577d5b929cb98962eb93c1d3bf7d62203e7dd03699faefb - languageName: node - linkType: hard - "@endo/eventual-send@npm:^0.17.2, @endo/eventual-send@npm:^0.17.5, @endo/eventual-send@npm:^0.17.6": version: 0.17.6 resolution: "@endo/eventual-send@npm:0.17.6" @@ -3270,16 +4006,7 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/eventual-send@npm:1.2.5" - dependencies: - "@endo/env-options": "npm:^1.1.6" - checksum: 10c0/7eaa30628582f768920659e4894b871c1056da4252b82b8ad70ed49a24c4559efb8d1655a6845984a0eae83d328179e4272b0917007a2f147dc8b15ecb0ecc52 - languageName: node - linkType: hard - -"@endo/eventual-send@npm:^1.2.8": +"@endo/eventual-send@npm:^1.2.5, @endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": version: 1.2.8 resolution: "@endo/eventual-send@npm:1.2.8" dependencies: @@ -3288,88 +4015,78 @@ __metadata: languageName: node linkType: hard -"@endo/exo@npm:^0.2.2": - version: 0.2.2 - resolution: "@endo/exo@npm:0.2.2" - dependencies: - "@endo/far": "npm:^0.2.18" - "@endo/patterns": "npm:^0.2.2" - checksum: 10c0/e54512d524b7bfc4c2bc88ec6ba64e5ddcd92a6cfc424230dbc936aed670a8932587301227918eee8315dcefe56e817faa9ab283bda6e66b3237fdeb512a9633 - languageName: node - linkType: hard - -"@endo/exo@npm:^1.5.3": - version: 1.5.3 - resolution: "@endo/exo@npm:1.5.3" +"@endo/exo@npm:^0.2.2": + version: 0.2.6 + resolution: "@endo/exo@npm:0.2.6" dependencies: - "@endo/common": "npm:^1.2.5" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/5510bc442730910ce2470c6ebdb6c04208c033e452cd60c8684e1769039453ad5f47de31b00629be3c6bf4183bee4a421bace142144e92740b606c591a839c72 + "@endo/env-options": "npm:^0.1.4" + "@endo/far": "npm:^0.2.22" + "@endo/pass-style": "npm:^0.1.7" + "@endo/patterns": "npm:^0.2.6" + checksum: 10c0/aad124b36e323eeb969df9572f9243ef64e28ca99bb37ef2700c050be3fc78140b0192b32cbeb6e1b52f4c04237a9bfeed6deb400ba2ade6c7ad01071fc1fed9 languageName: node linkType: hard -"@endo/far@npm:0.2.18, @endo/far@npm:^0.2.18": - version: 0.2.18 - resolution: "@endo/far@npm:0.2.18" +"@endo/exo@npm:^1.5.3, @endo/exo@npm:^1.5.6": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/pass-style": "npm:^0.1.3" - checksum: 10c0/0df1ab4e2f3969f1256c0f6323865b384db35565c11e6e97bd3e348f0e12b6d895fee7590439dd37d34f0e0aa980b9e4cc6e250e97c1d7cb2030df8468d5b985 + "@endo/common": "npm:^1.2.8" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/0193de0606a7f07f207f3dd8bb71ec6be0acfb0ff5ef570f03cbbcaed888db68e451082c34764de8ee301f8d2d175e6c5a5405e76367c27151d644536bdf57a4 languageName: node linkType: hard -"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/far@npm:1.1.5" +"@endo/far@npm:^0.2.18, @endo/far@npm:^0.2.22": + version: 0.2.22 + resolution: "@endo/far@npm:0.2.22" dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/pass-style": "npm:^1.4.3" - checksum: 10c0/8c50a28323ab1078d0cb6fce1d7fc6da4884247d76585f37f960a2a7134fc7f293075effaae34b41801b7508a1f75d32304c19db0597709727853c4a87eb4999 + "@endo/eventual-send": "npm:^0.17.6" + "@endo/pass-style": "npm:^0.1.7" + checksum: 10c0/bd30a168b47a26014cab296336a64aa2721975c386f7f87b6776dd33cf77f3e85ddb822e8422fbc2befb6920d72301e3b9b206fe71d970dce1870b708b09805d languageName: node linkType: hard -"@endo/import-bundle@npm:0.3.4, @endo/import-bundle@npm:^0.3.4": - version: 0.3.4 - resolution: "@endo/import-bundle@npm:0.3.4" +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.5, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" dependencies: - "@endo/base64": "npm:^0.2.31" - "@endo/compartment-mapper": "npm:^0.8.4" - checksum: 10c0/3d5b235867c210deb90b5981a309142010e2e63d3ee1492855676e182529e091fbf27282dff5756fefcdbc9ae86f42746701b66398754d094e486e06afa940fc + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + checksum: 10c0/e0d95743c25183b961aa1f11dd81c067739fd2fb3deeab58520e949961eacba9ed109bb01b9ed820d596e8a043b6721d650d9624abf0263296cca647e7286a2e languageName: node linkType: hard -"@endo/import-bundle@npm:^1.2.2": - version: 1.2.2 - resolution: "@endo/import-bundle@npm:1.2.2" +"@endo/import-bundle@npm:^0.3.4": + version: 0.3.5 + resolution: "@endo/import-bundle@npm:0.3.5" dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/errors": "npm:^1.2.5" - "@endo/where": "npm:^1.0.7" - ses: "npm:^1.8.0" - checksum: 10c0/fa4090554c8ed063090df5217a7e739edcec8b1707ebd7c80d034db7c07a1388531c8119e99c877851f1dd37d8c3c5a12780cd4dc26788e90c1c3d7265e24e6e + "@endo/base64": "npm:^0.2.32" + "@endo/compartment-mapper": "npm:^0.8.5" + checksum: 10c0/a86572e8fea258bb4c047c6ddc5e033f524f4885b304188405c5bf5f1234be128d3e97e62dfc45b7dfe7760194c8cfc67686d83004d9007f8bc68fbae651aded languageName: node linkType: hard -"@endo/init@npm:0.5.56, @endo/init@npm:^0.5.56": - version: 0.5.56 - resolution: "@endo/init@npm:0.5.56" +"@endo/import-bundle@npm:^1.2.2, @endo/import-bundle@npm:^1.3.1": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" dependencies: - "@endo/base64": "npm:^0.2.31" - "@endo/eventual-send": "npm:^0.17.2" - "@endo/lockdown": "npm:^0.1.28" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/f7e8b6b524de282683f601764d87bc72f0a82e63ed7d2fbe1c40c45f41eb10b25cde49a570c879fb46449e5dc28d0a288536847051dd1b4171bb0092c80a6403 + "@endo/base64": "npm:^1.0.9" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/where": "npm:^1.0.9" + ses: "npm:^1.10.0" + checksum: 10c0/cc38bb7858c4b3a3d1cfbf70b0af3b05b527019452eb922313b4adf87e5590f5cacf4ff5dbd7a44c172d3c220de41edc3fa8895551f76071c85f1450ff94b09a languageName: node linkType: hard -"@endo/init@npm:^0.5.60": +"@endo/init@npm:^0.5.56, @endo/init@npm:^0.5.60": version: 0.5.60 resolution: "@endo/init@npm:0.5.60" dependencies: @@ -3381,19 +4098,7 @@ __metadata: languageName: node linkType: hard -"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.4": - version: 1.1.4 - resolution: "@endo/init@npm:1.1.4" - dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/lockdown": "npm:^1.0.10" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/9e915b3b888b7a9f1d563d532ad180dea987253d71e79eda1fcda8d287391611bcca369f2d9b89c59b9f24b3adc548816954e8eaefa4f7402c68585245a686a5 - languageName: node - linkType: hard - -"@endo/init@npm:^1.1.7": +"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.4, @endo/init@npm:^1.1.6, @endo/init@npm:^1.1.7": version: 1.1.7 resolution: "@endo/init@npm:1.1.7" dependencies: @@ -3405,16 +4110,7 @@ __metadata: languageName: node linkType: hard -"@endo/lockdown@npm:^0.1.28": - version: 0.1.28 - resolution: "@endo/lockdown@npm:0.1.28" - dependencies: - ses: "npm:^0.18.4" - checksum: 10c0/99ab7b0929159d1f4da7fef613e5c5b2fc468cd099040521dc09c2ee6843ade599b4915dfe93ee95048e7f75fcbf3557459aa431349765ce10edd152c580cc1b - languageName: node - linkType: hard - -"@endo/lockdown@npm:^0.1.32": +"@endo/lockdown@npm:^0.1.28, @endo/lockdown@npm:^0.1.32": version: 0.1.32 resolution: "@endo/lockdown@npm:0.1.32" dependencies: @@ -3423,16 +4119,7 @@ __metadata: languageName: node linkType: hard -"@endo/lockdown@npm:^1.0.10": - version: 1.0.10 - resolution: "@endo/lockdown@npm:1.0.10" - dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/94be0c1b14cacb2d8088dcc17998e901159a028c51170d78a8cc6a820ae76cabc7d2694f1a1956cb4eab70a8c9a0c8254d88ea4c3f3d9725b739aacf6db83d5b - languageName: node - linkType: hard - -"@endo/lockdown@npm:^1.0.13": +"@endo/lockdown@npm:^1.0.12, @endo/lockdown@npm:^1.0.13": version: 1.0.13 resolution: "@endo/lockdown@npm:1.0.13" dependencies: @@ -3441,18 +4128,6 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:0.8.5": - version: 0.8.5 - resolution: "@endo/marshal@npm:0.8.5" - dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/nat": "npm:^4.1.27" - "@endo/pass-style": "npm:^0.1.3" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/026e4738c7678d89c8c7658eb964c365126d159deec9bd0293a5c2120e53abfd4eeab05ff2b9e2085781ac31914e1aa399782fde385e34ff7d9a08a8283518fa - languageName: node - linkType: hard - "@endo/marshal@npm:^0.8.5, @endo/marshal@npm:^0.8.9": version: 0.8.9 resolution: "@endo/marshal@npm:0.8.9" @@ -3465,30 +4140,17 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:^1.5.2, @endo/marshal@npm:^1.5.3": - version: 1.5.3 - resolution: "@endo/marshal@npm:1.5.3" - dependencies: - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/05f4fceef7727971d3d2a1b8d87f4d9c6651772f9d231e2daa36c3ed0b0e13c3b8d26cb4828ecaadf4329bf77792a293507eadcff7a61df292d4e390936993d1 - languageName: node - linkType: hard - -"@endo/module-source@npm:^1.0.2": - version: 1.0.2 - resolution: "@endo/module-source@npm:1.0.2" +"@endo/marshal@npm:^1.5.3, @endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" dependencies: - "@agoric/babel-generator": "npm:^7.17.6" - "@babel/parser": "npm:^7.23.6" - "@babel/traverse": "npm:^7.23.6" - "@babel/types": "npm:^7.24.0" - ses: "npm:^1.8.0" - checksum: 10c0/137b8b798c854a024074c2e7c62eef8663b21cc96e3faab94a9836a57ba13224a21d2116c7da187d060a701f7dc7a3b15f540181576d54afafc287f430ad6c23 + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/bdb634a77c2147c1359792531822aabe642a5e4d39f496dd57bb97367617a2f2d72edaaa50c51ed6a2ec1f2c08deab6a571c3dd8ffa260d441d25f53606902b1 languageName: node linkType: hard @@ -3505,24 +4167,17 @@ __metadata: languageName: node linkType: hard -"@endo/nat@npm:4.1.27, @endo/nat@npm:^4.1.27": - version: 4.1.27 - resolution: "@endo/nat@npm:4.1.27" - checksum: 10c0/41407ce76ca14f1cd6919ca8017e587f0f15abf8afc4367213d77200e776397ac3a796039be2d45a70b9c75225fccf83f10bfe0f66aa01bf04705b71b3d325d9 - languageName: node - linkType: hard - -"@endo/nat@npm:^4.1.31": +"@endo/nat@npm:^4.1.27, @endo/nat@npm:^4.1.31": version: 4.1.31 resolution: "@endo/nat@npm:4.1.31" checksum: 10c0/d77f2663b6f22cf4912e71d9a7b9e3e8268519a46d95675197bb2eaf788cccfefda909e632db446d161701a77595d7bb481afc0b1fe026167cbbf245ed3ccdb8 languageName: node linkType: hard -"@endo/nat@npm:^5.0.10, @endo/nat@npm:^5.0.9": - version: 5.0.10 - resolution: "@endo/nat@npm:5.0.10" - checksum: 10c0/7ad2aa2d216d517409c771aebb465aceb6ea8b88ec808c2dc030d7ffc7fe7d601d8401572f3866384a63ff2aa74209a22f29e1561e773d91d7ad2d81fa13fc7e +"@endo/nat@npm:^5.0.10, @endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13, @endo/nat@npm:^5.0.9": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 languageName: node linkType: hard @@ -3537,29 +4192,19 @@ __metadata: languageName: node linkType: hard -"@endo/netstring@npm:^1.0.10": - version: 1.0.10 - resolution: "@endo/netstring@npm:1.0.10" - dependencies: - "@endo/init": "npm:^1.1.4" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/stream": "npm:^1.2.5" - ses: "npm:^1.8.0" - checksum: 10c0/518987df7a1bb31e5b0f643651aa49f991dcc3b1c96a5072f0209d609d07a945d6aff0eb264f5d1c24d55aa8d2cde03591aa74aa62f303c2ab0582bc4162f393 - languageName: node - linkType: hard - -"@endo/pass-style@npm:^0.1.3": - version: 0.1.3 - resolution: "@endo/pass-style@npm:0.1.3" +"@endo/netstring@npm:^1.0.10, @endo/netstring@npm:^1.0.12": + version: 1.0.13 + resolution: "@endo/netstring@npm:1.0.13" dependencies: - "@endo/promise-kit": "npm:^0.2.56" - "@fast-check/ava": "npm:^1.1.3" - checksum: 10c0/9d2667694a66d87f5ef45449fe426c94aa0a862a298c5f2694ec71bf3f500cae3499e96011e26d38ef02bebdc7f24b16809892694437e9dee6d40066d6507fcd + "@endo/init": "npm:^1.1.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + ses: "npm:^1.10.0" + checksum: 10c0/1d669ffca92609b3e179bd235c3660ef2fd36a808d4df523fdd6c276cd2a47e2177c43a4e37b4bfb8cacfd1b4e1657cec7d197518c795652c8c248997ee59948 languageName: node linkType: hard -"@endo/pass-style@npm:^0.1.7": +"@endo/pass-style@npm:^0.1.3, @endo/pass-style@npm:^0.1.7": version: 0.1.7 resolution: "@endo/pass-style@npm:0.1.7" dependencies: @@ -3569,53 +4214,44 @@ __metadata: languageName: node linkType: hard -"@endo/pass-style@npm:^1.4.3": - version: 1.4.3 - resolution: "@endo/pass-style@npm:1.4.3" +"@endo/pass-style@npm:^1.4.3, @endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/pass-style@npm:1.4.7" dependencies: - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/promise-kit": "npm:^1.1.5" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" "@fast-check/ava": "npm:^1.1.5" - checksum: 10c0/f24c528b1219f5aa122f9a04e80459dec3e9664e7849019b172ad8354870b849b643c8dfc79104857827457d66b2bb09bade9b2c6ea717a97e613ecf6d53c1f9 - languageName: node - linkType: hard - -"@endo/patterns@npm:^0.2.2": - version: 0.2.2 - resolution: "@endo/patterns@npm:0.2.2" - dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/marshal": "npm:^0.8.5" - "@endo/promise-kit": "npm:^0.2.56" - checksum: 10c0/49a598115e23b7da5680288bceae2d77b425261128ac9963ea139917f1da46bd97894bc3a0981eea966877d6042f4d35583a1b6986d887a1cc48851c951ae33a + checksum: 10c0/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e languageName: node linkType: hard -"@endo/patterns@npm:^1.4.2, @endo/patterns@npm:^1.4.3": - version: 1.4.3 - resolution: "@endo/patterns@npm:1.4.3" +"@endo/patterns@npm:^0.2.2, @endo/patterns@npm:^0.2.6": + version: 0.2.6 + resolution: "@endo/patterns@npm:0.2.6" dependencies: - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/10aabc6459d1b5d26e8946ab1b88db23eda80231aa6a0b6c9835568eee1daf745d23c29fa7f202bf11859a7ae77d5f51071c3d863d34e259a62c382ec797bb03 + "@endo/eventual-send": "npm:^0.17.6" + "@endo/marshal": "npm:^0.8.9" + "@endo/promise-kit": "npm:^0.2.60" + checksum: 10c0/fa8f6bc1dcea4296486708d36baa1d306a0c7c5f7d88b0e2469e27aaef4e97f68a89c39dfe53a128888abbc568851a3ba3c63da78242b925a4811bd56912c133 languageName: node linkType: hard -"@endo/promise-kit@npm:0.2.56, @endo/promise-kit@npm:^0.2.56": - version: 0.2.56 - resolution: "@endo/promise-kit@npm:0.2.56" +"@endo/patterns@npm:^1.4.3, @endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" dependencies: - ses: "npm:^0.18.4" - checksum: 10c0/ceb59dae724681f0f88a863efbabbd25a142b536664c2c6cbdd8532bc45317f99bc70d837c77d8c54d39d7baeac8fd70fa9787304fd169d5f2a1f014f46b9498 + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/358720438a019847406dfad9f23fc9b565c955ffd86d75693cea994c492dd46efaf189502f04b04f8870e6d50ffcb44ffa1e1dd3a0d6b2dfbbe57edeb994b83b languageName: node linkType: hard -"@endo/promise-kit@npm:^0.2.60": +"@endo/promise-kit@npm:^0.2.56, @endo/promise-kit@npm:^0.2.60": version: 0.2.60 resolution: "@endo/promise-kit@npm:0.2.60" dependencies: @@ -3624,16 +4260,7 @@ __metadata: languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/promise-kit@npm:1.1.5" - dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/3a9fb59546507dbbb8c83ada4de664ca4f6085ffcb56c9e3e07789e002e717454b1ee5ae1273549935a7e77ac42be7ae8ddca94ff6d4f16914210d31159ce1a4 - languageName: node - linkType: hard - -"@endo/promise-kit@npm:^1.1.8": +"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.5, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": version: 1.1.8 resolution: "@endo/promise-kit@npm:1.1.8" dependencies: @@ -3642,29 +4269,20 @@ __metadata: languageName: node linkType: hard -"@endo/ses-ava@npm:0.2.40": - version: 0.2.40 - resolution: "@endo/ses-ava@npm:0.2.40" - dependencies: - ses: "npm:^0.18.4" - checksum: 10c0/5b11104107a1a43724a686cceb425bed4235aad9a8e2d5bf13e4848a08b1711b29ea40bd31aec4991c328578f3f4532975f26f99377392b026c39b851f8f0979 - languageName: node - linkType: hard - -"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/ses-ava@npm:1.2.5" +"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.5, @endo/ses-ava@npm:^1.2.7": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" dependencies: - "@endo/env-options": "npm:^1.1.6" - "@endo/init": "npm:^1.1.4" - ses: "npm:^1.8.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/init": "npm:^1.1.7" + ses: "npm:^1.10.0" peerDependencies: ava: ^5.3.0 || ^6.1.2 - checksum: 10c0/cabde169f565d9a61f5d41040599c43b5675f6220f66d4d6a56d351e1465434e94b52b1d664444fbd57d4b8700fa97ac9886fc806f5172552c3318269347c376 + checksum: 10c0/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf languageName: node linkType: hard -"@endo/static-module-record@npm:^0.7.19": +"@endo/static-module-record@npm:^0.7.20": version: 0.7.20 resolution: "@endo/static-module-record@npm:0.7.20" dependencies: @@ -3701,30 +4319,19 @@ __metadata: languageName: node linkType: hard -"@endo/stream-node@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/stream-node@npm:1.1.5" - dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/init": "npm:^1.1.4" - "@endo/stream": "npm:^1.2.5" - ses: "npm:^1.8.0" - checksum: 10c0/54fa69e1d334000df574ed9ebcaa82d88786a502ac28781caaab971aee18b700e1a6bf1e34fcf77a14d763f96eda61133f6e7091c0186001353b89727e84c0a8 - languageName: node - linkType: hard - -"@endo/stream@npm:^0.3.25": - version: 0.3.25 - resolution: "@endo/stream@npm:0.3.25" +"@endo/stream-node@npm:^1.1.5, @endo/stream-node@npm:^1.1.7": + version: 1.1.8 + resolution: "@endo/stream-node@npm:1.1.8" dependencies: - "@endo/eventual-send": "npm:^0.17.2" - "@endo/promise-kit": "npm:^0.2.56" - ses: "npm:^0.18.4" - checksum: 10c0/3a572465c33d5a66da697780da9e236e3caa80d3f43c2e35af6aadd11b43d10968573125c876a6b24ec716866c090ad0782b2df59f0834873059294867d4752c + "@endo/errors": "npm:^1.2.8" + "@endo/init": "npm:^1.1.7" + "@endo/stream": "npm:^1.2.8" + ses: "npm:^1.10.0" + checksum: 10c0/d07769acf381b4b5a904bfdae1b7aba0b7cb11f8ed1a38892a072b68e3dd8eb1954c77984a6eb7af09006ad5e707a8aa4e2c5d4424eb6898beae9ceb0015d8e3 languageName: node linkType: hard -"@endo/stream@npm:^0.3.29": +"@endo/stream@npm:^0.3.25, @endo/stream@npm:^0.3.29": version: 0.3.29 resolution: "@endo/stream@npm:0.3.29" dependencies: @@ -3735,14 +4342,14 @@ __metadata: languageName: node linkType: hard -"@endo/stream@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/stream@npm:1.2.5" +"@endo/stream@npm:^1.2.5, @endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" dependencies: - "@endo/eventual-send": "npm:^1.2.5" - "@endo/promise-kit": "npm:^1.1.5" - ses: "npm:^1.8.0" - checksum: 10c0/625fd9b8b485149c269a01673b76b33fadd0702d76eb37f136c9f7558252e3d51cc9602b2880f1b43971a00f41e5d3e3d2b3a6ebef6f0253bb314d9a144a2cf5 + "@endo/eventual-send": "npm:^1.2.8" + "@endo/promise-kit": "npm:^1.1.8" + ses: "npm:^1.10.0" + checksum: 10c0/f435f7650020b32c10bb4cb139910b363b4d4f22bcf9e7a659d3d2eae694a3ea43c3af49c80370760a573370429e5fbe1619dec631251578d4c5eba9ff161613 languageName: node linkType: hard @@ -3760,13 +4367,6 @@ __metadata: languageName: node linkType: hard -"@endo/where@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/where@npm:1.0.7" - checksum: 10c0/a76306e670074b43c15a223e4118c500ad03851586516d6a0204d5d865e3b8eda161a86b54de503efe11aa70c04d7adbd9e5185a905c3a1a953a757f680d6a68 - languageName: node - linkType: hard - "@endo/where@npm:^1.0.9": version: 1.0.9 resolution: "@endo/where@npm:1.0.9" @@ -3774,28 +4374,14 @@ __metadata: languageName: node linkType: hard -"@endo/zip@npm:0.2.31, @endo/zip@npm:^0.2.31": - version: 0.2.31 - resolution: "@endo/zip@npm:0.2.31" - checksum: 10c0/6c3564be33ad7967678f7db2a942191ee12c43fe88868bba93e70ab882d3a650903597e2a85aaaf40aba86654bbc68d570970940440ea12ffe26a790c718d534 - languageName: node - linkType: hard - -"@endo/zip@npm:^0.2.35": +"@endo/zip@npm:^0.2.31, @endo/zip@npm:^0.2.32, @endo/zip@npm:^0.2.35": version: 0.2.35 resolution: "@endo/zip@npm:0.2.35" checksum: 10c0/bb81c085e47a5d67342dcc039b2f471e4679e08de95cea3cdba598e2644125ec0b2002e7a1d3ff9a10977380487a58688d7e2c4d1d5525c16e46fed4b735372d languageName: node linkType: hard -"@endo/zip@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/zip@npm:1.0.7" - checksum: 10c0/a1c0d155448ce877012b34c8fe8cd3a58de9eb807514c81cddeebb802ee8e552b27d8a9a40fab3f3e4c49e0cb7fea6902fa1dd12a23ff6f30b56161fc3edc1f8 - languageName: node - linkType: hard - -"@endo/zip@npm:^1.0.9": +"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.8, @endo/zip@npm:^1.0.9": version: 1.0.9 resolution: "@endo/zip@npm:1.0.9" checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc @@ -3813,9 +4399,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -3834,9 +4420,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -3855,9 +4441,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -3876,9 +4462,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -3897,9 +4483,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -3918,9 +4504,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3939,9 +4525,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3960,9 +4546,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3981,9 +4567,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -4002,9 +4588,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -4023,9 +4609,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -4044,9 +4630,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -4065,9 +4651,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -4086,9 +4672,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -4107,9 +4693,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -4128,9 +4714,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -4149,9 +4735,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -4170,9 +4756,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -4198,9 +4784,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -4219,9 +4805,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -4240,9 +4826,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -4261,9 +4847,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -4282,9 +4868,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4297,20 +4883,20 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard @@ -4338,6 +4924,48 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/common@npm:^3.2.0": + version: 3.2.0 + resolution: "@ethereumjs/common@npm:3.2.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + crc-32: "npm:^1.2.0" + checksum: 10c0/4e2256eb54cc544299f4d7ebc9daab7a3613c174de3981ea5ed84bd10c41a03d013d15b1abad292da62fd0c4b8ce5b220a258a25861ccffa32f2cc9a8a4b25d8 + languageName: node + linkType: hard + +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: 10c0/78379f288e9d88c584c2159c725c4a667a9742981d638bad760ed908263e0e36bdbd822c0a902003e0701195fd1cbde7adad621cd97fdfbf552c45e835ce022c + languageName: node + linkType: hard + +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": + version: 4.2.0 + resolution: "@ethereumjs/tx@npm:4.2.0" + dependencies: + "@ethereumjs/common": "npm:^3.2.0" + "@ethereumjs/rlp": "npm:^4.0.1" + "@ethereumjs/util": "npm:^8.1.0" + ethereum-cryptography: "npm:^2.0.0" + checksum: 10c0/f168303edf5970673db06d2469a899632c64ba0cd5d24480e97683bd0e19cc22a7b0a7bc7db3a49760f09826d4c77bed89b65d65252daf54857dd3d97324fb9a + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": "npm:^4.0.1" + ethereum-cryptography: "npm:^2.0.0" + micro-ftch: "npm:^0.3.1" + checksum: 10c0/4e6e0449236f66b53782bab3b387108f0ddc050835bfe1381c67a7c038fea27cb85ab38851d98b700957022f0acb6e455ca0c634249cfcce1a116bad76500160 + languageName: node + linkType: hard + "@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/abi@npm:5.7.0" @@ -4768,12 +5396,12 @@ __metadata: linkType: hard "@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.5.3": - version: 1.6.11 - resolution: "@floating-ui/dom@npm:1.6.11" + version: 1.6.12 + resolution: "@floating-ui/dom@npm:1.6.12" dependencies: "@floating-ui/core": "npm:^1.6.0" "@floating-ui/utils": "npm:^0.2.8" - checksum: 10c0/02ef34a75a515543c772880338eea7b66724997bd5ec7cd58d26b50325709d46d480a306b84e7d5509d734434411a4bcf23af5680c2e461e6e6a8bf45d751df8 + checksum: 10c0/c67b39862175b175c6ac299ea970f17a22c7482cfdf3b1bc79313407bf0880188b022b878953fa69d3ce166ff2bd9ae57c86043e5dd800c262b470d877591b7d languageName: node linkType: hard @@ -4790,8 +5418,8 @@ __metadata: linkType: hard "@floating-ui/react@npm:^0.26.4": - version: 0.26.24 - resolution: "@floating-ui/react@npm:0.26.24" + version: 0.26.28 + resolution: "@floating-ui/react@npm:0.26.28" dependencies: "@floating-ui/react-dom": "npm:^2.1.2" "@floating-ui/utils": "npm:^0.2.8" @@ -4799,7 +5427,7 @@ __metadata: peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/c5c3ac265802087673a69b0e08b3bea1ee02de9da4cdbc40bb1c9e06823be72628a82f1655b40d56a4383715b4ab3b6deddff4e69146f513970ee592e1dd8f92 + checksum: 10c0/a42df129e1e976fe8ba3f4c8efdda265a0196c1b66b83f2b9b27423d08dcc765406f893aeff9d830e70e3f14a9d4c490867eb4c32983317cbaa33863b0fae6f6 languageName: node linkType: hard @@ -4810,52 +5438,53 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:1.18.2": - version: 1.18.2 - resolution: "@formatjs/ecma402-abstract@npm:1.18.2" +"@formatjs/ecma402-abstract@npm:2.2.4": + version: 2.2.4 + resolution: "@formatjs/ecma402-abstract@npm:2.2.4" dependencies: - "@formatjs/intl-localematcher": "npm:0.5.4" - tslib: "npm:^2.4.0" - checksum: 10c0/87afb37dd937555e712ca85d5142a9083d617c491d1dddf8d660fdfb6186272d2bc75b78809b076388d26f016200c8bddbce73281fd707eb899da2bf3bc9b7ca + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/intl-localematcher": "npm:0.5.8" + tslib: "npm:2" + checksum: 10c0/3f262533fa704ea7a1a7a8107deee2609774a242c621f8cb5dd4bf4c97abf2fc12f5aeda3f4ce85be18147c484a0ca87303dca6abef53290717e685c55eabd2d languageName: node linkType: hard -"@formatjs/fast-memoize@npm:2.2.0": - version: 2.2.0 - resolution: "@formatjs/fast-memoize@npm:2.2.0" +"@formatjs/fast-memoize@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/fast-memoize@npm:2.2.3" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/ae88c5a93b96235aba4bd9b947d0310d2ec013687a99133413361b24122b5cdea8c9bf2e04a4a2a8b61f1f4ee5419ef6416ca4796554226b5050e05a9ce6ef49 + tslib: "npm:2" + checksum: 10c0/f1004c3b280de7e362bd37c5f48ff34c2ba1d6271d4a7b695fed561d1201a3379397824d8bffbf15fecee344d1e70398393bbb04297f242692310a305f12e75b languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.7.6": - version: 2.7.6 - resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6" +"@formatjs/icu-messageformat-parser@npm:2.9.4": + version: 2.9.4 + resolution: "@formatjs/icu-messageformat-parser@npm:2.9.4" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/icu-skeleton-parser": "npm:1.8.0" - tslib: "npm:^2.4.0" - checksum: 10c0/9fc72c2075333a969601e2be4260638940b1abefd1a5fc15b93b0b10d2319c9df5778aa51fc2a173ce66ca5e8a47b4b64caca85a32d0eb6095e16e8d65cb4b00 + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/icu-skeleton-parser": "npm:1.8.8" + tslib: "npm:2" + checksum: 10c0/f1ed14ece7ef0abc9fb62e323b78c994fc772d346801ad5aaa9555e1a7d5c0fda791345f4f2e53a3223f0b82c1a4eaf9a83544c1c20cb39349d1a39bedcf1648 languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.8.0": - version: 1.8.0 - resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0" +"@formatjs/icu-skeleton-parser@npm:1.8.8": + version: 1.8.8 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.8" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - tslib: "npm:^2.4.0" - checksum: 10c0/10956732d70cc67049d216410b5dc3ef048935d1ea2ae76f5755bb9d0243af37ddeabd5d140ddbf5f6c7047068c3d02a05f93c68a89cedfaf7488d5062885ea4 + "@formatjs/ecma402-abstract": "npm:2.2.4" + tslib: "npm:2" + checksum: 10c0/5ad78a5682e83b973e6fed4fca68660b944c41d1e941f0c84d69ff3d10ae835330062dc0a2cf0d237d2675ad3463405061a3963c14c2b9d8d1c1911f892b1a8d languageName: node linkType: hard -"@formatjs/intl-localematcher@npm:0.5.4": - version: 0.5.4 - resolution: "@formatjs/intl-localematcher@npm:0.5.4" +"@formatjs/intl-localematcher@npm:0.5.8": + version: 0.5.8 + resolution: "@formatjs/intl-localematcher@npm:0.5.8" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/c9ff5d34ca8b6fe59f8f303a3cc31a92d343e095a6987e273e5cc23f0fe99feb557a392a05da95931c7d24106acb6988e588d00ddd05b0934005aafd7fdbafe6 + tslib: "npm:2" + checksum: 10c0/7a660263986326b662d4cb537e8386331c34fda61fb830b105e6c62d49be58ace40728dae614883b27a41cec7b1df8b44f72f79e16e6028bfca65d398dc04f3b languageName: node linkType: hard @@ -4996,40 +5625,40 @@ __metadata: languageName: node linkType: hard -"@internationalized/date@npm:^3.5.5": - version: 3.5.5 - resolution: "@internationalized/date@npm:3.5.5" +"@internationalized/date@npm:^3.5.6": + version: 3.5.6 + resolution: "@internationalized/date@npm:3.5.6" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/fc17291c8923eaf413e4cb1c74570a8f78269d8b6a5ad74de6f4f45b4e9a84f4243a9c3f224526c36b024f77e4a2fae34df6b34b022ae1b068384e04ad32560e + checksum: 10c0/25d3150247175892705aeaf8e1a78295717d420c37cb3065a766c4058a1aed460a69dc5362f7073425c95095c27036c7ed65f0ce5fbb32b20f917132e8dc543f languageName: node linkType: hard -"@internationalized/message@npm:^3.1.4": - version: 3.1.4 - resolution: "@internationalized/message@npm:3.1.4" +"@internationalized/message@npm:^3.1.5": + version: 3.1.5 + resolution: "@internationalized/message@npm:3.1.5" dependencies: "@swc/helpers": "npm:^0.5.0" intl-messageformat: "npm:^10.1.0" - checksum: 10c0/29d2a2117381a2e50377a13cdc4379981403992b917997c477bc7bc82b59fcdd1252addf36d001edd4d30b2f496ad9c5a982732b52032e5559f0703e27521a9c + checksum: 10c0/81a2ef21154d0b00796fd2ecfb5365248fe50f64a7ad1616dbe4e491555e7e018557b061df145d0ab5b68cb1e757ac203d3892c42f791f169360b98d77fa5091 languageName: node linkType: hard -"@internationalized/number@npm:^3.5.3": - version: 3.5.3 - resolution: "@internationalized/number@npm:3.5.3" +"@internationalized/number@npm:^3.5.4": + version: 3.5.4 + resolution: "@internationalized/number@npm:3.5.4" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/dd1bb4e89c6468b97e8357e1ba0a60234bd2c8226f3241c4c7499e5b1791ba0574127ea6de0fd6c4158e2ceef564bba6531a8f5589e58b820df669e312500f99 + checksum: 10c0/d01a1845ad9815756ceb59eeb75792ee89105d073ce232350c0644453a3470e3ebaffc2b00ebd2dd8238957b0ae12d1551633308897fa9c332dda82f2af8c5cf languageName: node linkType: hard -"@internationalized/string@npm:^3.2.3": - version: 3.2.3 - resolution: "@internationalized/string@npm:3.2.3" +"@internationalized/string@npm:^3.2.4": + version: 3.2.4 + resolution: "@internationalized/string@npm:3.2.4" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/824d2972951823d0421babb7e03003228fcbd9966028264838b2dad1032d4142f159c82f730a0b8026b8c8c10f06afe7df634c8d0cc8a9b6362909c6f653440a + checksum: 10c0/5a03ff3d7bea1eb0e7ef8f7b00d148b6b8afa90600434db61389e6a8a83e3ca89e469c730eb02ef6284e7b559ce4be8f46cb446387e137931bc47acb8cbcd841 languageName: node linkType: hard @@ -5185,33 +5814,37 @@ __metadata: linkType: hard "@keplr-wallet/provider-extension@npm:^0.12.95": - version: 0.12.129 - resolution: "@keplr-wallet/provider-extension@npm:0.12.129" + version: 0.12.156 + resolution: "@keplr-wallet/provider-extension@npm:0.12.156" dependencies: - "@keplr-wallet/types": "npm:0.12.129" + "@keplr-wallet/types": "npm:0.12.156" deepmerge: "npm:^4.2.2" long: "npm:^4.0.0" - checksum: 10c0/28b4d66d247a7be7cc5634287474d719cb07f16fbd1fcc1f1a0962e70efd6e9a9096937e5cc39f8beef77b193ee52ac39b7ed74df1e371b69b61fa506291745c + peerDependencies: + starknet: ^6 + checksum: 10c0/859c1264cc8491e32f5fc1ac5481cc62e4e63b1d08af4368cee35848bed882531e897c3d07e6fe631d649b6d91bda818a8b31860bf9bfad9366d19c7bd66afe5 languageName: node linkType: hard -"@keplr-wallet/provider@npm:0.12.129": - version: 0.12.129 - resolution: "@keplr-wallet/provider@npm:0.12.129" +"@keplr-wallet/provider@npm:0.12.156": + version: 0.12.156 + resolution: "@keplr-wallet/provider@npm:0.12.156" dependencies: - "@keplr-wallet/router": "npm:0.12.129" - "@keplr-wallet/types": "npm:0.12.129" + "@keplr-wallet/router": "npm:0.12.156" + "@keplr-wallet/types": "npm:0.12.156" buffer: "npm:^6.0.3" deepmerge: "npm:^4.2.2" long: "npm:^4.0.0" - checksum: 10c0/75afee6485365b6eeece9aa93008d3b1327bc1e835c6a2725f5dadea64bdb01fa2fd0eb7ed48a6a9ed1fc43e67911289fb5d1d9f94f3103eae2dae534e271e27 + peerDependencies: + starknet: ^6 + checksum: 10c0/dea62070a735bcbe6c0a5bfc941931a887abafbae6475224ae3bbc0c69aab633cd7d851dca10f230112faabfd63d6fd6f9a83d3d5a1c40d3c85a4638a8fa3eff languageName: node linkType: hard -"@keplr-wallet/router@npm:0.12.129": - version: 0.12.129 - resolution: "@keplr-wallet/router@npm:0.12.129" - checksum: 10c0/8c2e316b0c68c47a2de557d3b759fe6ffb19249e241963ebbae54349fe423a4e54312f22854f5c9c31d37f43b2cdd43f109279c1521fbfbe74d80ab1cd55166a +"@keplr-wallet/router@npm:0.12.156": + version: 0.12.156 + resolution: "@keplr-wallet/router@npm:0.12.156" + checksum: 10c0/ef3e1ffce5b10a0a9f40e6c17835aa7460d15080cc8e2f147d8b5b8b344e41c47f88906da3aa5af336415883bd86dc806d1b3fa4d1b20a4b1467e6b46b1d9334 languageName: node linkType: hard @@ -5222,12 +5855,14 @@ __metadata: languageName: node linkType: hard -"@keplr-wallet/types@npm:0.12.129, @keplr-wallet/types@npm:^0.12.121, @keplr-wallet/types@npm:^0.12.90, @keplr-wallet/types@npm:^0.12.95": - version: 0.12.129 - resolution: "@keplr-wallet/types@npm:0.12.129" +"@keplr-wallet/types@npm:0.12.156, @keplr-wallet/types@npm:^0.12.121, @keplr-wallet/types@npm:^0.12.90, @keplr-wallet/types@npm:^0.12.95": + version: 0.12.156 + resolution: "@keplr-wallet/types@npm:0.12.156" dependencies: long: "npm:^4.0.0" - checksum: 10c0/64ebd2cc366e837540f681416e3270a2cb94c4bff99ae39891ff04efa2b5731b0a86429b1f70a5247da6950c664829d5f4dcc3e997bf5fb82972d68e56b8a71d + peerDependencies: + starknet: ^6 + checksum: 10c0/3f5d461922c4fd14c1fbefd8477eacc99140bb32fab2859c9f36d5eb26d5a7d30c2858d783a3ec8ced3617b1a517dc7d5080455c04d1ca30990c21d1e0b7ce00 languageName: node linkType: hard @@ -5252,18 +5887,19 @@ __metadata: linkType: hard "@keplr-wallet/wc-client@npm:^0.12.95": - version: 0.12.129 - resolution: "@keplr-wallet/wc-client@npm:0.12.129" + version: 0.12.156 + resolution: "@keplr-wallet/wc-client@npm:0.12.156" dependencies: - "@keplr-wallet/provider": "npm:0.12.129" - "@keplr-wallet/types": "npm:0.12.129" + "@keplr-wallet/provider": "npm:0.12.156" + "@keplr-wallet/types": "npm:0.12.156" buffer: "npm:^6.0.3" deepmerge: "npm:^4.2.2" long: "npm:^3 || ^4 || ^5" peerDependencies: "@walletconnect/sign-client": ^2 "@walletconnect/types": ^2 - checksum: 10c0/f5ccbf7e2dfc9e3d9df5e3588383d6f2d4fcb48356ad96b108077f7e050b40d72584dba35f8e6dcaedd2605c7d42e4b6a13ff70ccc78104e46560c2fec847ffd + starknet: ^6 + checksum: 10c0/c82e2d6a6cebef3095c013f1658e2ea87c96d4c426f7e3c6adcb695f31cc06774e4d47d795b911ade0de743b98b44c79ced00ac90c390e72b7a2d80f32a34425 languageName: node linkType: hard @@ -5383,69 +6019,69 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^8.2.2": - version: 8.2.2 - resolution: "@ledgerhq/devices@npm:8.2.2" +"@ledgerhq/devices@npm:^8.4.4": + version: 8.4.4 + resolution: "@ledgerhq/devices@npm:8.4.4" dependencies: - "@ledgerhq/errors": "npm:^6.16.3" + "@ledgerhq/errors": "npm:^6.19.1" "@ledgerhq/logs": "npm:^6.12.0" rxjs: "npm:^7.8.1" semver: "npm:^7.3.5" - checksum: 10c0/c9bd63858ac4ce37a8e8fa3523ec1ed343b381d9711404d4334ef89d8cc8898af85e951b48ad962dce9a9c98344f0942393b69e52627cc34ec6e1b0dc93a5bbd + checksum: 10c0/ea4c3dada124c5c0aad59837e1c399bf2f41f8b4da5c996aaf73bbf8719082598808947c505dc728266ff83fc5fea71170d3f0d18a9b5d59e6e2737ae8a38f39 languageName: node linkType: hard -"@ledgerhq/errors@npm:^6.16.3": - version: 6.16.3 - resolution: "@ledgerhq/errors@npm:6.16.3" - checksum: 10c0/12e8e39317aac45694ae0f01f20b870a933611cd31187fc6ff63f268154b58f99d34b02f5dc033cbe3aebbe6fbfcd6f19aea842b7de22b5d8e051aef2fb94f94 +"@ledgerhq/errors@npm:^6.19.1": + version: 6.19.1 + resolution: "@ledgerhq/errors@npm:6.19.1" + checksum: 10c0/5cfbd5ff5e4316afc88c456a74d3dc0e0032dafd88f656e80a5cb5b297a75ba6701c53ce38ef3f38a84a8591c499b0b9248cdf352ff34c97a550440cdaddd8d2 languageName: node linkType: hard "@ledgerhq/hw-app-cosmos@npm:^6.28.1": - version: 6.29.5 - resolution: "@ledgerhq/hw-app-cosmos@npm:6.29.5" + version: 6.30.4 + resolution: "@ledgerhq/hw-app-cosmos@npm:6.30.4" dependencies: - "@ledgerhq/errors": "npm:^6.16.3" - "@ledgerhq/hw-transport": "npm:^6.30.5" + "@ledgerhq/errors": "npm:^6.19.1" + "@ledgerhq/hw-transport": "npm:^6.31.4" bip32-path: "npm:^0.4.2" - checksum: 10c0/0b1988defdf762abe3cd8d160f1e5234056765d0c4d13459300cef1c524a5b925dd85cb8c0357288537c040b72f48cb7d20a797770fdd1d24631a65b6419e3e9 + checksum: 10c0/d446c7d2ab8a2a803ba728ff68401c61ff49f1070b949fea14d7223e8e795928bcbb5c295a4dc8f6fccb74fe25b8e30991125dae864edcd0d8a7ea4e0b1aa92d languageName: node linkType: hard "@ledgerhq/hw-transport-webhid@npm:^6.27.15": - version: 6.28.5 - resolution: "@ledgerhq/hw-transport-webhid@npm:6.28.5" + version: 6.29.4 + resolution: "@ledgerhq/hw-transport-webhid@npm:6.29.4" dependencies: - "@ledgerhq/devices": "npm:^8.2.2" - "@ledgerhq/errors": "npm:^6.16.3" - "@ledgerhq/hw-transport": "npm:^6.30.5" + "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/errors": "npm:^6.19.1" + "@ledgerhq/hw-transport": "npm:^6.31.4" "@ledgerhq/logs": "npm:^6.12.0" - checksum: 10c0/e9233f83b9f5ee4ab480ffd894c44251c85d6a11c2591665ee5b91ce0997316a822bbd52ca9129736f074df5d809df576c528fd009a309652c1cc1bb41fe4862 + checksum: 10c0/85db88aa9c9ca4911645b9421e1a1ce828c48c32b03b7ed15caed8f8e24749dc31007540ec4f0088603d1a315274dbc06d30e4cb71c86b57160b721a664fc8dd languageName: node linkType: hard "@ledgerhq/hw-transport-webusb@npm:^6.27.15": - version: 6.28.5 - resolution: "@ledgerhq/hw-transport-webusb@npm:6.28.5" + version: 6.29.4 + resolution: "@ledgerhq/hw-transport-webusb@npm:6.29.4" dependencies: - "@ledgerhq/devices": "npm:^8.2.2" - "@ledgerhq/errors": "npm:^6.16.3" - "@ledgerhq/hw-transport": "npm:^6.30.5" + "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/errors": "npm:^6.19.1" + "@ledgerhq/hw-transport": "npm:^6.31.4" "@ledgerhq/logs": "npm:^6.12.0" - checksum: 10c0/25ae085cf6f74202f7c4d089aca39058790d32fa287de9fb3e7ae982fd9e80c34988ad3b82249b856839db81165e0c94f02a0a3954866b83f2cf13c393e3a2ba + checksum: 10c0/cddd324c12de64e755422c6dc0d509bc344f2f048c2b743bc5737db9c097ffb6c201fc577d971543e196ccb34a72507450ed3262a2b6d39c753424d299fafc2f languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.30.5": - version: 6.30.5 - resolution: "@ledgerhq/hw-transport@npm:6.30.5" +"@ledgerhq/hw-transport@npm:^6.31.4": + version: 6.31.4 + resolution: "@ledgerhq/hw-transport@npm:6.31.4" dependencies: - "@ledgerhq/devices": "npm:^8.2.2" - "@ledgerhq/errors": "npm:^6.16.3" + "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/errors": "npm:^6.19.1" "@ledgerhq/logs": "npm:^6.12.0" events: "npm:^3.3.0" - checksum: 10c0/ef80bb7d5839e3f2dc278fc4aaa2a2e74766cce80cfc0c42958601ce231ce576e2cd318ead971aa09263e43592160a5256a945ccb31dc542a341ad26f871102f + checksum: 10c0/033acb802d991788efcda9223356528d0987a268e94c34cbafde499541722363e7cfa6e2734365ef3282c0a80a69f4964a6d728690ff7494662a650516530b02 languageName: node linkType: hard @@ -5457,9 +6093,9 @@ __metadata: linkType: hard "@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": - version: 1.2.0 - resolution: "@lit-labs/ssr-dom-shim@npm:1.2.0" - checksum: 10c0/016168cf6901ab343462c13fb168dda6d549f8b42680aa394e6b7cd0af7cce51271e00dbfa5bbbe388912bf89cbb8f941a21cc3ec9bf95d6a84b6241aa9e5a72 + version: 1.2.1 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1" + checksum: 10c0/75cecf2cc4c1a089c6984d9f45b8264e3b4947b4ebed96aef7eb201bd6b3f26caeaafedf457884ac38d4f2d99cddaf94a4b2414c02c61fbf1f64c0a0dade11f4 languageName: node linkType: hard @@ -5472,6 +6108,28 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-json-rpc-provider@npm:^1.0.0": + version: 1.0.1 + resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" + dependencies: + "@metamask/json-rpc-engine": "npm:^7.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + checksum: 10c0/842f999d7a1c49b625fd863b453d076f393ac9090a1b9c7531aa24ec033e7e844c98a1c433ac02f4e66a62262d68c0d37c218dc724123da4eea1abcc12a63492 + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.3.3 + resolution: "@metamask/json-rpc-engine@npm:7.3.3" + dependencies: + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: 10c0/6c3b55de01593bc841de1bf4daac46cc307ed7c3b759fec12cbda582527962bb0d909b024e6c56251c0644379634cec24f3d37cbf3443430e148078db9baece1 + languageName: node + linkType: hard + "@metamask/object-multiplex@npm:^1.1.0": version: 1.3.0 resolution: "@metamask/object-multiplex@npm:1.3.0" @@ -5502,7 +6160,17 @@ __metadata: languageName: node linkType: hard -"@metamask/safe-event-emitter@npm:2.0.0, @metamask/safe-event-emitter@npm:^2.0.0": +"@metamask/rpc-errors@npm:^6.2.1": + version: 6.4.0 + resolution: "@metamask/rpc-errors@npm:6.4.0" + dependencies: + "@metamask/utils": "npm:^9.0.0" + fast-safe-stringify: "npm:^2.0.6" + checksum: 10c0/eeca3a2316c97f2f0e8922fc3a0625a704f76a1dd3b0cc78ed54dcc3c4ca7f5c3f5c90880e74c748f09f075cc21f176f3498421ad75a5c323535e454a7896c21 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^2.0.0": version: 2.0.0 resolution: "@metamask/safe-event-emitter@npm:2.0.0" checksum: 10c0/a86b91f909834dc14de7eadd38b22d4975f6529001d265cd0f5c894351f69f39447f1ef41b690b9849c86dd2a25a39515ef5f316545d36aea7b3fc50ee930933 @@ -5510,68 +6178,110 @@ __metadata: linkType: hard "@metamask/safe-event-emitter@npm:^3.0.0": - version: 3.1.1 - resolution: "@metamask/safe-event-emitter@npm:3.1.1" - checksum: 10c0/4dd51651fa69adf65952449b20410acac7edad06f176dc6f0a5d449207527a2e85d5a21a864566e3d8446fb259f8840bd69fdb65932007a882f771f473a2b682 + version: 3.1.2 + resolution: "@metamask/safe-event-emitter@npm:3.1.2" + checksum: 10c0/ca59aada3e79bae9609d3be2569c25c22f9b1df05821a2fbebfbcc835a811347e814eabf9dbbddf342fef9dcadac903492a49fdc0c9bcac0aff980c0d38daab2 languageName: node linkType: hard -"@metamask/utils@npm:^3.0.1": - version: 3.6.0 - resolution: "@metamask/utils@npm:3.6.0" +"@metamask/superstruct@npm:^3.0.0, @metamask/superstruct@npm:^3.1.0": + version: 3.1.0 + resolution: "@metamask/superstruct@npm:3.1.0" + checksum: 10c0/8820e76582b3d735a2142c878ac4830d962f7a9c0776cb31bafdff646ff701657b9be192601d7f96834c3a8edd87677650f5bfa1a29d945e8dbc77a8d788b3fc + languageName: node + linkType: hard + +"@metamask/utils@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/utils@npm:5.0.2" dependencies: + "@ethereumjs/tx": "npm:^4.1.2" "@types/debug": "npm:^4.1.7" debug: "npm:^4.3.4" semver: "npm:^7.3.8" superstruct: "npm:^1.0.3" - checksum: 10c0/4efcdb04d65dabada1c6918a76a2b7ee226bea309a351670d46737e58bf8d9fb17dfe1b707eaee69f865ccc237dcd6df75b487ccdbe6dd77de52c4cd9ee08cf8 + checksum: 10c0/fa82d856362c3da9fa80262ffde776eeafb0e6f23c7e6d6401f824513a8b2641aa115c2eaae61c391950cdf4a56c57a10082c73a00a1840f8159d709380c4809 + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.3.0": + version: 8.5.0 + resolution: "@metamask/utils@npm:8.5.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.0.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10c0/037f463e3c6a512b21d057224b1e9645de5a86ba15c0d2140acd43fb7316bfdd9f2635ffdb98e970278eb4e0dd81080bb1855d08dff6a95280590379ad73a01b + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.0.0": + version: 9.3.0 + resolution: "@metamask/utils@npm:9.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10c0/8298d6f58d1cf8f5b3e057a4fdf364466f6d7d860e2950713690c5b4be3edb48d952f20982af66f83753596dc2bcd5b23cb53721b389ca134117b20ef0ebf04f languageName: node linkType: hard -"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/animation@npm:10.17.0" +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/animation@npm:10.18.0" dependencies: - "@motionone/easing": "npm:^10.17.0" - "@motionone/types": "npm:^10.17.0" - "@motionone/utils": "npm:^10.17.0" + "@motionone/easing": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" tslib: "npm:^2.3.1" - checksum: 10c0/51873c9532ccb9f2b8475e871ba3eeebff2171bb2bd88e76bcf1fdb5bc1a7150f319c148063d17c16597038a8993c68033d918cc73a9fec40bb1f78ee8a52764 + checksum: 10c0/83c01ab8ecf5fae221e5012116c4c49d4473ba88ba22197e1d8c1e39364c5c6b9c5271e57ae716fd21f92314d15c63788c48d0a30872ee8d72337e1d98b46834 languageName: node linkType: hard "@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": - version: 10.17.0 - resolution: "@motionone/dom@npm:10.17.0" + version: 10.18.0 + resolution: "@motionone/dom@npm:10.18.0" dependencies: - "@motionone/animation": "npm:^10.17.0" - "@motionone/generators": "npm:^10.17.0" - "@motionone/types": "npm:^10.17.0" - "@motionone/utils": "npm:^10.17.0" + "@motionone/animation": "npm:^10.18.0" + "@motionone/generators": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" hey-listen: "npm:^1.0.8" tslib: "npm:^2.3.1" - checksum: 10c0/bca972f6d60aa1462993ea1b36f0ba702c8c4644b602e460834d3a4ce88f3c7c1dcfec8810c6598e9cf502ad6d3af718a889ab1661c97ec162979fe9a0ff36ab + checksum: 10c0/3bd4b1015e88464c9effc170c23bc63bbc910cbb9ca84986ec19ca82e0e13335e63a1f0d12e265fbe93616fe864fc2aec4e952d51e07932894e148de6fac2111 languageName: node linkType: hard -"@motionone/easing@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/easing@npm:10.17.0" +"@motionone/easing@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/easing@npm:10.18.0" dependencies: - "@motionone/utils": "npm:^10.17.0" + "@motionone/utils": "npm:^10.18.0" tslib: "npm:^2.3.1" - checksum: 10c0/9e82cf970cb754c44bc8226fd660c4a546aa06bb6eabb0b8be3a1466fc07920da13195e76d09d81704d059411584ba66de3bfc0192acc585a6fe352bf3e3fe22 + checksum: 10c0/0adf9b7086b0f569d28886890cc0725a489285f2debfcaf27c1c15dfef5736c9f4207cfda14c71b3275f8163777320cb7ff48ad263c7f4ccd31e12a5afc1a952 languageName: node linkType: hard -"@motionone/generators@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/generators@npm:10.17.0" +"@motionone/generators@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/generators@npm:10.18.0" dependencies: - "@motionone/types": "npm:^10.17.0" - "@motionone/utils": "npm:^10.17.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" tslib: "npm:^2.3.1" - checksum: 10c0/b1a951d7c20474b34d31cb199907a3ee4ae5074ff2ab49e18e54a63f5eacba6662e179a76f9b64ed7eaac5922ae934eaeca567f2a48c5a1a3ebf59cc5a43fc9f + checksum: 10c0/7ed7dda5ac58cd3e8dd347b5539d242d96e02ee16fef921c8d14295a806e6bc429a15291461ec078977bd5f6162677225addd707ca79f808e65bc3599c45c0e9 languageName: node linkType: hard @@ -5585,21 +6295,21 @@ __metadata: languageName: node linkType: hard -"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/types@npm:10.17.0" - checksum: 10c0/9c91d887b368c93e860c1ff4b245d60d33966ec5bd2525ce91c4e2904c223f79333013fe06140feeab23f27ad9e8546a151e8357c5dc5218c5b658486bac3f82 +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.1": + version: 10.17.1 + resolution: "@motionone/types@npm:10.17.1" + checksum: 10c0/f7b16cd4f0feda0beac10173afa6de7384722f9f24767f78b7aa90f15b8a89d584073a64387b015a8e015a962fa4b47a8ce23621f47708a08676b12bb0d43bbb languageName: node linkType: hard -"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.17.0": - version: 10.17.0 - resolution: "@motionone/utils@npm:10.17.0" +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/utils@npm:10.18.0" dependencies: - "@motionone/types": "npm:^10.17.0" + "@motionone/types": "npm:^10.17.1" hey-listen: "npm:^1.0.8" tslib: "npm:^2.3.1" - checksum: 10c0/a90dc772245fa379d522d752dcbe80b02b1fcb17da6a3f3ebc725ac0e99b7847d39f1f4a29f10cbf5e8b6157766191ba03e96c75b0fa8378e3a1c4cc8cad728a + checksum: 10c0/db57dbb6a131fab36dc1eb4e1f3a4575ca97563221663adce54c138de1e1a9eaf4a4a51ddf99fdab0341112159e0190b35cdeddfdbd08ba3ad1e35886a5324bb languageName: node linkType: hard @@ -5622,12 +6332,21 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.4.0": - version: 1.4.0 - resolution: "@noble/curves@npm:1.4.0" +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" dependencies: "@noble/hashes": "npm:1.4.0" - checksum: 10c0/31fbc370df91bcc5a920ca3f2ce69c8cf26dc94775a36124ed8a5a3faf0453badafd2ee4337061ffea1b43c623a90ee8b286a5a81604aaf9563bdad7ff795d18 + checksum: 10c0/65620c895b15d46e8087939db6657b46a1a15cd4e0e4de5cd84b97a0dfe0af85f33a431bb21ac88267e3dc508618245d4cb564213959d66a84d690fe18a63419 + languageName: node + linkType: hard + +"@noble/curves@npm:1.6.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.6.0": + version: 1.6.0 + resolution: "@noble/curves@npm:1.6.0" + dependencies: + "@noble/hashes": "npm:1.5.0" + checksum: 10c0/f3262aa4d39148e627cd82b5ac1c93f88c5bb46dd2566b5e8e52ffac3a0fc381ad30c2111656fd2bd3b0d37d43d540543e0d93a5ff96a6cb184bc3bfe10d1cd9 languageName: node linkType: hard @@ -5688,141 +6407,149 @@ __metadata: linkType: hard "@opentelemetry/api@npm:^1.0.0": - version: 1.8.0 - resolution: "@opentelemetry/api@npm:1.8.0" - checksum: 10c0/66d5504bfbf9c19a14ea549f5fca975a73a5e1e8a1e40a6dc2d662893c942b9ba66c009262816dee2b9ffd0267acd707ec692eba20db11a09d4ee114c00dc161 + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add languageName: node linkType: hard "@opentelemetry/core@npm:^1.14.0": - version: 1.22.0 - resolution: "@opentelemetry/core@npm:1.22.0" + version: 1.28.0 + resolution: "@opentelemetry/core@npm:1.28.0" dependencies: - "@opentelemetry/semantic-conventions": "npm:1.22.0" + "@opentelemetry/semantic-conventions": "npm:1.27.0" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.9.0" - checksum: 10c0/4850f6f407e4a4df72825d88b7dbe653e23f34a6dcba0b2d05725d0b497e1d44069909301b0efa1d4eac577225f10f5e86e09cb5338aacf28e2467b6d7d4c3b1 + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/4f87318ca59bc4c2f4302decfdbc3b3672604e4bbc7cb40d09f0ecbbe9e5a8b7db527a1c7ee17a93c3f9ca69c1dd88cc24cb07398b7828efc30ea9fcb8adbc4d languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.22.0": - version: 1.22.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.22.0" - checksum: 10c0/35d4aae14111fd65becf667fb935aef673f820dba0e160cdf02dfee19b8eb169a8ba3f7db4db8a40d82a15989f465faf085b4ba41895ba2c89f8e631f5e53f08 +"@opentelemetry/semantic-conventions@npm:1.27.0": + version: 1.27.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.27.0" + checksum: 10c0/b859773ba06b7e53dd9c6b45a171bf3000e405733adbf462ae91004ed011bc80edb5beecb817fb344a085adfd06045ab5b729c9bd0f1479650ad377134fb798c languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-android-arm64@npm:2.4.1" +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-darwin-arm64@npm:2.4.1" +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-darwin-x64@npm:2.4.1" +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-freebsd-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-freebsd-x64@npm:2.4.1" +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.1" +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.1" +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.1" +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.1" +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.1" +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard "@parcel/watcher-wasm@npm:^2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-wasm@npm:2.4.1" + version: 2.5.0 + resolution: "@parcel/watcher-wasm@npm:2.5.0" dependencies: is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" napi-wasm: "npm:^1.1.0" - checksum: 10c0/30a0d4e618c4867a5990025df56dff3a31a01f78b2d108b31e6ed7fabf123a13fd79ee292f547b572e439d272a6157c2ba9fb8e527456951c14283f872bdc16f + checksum: 10c0/8aad14aa21d460d7f8d407a9d8859b8372317e03bc53a154aefb9394ae51ab0fac27fdf546ec4da27307ad8219945128a19646f8e637a0200b0c6b39fbccd3d8 languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-arm64@npm:2.4.1" +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-ia32@npm:2.4.1" +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-x64@npm:2.4.1" +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@parcel/watcher@npm:^2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher@npm:2.4.1" - dependencies: - "@parcel/watcher-android-arm64": "npm:2.4.1" - "@parcel/watcher-darwin-arm64": "npm:2.4.1" - "@parcel/watcher-darwin-x64": "npm:2.4.1" - "@parcel/watcher-freebsd-x64": "npm:2.4.1" - "@parcel/watcher-linux-arm-glibc": "npm:2.4.1" - "@parcel/watcher-linux-arm64-glibc": "npm:2.4.1" - "@parcel/watcher-linux-arm64-musl": "npm:2.4.1" - "@parcel/watcher-linux-x64-glibc": "npm:2.4.1" - "@parcel/watcher-linux-x64-musl": "npm:2.4.1" - "@parcel/watcher-win32-arm64": "npm:2.4.1" - "@parcel/watcher-win32-ia32": "npm:2.4.1" - "@parcel/watcher-win32-x64": "npm:2.4.1" + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" detect-libc: "npm:^1.0.3" is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" @@ -5839,6 +6566,8 @@ __metadata: optional: true "@parcel/watcher-linux-arm-glibc": optional: true + "@parcel/watcher-linux-arm-musl": + optional: true "@parcel/watcher-linux-arm64-glibc": optional: true "@parcel/watcher-linux-arm64-musl": @@ -5853,7 +6582,7 @@ __metadata: optional: true "@parcel/watcher-win32-x64": optional: true - checksum: 10c0/33b7112094b9eb46c234d824953967435b628d3d93a0553255e9910829b84cab3da870153c3a870c31db186dc58f3b2db81382fcaee3451438aeec4d786a6211 + checksum: 10c0/9bad727d8b11e5d150ec47459254544c583adaa47d047b8ef65e1c74aede1a0767dc7fc6b8997649dae07318d6ef39caba6a1c405d306398d5bcd47074ec5d29 languageName: node linkType: hard @@ -5975,739 +6704,763 @@ __metadata: languageName: node linkType: hard -"@react-aria/breadcrumbs@npm:^3.5.16": - version: 3.5.16 - resolution: "@react-aria/breadcrumbs@npm:3.5.16" +"@react-aria/breadcrumbs@npm:^3.5.18": + version: 3.5.18 + resolution: "@react-aria/breadcrumbs@npm:3.5.18" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/link": "npm:^3.7.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/breadcrumbs": "npm:^3.7.7" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/breadcrumbs": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d1a13954ce9760dbba2d9e2d02269ffff5823c473014c57c6c558c43bc826fff75b0313fd51fc491e45c2688c9a1d7ad5b9760fc15db2a3e7dbb7c07a5d14a09 + checksum: 10c0/33e50a04c1d2b8efb91194ecac6f087051f4138c13fd182675eab311175bb637c09aa1f7ee1fedaf87e24b7b601b7d5d3ff4bb23d87d70c776eeff84006d5388 languageName: node linkType: hard -"@react-aria/button@npm:^3.9.8": - version: 3.9.8 - resolution: "@react-aria/button@npm:3.9.8" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/button@npm:^3.10.1": + version: 3.10.1 + resolution: "@react-aria/button@npm:3.10.1" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/759027e13f00d3c3c1ccf06f72b9a2f7f100177f48495539de4db6dd47435bba2d3c3274c811e67875b3e19cbc36dd765c75c7684812c4840dc784710cb7b68a + checksum: 10c0/9d35405c008043a7e7314d79c23805642d96742f32e464c05d3bf5417c04e8d70cc395e675dd4133849e08939fdd42eb757168124b0f8a713800eca501c22809 languageName: node linkType: hard -"@react-aria/calendar@npm:^3.5.11": - version: 3.5.11 - resolution: "@react-aria/calendar@npm:3.5.11" +"@react-aria/calendar@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-aria/calendar@npm:3.5.13" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/calendar": "npm:^3.5.4" - "@react-types/button": "npm:^3.9.6" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/calendar": "npm:^3.5.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/c6261e9cae5bfc8a6f727bfd125ada9cacdd1f7b51e4049d37017981765ac4ea9e1764fd7cb3611ed4ec0258f7f7a9a8ac81462d65f37ca4fd1612bbfd07c742 + checksum: 10c0/10f30f6cfdf81d38b48cb40368b141b50cc270ed39bf0240e501b207433bd7324293123bd8d0f49e868e51702b6eed9fc6da9601eb90354bb5e2db631c7089d9 languageName: node linkType: hard -"@react-aria/checkbox@npm:^3.14.6": - version: 3.14.6 - resolution: "@react-aria/checkbox@npm:3.14.6" - dependencies: - "@react-aria/form": "npm:^3.0.8" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/toggle": "npm:^3.10.7" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/checkbox": "npm:^3.6.8" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/checkbox@npm:^3.14.8": + version: 3.14.8 + resolution: "@react-aria/checkbox@npm:3.14.8" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/toggle": "npm:^3.10.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/fafef71bb96a121060616f098e0195a0f1b723c6aecb5fe7b0dff4bf6c6ce740eb61dc6617a5cc06c6dfa14af33f4c0b2c21de36497d432c63af2f3526637ab1 + checksum: 10c0/96ac21b5c6ede1ce0545e27dbefb20df88cd06f24c0ed2c2fb44383bcf632aa33096c70ffca59f8bc68c7e5e4f71293a975e6bd5dc65077ca70991f651a56992 languageName: node linkType: hard -"@react-aria/combobox@npm:^3.10.3": - version: 3.10.3 - resolution: "@react-aria/combobox@npm:3.10.3" - dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/listbox": "npm:^3.13.3" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/menu": "npm:^3.15.3" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/combobox": "npm:^3.9.2" - "@react-stately/form": "npm:^3.0.5" - "@react-types/button": "npm:^3.9.6" - "@react-types/combobox": "npm:^3.12.1" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/color@npm:^3.0.1": + version: 3.0.1 + resolution: "@react-aria/color@npm:3.0.1" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7f05b21d84e4587e570563002efb9a0b13bfef78559ee243d6ff50359871191ebb24e88113c127037ca4e4fa6cf7f8d7981e62eb0de2304bcd266cacde68b866 - languageName: node - linkType: hard - -"@react-aria/datepicker@npm:^3.11.2": - version: 3.11.2 - resolution: "@react-aria/datepicker@npm:3.11.2" - dependencies: - "@internationalized/date": "npm:^3.5.5" - "@internationalized/number": "npm:^3.5.3" - "@internationalized/string": "npm:^3.2.3" - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/form": "npm:^3.0.8" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/spinbutton": "npm:^3.6.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/datepicker": "npm:^3.10.2" - "@react-stately/form": "npm:^3.0.5" - "@react-types/button": "npm:^3.9.6" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/datepicker": "npm:^3.8.2" - "@react-types/dialog": "npm:^3.5.12" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/ee4969e6f28a765abee0ba519ad9c77b9910d76ec3c327403d8b901db750ed4daa32be2d1ea62d760f0e4dc4f51aa02c02c0481f4b00a40380d4dccf7a895a38 + languageName: node + linkType: hard + +"@react-aria/combobox@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/combobox@npm:3.10.5" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10c0/420c3de273014e4de38f823b0e7415f8eb648b97293e7169967ffce35133a37eca94288bd2adc636f892ed2da42150bc5b41d85b97a6a545c141cf2ad8ca1cbc + languageName: node + linkType: hard + +"@react-aria/datepicker@npm:^3.11.4": + version: 3.11.4 + resolution: "@react-aria/datepicker@npm:3.11.4" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/2bd8971c5bae8cafa3b4dce3aa6f6482436b31073f5f6f1ebbe88dbf2ac6abcb49efde12f485160cfbc6f0ac56b84e012a50d7820a6108bf072355a26b7244ff + checksum: 10c0/4df110dcc84f22948210dc0d996569593283017857fa848c553a7848849609922c6ba34e44698390fe192a29f9c6bf428c8beb49f449c83640c62442b86014cd languageName: node linkType: hard -"@react-aria/dialog@npm:^3.5.17": - version: 3.5.17 - resolution: "@react-aria/dialog@npm:3.5.17" +"@react-aria/dialog@npm:^3.5.19": + version: 3.5.19 + resolution: "@react-aria/dialog@npm:3.5.19" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/dialog": "npm:^3.5.12" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/46d30780c080c6e7c564ede769e9ccda763c54051501bc7149383f26f74e0162a0a46003d558bf30e56aabaa958333a158fd41c2dbc691f5fe17b68365c7bf5f + checksum: 10c0/a93699d76c0756fe9723f86a5b4db3af10f2bd042e769c5907cca430e49eee0ccac56859c61736eead8a67d0c8a254f0244d29a5773d603ef6bb53f5bf92fba6 languageName: node linkType: hard -"@react-aria/dnd@npm:^3.7.2": - version: 3.7.2 - resolution: "@react-aria/dnd@npm:3.7.2" - dependencies: - "@internationalized/string": "npm:^3.2.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/dnd": "npm:^3.4.2" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/dnd@npm:^3.7.4": + version: 3.7.4 + resolution: "@react-aria/dnd@npm:3.7.4" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/2cfa3072bed8b26a6bcb128d537b64ff6f7b8ad2837476b9d35722bda8c36d5d3ee74bcfef0d9496ce921396c63e08b9811d8ca736cca25b2ebe57f486f0b5f1 + checksum: 10c0/2c3619b2297d4f3f2974565835a15b853d9fe8631d6c02db664d3bad21e3b6126026999541fc98dc8f253684747406fcb55ac28f4ab3acac6f18de152ae4c1c6 languageName: node linkType: hard -"@react-aria/focus@npm:^3.18.2": - version: 3.18.2 - resolution: "@react-aria/focus@npm:3.18.2" +"@react-aria/focus@npm:^3.18.4": + version: 3.18.4 + resolution: "@react-aria/focus@npm:3.18.4" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/378178278effdc8342ac08a198f7479fb6955e8b6c85ff238e1cb47b81fcae88e8fa9b6c14cb00f1e6cc8952a01eff9581b32022e5e631aceaa8dd63d59706a3 + checksum: 10c0/141f8ef80060c5b58384af4af9446c0792618671e9f963942c3edc29bb15b7eb0ebb62cbe118135c7379c2732e86071aa7d7c890903a0ae411be07f2ec854e6a languageName: node linkType: hard -"@react-aria/form@npm:^3.0.8": - version: 3.0.8 - resolution: "@react-aria/form@npm:3.0.8" +"@react-aria/form@npm:^3.0.10": + version: 3.0.10 + resolution: "@react-aria/form@npm:3.0.10" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/form": "npm:^3.0.5" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a4e442505de7bcc41d6f3683f430521b2643b42ec54ca998ad5475ff88d1729712357990757fc5722c7622f61b484190b82a2764dda35feda2fd3ba99a67e5e1 - languageName: node - linkType: hard - -"@react-aria/grid@npm:^3.10.3": - version: 3.10.3 - resolution: "@react-aria/grid@npm:3.10.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/grid": "npm:^3.9.2" - "@react-stately/selection": "npm:^3.16.2" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/31ed3c2a2eb8340f38e9164bf2730ece07563178975aaff55c2e58ed307943071b105dd0503bf31a9fe17e085ef3db52f935636b04365e26194649f0c87f8c5e + languageName: node + linkType: hard + +"@react-aria/grid@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/grid@npm:3.10.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/351dd76078278f805c48f97b5249cdebd85cc428bc3a751fb33034d46bb8d9b1ad3b81cd9782944afd22063c91057b63882a07badc4f1f0170b5077b29aa06ec + checksum: 10c0/d85110a3df794a8df38ea1b52b7f575c1a4e31a4f4f6989c80c25099e6a020e1a290436febc846dbd0397db42b55a5d1e4028341808a9cbc82e92401acde5973 languageName: node linkType: hard -"@react-aria/gridlist@npm:^3.9.3": - version: 3.9.3 - resolution: "@react-aria/gridlist@npm:3.9.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/grid": "npm:^3.10.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/tree": "npm:^3.8.4" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/gridlist@npm:^3.9.5": + version: 3.9.5 + resolution: "@react-aria/gridlist@npm:3.9.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/ff5c7af71025de816a3f064af89520454e893ff224003f1b8e22cddaefa56ca8c09020411eed19eb11212d7b20810d1addb1c6dba2b75854d8b306228331ed79 + checksum: 10c0/d9ceb8df29f9d6f9cae123b6227313915aea9fd40543afb83ddee3f8a31fc5bceae4eb28a64fa5345dc7285b64adcc1dddfc60c28cc071782e681adf717b7879 languageName: node linkType: hard -"@react-aria/i18n@npm:^3.12.2": - version: 3.12.2 - resolution: "@react-aria/i18n@npm:3.12.2" +"@react-aria/i18n@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-aria/i18n@npm:3.12.3" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@internationalized/message": "npm:^3.1.4" - "@internationalized/number": "npm:^3.5.3" - "@internationalized/string": "npm:^3.2.3" - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@internationalized/message": "npm:^3.1.5" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6969cdafa899fa66b8a88eb80335e90d9ff31505d9814d3120e981c1ce5ccb6422be321ecab214d42b1ba935bef0172cbc71e639e47436e37899af84426feb15 + checksum: 10c0/98210abb15d598a6e4a35eae6df1d70ae6376ef9a5e1c3d298e03f4cc006df696785006323fa97ac57ce14c5b5c8d108690a5c2b187624cad5956778ffc25ca9 languageName: node linkType: hard -"@react-aria/interactions@npm:^3.22.2": - version: 3.22.2 - resolution: "@react-aria/interactions@npm:3.22.2" +"@react-aria/interactions@npm:^3.22.4": + version: 3.22.4 + resolution: "@react-aria/interactions@npm:3.22.4" dependencies: - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f5e1b3e8ea040cc2d32b35fcd749ba32d63069a31d407ac4fe08808d32a458a4a76ed7d630e88a38f0ba7cbea315908c020059ea21284b6003b106417da40e7a + checksum: 10c0/8455a68540a4085b71ed034cad5c349a7e756e44cd30d69d340d7f7a66ce1886882021fbcc8049a5d8aeba54b47cd2ca49a7bc4e6910aab2d13b41703d55c7a5 languageName: node linkType: hard -"@react-aria/label@npm:^3.7.11": - version: 3.7.11 - resolution: "@react-aria/label@npm:3.7.11" +"@react-aria/label@npm:^3.7.12": + version: 3.7.12 + resolution: "@react-aria/label@npm:3.7.12" dependencies: - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1072a6b0f4a0f9f594aea1bddf44ac6ea99b63ba1049b55de851c7a6692e5ed0cc8df0a05dae2c781dcb71fb10bf49c2fb4c0a2e6b4fb6e5c19d633f13607f0d + checksum: 10c0/28a8a04c788df9fb776565974a1c20bf01067d3d9a1f6cbeb184859c7e8893a64809bbcd1af9d765039ee30da96ecbce75c7d2d37bddb54cf4e709ab2d7afcca languageName: node linkType: hard -"@react-aria/link@npm:^3.7.4": - version: 3.7.4 - resolution: "@react-aria/link@npm:3.7.4" +"@react-aria/link@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-aria/link@npm:3.7.6" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/link": "npm:^3.5.7" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f3d5133967194e237c16ba9568bb6c85cb2114dba0d779f9ee51e46a2ed327c3d357f8bdf7d1062f11be6ea928c105a48549785cbdbe729659682fcc6abe4c70 + checksum: 10c0/81e3f3b53648ac4223e3c673a13c592c24895202b39255bb16bd2b39bcc9dff4b5ad2f6ed69029228ada20941eefd89060fe1761e6658eefcdbb28019fa1818a languageName: node linkType: hard -"@react-aria/listbox@npm:^3.13.3": - version: 3.13.3 - resolution: "@react-aria/listbox@npm:3.13.3" +"@react-aria/listbox@npm:^3.13.5": + version: 3.13.5 + resolution: "@react-aria/listbox@npm:3.13.5" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/list": "npm:^3.10.8" - "@react-types/listbox": "npm:^3.5.1" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-types/listbox": "npm:^3.5.2" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b4c48310ede8905cab5a4705c3514870f29ddad79a634a450f3ad00469efdead42b6e25f2bf433ea12a56290ed70531646fb7bd2fd3c5e9a6a5e8ec5f831e369 + checksum: 10c0/877c86bfe63b4b75a3bf75db7c275006d7341a4933b37dc57f996d1c9f230c4ca0a6f68960938b445bb5ed3af23787b1f7a818d783d4e7188a0b891b74215bdc languageName: node linkType: hard -"@react-aria/live-announcer@npm:^3.3.4": - version: 3.3.4 - resolution: "@react-aria/live-announcer@npm:3.3.4" +"@react-aria/live-announcer@npm:^3.4.0": + version: 3.4.0 + resolution: "@react-aria/live-announcer@npm:3.4.0" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/69c86b75686a2c4108da3f959da4c5739b0130ff370468c6d8ea3aaf594315c6ac1577c5b7bdb56629073ad19852d2bef18e412fd7acfd6c390201291ac9dcf9 - languageName: node - linkType: hard - -"@react-aria/menu@npm:^3.15.3": - version: 3.15.3 - resolution: "@react-aria/menu@npm:3.15.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/menu": "npm:^3.8.2" - "@react-stately/tree": "npm:^3.8.4" - "@react-types/button": "npm:^3.9.6" - "@react-types/menu": "npm:^3.9.11" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/d4815bbe453765013042299c295cba362147fe7634d4bdcfecffc3f7efbe84b83c820e9737ac90e127b4f8980aaea16f7f9876de516a6c05a42de0b5bf606b92 + languageName: node + linkType: hard + +"@react-aria/menu@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/menu@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b61b9fe943e47ad4db30c38b12b5c5529c3d460c357ffd7a26452b99751d53f9600d6bf1e87231342363f615f70296a0858d36ae82ab5c7e52945b54056f213b + checksum: 10c0/466bfeb1e76056556c502b274bd69637fb06b02f43c28c076b47476e4289eeb30d1120a17d41fe11bdcb972cc4c1119b7f0efb1aad28efc570dc7524fc7c8b59 languageName: node linkType: hard -"@react-aria/meter@npm:^3.4.16": - version: 3.4.16 - resolution: "@react-aria/meter@npm:3.4.16" +"@react-aria/meter@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/meter@npm:3.4.17" dependencies: - "@react-aria/progress": "npm:^3.4.16" - "@react-types/meter": "npm:^3.4.3" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/progress": "npm:^3.4.17" + "@react-types/meter": "npm:^3.4.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/ced05ef75d5731323ff22e50449ef3625b726200d942f3cb46664ac4f03f2221bc9f3f46db2696941728a49b3127cee1167353d4217f368ebbfbaa96bf4a5e57 + checksum: 10c0/d5b648664416f50448c34567df5f6c0c706014ab3d487869958e9f9b8d4a4fae5f5bc173edf4dd734d91ea9f6b7f7e853679baaf48926326d96ff8be2150ba0c languageName: node linkType: hard -"@react-aria/numberfield@npm:^3.11.6": - version: 3.11.6 - resolution: "@react-aria/numberfield@npm:3.11.6" +"@react-aria/numberfield@npm:^3.11.8": + version: 3.11.8 + resolution: "@react-aria/numberfield@npm:3.11.8" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/spinbutton": "npm:^3.6.8" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/numberfield": "npm:^3.9.6" - "@react-types/button": "npm:^3.9.6" - "@react-types/numberfield": "npm:^3.8.5" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/numberfield": "npm:^3.8.6" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d3eee1334e96311e9c4ae8205c4a004c0d58b99a750524e0a768add6073ff042096d92dcd69df03fb184eb3613b49c60b2f1e533127fb01c5d3cf40435f9abbc + checksum: 10c0/a1f6e5d90e150f40902546212687850a9c50889726db0f28f0ec73a1fd8f427048f464677b389d620350817749e5d96b90e51bca639705ff141543adbe3b82e3 languageName: node linkType: hard -"@react-aria/overlays@npm:^3.20.0, @react-aria/overlays@npm:^3.23.2": - version: 3.23.2 - resolution: "@react-aria/overlays@npm:3.23.2" +"@react-aria/overlays@npm:^3.20.0, @react-aria/overlays@npm:^3.23.4": + version: 3.23.4 + resolution: "@react-aria/overlays@npm:3.23.4" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/button": "npm:^3.9.6" - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/button": "npm:^3.10.0" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4ec179c1074183ba553d235387ef1ee9aef1463dcef41cd45f48410c9a46aa148b83f562dce78a5d0767060a4b7362ae9e2b2877886931c41a2385b9d249b722 + checksum: 10c0/174c8ef7d52123e8d979044dd36373314328086b2dc37a8b4f1fab8344be74c77925595dca86f720fd661eeffd5b632261f9a57e813d0f91460d1f08a090504e languageName: node linkType: hard -"@react-aria/progress@npm:^3.4.16": - version: 3.4.16 - resolution: "@react-aria/progress@npm:3.4.16" +"@react-aria/progress@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/progress@npm:3.4.17" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/progress": "npm:^3.5.6" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/progress": "npm:^3.5.7" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/9cfa814a67c08f902b3b8fe6df0df0fb9a740298c2183bff3c0a6c937292e8317713f9a3c27c6a8247736be629ce734ab87c7541c109439285fa2e598f4735f7 + checksum: 10c0/5eae2b0693cbb349242993bee9bcc82b59bf53b9429a5101736695ae64ab55be6b37e38fb26ac7288fb12e6ec2436da0a0aaddb2e11ffd3b3f06348a43edd5c4 languageName: node linkType: hard -"@react-aria/radio@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-aria/radio@npm:3.10.7" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/form": "npm:^3.0.8" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/radio": "npm:^3.10.7" - "@react-types/radio": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/radio@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/radio@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/radio": "npm:^3.10.8" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a852e7d7fcadbe24ee6cdca5309171e0e67893804494bb512e47329b1e1ef0d77fb9530b7d05fe485c6282aff6a59b7565a1c5bb075c559567a6f0e2ad49a47d + checksum: 10c0/1b6251b8c020f16b8d4ce0710323f52efd4bbc408789757a54dde2cd59fe5601b76c571b8f1f5b00e7680457e2f6766e1a3f55d4153685c4880e09b5933e63a0 languageName: node linkType: hard -"@react-aria/searchfield@npm:^3.7.8": - version: 3.7.8 - resolution: "@react-aria/searchfield@npm:3.7.8" - dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/searchfield": "npm:^3.5.6" - "@react-types/button": "npm:^3.9.6" - "@react-types/searchfield": "npm:^3.5.8" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/searchfield@npm:^3.7.10": + version: 3.7.10 + resolution: "@react-aria/searchfield@npm:3.7.10" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/searchfield": "npm:^3.5.9" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e2038d9dcc921447f3c2e481bce569666acd56e2174206f94f26e499c2dd4d381e1cad5edb5c3adbb47dbbb7c50e79996931c60cdb2e34601b1a6713d903aab0 - languageName: node - linkType: hard - -"@react-aria/select@npm:^3.14.9": - version: 3.14.9 - resolution: "@react-aria/select@npm:3.14.9" - dependencies: - "@react-aria/form": "npm:^3.0.8" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/listbox": "npm:^3.13.3" - "@react-aria/menu": "npm:^3.15.3" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-stately/select": "npm:^3.6.7" - "@react-types/button": "npm:^3.9.6" - "@react-types/select": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + checksum: 10c0/1ae7fab9f6bc473ccc8d2762c4d07ffbbdd45366b1fe7fa282c14354eac8e427bebb0dde20e1cb92e4a2cd769f9f3872a5712c53763706b6414d024fa5275732 + languageName: node + linkType: hard + +"@react-aria/select@npm:^3.14.11": + version: 3.14.11 + resolution: "@react-aria/select@npm:3.14.11" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/select": "npm:^3.6.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/80c69f8cde15ca86d89e84ab222ba0ff34da13fb29b2966e3278ac8984bfc3511c1c6100410369a7f82c6fe226924f9b49d4deb42d93572dabb853c175c53c19 + checksum: 10c0/b8c2e24a2713367938514c1d47817943bf1677bf4a29e5f5f695e1e9e708a93dde465de8d06babf276bc7face7938b280fd603af4b77d1068e9ce5b85a7cefd6 languageName: node linkType: hard -"@react-aria/selection@npm:^3.19.3": - version: 3.19.3 - resolution: "@react-aria/selection@npm:3.19.3" +"@react-aria/selection@npm:^3.20.1": + version: 3.20.1 + resolution: "@react-aria/selection@npm:3.20.1" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/selection": "npm:^3.16.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/8642ac94780b580ade6f8571b97fdeba7ab28203a86f5d6170f69ea39c0b8c1553c6e4648a0666c2819e5a6f9d5475685a12c61df2463ae5524434c8186cc08d + checksum: 10c0/44e10f4e4952e5fbb15071bbaa1ccafcb91b6168a8ac6eb1e0f4e1036014527ea3c0e363a7f552ca923b6929f9a5e2495bb454ad9cd4c64003d650115b5e637a languageName: node linkType: hard -"@react-aria/separator@npm:^3.4.2": - version: 3.4.2 - resolution: "@react-aria/separator@npm:3.4.2" +"@react-aria/separator@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-aria/separator@npm:3.4.3" dependencies: - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6914fc36e40e7313a21e479db6a51dac02dfa261b3e3f133c469900bdbab3c1731ccc8694f42ba76fb97c0a12bf700100ab5ca0e2e0db27e27739777da23ec5c + checksum: 10c0/322b7135944d0a941e65cc5756153e8e0aa60af102572f988d14add4cdfd7e727a133f0c3a86b69333f08da2f606f03d6d590483e986b79e649562f46cdb4836 languageName: node linkType: hard -"@react-aria/slider@npm:^3.7.11": - version: 3.7.11 - resolution: "@react-aria/slider@npm:3.7.11" +"@react-aria/slider@npm:^3.7.13": + version: 3.7.13 + resolution: "@react-aria/slider@npm:3.7.13" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/slider": "npm:^3.5.7" - "@react-types/shared": "npm:^3.24.1" - "@react-types/slider": "npm:^3.7.5" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/slider": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/dbfe7bc712aeb5e9172571e639be63d232e8d3ffdf92687146c81b695c7f971ee39d7af89bdc1e1e0a685f279a3d918b0c9b256998dd98a7a263d8d709342be1 + checksum: 10c0/6256790404e7ab67ea64c613b491fad3e9cd4315a6fe2fa72b2271eb5f0254bb39c5cbd5f9896119714fcb94f515c33c3c6ca8195aaf3b0fd5e5f6d49d7c8bd3 languageName: node linkType: hard -"@react-aria/spinbutton@npm:^3.6.8": - version: 3.6.8 - resolution: "@react-aria/spinbutton@npm:3.6.8" +"@react-aria/spinbutton@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/spinbutton@npm:3.6.9" dependencies: - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a910eca9755929e73975a266595f4dca5a6e11de877fa5e70b7a0ee042848a3005db50344fe4ea559f811a9203cea3b3d69e7bbdb76d7aa380e87e5ccbf3ad4d + checksum: 10c0/c15434d8c7c058ca39634b9a2350915967cf8d59e19101fc5e243f6a0b3b6971e9bb265aee07b3bbfb68ce207a3affea8924db2bd850705a7b2163f946d82f34 languageName: node linkType: hard -"@react-aria/ssr@npm:^3.9.5": - version: 3.9.5 - resolution: "@react-aria/ssr@npm:3.9.5" +"@react-aria/ssr@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-aria/ssr@npm:3.9.6" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e28d3e366b77c77276bd74c8d906ccccc9a5f72c00e65c82c9f35584c3bb2467513429e87facc4e6ede756a2870dddb1645073a6b9afb00b3f28f20a1b0f2d36 + checksum: 10c0/be52f2909035e093d3f72cccde15b66b4eef2dc30c71dac46a1ea43d3847dace1a709114640bfa3e9aa72ba716749635fb72116f4da16f7d80248ca348146456 languageName: node linkType: hard -"@react-aria/switch@npm:^3.6.7": - version: 3.6.7 - resolution: "@react-aria/switch@npm:3.6.7" +"@react-aria/switch@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/switch@npm:3.6.9" dependencies: - "@react-aria/toggle": "npm:^3.10.7" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/shared": "npm:^3.24.1" - "@react-types/switch": "npm:^3.5.5" + "@react-aria/toggle": "npm:^3.10.9" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/switch": "npm:^3.5.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/0c8fd8efacfc1be66ecff7c570493bd54dfff0b99e1c1cc4533d8ed793dc619b33e4dc14da28c64201b2248e3c0dc48af4c7ef144968d0d4a33146b8cc42c7f7 - languageName: node - linkType: hard - -"@react-aria/table@npm:^3.15.3": - version: 3.15.3 - resolution: "@react-aria/table@npm:3.15.3" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/grid": "npm:^3.10.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/flags": "npm:^3.0.3" - "@react-stately/table": "npm:^3.12.2" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" - "@react-types/table": "npm:^3.10.1" + checksum: 10c0/94000e6527b3889433d96571f8d7ce32a64b978fc7640d2a8f43ee38cebd3a13149a66512d54485c5f7c8769d5a7de2d4847ffc6130655f37cc7fbd70bd99bc0 + languageName: node + linkType: hard + +"@react-aria/table@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/table@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/table": "npm:^3.12.3" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6f482f0b299bdcdc3ace6f7eb37bdf3c3c0bcc7a52d6e2c6f5701af0a4d661e800b6384932e0c236be45b7cbdbfcf20ea2870e2208e3964ace1872b24e2c999e + checksum: 10c0/54a8794f9842082aef5ce9b36e21cb125b02e6792c38c40d1a65f25ba62362c4adc17a7db220672e1b65f515aedfe1a55eb9b70b7ce7d9c0fb75f4da16e4a8eb languageName: node linkType: hard -"@react-aria/tabs@npm:^3.9.5": - version: 3.9.5 - resolution: "@react-aria/tabs@npm:3.9.5" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/tabs": "npm:^3.6.9" - "@react-types/shared": "npm:^3.24.1" - "@react-types/tabs": "npm:^3.3.9" +"@react-aria/tabs@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-aria/tabs@npm:3.9.7" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4e2b994c3093cc996a7eb052815b95dc9715f93ad1bff8be186dd75d2a10a08a04c73377e20cda8ffce6c0134b9ce60b104d6eca0c4d392ca61a83b595609691 + checksum: 10c0/0e079c0e803b94efcb5f30444a888322d614e577c462eb2e7a4a0170aa92fea6e21cdbf041d5efdfab0b0c50ec287dc8032afe4b52b4f77489fa9ec4866837a2 languageName: node linkType: hard -"@react-aria/tag@npm:^3.4.5": - version: 3.4.5 - resolution: "@react-aria/tag@npm:3.4.5" +"@react-aria/tag@npm:^3.4.7": + version: 3.4.7 + resolution: "@react-aria/tag@npm:3.4.7" dependencies: - "@react-aria/gridlist": "npm:^3.9.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/list": "npm:^3.10.8" - "@react-types/button": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/list": "npm:^3.11.0" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/595fb4eb9fae91b77d53b98a806d4de5e98c0d691960a5fbeec7ff332ca975d2ff461497f69dad74f417f41418c318461cf098ba2ea52652136cb7e2a60e41c2 + checksum: 10c0/869e26288a2d3c90cc8027342f70dc1ec0146d6ec5ebe62c7b06eb48390e1d1a71083ca6de7147353764bc566a7f6dfad2666e6d378afa6cf53acb586e1019b1 languageName: node linkType: hard -"@react-aria/textfield@npm:^3.14.8": - version: 3.14.8 - resolution: "@react-aria/textfield@npm:3.14.8" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/form": "npm:^3.0.8" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" - "@react-types/textfield": "npm:^3.9.6" +"@react-aria/textfield@npm:^3.14.10": + version: 3.14.10 + resolution: "@react-aria/textfield@npm:3.14.10" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e74cf7cfa2f791472e7603b323f9c75d08bbadc5ddd9dd705b13be305e787f5e3021c1bc03c8e6a0d11ae9e900c05a27bcff032ebefb9ece0028fc4e16796757 + checksum: 10c0/91b4d6ae47c6bf355ae9ff53626d6195afc3fe5852a7aa930b286fbe0804c13b79649ff1b220706cc7808b0e8c4ad3f4f1c04261b4a90abb79f3bb83c033c5e5 languageName: node linkType: hard -"@react-aria/toggle@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-aria/toggle@npm:3.10.7" - dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/toggle": "npm:^3.7.7" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" +"@react-aria/toggle@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/toggle@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4db82eaa7ec69e313e313b39dfa39c2bd8ec2222e6534f7fca05e1184e5c1124335d07507bdb227058aac2712b84a0f5b3c62d9dd17f40a90acc03b467648f44 + checksum: 10c0/057302ef08413cc7bfdde96102da734610294aef19c91d6bae8accf2dfc3ffd976dd531c5d42c6aa955e44da92b46f51667488ae0a48718370d449b6dc0f84e4 languageName: node linkType: hard -"@react-aria/tooltip@npm:^3.7.7": - version: 3.7.7 - resolution: "@react-aria/tooltip@npm:3.7.7" +"@react-aria/tooltip@npm:^3.7.9": + version: 3.7.9 + resolution: "@react-aria/tooltip@npm:3.7.9" dependencies: - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-stately/tooltip": "npm:^3.4.12" - "@react-types/shared": "npm:^3.24.1" - "@react-types/tooltip": "npm:^3.4.11" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tooltip": "npm:^3.4.12" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/858b95d3d0ec905e96314d8a554a192c520842a350d7791204374bb97caadfa9f8b5d0fe09070bf492be562003055881d9cd5cb412e563ae44cc9619076fdaf6 + checksum: 10c0/1db345fe35462ddce880ea28bf0dcf6d320ed5e7ce96d0b836a8d3a00c35a88eef037e0e9e1601bdf516ae8c5c6ea0e9190b849499ee9146b7de9b70062f8d13 languageName: node linkType: hard -"@react-aria/utils@npm:^3.21.1, @react-aria/utils@npm:^3.25.2": - version: 3.25.2 - resolution: "@react-aria/utils@npm:3.25.2" +"@react-aria/utils@npm:^3.21.1, @react-aria/utils@npm:^3.25.3": + version: 3.25.3 + resolution: "@react-aria/utils@npm:3.25.3" dependencies: - "@react-aria/ssr": "npm:^3.9.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/ssr": "npm:^3.9.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/9e190a954d6e068439b90ef29ebd95193f8f50b9326b626985b6cb2ed72dd0d85b63c91505ddfc179a58b66940c598d2d9ef047e2dfd81b38c0878e550b2e22e + checksum: 10c0/dc86ea48c24232f5c51d0b5317d947c4ccf01a8afb3bdc89cb880a7b0a695a04c8a7c615fb190664f4f3c7da8669ab2bd2f7cdfb2861339f5816cbd600249a84 languageName: node linkType: hard -"@react-aria/visually-hidden@npm:^3.8.15": - version: 3.8.15 - resolution: "@react-aria/visually-hidden@npm:3.8.15" +"@react-aria/visually-hidden@npm:^3.8.17": + version: 3.8.17 + resolution: "@react-aria/visually-hidden@npm:3.8.17" dependencies: - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/utils": "npm:^3.25.2" - "@react-types/shared": "npm:^3.24.1" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f274fd3142997f3841e1a33b4057c024f53cebd3ec1398cbf2a3212df247704f3b38eb4d6276785ac0820ea9908cb129a6cd5150368a7640e537a298083daeca + checksum: 10c0/411699c167686509583debc659e734ec3c123198570104abbd4fe74a5a60d93a305d73f6d761ec67846c672d1076d8f089a6f90d2e2653e1a334fe7344088bd5 languageName: node linkType: hard @@ -6720,640 +7473,672 @@ __metadata: languageName: node linkType: hard -"@react-stately/calendar@npm:^3.5.4": - version: 3.5.4 - resolution: "@react-stately/calendar@npm:3.5.4" +"@react-stately/calendar@npm:^3.5.5": + version: 3.5.5 + resolution: "@react-stately/calendar@npm:3.5.5" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e5b5e8cda088fb46c6073e2330b7e9fcd4c0fa834a1a8cdb954036b5c405a7d88b81907da37be43f6e58a7d79609072c4b0cc3b0fe19bf45df175d42def772de + checksum: 10c0/ff38c8fb4178d965db8569980756d864e9a0341fca60bccc76d4fe34645375a2ed32a533097426f9f1892fe99bce32d5ec00a3e8ce9acbdfc6b7f2e82012d4de languageName: node linkType: hard -"@react-stately/checkbox@npm:^3.6.8": - version: 3.6.8 - resolution: "@react-stately/checkbox@npm:3.6.8" +"@react-stately/checkbox@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-stately/checkbox@npm:3.6.9" dependencies: - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/checkbox": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/87e93c2259ea490cc968aab51e5cf21d1df2d7db8b7b2d0bc09dd3a3964946c5b912deca86483f61d49a8a8f2d6220d31d5ef1f3948b86ff12de7b275d0584af + checksum: 10c0/068be8d5c743b0ac3f0a96863568401027035b20a32caaa220600172f6ed0f93a49d58cfc4a960befd4762aa1eab18e2c30bd3656157729b4e3944156aeebd6c languageName: node linkType: hard -"@react-stately/collections@npm:^3.10.9": - version: 3.10.9 - resolution: "@react-stately/collections@npm:3.10.9" +"@react-stately/collections@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/collections@npm:3.11.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/726fb28ee15b3c115caef3b39513b70672c9a6c6e4de88d0c13572d449e95f5bd188bc2eac0ebd147fef78b4e008eefb20149e63c37b3c9bdf126dc98a237d2b + checksum: 10c0/aba7d2194f4db8ee1ad5ad708a34d9bb336d3fd1fcb837cb237c6b63e1537003592eb6d33d80d1a6a313613e594d8d4a9da779c00d7fa3470f4adb5ff227150f languageName: node linkType: hard -"@react-stately/combobox@npm:^3.9.2": - version: 3.9.2 - resolution: "@react-stately/combobox@npm:3.9.2" +"@react-stately/color@npm:^3.8.0": + version: 3.8.0 + resolution: "@react-stately/color@npm:3.8.0" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/overlays": "npm:^3.6.10" - "@react-stately/select": "npm:^3.6.7" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/combobox": "npm:^3.12.1" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/600f4d2fba00478ef6e7f9ac04b45bebff1ddca9eb2d60838c0048136d084c2e4db79e46575231fda8f42bab9126dcef394520529268f2a4dec7b38ecab9a54e + checksum: 10c0/cb0acc88713c9a4271a1445c963c11a8d6cfaa2127894dc810783bc04cc288f1d143679a3b10612abf3cbb1a9871115f4e51745d707825879a454df2c7114609 languageName: node linkType: hard -"@react-stately/data@npm:^3.11.6": - version: 3.11.6 - resolution: "@react-stately/data@npm:3.11.6" +"@react-stately/combobox@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-stately/combobox@npm:3.10.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b81e229ef2ca8b0bc80a35a47695a1fbf1dd1c15f1728411e2440b398439024ce405cba963cbff267bf0a6235650f06744b719e6764fa21f6f490307c98783e1 + checksum: 10c0/a9ce1a4fd03d40d43f4914c8d079b1bfc40a73643067ca57c8fbc84faa5818217df2c842e4c5e94bfb79c014ba55fc185c92c7b359fbfe84ff4078104361fab7 languageName: node linkType: hard -"@react-stately/datepicker@npm:^3.10.2": - version: 3.10.2 - resolution: "@react-stately/datepicker@npm:3.10.2" - dependencies: - "@internationalized/date": "npm:^3.5.5" - "@internationalized/string": "npm:^3.2.3" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/overlays": "npm:^3.6.10" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/datepicker": "npm:^3.8.2" - "@react-types/shared": "npm:^3.24.1" +"@react-stately/data@npm:^3.11.7": + version: 3.11.7 + resolution: "@react-stately/data@npm:3.11.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10c0/bd5d81e62a251501d71ed87c1e2869d22fb0fbe80d617e70fdba4755eea79c6f51a2f9aafacf99145a2a0bbac8f5aa082096e08b930f63a7196e83c18dab3d99 + languageName: node + linkType: hard + +"@react-stately/datepicker@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-stately/datepicker@npm:3.10.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/string": "npm:^3.2.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/49583dfb0f5ca1f9208f132fd951ea828cf411f06321dd25ffdc892314d14269108c22c0efdeea5bbdbae6dc361ff9b39a9e5aefd045e5f6146d458d906ef750 + checksum: 10c0/74fa89a4b9d80343dc07a7bbabcf88962ea0afbddcfb5e24b5c97fffcb9596ec097fa4ddaf7c534c8ba96c83101f88237413d2b6f65a979653007c463c8e09c0 languageName: node linkType: hard -"@react-stately/dnd@npm:^3.4.2": - version: 3.4.2 - resolution: "@react-stately/dnd@npm:3.4.2" +"@react-stately/dnd@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-stately/dnd@npm:3.4.3" dependencies: - "@react-stately/selection": "npm:^3.16.2" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/91b8e21844faa7db1ed51c0f2d1372c8a2b1f7720e19ea968be828ea261aa91ee9d12692856a2fa62b2783a7f10233b3ee363bb252d8cfcbe70fa10604539a87 + checksum: 10c0/06356b2f1c9e1e4f77135d79a00a7ddbceed6b09bf6d1681ddf710c88aab0063f1ca96afc814693f049e2f4e38b5c4071d1a47cde6e2b7ef676c0a0e838b74ea languageName: node linkType: hard -"@react-stately/flags@npm:^3.0.3": - version: 3.0.3 - resolution: "@react-stately/flags@npm:3.0.3" +"@react-stately/flags@npm:^3.0.4": + version: 3.0.4 + resolution: "@react-stately/flags@npm:3.0.4" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10c0/314a5885e2060dc56a32d1bae892af1f7644e14e66aa3ae3f6c0b1b4a6a1a8ded0e03adcea24bcfb9df3b87cd77f2139fde8a3d1098a0e3ba3604c3c8916385e + checksum: 10c0/363aacb4c8a9c091689a4fba2e1f0c0ca9040c9c722dae6388cbfde1952db0c808fe98e4ada6ecea89a9bf6288cf351f3f1cd54434fa6a8dccf8903e8b2085b9 languageName: node linkType: hard -"@react-stately/form@npm:^3.0.5": - version: 3.0.5 - resolution: "@react-stately/form@npm:3.0.5" +"@react-stately/form@npm:^3.0.6": + version: 3.0.6 + resolution: "@react-stately/form@npm:3.0.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e85c2e4635b56b29d0aaf636e6c4d9df9c8a2877db2cfb3a0d0a4ecb4fa54f028a24a606a495152d83c8b350a97dda199c572f1413a2d49ce9dd8ebcf577a51f + checksum: 10c0/ba8439dfb606abeedf4b90e0f3fa77d05ae1f0a898d800af419a3aaaf0b388259d09d109c138dbf6768120213870a63f6e604886fc6c11233f8da1668c086b22 languageName: node linkType: hard -"@react-stately/grid@npm:^3.9.2": - version: 3.9.2 - resolution: "@react-stately/grid@npm:3.9.2" +"@react-stately/grid@npm:^3.9.3": + version: 3.9.3 + resolution: "@react-stately/grid@npm:3.9.3" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/selection": "npm:^3.16.2" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/04806e5cf9d66440f374c1bf12445ba5c7d271583083ecb2675a236c77883909b12118205188f97f5b39dcf2c78c9d89544f57f6f70c283484d1627b610b7ab5 + checksum: 10c0/cc8d420f1148dda47ed12b9cc318f4633c252abd99d88c75294ba6c4641dd5c39b3ccd8e21350768629b942d8762e08052d8b23ab80fbe5e1ed248faa719a647 languageName: node linkType: hard -"@react-stately/list@npm:^3.10.8": - version: 3.10.8 - resolution: "@react-stately/list@npm:3.10.8" +"@react-stately/list@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/list@npm:3.11.0" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/cf4754f9eaac86785720fa05c93972387247ed62226ce3580c10a820e75e173594f215d949747569ae52d4ce055b047ac854946368dbed94f1ac236be9010431 + checksum: 10c0/64731450c5d93997c8b1ce51b3eedc1fc9b1eb7814324d56fc459bf708dbb4e052f880bb02d116af6c0544ff4e9f1c347acd99878efa501614e74fd910409a32 languageName: node linkType: hard -"@react-stately/menu@npm:^3.8.2": - version: 3.8.2 - resolution: "@react-stately/menu@npm:3.8.2" +"@react-stately/menu@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-stately/menu@npm:3.8.3" dependencies: - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/menu": "npm:^3.9.11" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/52713bfbf6343d459be80a4fb7949ea3b25db125412a1ddc3775e64aa7d2af22f0362000104fa35a12b142ca3b631368859b85d1171161e77d4b01493f223a47 + checksum: 10c0/b222962aa9fb9935032756d2d3406ccfb56391a70d2bc2d968b06cab2d1a838443c8e6779032e197f2628bb5183d67851a0020ae70ef0cb74e1f7096bbd82fdf languageName: node linkType: hard -"@react-stately/numberfield@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-stately/numberfield@npm:3.9.6" +"@react-stately/numberfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-stately/numberfield@npm:3.9.7" dependencies: - "@internationalized/number": "npm:^3.5.3" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/numberfield": "npm:^3.8.5" + "@internationalized/number": "npm:^3.5.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/numberfield": "npm:^3.8.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/5f9f45d6d1056769b2b4b08a418852bb5e302ebdc638af596415a87e50fb4d2cc6112e0831d69bedfb014d109a7c0f6fecd792518e69c4e92ca3d3ea2a341754 + checksum: 10c0/f956674792c5bb6a893d15c45b3ca4c2d0757e09a3acc4ee90efae179d6e6245d1dedd23125030f5e07f1edf7ced547a988c7d233a2eb4fcc8ea673cd4bfe942 languageName: node linkType: hard -"@react-stately/overlays@npm:^3.6.10": - version: 3.6.10 - resolution: "@react-stately/overlays@npm:3.6.10" +"@react-stately/overlays@npm:^3.6.11": + version: 3.6.11 + resolution: "@react-stately/overlays@npm:3.6.11" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/overlays": "npm:^3.8.9" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/overlays": "npm:^3.8.10" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/3bc5a97fe34a53cacd7fdf73e6dec30abf961c9ab8bf83af8fe1c8df8ccc2f39dacceb4834bd08b77cb823d83e213e855d5ebaa50f2c77a98eeecdb422bede28 + checksum: 10c0/559efc68bdb4512b8049f31a83e15404f7a306e960763570d876a08aee165656fdfbef4533251709e0576b1a7d6fd1f4e575ebfabc93738deb686c52571d36f9 languageName: node linkType: hard -"@react-stately/radio@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-stately/radio@npm:3.10.7" +"@react-stately/radio@npm:^3.10.8": + version: 3.10.8 + resolution: "@react-stately/radio@npm:3.10.8" dependencies: - "@react-stately/form": "npm:^3.0.5" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/radio": "npm:^3.8.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/908f0c5eb6a0726b279ab365f7062dea90efd68e4f187a2c151235b10cc5ebfdc8d43a6b835839d0d9816461eefa2fd37e1a6a295b48f25f0afdf15f95ee2369 + checksum: 10c0/c918b134af1cb336dd687f92143df06c66b38ada10e9def7c5738e1ff0490f31563a8c20471d70d83eb8c5ad99757a7669a4d250f4f144821641b1670e6cb57d languageName: node linkType: hard -"@react-stately/searchfield@npm:^3.5.6": - version: 3.5.6 - resolution: "@react-stately/searchfield@npm:3.5.6" +"@react-stately/searchfield@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-stately/searchfield@npm:3.5.7" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/searchfield": "npm:^3.5.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/searchfield": "npm:^3.5.9" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e7ea3bb886c9b043bc473a74e164419c5cecb3d416ecdd0232e152d61300bc87ed6a5356baf3c0a11af212400f3c27799e917f1641dbe0954e90c52861ba7a8f + checksum: 10c0/855457c63a684d724bcaea19d043c0e99a1fb91c6587e9dc263ee4d6ce2f7a7ded2c5cb1cb957063c141323775cf490e93b20004ae19940d5036c1744641d0ba languageName: node linkType: hard -"@react-stately/select@npm:^3.6.7": - version: 3.6.7 - resolution: "@react-stately/select@npm:3.6.7" +"@react-stately/select@npm:^3.6.8": + version: 3.6.8 + resolution: "@react-stately/select@npm:3.6.8" dependencies: - "@react-stately/form": "npm:^3.0.5" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/select": "npm:^3.9.6" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/6fb434004996bb15f85172f2ad571f5a6cfe82e48f29405da515fbe4d36e0903966daaad8d055e9be8dfb358bcb530fd81c15866c451c28645f7a5b83c2ca48c + checksum: 10c0/2d76055fb4f7130224e1a746e43a37f0f70700fb0dd07c7a404b255a62a148ec704e9ddf9bbcc2188096dae231216738147b11587c68933a9234153b9497bde3 languageName: node linkType: hard -"@react-stately/selection@npm:^3.16.2": - version: 3.16.2 - resolution: "@react-stately/selection@npm:3.16.2" +"@react-stately/selection@npm:^3.17.0": + version: 3.17.0 + resolution: "@react-stately/selection@npm:3.17.0" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/4928bec77ab6f51f79948f2f19f6177d16def6c509e5a142eccc3406fec6e16832a50fd157aff1005f313a815c95dd3a0fa1503443c8fbff8dc1982c57f56297 + checksum: 10c0/3d0cac8fa729ca9b2d083d305e533ebdc229808d34505a52e1791d916fbe08d32413216efa3ae1c322da1cf9e59024bf9b2d9b7b68e3cb0d7d30fd4da4f0be42 languageName: node linkType: hard -"@react-stately/slider@npm:^3.5.7": - version: 3.5.7 - resolution: "@react-stately/slider@npm:3.5.7" +"@react-stately/slider@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-stately/slider@npm:3.5.8" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" - "@react-types/slider": "npm:^3.7.5" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e895a4c942cfbe6e07532c9e482b55d3d61fb59e4e9a0832ec9f51b84fd09c3d26b83e17827520ee45bdcfa81f412b13e662ef77ac0b1ff21619b5824d91087f + checksum: 10c0/47a8887a4732a5a0503632cc83c36f61793bd34893989e0f23d15268b8776b30754de43559e2e962ac60125dc1816d297c09e15ec7ecadd78595b1e05ac4c5cc languageName: node linkType: hard -"@react-stately/table@npm:^3.12.2": - version: 3.12.2 - resolution: "@react-stately/table@npm:3.12.2" +"@react-stately/table@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-stately/table@npm:3.12.3" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/flags": "npm:^3.0.3" - "@react-stately/grid": "npm:^3.9.2" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" - "@react-types/table": "npm:^3.10.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/3c46d4b02eb948e40a83d50e5a51614d00970db261ef046c4061e2a12f3784bd41e0c9598d4ed663104c377fb110aaffbe954439864448e956761e589a709b6e + checksum: 10c0/736f62ed831416212f836525408ad17ce396633620136786025cff47571461b97e047f9321ebfd8db889b02cda73a401b76108529314b74e7b88e44bd2909f59 languageName: node linkType: hard -"@react-stately/tabs@npm:^3.6.9": - version: 3.6.9 - resolution: "@react-stately/tabs@npm:3.6.9" +"@react-stately/tabs@npm:^3.6.10": + version: 3.6.10 + resolution: "@react-stately/tabs@npm:3.6.10" dependencies: - "@react-stately/list": "npm:^3.10.8" - "@react-types/shared": "npm:^3.24.1" - "@react-types/tabs": "npm:^3.3.9" + "@react-stately/list": "npm:^3.11.0" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/f36a930e4900e4aecd49fbffb9bd013ba34c310188501ccb61a914d0cfe2291f198ea02ee8c12968afea77ad0c8e98b5015d8e0eac84b8b2d9cb6cfdb68fb055 + checksum: 10c0/308521c0810c7653b6015bfd4c6c2393dee1ef7780718e9322dc42a670a195b940440ecaed8acceccccf720d05e67efef789a12929778549f93697bd263540fb languageName: node linkType: hard -"@react-stately/toggle@npm:^3.7.7": - version: 3.7.7 - resolution: "@react-stately/toggle@npm:3.7.7" +"@react-stately/toggle@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-stately/toggle@npm:3.7.8" dependencies: - "@react-stately/utils": "npm:^3.10.3" - "@react-types/checkbox": "npm:^3.8.3" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/eb7757e5df8f442229c857b9d8da9bf29f22f1fc197273473360433ee4cf5321a4137a3967b934eaf5ddf211ef7f48918eecbcafee76da0f997e9729973c544e + checksum: 10c0/765bb5e0c40a999b4a49babdcabf9cc9be81f9c967ee80345607ae77dc606cfb4ae730ea71af18298f636c5edb334801d2d3e2e6b123655cba67b4751d00e492 languageName: node linkType: hard -"@react-stately/tooltip@npm:^3.4.12": - version: 3.4.12 - resolution: "@react-stately/tooltip@npm:3.4.12" +"@react-stately/tooltip@npm:^3.4.13": + version: 3.4.13 + resolution: "@react-stately/tooltip@npm:3.4.13" dependencies: - "@react-stately/overlays": "npm:^3.6.10" - "@react-types/tooltip": "npm:^3.4.11" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/tooltip": "npm:^3.4.12" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/370be423cfca5e4e24991f0d3626a51e715683c1bbaa99151c422ea24c0641f26f3241885a650173c46cf7ce0be1d532363f2b78cd65a0cfc446277a6ef76b8b + checksum: 10c0/b4322cf62ad87888898676e4cf19a75d56594851a2ca8035421e69d45b02486ea36bd7b977b7596621165b771f47c4fe1a7b23d785771f26afcd16fecad1ab8b languageName: node linkType: hard -"@react-stately/tree@npm:^3.8.4": - version: 3.8.4 - resolution: "@react-stately/tree@npm:3.8.4" +"@react-stately/tree@npm:^3.8.5": + version: 3.8.5 + resolution: "@react-stately/tree@npm:3.8.5" dependencies: - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/utils": "npm:^3.10.3" - "@react-types/shared": "npm:^3.24.1" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/58cfc6bd6d5b989e344fae04d735b9f7d0fd9b1c22f76a00d84d02ed4aaaf7056e3f5b77a3860e097d425803332b4757e71e0f7c5ef43079015a62d26cff9a3f + checksum: 10c0/6df95aa9c75ef87fed004641f73e1889950724fdd521e2447310d645b666da79ed7a67dd80b5db6c5b75903b03aa61b1ac3f84d39117d2951c115b9b19aae03f languageName: node linkType: hard -"@react-stately/utils@npm:^3.10.3": - version: 3.10.3 - resolution: "@react-stately/utils@npm:3.10.3" +"@react-stately/utils@npm:^3.10.4": + version: 3.10.4 + resolution: "@react-stately/utils@npm:3.10.4" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/5ab34ed32c49281e01b08d87d1564bae880b68b8d25faf2b3babf825eb75e7029b73fd6469a9567e03a0e152bfaf130700e1c9fb4949d1db62fac5cd33af951e + checksum: 10c0/875c11424fadf4419caceeee13e5bfdee2b0c330fe0220c0ea9d68d570cc9a34525f2f124d977e519b397a738cd2f8e36b7b03a046e3e7da99460e99282977a4 languageName: node linkType: hard -"@react-types/breadcrumbs@npm:^3.7.7": - version: 3.7.7 - resolution: "@react-types/breadcrumbs@npm:3.7.7" +"@react-types/breadcrumbs@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-types/breadcrumbs@npm:3.7.8" dependencies: - "@react-types/link": "npm:^3.5.7" - "@react-types/shared": "npm:^3.24.1" + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/9deaac78acfd4ccf9d821bdf3bed8701e933b1e106f9ff55ca890cb6e75eaf5e3432d631ac61f02829078305c00bc54123c82d0405511b83b171ca1f64d8e48c + checksum: 10c0/886f7c3b9e7196d8516814dcf8dfcaa437107c4e2e7d6db1b83adadbdab16fb3a12edb9e1b01b6f0524307394735766487d1129b1c8d4172e50eb8e3e0bae31a languageName: node linkType: hard -"@react-types/button@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-types/button@npm:3.9.6" +"@react-types/button@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-types/button@npm:3.10.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b041a3922d8fa0a41ae4ca4f1e229b8ded70397057b1d6c6cd62e619978530c04cb283578a0c21afb83246169bfa0a71fb065071d12b58fa5d8c5e36c39abf1c + checksum: 10c0/89395334f286f1a97a584715bbb87e7bb017d7366aa73ce0cec36ec8cb59059dec1f5afe3ab44f3972e0c50f44daeb2d531b10191d6f2b7f70c3ce7d3c94c0da languageName: node linkType: hard -"@react-types/calendar@npm:^3.4.9": - version: 3.4.9 - resolution: "@react-types/calendar@npm:3.4.9" +"@react-types/calendar@npm:^3.4.10": + version: 3.4.10 + resolution: "@react-types/calendar@npm:3.4.10" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/611a5890464de326d5f8e7f97c442d81d8d7da0f792cab1ee1819d4230f5444ee3c38d2bf524152c3cad19904a4f5795c0e1a6776812c039d339f30eeb88722e + checksum: 10c0/e4768b09c86739724f7fbdde41496859bfc6ba1d09071667da82f8914e8a5eef50cd168dc79d44782b8f2143547ea1326b476f0cce1cbbf667acecf5500bce95 languageName: node linkType: hard -"@react-types/checkbox@npm:^3.8.3": - version: 3.8.3 - resolution: "@react-types/checkbox@npm:3.8.3" +"@react-types/checkbox@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/checkbox@npm:3.8.4" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/cc968b449857022a3b6a51ca7882ba6a7bc17a4878457c94eec93fcaf482cb02611b471c4fdb2c5060422bc6a2e6f4a10db011e48eb64bcece8d17934707cde6 + checksum: 10c0/e2970200658c2035f3fd8d82e805ddd5cf402cf523e293a76a7e181c0b4234e657471c34c9eb0d4f421ed494e98214160efedc8c358d9bfa63ae4b3012d73b6e languageName: node linkType: hard -"@react-types/combobox@npm:^3.12.1": - version: 3.12.1 - resolution: "@react-types/combobox@npm:3.12.1" +"@react-types/color@npm:^3.0.0": + version: 3.0.0 + resolution: "@react-types/color@npm:3.0.0" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/714dde84ce0effba879744bb4ae914a13215621d8b46692b09fbe71238143067163f9d07bcf2ea252aeb893118db57ceb32994746523852dd8d216a28ce3384b + checksum: 10c0/77e69841a7b3d692c4b71594f58a3b0184ca1e1bc34d3e9a7a1d58e66ee2c4a93109977739fd19c8aca80edbf667b4fd3f8be03d9c6f2eb5587ee6550509cfbc languageName: node linkType: hard -"@react-types/datepicker@npm:^3.8.2": - version: 3.8.2 - resolution: "@react-types/datepicker@npm:3.8.2" +"@react-types/combobox@npm:^3.13.0": + version: 3.13.0 + resolution: "@react-types/combobox@npm:3.13.0" dependencies: - "@internationalized/date": "npm:^3.5.5" - "@react-types/calendar": "npm:^3.4.9" - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b8da4a90df3e3ecb5494e97c4b40abe74c5f8b3565c50cac3775a85e5268d04846d86e504a71d57943fc92bf3068c5499a4b273d269a441cba75dca77ee83eeb + checksum: 10c0/0eb33769279d76d2043833d2bbc36d3357d5dd92a00807980d95d5c4198060d06e3146355f31287c6b678c8b5d80c8e57084a55de71ab5174a8e8794e4702dfe languageName: node linkType: hard -"@react-types/dialog@npm:^3.5.12": - version: 3.5.12 - resolution: "@react-types/dialog@npm:3.5.12" +"@react-types/datepicker@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-types/datepicker@npm:3.8.3" dependencies: - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@internationalized/date": "npm:^3.5.6" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/75991c5be8a28323936baa2461db4cb4dc877a9f210a9d4f11f667d7b0e1eca2f90090fbaf335bb4be71c905216286177721fd7e9ba3ae084b1a272b2e8da6cb + checksum: 10c0/c6b3c2c6757329d1fd636e40b0024a20875bf7f2c895e521d9941b9469b5a8ca19b2773ae8bd1adc35b1a5f9f9946b04cfc2032cd7e4fd99cbf2947f86a06d51 languageName: node linkType: hard -"@react-types/grid@npm:^3.2.8": - version: 3.2.8 - resolution: "@react-types/grid@npm:3.2.8" +"@react-types/dialog@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-types/dialog@npm:3.5.13" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1c2c456f89b2984fc330f9ddacd4d45c8aaf1afbaec8444e753a84dceea4381325c07d153b28942959b369ad7667575ae9bae08bd7c11a1ee22e908dd658498c + checksum: 10c0/9cb9043694a1e48fbf0221effd28da602c314c64d653455d5616d8384adf93c78c87453a5b210ff587a221836adb5e2e7f9cb5b3f9a04c3522ad35dadba5d39a languageName: node linkType: hard -"@react-types/link@npm:^3.5.7": - version: 3.5.7 - resolution: "@react-types/link@npm:3.5.7" +"@react-types/grid@npm:^3.2.9": + version: 3.2.9 + resolution: "@react-types/grid@npm:3.2.9" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/cc8c526ff1fcacab28647f7355a96ba21b858444d53ff5eb236636fc88da9e3fb91e784aa5cf2d112cdbf7be8fdea5067a975be6c1c113cd7e5dc3bf4fc8499c + checksum: 10c0/2645c4dafef3d10fe866a2a2ee9c17bce6fef9bf166bdf98e1de5bb6ed4cefc390eda87ea79ed8846cc94a9f57eb530577122d6063a14747ff3df2a08ec700cb languageName: node linkType: hard -"@react-types/listbox@npm:^3.5.1": - version: 3.5.1 - resolution: "@react-types/listbox@npm:3.5.1" +"@react-types/link@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-types/link@npm:3.5.8" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/fa1d0ec7e70a4b9a2a2e379899016dd81d9172f9065f6626436ab956f166f73e0062c2c73f8122b993096d8936f8433e85d6ecebeae67b54980e571ec30d688e + checksum: 10c0/39ac4827bb791d481bcf394429effc53dd446cf7e260ee1900c09327581b36650aa68f573d5002ac7d9e39ac5dbbb08e0d39cf0eeb408c2a3bfc2c8ce77a5cb7 languageName: node linkType: hard -"@react-types/menu@npm:^3.9.11": - version: 3.9.11 - resolution: "@react-types/menu@npm:3.9.11" +"@react-types/listbox@npm:^3.5.2": + version: 3.5.2 + resolution: "@react-types/listbox@npm:3.5.2" dependencies: - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e0bae8eb7c19900512a32d0d4d2909b7537c28be30cb58c9c8ff0de621828bdf14030fbe17cd8addf919844aa3d462182b2c81a0b3eba864f7144c9edbec3add + checksum: 10c0/a4145e0290e79c7ac0ae97f64384949f5156e75f4f05b1db17c36c1c31233dbfa7bc8509601dbb8782c24f77142a625db9e087b8a911acd385742f23d3d931bd languageName: node linkType: hard -"@react-types/meter@npm:^3.4.3": - version: 3.4.3 - resolution: "@react-types/meter@npm:3.4.3" +"@react-types/menu@npm:^3.9.12": + version: 3.9.12 + resolution: "@react-types/menu@npm:3.9.12" dependencies: - "@react-types/progress": "npm:^3.5.6" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e06d845e33b6cd0d3dee783ea68927187409896db963be1b7356e6ab63f909fbb3deaed6f95ce8f2b8855cd2d4f8138b4c54a5ab7e6fb8898d324a177302e16d + checksum: 10c0/c0f5be96e7fce99143ee564bf2debfc61c43ce5459dc4dc60118d4d873877cae9796c736dea88a1da892ea633fadd179c156c37b070a44eb4060f85a3007eb81 languageName: node linkType: hard -"@react-types/numberfield@npm:^3.8.5": - version: 3.8.5 - resolution: "@react-types/numberfield@npm:3.8.5" +"@react-types/meter@npm:^3.4.4": + version: 3.4.4 + resolution: "@react-types/meter@npm:3.4.4" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/progress": "npm:^3.5.7" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/842c6cbb6c68c48764b1498103b1c40e940285366a8b342c3e259c48b518e9c986d9e358e7f0f6af0aaddbb48d709681c4fd4dcd3bb9b553a5be20d7548ce068 + checksum: 10c0/0fa94ee35264e3d600e424aba3b21dd6b0896c6877d723381ea5a34c7594e8079b81ce3b2115d6420695ed0004d7251e4d5dc93b6ad8c06c8de8fb30c085ee45 languageName: node linkType: hard -"@react-types/overlays@npm:^3.8.9": - version: 3.8.9 - resolution: "@react-types/overlays@npm:3.8.9" +"@react-types/numberfield@npm:^3.8.6": + version: 3.8.6 + resolution: "@react-types/numberfield@npm:3.8.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/8719684bd606e119f3a20db73cecf1e36e7c2d8158b996e9308495e5b78252689c459ce394a798f03ebb0c7303eac67093ce9345eb45e5bb4e1ae55451dcf4b3 + checksum: 10c0/f15d30246d8e33e360f4c3398ffc287aa8bb9e133e7b3368cd3c05a80c18df4cbf46fe4dbaafd7cb18bb268632a291030e7e71d1c4ea794d366afb7a75512c32 languageName: node linkType: hard -"@react-types/progress@npm:^3.5.6": - version: 3.5.6 - resolution: "@react-types/progress@npm:3.5.6" +"@react-types/overlays@npm:^3.8.10": + version: 3.8.10 + resolution: "@react-types/overlays@npm:3.8.10" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/dfd6e957148fef5014e3b3ca761f38ef9927dfad78bdbe194eb08fa747718903397d973170f91a4f98c6c703217996e60c76217c0601f71015c43a6332dc6aae + checksum: 10c0/753fd637dab9e189403cab8567a88fce183de8013dcec705fe3ed813facaa7a95fa754af5a45f364787c4351132d27ebaf3184e0e14955c47bf80b82560c3539 languageName: node linkType: hard -"@react-types/radio@npm:^3.8.3": - version: 3.8.3 - resolution: "@react-types/radio@npm:3.8.3" +"@react-types/progress@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-types/progress@npm:3.5.7" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b110d915a11747897781bf635fc1f1b86be892f8bd01ce38e2e8e229d9ab82e46b37980540bd930e71124ccc02081d143c513440994da127f9ed2d34a75912ee + checksum: 10c0/8780f97a5e3400e2381ed6659511a74fdfa8a3aa21499c8fe1fcd92386460569c56032d60297dd0786744d460cd515ebf4f663ea4b1a1f57e717e2da977dd581 languageName: node linkType: hard -"@react-types/searchfield@npm:^3.5.8": - version: 3.5.8 - resolution: "@react-types/searchfield@npm:3.5.8" +"@react-types/radio@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/radio@npm:3.8.4" dependencies: - "@react-types/shared": "npm:^3.24.1" - "@react-types/textfield": "npm:^3.9.6" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7ddf33358f76b8652aecdd6fec95c891890dcdf97a9c8bafa19f67e049f308ce3aefa0f230c8b3276bba1dd52a1c49f4dbbb03d7cb0ab01bf72308cb117bb85b + checksum: 10c0/2a7395f07810b3ae128c329f31d00f0bda3ecc03a8203e17cda7fbc0be019bb01113b8af6d0f73334168ae2fd13763ef4d1138c3f8b3d49ef2c858e33df2f3ae languageName: node linkType: hard -"@react-types/select@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-types/select@npm:3.9.6" +"@react-types/searchfield@npm:^3.5.9": + version: 3.5.9 + resolution: "@react-types/searchfield@npm:3.5.9" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10c0/5e7d644e86a6ffb41c6230ef57e2ccdcfc1ad045a035a1c88aeb476054854fdc0542bfd62a8b3d23d4f19adf7e117c90ca9d8afd5726d7b039ed52f9ebed0639 + languageName: node + linkType: hard + +"@react-types/select@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/select@npm:3.9.7" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/10495da46af019a1f2a5473740f4dcf84cd03c4aee9aa19dba2a8867f521efc33d4587c02ef762619c903ef8426cd887b89957efe3c91c96acd9e07a60f19af8 + checksum: 10c0/438a23b9be9469d81f2c0da0904ac76ce163ea41b03ca05c744a0d96b323837f1f0270b58dde83303970b2755202cc6dbbc109d8c9cce9c69100c56dfca967ab languageName: node linkType: hard -"@react-types/shared@npm:^3.24.1": - version: 3.24.1 - resolution: "@react-types/shared@npm:3.24.1" +"@react-types/shared@npm:^3.25.0": + version: 3.25.0 + resolution: "@react-types/shared@npm:3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/34ef83cf5d945963208beb724d54468e5371fd7361024f6f42a29cdc6d4a9516aa4d82804cdecbcf01c16d82c96aacb511418d7c839e1ea4579b20411e565ed4 + checksum: 10c0/d168f6b404c345928ef8ead94f0cecd3831d8f6df708dbe897ac62d566949a0931c3b0d95ef6dd02bc5af05b183781b531e6f041ffd1d320bc2cab7697fd27d0 languageName: node linkType: hard -"@react-types/slider@npm:^3.7.5": - version: 3.7.5 - resolution: "@react-types/slider@npm:3.7.5" +"@react-types/slider@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-types/slider@npm:3.7.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7566c726c2b4a0639130c4bb0730dc66bb17cacdfba39af95fbe64ef30544805ac2eb00af69d2689fc86529a0b7beea544e4c2d7f6fc91f1e3633921d0e9feff + checksum: 10c0/06efeb2076380eafe0ac2b20d72fa4c2072f1dd85346a49388bd7fae76fd78d143c457fd1732c5dbccd34e2e16593d1672a76b51fa986554343319cfc996042e languageName: node linkType: hard -"@react-types/switch@npm:^3.5.5": - version: 3.5.5 - resolution: "@react-types/switch@npm:3.5.5" +"@react-types/switch@npm:^3.5.6": + version: 3.5.6 + resolution: "@react-types/switch@npm:3.5.6" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b7d865c49d213af0048fd36d29991779021c3a6bc9a8e57eabe10f05be42b122c49fc3d2ba287bf3fd33b65fc00442905c9f3784d2524a333c931c782c55e2eb + checksum: 10c0/9c32a3306adf1afd103b3187e01be475f6e3f42391a2fe652312eb5fd89cc83087ceb6b9ea510f9f894593a695cb70ce00063aba6d808f6bc1cbbaa93f47f38b languageName: node linkType: hard -"@react-types/table@npm:^3.10.1": - version: 3.10.1 - resolution: "@react-types/table@npm:3.10.1" +"@react-types/table@npm:^3.10.2": + version: 3.10.2 + resolution: "@react-types/table@npm:3.10.2" dependencies: - "@react-types/grid": "npm:^3.2.8" - "@react-types/shared": "npm:^3.24.1" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1f3d2390f421ed9053816ba40b41744c5168d8f3b926c29d565e5588420a133315f1d2301db16c33ffff5d0689fad014b388385fd5876a7c365873e21b02189d + checksum: 10c0/e25e393192a2d272b5a35a864b566c0f86ad923b5420df37c161d5f8e39b333f0759caaa6e94fb166fadd22ddf07a3da57f57f8e47843ce1f5fc296be305e879 languageName: node linkType: hard -"@react-types/tabs@npm:^3.3.9": - version: 3.3.9 - resolution: "@react-types/tabs@npm:3.3.9" +"@react-types/tabs@npm:^3.3.10": + version: 3.3.10 + resolution: "@react-types/tabs@npm:3.3.10" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/53416d3060c911e3c1416e5fe749cffff5eca30ed1a101bb012b9c89726cea818fd1f16650230410bec0dd7d2626dc1581c53106d7a0660101174a242f6ae458 + checksum: 10c0/f0da42c6334b4b7715bed6c555d6866c03c8c8bbedd014d886c869baa1572b4b14012f1b62a25906ab09061c1d332326c9e56e10ca5278f415918be381a2e544 languageName: node linkType: hard -"@react-types/textfield@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-types/textfield@npm:3.9.6" +"@react-types/textfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/textfield@npm:3.9.7" dependencies: - "@react-types/shared": "npm:^3.24.1" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/3d3744eae4efe7138151373c74df38aecb143a1c745e1ac1479af54273024ed35b55306852b32a941daf6f2b549680cd3f5bdf5fe05086791c2e11d28996a73e + checksum: 10c0/e547b784c295f842f106652ef1ba301c335c05cfe6fc1367c3870d3b0e51eed8e5cd04572d3b1f056fa74f32bb23f4c75d2e821be3729313ff64a9989e4f5ff9 languageName: node linkType: hard -"@react-types/tooltip@npm:^3.4.11": - version: 3.4.11 - resolution: "@react-types/tooltip@npm:3.4.11" +"@react-types/tooltip@npm:^3.4.12": + version: 3.4.12 + resolution: "@react-types/tooltip@npm:3.4.12" dependencies: - "@react-types/overlays": "npm:^3.8.9" - "@react-types/shared": "npm:^3.24.1" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/76bfaeb25c9c06668e85e451bd527e0e15249f025a12fe4c710e8cb4d6ae2643f9fad065729646205c87b7be571c5d8baadb43ab7bc44946dc7e73402aae7f98 + checksum: 10c0/cc1dd4effeddeb768b256537e8b7ed492d77ac10245d936eac0a2d1e202c36a179c194bd50188fdee2c3caaf502dbc3c7861886746a12a1795f5ee26b8935180 languageName: node linkType: hard @@ -7489,129 +8274,143 @@ __metadata: linkType: hard "@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": - version: 5.1.2 - resolution: "@rollup/pluginutils@npm:5.1.2" + version: 5.1.3 + resolution: "@rollup/pluginutils@npm:5.1.3" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" - picomatch: "npm:^2.3.1" + picomatch: "npm:^4.0.2" peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 10c0/30f4a98e91a8699b6666b64ecdc665439bd53dddbe964bbeca56da81ff889cfde3a3e059144b80c5a2d9b48aa158df18a45e9a847a33b757d3e8336b278b8836 + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.4" +"@rollup/rollup-android-arm-eabi@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.27.3" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-android-arm64@npm:4.22.4" +"@rollup/rollup-android-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-android-arm64@npm:4.27.3" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-darwin-arm64@npm:4.22.4" +"@rollup/rollup-darwin-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.27.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-darwin-x64@npm:4.22.4" +"@rollup/rollup-darwin-x64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.27.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4" +"@rollup/rollup-freebsd-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.3" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-freebsd-x64@npm:4.27.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.4" +"@rollup/rollup-linux-arm-musleabihf@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.27.3" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.4" +"@rollup/rollup-linux-arm64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.27.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.4" +"@rollup/rollup-linux-arm64-musl@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.27.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.4" +"@rollup/rollup-linux-riscv64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.27.3" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.4" +"@rollup/rollup-linux-s390x-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.27.3" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.4" +"@rollup/rollup-linux-x64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.27.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.4" +"@rollup/rollup-linux-x64-musl@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.27.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.4" +"@rollup/rollup-win32-arm64-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.27.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.4" +"@rollup/rollup-win32-ia32-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.27.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.4" +"@rollup/rollup-win32-x64-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.27.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7624,12 +8423,12 @@ __metadata: linkType: hard "@safe-global/safe-apps-provider@npm:^0.18.1": - version: 0.18.2 - resolution: "@safe-global/safe-apps-provider@npm:0.18.2" + version: 0.18.4 + resolution: "@safe-global/safe-apps-provider@npm:0.18.4" dependencies: - "@safe-global/safe-apps-sdk": "npm:^9.0.0" + "@safe-global/safe-apps-sdk": "npm:^9.1.0" events: "npm:^3.3.0" - checksum: 10c0/599cc714acdb008d57f341e86298d05dd390ded2622dec8171293cb9877be9d36c2877c930e2b935f2f12eda1e11223fa6aaf277673eaccb471bbae51b652def + checksum: 10c0/612c9816b75b86b73b95b5df35529f4d48da1a3a59b2b999f6ef836b28b10cda2142e159dbc97f0298fa8f5b76df82a1e08e34034fdf12f148e9fd4af2f72134 languageName: node linkType: hard @@ -7643,27 +8442,27 @@ __metadata: languageName: node linkType: hard -"@safe-global/safe-apps-sdk@npm:^9.0.0": - version: 9.0.0 - resolution: "@safe-global/safe-apps-sdk@npm:9.0.0" +"@safe-global/safe-apps-sdk@npm:^9.1.0": + version: 9.1.0 + resolution: "@safe-global/safe-apps-sdk@npm:9.1.0" dependencies: "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" - viem: "npm:^1.6.0" - checksum: 10c0/04f50e68fe8f9fff513b8c5dcf0455c8636b54bb5677a7ff7b96c3d718c948fbc4d5da11112e69da83b811fdfae285d25ad07f88d2111d7e55d68085cb59692e + viem: "npm:^2.1.1" + checksum: 10c0/13af12122a6b1388e7960a76c3c421ea5ed97197646cd1f720b9fc9364fad0cc8f21cda23773130cd6bf57935a36f9e93f5222569cc80382709430b5cad26fda languageName: node linkType: hard "@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": - version: 3.21.1 - resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.21.1" - checksum: 10c0/7eebf7b07d7c8bfc78e9760b119f6623e0343264ac88a366a63db13c24ae9c8691054d2c2ed5bc1e28b4ce6a43b36ce38ec0f80cead478fcae62c7c85f2f0a3f + version: 3.22.2 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.22.2" + checksum: 10c0/4c61c6bc1e720ceb98e7812ef060e40120e130c385f1ac8012a99155179b0651e12f608e053c9e4d1d7917881920e9e3b15c3c90805f9bbb7f28d80b13d04381 languageName: node linkType: hard -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": - version: 1.1.6 - resolution: "@scure/base@npm:1.1.6" - checksum: 10c0/237a46a1f45391fc57719154f14295db936a0b1562ea3e182dd42d7aca082dbb7062a28d6c49af16a7e478b12dae8a0fe678d921ea5056bcc30238d29eb05c55 +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.7, @scure/base@npm:~1.1.8": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 10c0/77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8 languageName: node linkType: hard @@ -7678,6 +8477,28 @@ __metadata: languageName: node linkType: hard +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" + dependencies: + "@noble/curves": "npm:~1.4.0" + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10c0/6849690d49a3bf1d0ffde9452eb16ab83478c1bc0da7b914f873e2930cd5acf972ee81320e3df1963eb247cf57e76d2d975b5f97093d37c0e3f7326581bf41bd + languageName: node + linkType: hard + +"@scure/bip32@npm:1.5.0, @scure/bip32@npm:^1.5.0": + version: 1.5.0 + resolution: "@scure/bip32@npm:1.5.0" + dependencies: + "@noble/curves": "npm:~1.6.0" + "@noble/hashes": "npm:~1.5.0" + "@scure/base": "npm:~1.1.7" + checksum: 10c0/3319beda59e7f129d770cbe49709a2d1742f2deb6989b12e37aa1a47cd128a8c943bdd9286c6a5513ef4539307c4bca8f89f9aa91f294cac4598cbf95fa0c01d + languageName: node + linkType: hard + "@scure/bip39@npm:1.2.1": version: 1.2.1 resolution: "@scure/bip39@npm:1.2.1" @@ -7688,6 +8509,26 @@ __metadata: languageName: node linkType: hard +"@scure/bip39@npm:1.3.0": + version: 1.3.0 + resolution: "@scure/bip39@npm:1.3.0" + dependencies: + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10c0/1ae1545a7384a4d9e33e12d9e9f8824f29b0279eb175b0f0657c0a782c217920054f9a1d28eb316a417dfc6c4e0b700d6fbdc6da160670107426d52fcbe017a8 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.4.0, @scure/bip39@npm:^1.4.0": + version: 1.4.0 + resolution: "@scure/bip39@npm:1.4.0" + dependencies: + "@noble/hashes": "npm:~1.5.0" + "@scure/base": "npm:~1.1.8" + checksum: 10c0/dcdceeac348ed9c0f545c1a7ef8854ef62d6eb4e7b7aaafa4e2ef27f7e1c5744b0cd26292afd04e1ee59ae035b19abdd65174a444b8db8c238ccc662f6b90eac + languageName: node + linkType: hard + "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -7702,38 +8543,6 @@ __metadata: languageName: node linkType: hard -"@solana/buffer-layout@npm:^4.0.1": - version: 4.0.1 - resolution: "@solana/buffer-layout@npm:4.0.1" - dependencies: - buffer: "npm:~6.0.3" - checksum: 10c0/6535f3908cf6dfc405b665795f0c2eaa0482a8c6b1811403945cf7b450e7eb7b40acce3e8af046f2fcc3eea1a15e61d48c418315d813bee4b720d56b00053305 - languageName: node - linkType: hard - -"@solana/web3.js@npm:^1.70.1": - version: 1.91.8 - resolution: "@solana/web3.js@npm:1.91.8" - dependencies: - "@babel/runtime": "npm:^7.24.5" - "@noble/curves": "npm:^1.4.0" - "@noble/hashes": "npm:^1.4.0" - "@solana/buffer-layout": "npm:^4.0.1" - agentkeepalive: "npm:^4.5.0" - bigint-buffer: "npm:^1.1.5" - bn.js: "npm:^5.2.1" - borsh: "npm:^0.7.0" - bs58: "npm:^4.0.1" - buffer: "npm:6.0.3" - fast-stable-stringify: "npm:^1.0.0" - jayson: "npm:^4.1.0" - node-fetch: "npm:^2.7.0" - rpc-websockets: "npm:^7.11.0" - superstruct: "npm:^0.14.2" - checksum: 10c0/fd5178c25c7074631867006647161ac7f0f0f6b71a9720688510fe5e74bdd10f78df26f70096ee59f87bf97b71c81a89cee0aabe7920fce7691da9e6b8262da1 - languageName: node - linkType: hard - "@stablelib/aead@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/aead@npm:1.0.1" @@ -7854,7 +8663,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": +"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": version: 1.0.2 resolution: "@stablelib/random@npm:1.0.2" dependencies: @@ -7893,7 +8702,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/x25519@npm:^1.0.3": +"@stablelib/x25519@npm:1.0.3, @stablelib/x25519@npm:^1.0.3": version: 1.0.3 resolution: "@stablelib/x25519@npm:1.0.3" dependencies: @@ -7905,11 +8714,11 @@ __metadata: linkType: hard "@swc/helpers@npm:^0.5.0": - version: 0.5.8 - resolution: "@swc/helpers@npm:0.5.8" + version: 0.5.15 + resolution: "@swc/helpers@npm:0.5.15" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/53a52b3654edb1b22ab317feb4ab7fa805eb368082530d2835647e5d0cc497f5c3aa8e16d568df6eee301982aac532674345acbaaa45354ffb58043768d4db36 + tslib: "npm:^2.8.0" + checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4 languageName: node linkType: hard @@ -7969,21 +8778,21 @@ __metadata: linkType: hard "@tanstack/react-virtual@npm:^3.0.0-beta.60": - version: 3.10.8 - resolution: "@tanstack/react-virtual@npm:3.10.8" + version: 3.10.9 + resolution: "@tanstack/react-virtual@npm:3.10.9" dependencies: - "@tanstack/virtual-core": "npm:3.10.8" + "@tanstack/virtual-core": "npm:3.10.9" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/b7aec88ef48f604d3e7245b9996ba42f06e6ee2c1a45146cb96814cb3873a4c888bf86d26d10284c847a5ed97e16dc9430c380387abc1231c2e43c00f6ebadff + checksum: 10c0/a854b6fb2bdccec9e581442def5ed6ee568fd2b12178e70450c03d9e60a1e5794be71c4ad3f385af717872c039e569ff88c52adb11a2ddf2c02ded3f83bc851d languageName: node linkType: hard -"@tanstack/virtual-core@npm:3.10.8": - version: 3.10.8 - resolution: "@tanstack/virtual-core@npm:3.10.8" - checksum: 10c0/ddb97cd03d84b343b38a2c14d85e33c788f4af622fccc0fdf997caf4e83e47e8f67b099b854c7dc4337d7662f647625ab3247cd8aa1bc9d4dda701bda83245f6 +"@tanstack/virtual-core@npm:3.10.9": + version: 3.10.9 + resolution: "@tanstack/virtual-core@npm:3.10.9" + checksum: 10c0/960cde330235daff5403e0da23837ac30a0f95a02c8866692f8382d03b675d6802e129436b0b3e7e737d8a5347ef2cadec448ba4c0878462228c094440d0207b languageName: node linkType: hard @@ -8027,15 +8836,14 @@ __metadata: linkType: hard "@terra-money/station-connector@npm:^1.1.0": - version: 1.1.0 - resolution: "@terra-money/station-connector@npm:1.1.0" + version: 1.1.4 + resolution: "@terra-money/station-connector@npm:1.1.4" dependencies: bech32: "npm:^2.0.0" peerDependencies: "@cosmjs/amino": ^0.31.0 - "@terra-money/feather.js": ^3.0.0-beta.1 axios: ^0.27.2 - checksum: 10c0/9749876044357bc0f28ceeb15a1535b8201e6fa3eb09e95c0374ecba04b87d85388a4d5c491b2a89cc3b02ad24c8fa055e69240ae937c16f5bee196416263898 + checksum: 10c0/34c3b5ed099ca79394d4f37fbf4275b3b3c047420f005a3999b685a1c2ba985947713a9a91a0dbe2cafd32d205491074ad6610c6cf6aa88beb0c0ae63c25b3b4 languageName: node linkType: hard @@ -8134,20 +8942,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 10c0/033abcb2f4c084ad33e30c3efaad82161240f351e3c71b6154ed289946b33b363696c0fbd42502b68e4582a87413c418321f40eb1ea863e34fe525641345e05b - languageName: node - linkType: hard - -"@types/connect@npm:^3.4.33": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 languageName: node linkType: hard @@ -8160,7 +8959,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a @@ -8174,13 +8973,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d - languageName: node - linkType: hard - "@types/fs-extra@npm:^11": version: 11.0.4 resolution: "@types/fs-extra@npm:11.0.4" @@ -8230,12 +9022,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:20.16.8, @types/node@npm:>=13.7.0": - version: 20.16.8 - resolution: "@types/node@npm:20.16.8" +"@types/node@npm:*, @types/node@npm:>=13.7.0, @types/node@npm:^22.9.0": + version: 22.9.1 + resolution: "@types/node@npm:22.9.1" dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/3b3bd96885cbbe49e5f701be91f9a69b904a60b23fd4812083b053a802a03e38227919ff800aff2961fd11147b471a1a4fc09f1df171f372698f16d39859aebf + undici-types: "npm:~6.19.8" + checksum: 10c0/ea489ae603aa8874e4e88980aab6f2dad09c755da779c88dd142983bfe9609803c89415ca7781f723072934066f63daf2b3339ef084a8ad1a8079cf3958be243 languageName: node linkType: hard @@ -8246,19 +9038,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^12.12.54": - version: 12.20.55 - resolution: "@types/node@npm:12.20.55" - checksum: 10c0/3b190bb0410047d489c49bbaab592d2e6630de6a50f00ba3d7d513d59401d279972a8f5a598b5bb8ddc1702f8a2f4ec57a65d93852f9c329639738e7053637d1 - languageName: node - linkType: hard - -"@types/node@npm:^22.9.0": - version: 22.9.0 - resolution: "@types/node@npm:22.9.0" +"@types/node@npm:20.16.8": + version: 20.16.8 + resolution: "@types/node@npm:20.16.8" dependencies: - undici-types: "npm:~6.19.8" - checksum: 10c0/3f46cbe0a49bab4ba30494025e4c8a6e699b98ac922857aa1f0209ce11a1313ee46e6808b8f13fe5b8b960a9d7796b77c8d542ad4e9810e85ef897d5593b5d51 + undici-types: "npm:~6.19.2" + checksum: 10c0/3b3bd96885cbbe49e5f701be91f9a69b904a60b23fd4812083b053a802a03e38227919ff800aff2961fd11147b471a1a4fc09f1df171f372698f16d39859aebf languageName: node linkType: hard @@ -8270,21 +9055,21 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.2.19": - version: 18.3.0 - resolution: "@types/react-dom@npm:18.3.0" + version: 18.3.1 + resolution: "@types/react-dom@npm:18.3.1" dependencies: "@types/react": "npm:*" - checksum: 10c0/6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b + checksum: 10c0/8b416551c60bb6bd8ec10e198c957910cfb271bc3922463040b0d57cf4739cdcd24b13224f8d68f10318926e1ec3cd69af0af79f0291b599a992f8c80d47f1eb languageName: node linkType: hard "@types/react@npm:*, @types/react@npm:^18.2.56": - version: 18.3.9 - resolution: "@types/react@npm:18.3.9" + version: 18.3.12 + resolution: "@types/react@npm:18.3.12" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/a92b8e061d0c833e096254782c56a802316593f4a907fb834b557cabe848a0829b9eb6056404ea239eb4d5ec5ac7b7724309761516c0a7a277916fa04dd4f805 + checksum: 10c0/8bae8d9a41619804561574792e29112b413044eb0d53746dde2b9720c1f9a59f71c895bbd7987cd8ce9500b00786e53bc032dced38cddf42910458e145675290 languageName: node linkType: hard @@ -8319,18 +9104,9 @@ __metadata: linkType: hard "@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/unist@npm:3.0.2" - checksum: 10c0/39f220ce184a773c55c18a127062bfc4d0d30c987250cd59bab544d97be6cfec93717a49ef96e81f024b575718f798d4d329eb81c452fc57d6d051af8b043ebf - languageName: node - linkType: hard - -"@types/ws@npm:^7.4.4": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/f1f53febd8623a85cef2652949acd19d83967e350ea15a851593e3033501750a1e04f418552e487db90a3d48611a1cff3ffcf139b94190c10f2fd1e1dc95ff10 + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 languageName: node linkType: hard @@ -8498,8 +9274,8 @@ __metadata: linkType: hard "@vanilla-extract/css@npm:^1.14.1": - version: 1.15.5 - resolution: "@vanilla-extract/css@npm:1.15.5" + version: 1.16.0 + resolution: "@vanilla-extract/css@npm:1.16.0" dependencies: "@emotion/hash": "npm:^0.9.0" "@vanilla-extract/private": "npm:^1.0.6" @@ -8513,7 +9289,7 @@ __metadata: media-query-parser: "npm:^2.0.2" modern-ahocorasick: "npm:^1.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/85b8c710b5fbc7ac73494e97be152327ff52a81397ca424622df126cd664638127ba67ada9cddb9a80a57be3f732da382d538a346675e9c497d6b71d60c57555 + checksum: 10c0/f25de438e400f18b128b29ba954d646173b8c98cc2cb5c1358a4f3e020646e8e7b9d8c4b236e00f8f1ea4eed6e62b758369e8e19836890182b5d07c703ddb150 languageName: node linkType: hard @@ -8588,17 +9364,17 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^4.2.1": - version: 4.2.1 - resolution: "@vitejs/plugin-react@npm:4.2.1" + version: 4.3.3 + resolution: "@vitejs/plugin-react@npm:4.3.3" dependencies: - "@babel/core": "npm:^7.23.5" - "@babel/plugin-transform-react-jsx-self": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx-source": "npm:^7.23.3" + "@babel/core": "npm:^7.25.2" + "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.14.0" + react-refresh: "npm:^0.14.2" peerDependencies: vite: ^4.2.0 || ^5.0.0 - checksum: 10c0/de1eec44d703f32e5b58e776328ca20793657fe991835d15b290230b19a2a08be5d31501d424279ae13ecfed28044c117b69d746891c8d9b92c69e8a8907e989 + checksum: 10c0/b370c25fb47bb96f0cc51f3aadbbcfce54e40f95a4de67cf932e5ec526f139648da703725c6ea2c71a1b525eb3dd6e3e8ff877da143627cd2575de5ec4f00aa3 languageName: node linkType: hard @@ -8667,28 +9443,28 @@ __metadata: languageName: node linkType: hard -"@walletconnect/core@npm:2.11.3": - version: 2.11.3 - resolution: "@walletconnect/core@npm:2.11.3" +"@walletconnect/core@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/core@npm:2.17.2" dependencies: - "@walletconnect/heartbeat": "npm:1.2.1" - "@walletconnect/jsonrpc-provider": "npm:1.0.13" - "@walletconnect/jsonrpc-types": "npm:1.0.3" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/jsonrpc-ws-connection": "npm:1.0.14" - "@walletconnect/keyvaluestorage": "npm:^1.1.1" - "@walletconnect/logger": "npm:^2.0.1" - "@walletconnect/relay-api": "npm:^1.0.9" - "@walletconnect/relay-auth": "npm:^1.0.4" - "@walletconnect/safe-json": "npm:^1.0.2" - "@walletconnect/time": "npm:^1.0.2" - "@walletconnect/types": "npm:2.11.3" - "@walletconnect/utils": "npm:2.11.3" - events: "npm:^3.3.0" - isomorphic-unfetch: "npm:3.1.0" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" + "@walletconnect/window-getters": "npm:1.0.1" + events: "npm:3.3.0" lodash.isequal: "npm:4.5.0" - uint8arrays: "npm:^3.1.0" - checksum: 10c0/364a793f35f758d5fa2be32b9456d6c4fcc7bf980db5d67bd5547a44f86ff8d1cb83a06dffee316a7d0b218cf08814bcdf59140e3d0c83b3608b4dcd71c881fd + uint8arrays: "npm:3.1.0" + checksum: 10c0/6124b81892a4e5e9350cfff22a7ce3a23a66c9589221411bd8bfd411fc392b6b343fae1634b32000d4275ba11b1a0f732cf6b7ba5da35b388854c7e7b4f2764d languageName: node linkType: hard @@ -8744,7 +9520,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/events@npm:^1.0.1": +"@walletconnect/events@npm:1.0.1, @walletconnect/events@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/events@npm:1.0.1" dependencies: @@ -8765,6 +9541,17 @@ __metadata: languageName: node linkType: hard +"@walletconnect/heartbeat@npm:1.2.2": + version: 1.2.2 + resolution: "@walletconnect/heartbeat@npm:1.2.2" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + events: "npm:^3.3.0" + checksum: 10c0/a97b07764c397fe3cd26e8ea4233ecc8a26049624df7edc05290d286266bc5ba1de740d12c50dc1b7e8605198c5974e34e2d5318087bd4e9db246e7b273f4592 + languageName: node + linkType: hard + "@walletconnect/jsonrpc-http-connection@npm:^1.0.4, @walletconnect/jsonrpc-http-connection@npm:^1.0.7": version: 1.0.8 resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.8" @@ -8788,7 +9575,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": +"@walletconnect/jsonrpc-provider@npm:1.0.14, @walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": version: 1.0.14 resolution: "@walletconnect/jsonrpc-provider@npm:1.0.14" dependencies: @@ -8799,7 +9586,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": +"@walletconnect/jsonrpc-types@npm:1.0.3": version: 1.0.3 resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" dependencies: @@ -8809,6 +9596,16 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-types@npm:1.0.4, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.4 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.4" + dependencies: + events: "npm:^3.3.0" + keyvaluestorage-interface: "npm:^1.0.0" + checksum: 10c0/752978685b0596a4ba02e1b689d23873e464460e4f376c97ef63e6b3ab273658ca062de2bfcaa8a498d31db0c98be98c8bbfbe5142b256a4b3ef425e1707f353 + languageName: node + linkType: hard + "@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.4, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": version: 1.0.8 resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" @@ -8832,7 +9629,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/keyvaluestorage@npm:^1.0.2, @walletconnect/keyvaluestorage@npm:^1.1.1": +"@walletconnect/keyvaluestorage@npm:1.1.1, @walletconnect/keyvaluestorage@npm:^1.0.2, @walletconnect/keyvaluestorage@npm:^1.1.1": version: 1.1.1 resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" dependencies: @@ -8918,13 +9715,13 @@ __metadata: languageName: node linkType: hard -"@walletconnect/logger@npm:^2.0.1": - version: 2.0.1 - resolution: "@walletconnect/logger@npm:2.0.1" +"@walletconnect/logger@npm:2.1.2, @walletconnect/logger@npm:^2.0.1": + version: 2.1.2 + resolution: "@walletconnect/logger@npm:2.1.2" dependencies: + "@walletconnect/safe-json": "npm:^1.0.2" pino: "npm:7.11.0" - tslib: "npm:1.14.1" - checksum: 10c0/1778686f608f03bc8a67fb560a2694e8aef74b392811508e98cc158d1839a1bb0a0256eb2ed719c4ee17e65a11543ddc4f9059d3bdd5dddcca6359ba1bab18bd + checksum: 10c0/c66e835d33f737f48d6269f151650f6d7bb85bd8b59580fb8116f94d460773820968026e666ddf4a1753f28fceb3c54aae8230a445108a116077cb13a293842f languageName: node linkType: hard @@ -8937,6 +9734,15 @@ __metadata: languageName: node linkType: hard +"@walletconnect/modal-core@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-core@npm:2.7.0" + dependencies: + valtio: "npm:1.11.2" + checksum: 10c0/84b11735c005e37e661aa0f08b2e8c8098db3b2cacd957c4a73f4d3de11b2d5e04dd97ab970f8d22fc3e8269fea3297b9487e177343bbab8dd69b3b917fb7f60 + languageName: node + linkType: hard + "@walletconnect/modal-ui@npm:2.6.2": version: 2.6.2 resolution: "@walletconnect/modal-ui@npm:2.6.2" @@ -8949,7 +9755,19 @@ __metadata: languageName: node linkType: hard -"@walletconnect/modal@npm:2.6.2, @walletconnect/modal@npm:^2.4.3": +"@walletconnect/modal-ui@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-ui@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + lit: "npm:2.8.0" + motion: "npm:10.16.2" + qrcode: "npm:1.5.3" + checksum: 10c0/b717f1fc9854b7d14a4364720fce2d44167f547533340704644ed2fdf9d861b3798ffd19a3b51062a366a8bc39f84b9a8bb3dd04e9e33da742192359be00b051 + languageName: node + linkType: hard + +"@walletconnect/modal@npm:2.6.2": version: 2.6.2 resolution: "@walletconnect/modal@npm:2.6.2" dependencies: @@ -8959,6 +9777,16 @@ __metadata: languageName: node linkType: hard +"@walletconnect/modal@npm:^2.4.3": + version: 2.7.0 + resolution: "@walletconnect/modal@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + "@walletconnect/modal-ui": "npm:2.7.0" + checksum: 10c0/2f3074eebbca41a46e29680dc2565bc762133508774f05db0075a82b0b66ecc8defca40a94ad63669676090a7e3ef671804592b10e91636ab1cdeac014a1eb11 + languageName: node + linkType: hard + "@walletconnect/randombytes@npm:^1.0.3": version: 1.0.3 resolution: "@walletconnect/randombytes@npm:1.0.3" @@ -8971,17 +9799,16 @@ __metadata: languageName: node linkType: hard -"@walletconnect/relay-api@npm:^1.0.9": - version: 1.0.9 - resolution: "@walletconnect/relay-api@npm:1.0.9" +"@walletconnect/relay-api@npm:1.0.11, @walletconnect/relay-api@npm:^1.0.9": + version: 1.0.11 + resolution: "@walletconnect/relay-api@npm:1.0.11" dependencies: "@walletconnect/jsonrpc-types": "npm:^1.0.2" - tslib: "npm:1.14.1" - checksum: 10c0/e5994c63619b89cae45428108857389536f3c7e43a92f324a8ef305f351cf125dcfafeb9c480f23798c162ca2cad7b8f91828bae28a84cf869c3e7ee1dcca9dd + checksum: 10c0/2595d7e68d3a93e7735e0b6204811762898b0ce1466e811d78be5bcec7ac1cde5381637615a99104099165bf63695da5ef9381d6ded29924a57a71b10712a91d languageName: node linkType: hard -"@walletconnect/relay-auth@npm:^1.0.4": +"@walletconnect/relay-auth@npm:1.0.4, @walletconnect/relay-auth@npm:^1.0.4": version: 1.0.4 resolution: "@walletconnect/relay-auth@npm:1.0.4" dependencies: @@ -8995,7 +9822,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": +"@walletconnect/safe-json@npm:1.0.2, @walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": version: 1.0.2 resolution: "@walletconnect/safe-json@npm:1.0.2" dependencies: @@ -9022,23 +9849,23 @@ __metadata: linkType: hard "@walletconnect/sign-client@npm:^2.9.0": - version: 2.11.3 - resolution: "@walletconnect/sign-client@npm:2.11.3" + version: 2.17.2 + resolution: "@walletconnect/sign-client@npm:2.17.2" dependencies: - "@walletconnect/core": "npm:2.11.3" - "@walletconnect/events": "npm:^1.0.1" - "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/core": "npm:2.17.2" + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-utils": "npm:1.0.8" - "@walletconnect/logger": "npm:^2.0.1" - "@walletconnect/time": "npm:^1.0.2" - "@walletconnect/types": "npm:2.11.3" - "@walletconnect/utils": "npm:2.11.3" - events: "npm:^3.3.0" - checksum: 10c0/6d8c24d7c75d0664fcb7b536f61d75c5ec041fee16fb0a7ea02b2ae920ae4e3dab2d207948b436d2e2b3c5487791d3664046e356994dea095181a7b9a9b319e3 + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" + events: "npm:3.3.0" + checksum: 10c0/0acbda4ea34be209b1436134804e72641ca377e2bb6823b7d94177b30e50b8e6de28dfdad6ff64dac61a1305e7b6f281df2357488382c88e440a79b817d377a8 languageName: node linkType: hard -"@walletconnect/time@npm:^1.0.2": +"@walletconnect/time@npm:1.0.2, @walletconnect/time@npm:^1.0.2": version: 1.0.2 resolution: "@walletconnect/time@npm:1.0.2" dependencies: @@ -9089,17 +9916,17 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.11.3": - version: 2.11.3 - resolution: "@walletconnect/types@npm:2.11.3" +"@walletconnect/types@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/types@npm:2.17.2" dependencies: - "@walletconnect/events": "npm:^1.0.1" - "@walletconnect/heartbeat": "npm:1.2.1" - "@walletconnect/jsonrpc-types": "npm:1.0.3" - "@walletconnect/keyvaluestorage": "npm:^1.1.1" - "@walletconnect/logger": "npm:^2.0.1" - events: "npm:^3.3.0" - checksum: 10c0/3e53ea10e9da801a9062be214c1ad3c927cceb5a80b2dc045685c75f091a6ce6fdb38554d16f09178731180a17818960f8706ffbecb6747dd6068264a3ea1409 + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + events: "npm:3.3.0" + checksum: 10c0/95bd3e4f4f2ef181ea69691800a0a06be2c4fa900ae972539851c5817a0f01b4ba9f381161d044df4db004f431bc416548ec6eca0ac523fc1fb06014386accac languageName: node linkType: hard @@ -9164,29 +9991,35 @@ __metadata: languageName: node linkType: hard -"@walletconnect/utils@npm:2.11.3, @walletconnect/utils@npm:^2.9.0": - version: 2.11.3 - resolution: "@walletconnect/utils@npm:2.11.3" +"@walletconnect/utils@npm:2.17.2, @walletconnect/utils@npm:^2.9.0": + version: 2.17.2 + resolution: "@walletconnect/utils@npm:2.17.2" dependencies: + "@ethersproject/hash": "npm:5.7.0" + "@ethersproject/transactions": "npm:5.7.0" "@stablelib/chacha20poly1305": "npm:1.0.1" "@stablelib/hkdf": "npm:1.0.1" - "@stablelib/random": "npm:^1.0.2" + "@stablelib/random": "npm:1.0.2" "@stablelib/sha256": "npm:1.0.1" - "@stablelib/x25519": "npm:^1.0.3" - "@walletconnect/relay-api": "npm:^1.0.9" - "@walletconnect/safe-json": "npm:^1.0.2" - "@walletconnect/time": "npm:^1.0.2" - "@walletconnect/types": "npm:2.11.3" - "@walletconnect/window-getters": "npm:^1.0.1" - "@walletconnect/window-metadata": "npm:^1.0.1" + "@stablelib/x25519": "npm:1.0.3" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/window-getters": "npm:1.0.1" + "@walletconnect/window-metadata": "npm:1.0.1" detect-browser: "npm:5.3.0" + elliptic: "npm:6.6.0" query-string: "npm:7.1.3" - uint8arrays: "npm:^3.1.0" - checksum: 10c0/0050c38bbb47b267fe79f5b60052e7053796f997a50d4adc609d0bb0d67adb1e2525ba96ddfacdfe7573746d8f265c7a3cfeb87a1112b97d16ecde839b9dbf8e + uint8arrays: "npm:3.1.0" + checksum: 10c0/b44c0025be12301a28715a204c037328eae4fa432f0ee1730da08b3b6583e07aeaf59efd9dcc52209f6a61b50b31c84e555028b97067dfdf9f5efe1211378fc8 languageName: node linkType: hard -"@walletconnect/window-getters@npm:^1.0.1": +"@walletconnect/window-getters@npm:1.0.1, @walletconnect/window-getters@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/window-getters@npm:1.0.1" dependencies: @@ -9195,7 +10028,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/window-metadata@npm:^1.0.1": +"@walletconnect/window-metadata@npm:1.0.1, @walletconnect/window-metadata@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/window-metadata@npm:1.0.1" dependencies: @@ -9205,18 +10038,6 @@ __metadata: languageName: node linkType: hard -"JSONStream@npm:^1.3.5": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: "npm:^1.2.0" - through: "npm:>=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 10c0/0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 - languageName: node - linkType: hard - "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -9252,12 +10073,27 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.9.0": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" +"abitype@npm:1.0.6, abitype@npm:^1.0.6": + version: 1.0.6 + resolution: "abitype@npm:1.0.6" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 10c0/30ca97010bbf34b9aaed401858eeb6bc30419f7ff11eb34adcb243522dd56c9d8a9d3d406aa5d4f60a7c263902f5136043005698e3f073ea882a4922d43a2929 + languageName: node + linkType: hard + +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" peerDependencies: acorn: ^8 - checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d languageName: node linkType: hard @@ -9279,12 +10115,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 languageName: node linkType: hard @@ -9311,15 +10147,6 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.5.0": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: "npm:^1.2.1" - checksum: 10c0/394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 - languageName: node - linkType: hard - "aggregate-error@npm:3.0.0": version: 3.0.0 resolution: "aggregate-error@npm:3.0.0" @@ -9382,42 +10209,42 @@ __metadata: linkType: hard "agoric@npm:^0.22.0-u17.1": - version: 0.22.0-upgrade-17-dev-ec448b0.0 - resolution: "agoric@npm:0.22.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/access-token": "npm:0.4.22-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cache": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/casting": "npm:0.4.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/governance": "npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/inter-protocol": "npm:0.17.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/smart-wallet": "npm:0.5.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" + version: 0.22.0-upgrade-18-dev-bf39b10.0 + resolution: "agoric@npm:0.22.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/access-token": "npm:0.4.22-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/cache": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/cosmic-proto": "npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/inter-protocol": "npm:0.17.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/network": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/smart-wallet": "npm:0.5.4-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" "@confio/relayer": "npm:^0.11.3" "@cosmjs/crypto": "npm:^0.32.3" "@cosmjs/encoding": "npm:^0.32.3" "@cosmjs/math": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" "@cosmjs/stargate": "npm:^0.32.3" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/zip": "npm:^1.0.7" + "@endo/bundle-source": "npm:^3.4.2" + "@endo/captp": "npm:^4.4.2" + "@endo/compartment-mapper": "npm:^1.3.1" + "@endo/env-options": "npm:^1.1.7" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + "@endo/zip": "npm:^1.0.8" "@iarna/toml": "npm:^2.2.3" anylogger: "npm:^0.21.0" chalk: "npm:^5.2.0" @@ -9431,7 +10258,7 @@ __metadata: bin: agops: src/bin-agops.js agoric: src/entrypoint.js - checksum: 10c0/d1c65f1179134b156fb41c89812766a39feb4b3b17fe3f4267599c514cc4a64b5035123cc78ac0893443f30dee4eb0880f2f040651c3600776c51604dc6ca5a2 + checksum: 10c0/52e7a996a47d43ca9d529f632b05207f8b9b22a99e41f2c17e2f0fbac905b5a9d6bdf47c4a0a8b8f274be384156f29161bd9fd921f4d0395f99f101b93f3c5a8 languageName: node linkType: hard @@ -9467,14 +10294,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.1": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - fast-deep-equal: "npm:^3.1.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 languageName: node linkType: hard @@ -9502,18 +10329,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc languageName: node linkType: hard @@ -9585,12 +10403,10 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 +"aria-query@npm:^5.3.0, aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e languageName: node linkType: hard @@ -9611,7 +10427,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -9748,9 +10564,9 @@ __metadata: linkType: hard "async@npm:^3.1.0": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 10c0/1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 languageName: node linkType: hard @@ -9769,20 +10585,20 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.17": - version: 10.4.19 - resolution: "autoprefixer@npm:10.4.19" + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" dependencies: - browserslist: "npm:^4.23.0" - caniuse-lite: "npm:^1.0.30001599" + browserslist: "npm:^4.23.3" + caniuse-lite: "npm:^1.0.30001646" fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" + picocolors: "npm:^1.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10c0/fe0178eb8b1da4f15c6535cd329926609b22d1811e047371dccce50563623f8075dd06fb167daff059e4228da651b0bdff6d9b44281541eaf0ce0b79125bfd19 + checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 languageName: node linkType: hard @@ -9853,21 +10669,21 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:=4.7.0": - version: 4.7.0 - resolution: "axe-core@npm:4.7.0" - checksum: 10c0/89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba +"axe-core@npm:^4.10.0": + version: 4.10.2 + resolution: "axe-core@npm:4.10.2" + checksum: 10c0/0e20169077de96946a547fce0df39d9aeebe0077f9d3eeff4896518b96fde857f80b98f0d4279274a7178791744dd5a54bb4f322de45b4f561ffa2586ff9a09d languageName: node linkType: hard "axios-retry@npm:^4.0.0": - version: 4.1.0 - resolution: "axios-retry@npm:4.1.0" + version: 4.5.0 + resolution: "axios-retry@npm:4.5.0" dependencies: is-retry-allowed: "npm:^2.2.0" peerDependencies: axios: 0.x || 1.x - checksum: 10c0/381ae8b03f2edf444e426a4be3c94e31b0b66c45bac30ce0dcf3aff48d9f2ed9607c826fa32d4a8cf0d40ae0cb9369449bb69837abe478d8821ce3375f34d73a + checksum: 10c0/574e7b1bf24aad99b560042d232a932d51bfaa29b5a6d4612d748ed799a6f11a5afb2582792492c55d95842200cbdfbe3454027a8c1b9a2d3e895d13c3d03c10 languageName: node linkType: hard @@ -9893,12 +10709,10 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^3.2.1": - version: 3.2.1 - resolution: "axobject-query@npm:3.2.1" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/f7debc2012e456139b57d888c223f6d3cb4b61eb104164a85e3d346273dd6ef0bc9a04b6660ca9407704a14a8e05fa6b6eb9d55f44f348c7210de7ffb350c3a7 +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 languageName: node linkType: hard @@ -9910,11 +10724,11 @@ __metadata: linkType: hard "base-x@npm:^3.0.2": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" + version: 3.0.10 + resolution: "base-x@npm:3.0.10" dependencies: safe-buffer: "npm:^5.0.1" - checksum: 10c0/e6bbeae30b24f748b546005affb710c5fbc8b11a83f6cd0ca999bd1ab7ad3a22e42888addc40cd145adc4edfe62fcfab4ebc91da22e4259aae441f95a77aee1a + checksum: 10c0/a13a34b71439ee5381667efa630b3bf640cf17f632c5ba01990483367592e72f247d7fb4f8c6d0e3ff8c0fb7224b3ac682ff5be09b87063a45b3968f0457e563 languageName: node linkType: hard @@ -9975,16 +10789,6 @@ __metadata: languageName: node linkType: hard -"bigint-buffer@npm:^1.1.5": - version: 1.1.5 - resolution: "bigint-buffer@npm:1.1.5" - dependencies: - bindings: "npm:^1.3.0" - node-gyp: "npm:latest" - checksum: 10c0/aa41e53d38242a2f05f85b08eaf592635f92e5328822784cda518232b1644efdbf29ab3664951b174cc645848add4605488e25c9439bcc749660c885b4ff6118 - languageName: node - linkType: hard - "bignumber.js@npm:*, bignumber.js@npm:9.1.2, bignumber.js@npm:^9.1.1, bignumber.js@npm:^9.1.2": version: 9.1.2 resolution: "bignumber.js@npm:9.1.2" @@ -10013,13 +10817,6 @@ __metadata: languageName: node linkType: hard -"bind-decorator@npm:^1.0.11": - version: 1.0.11 - resolution: "bind-decorator@npm:1.0.11" - checksum: 10c0/265f1d5cc110075898b0c5f671bb06a05fb3193ee8899e4b66d48bc620248918cf24b14f798cf230ef717063458dc306dbf801268c45989f8546299a541a60fe - languageName: node - linkType: hard - "bindings@npm:^1.3.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -10086,30 +10883,19 @@ __metadata: linkType: hard "bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: 10c0/b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 languageName: node linkType: hard -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": +"bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": version: 5.2.1 resolution: "bn.js@npm:5.2.1" checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa languageName: node linkType: hard -"borsh@npm:^0.7.0": - version: 0.7.0 - resolution: "borsh@npm:0.7.0" - dependencies: - bn.js: "npm:^5.2.0" - bs58: "npm:^4.0.0" - text-encoding-utf-8: "npm:^1.0.2" - checksum: 10c0/513b3e51823d2bf5be77cec27742419d2b0427504825dd7ceb00dedb820f246a4762f04b83d5e3aa39c8e075b3cbaeb7ca3c90bd1cbeecccb4a510575be8c581 - languageName: node - linkType: hard - "bowser@npm:2.11.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" @@ -10136,12 +10922,12 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 languageName: node linkType: hard @@ -10173,7 +10959,7 @@ __metadata: languageName: node linkType: hard -"browserify-cipher@npm:^1.0.0": +"browserify-cipher@npm:^1.0.1": version: 1.0.1 resolution: "browserify-cipher@npm:1.0.1" dependencies: @@ -10197,16 +10983,17 @@ __metadata: linkType: hard "browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" + version: 4.1.1 + resolution: "browserify-rsa@npm:4.1.1" dependencies: - bn.js: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a + bn.js: "npm:^5.2.1" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0 languageName: node linkType: hard -"browserify-sign@npm:^4.0.0": +"browserify-sign@npm:^4.2.3": version: 4.2.3 resolution: "browserify-sign@npm:4.2.3" dependencies: @@ -10224,21 +11011,21 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.0, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + caniuse-lite: "npm:^1.0.30001669" + electron-to-chromium: "npm:^1.5.41" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + checksum: 10c0/d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a languageName: node linkType: hard -"bs58@npm:^4.0.0, bs58@npm:^4.0.1": +"bs58@npm:^4.0.0": version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: @@ -10265,16 +11052,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.2.1" - checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 - languageName: node - linkType: hard - "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -10285,7 +11062,17 @@ __metadata: languageName: node linkType: hard -"bufferutil@npm:^4.0.1, bufferutil@npm:^4.0.3": +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + +"bufferutil@npm:^4.0.3": version: 4.0.8 resolution: "bufferutil@npm:4.0.8" dependencies: @@ -10343,9 +11130,9 @@ __metadata: linkType: hard "callsites@npm:^4.0.0": - version: 4.1.0 - resolution: "callsites@npm:4.1.0" - checksum: 10c0/91700844127a6dcd4792d231a12dd8e9ec10525eb9962180a8558417d7e3f443e52a4f14746ad2838eaf14f79431ee1539d13bd188da280f720a06a91bd1157a + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 languageName: node linkType: hard @@ -10363,10 +11150,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": - version: 1.0.30001605 - resolution: "caniuse-lite@npm:1.0.30001605" - checksum: 10c0/ceb96a0ecfdaee6510c00aebaaa63db20aaeafab03450d4e3b214e009cb632f87385a70c299cdd1ca4c17e1473883d8fa2051c5b2d083a454338c0c779b25cbc +"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001680 + resolution: "caniuse-lite@npm:1.0.30001680" + checksum: 10c0/11a4e7f6f5d5f965cfd4b7dc4aef34e12a26e99647f02b5ac9fd7f7670845473b95ada416a785473237e4b1b67281f7b043c8736c85b77097f6b697e8950b15f languageName: node linkType: hard @@ -10389,18 +11176,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -10486,12 +11262,12 @@ __metadata: linkType: hard "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" + version: 1.0.5 + resolution: "cipher-base@npm:1.0.5" dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/064a7f9323ba5416c8f4ab98bd0fca7234f05b39b0784b8131429e84ac5c735e7fc9f87e2bd39b278a0121d833ca20fa9f5b4dd11fbe289191e7d29471bb3f5b languageName: node linkType: hard @@ -10505,9 +11281,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.2.2": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 10c0/0de9a9c3fad03a46804c0d38e7b712fb282584a9c7ef1ed44cae22fb71d9bb600309d66a9711ac36a596fd03422f5bb03e021e8f369c12a39fa1786ae531baab + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc languageName: node linkType: hard @@ -10612,7 +11388,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.1.0, clsx@npm:^1.2.1": +"clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 @@ -10635,7 +11411,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": +"color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -10727,13 +11503,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.3": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -10785,6 +11554,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + "confusing-browser-globals@npm:^1.0.10": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" @@ -10813,10 +11589,10 @@ __metadata: languageName: node linkType: hard -"cookie-es@npm:^1.0.0": - version: 1.1.0 - resolution: "cookie-es@npm:1.1.0" - checksum: 10c0/27f1057b05eb42dca539a80cf45b8f9d5bacf35482690d756025447810dcd669e0cd13952a063a43e47a4e6fd7400745defedc97479a4254019f0bdb5c200341 +"cookie-es@npm:^1.2.2": + version: 1.2.2 + resolution: "cookie-es@npm:1.2.2" + checksum: 10c0/210eb67cd40a53986fda99d6f47118cfc45a69c4abc03490d15ab1b83ac978d5518356aecdd7a7a4969292445e3063c2302deda4c73706a67edc008127608638 languageName: node linkType: hard @@ -10864,34 +11640,43 @@ __metadata: linkType: hard "cosmos-kit@npm:^2.19.0": - version: 2.19.0 - resolution: "cosmos-kit@npm:2.19.0" - dependencies: - "@cosmos-kit/cdcwallet": "npm:^2.13.2" - "@cosmos-kit/coin98": "npm:^2.11.2" - "@cosmos-kit/compass": "npm:^2.11.2" - "@cosmos-kit/cosmostation": "npm:^2.12.0" - "@cosmos-kit/exodus": "npm:^2.10.2" - "@cosmos-kit/fin": "npm:^2.11.2" - "@cosmos-kit/frontier": "npm:^2.10.2" - "@cosmos-kit/galaxy-station": "npm:^2.10.2" - "@cosmos-kit/keplr": "npm:^2.12.2" - "@cosmos-kit/leap": "npm:^2.12.2" - "@cosmos-kit/ledger": "npm:^2.11.2" - "@cosmos-kit/okxwallet-extension": "npm:^2.11.2" - "@cosmos-kit/omni": "npm:^2.10.2" - "@cosmos-kit/owallet": "npm:^2.11.2" - "@cosmos-kit/shell": "npm:^2.11.2" - "@cosmos-kit/station": "npm:^2.10.2" - "@cosmos-kit/tailwind": "npm:^1.5.2" - "@cosmos-kit/trust": "npm:^2.11.2" - "@cosmos-kit/vectis": "npm:^2.11.2" - "@cosmos-kit/xdefi": "npm:^2.10.2" - checksum: 10c0/caa14c1c2cf0cde555e7296fc2b463d4c4183d7ee5d9c834c48e5b6399227229e343cc4ea66d722ae64b15ebc1e13d45559f695674b579f937eeb7004167170e - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.0": + version: 2.21.1 + resolution: "cosmos-kit@npm:2.21.1" + dependencies: + "@cosmos-kit/cdcwallet": "npm:^2.15.1" + "@cosmos-kit/coin98": "npm:^2.13.1" + "@cosmos-kit/compass": "npm:^2.13.1" + "@cosmos-kit/cosmostation": "npm:^2.14.0" + "@cosmos-kit/exodus": "npm:^2.12.0" + "@cosmos-kit/fin": "npm:^2.13.1" + "@cosmos-kit/frontier": "npm:^2.12.0" + "@cosmos-kit/galaxy-station": "npm:^2.12.0" + "@cosmos-kit/keplr": "npm:^2.14.1" + "@cosmos-kit/leap": "npm:^2.14.1" + "@cosmos-kit/ledger": "npm:^2.13.0" + "@cosmos-kit/okxwallet-extension": "npm:^2.13.0" + "@cosmos-kit/omni": "npm:^2.12.0" + "@cosmos-kit/owallet": "npm:^2.13.1" + "@cosmos-kit/shell": "npm:^2.13.1" + "@cosmos-kit/station": "npm:^2.12.0" + "@cosmos-kit/tailwind": "npm:^1.7.0" + "@cosmos-kit/trust": "npm:^2.13.0" + "@cosmos-kit/vectis": "npm:^2.13.1" + "@cosmos-kit/xdefi": "npm:^2.12.0" + checksum: 10c0/21f1acbbca5c1182ef38e1218bc50c76d7c433555e0acdbdc0586a6c3502476f30e11e1ab3df618820dd0e1eec72b2460b1e049aa23cab9de2e4c310f4a3b3cf + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: 10c0/11dcf4a2e77ee793835d49f2c028838eae58b44f50d1ff08394a610bfd817523f105d6ae4d9b5bef0aad45510f633eb23c903e9902e4409bed1ce70cb82b9bf0 + languageName: node + linkType: hard + +"create-ecdh@npm:^4.0.4": version: 4.0.4 resolution: "create-ecdh@npm:4.0.4" dependencies: @@ -10914,7 +11699,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -10945,44 +11730,42 @@ __metadata: linkType: hard "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 languageName: node linkType: hard -"crossws@npm:^0.2.0, crossws@npm:^0.2.2": - version: 0.2.4 - resolution: "crossws@npm:0.2.4" - peerDependencies: - uWebSockets.js: "*" - peerDependenciesMeta: - uWebSockets.js: - optional: true - checksum: 10c0/b950c64d36f3f11fdb8e0faf3107598660d89d77eb860e68b535fe6acba9f0f2f0507cc7250bd219a3ef2fe08718db91b591e6912b7324fcfc8fd1b8d9f78c96 +"crossws@npm:>=0.2.0 <0.4.0": + version: 0.3.1 + resolution: "crossws@npm:0.3.1" + dependencies: + uncrypto: "npm:^0.1.3" + checksum: 10c0/37dc72074ee61ee999ec79e061a0ddab870e061a88cd9b83f479c5c4130c6742ce6b308c38968ee4be9073246c32b0cb0adaed50f1e448b988c3b3172c4ce2e0 languageName: node linkType: hard "crypto-browserify@npm:^3.12.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" + version: 3.12.1 + resolution: "crypto-browserify@npm:3.12.1" dependencies: - browserify-cipher: "npm:^1.0.0" - browserify-sign: "npm:^4.0.0" - create-ecdh: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - create-hmac: "npm:^1.1.0" - diffie-hellman: "npm:^5.0.0" - inherits: "npm:^2.0.1" - pbkdf2: "npm:^3.0.3" - public-encrypt: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - randomfill: "npm:^1.0.3" - checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 + browserify-cipher: "npm:^1.0.1" + browserify-sign: "npm:^4.2.3" + create-ecdh: "npm:^4.0.4" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + diffie-hellman: "npm:^5.0.3" + hash-base: "npm:~3.0.4" + inherits: "npm:^2.0.4" + pbkdf2: "npm:^3.1.2" + public-encrypt: "npm:^4.0.3" + randombytes: "npm:^2.1.0" + randomfill: "npm:^1.0.4" + checksum: 10c0/184a2def7b16628e79841243232ab5497f18d8e158ac21b7ce90ab172427d0a892a561280adc08f9d4d517bce8db2a5b335dc21abb970f787f8e874bd7b9db7d languageName: node linkType: hard @@ -11057,14 +11840,14 @@ __metadata: linkType: hard "daisyui@npm:^4.12.10": - version: 4.12.10 - resolution: "daisyui@npm:4.12.10" + version: 4.12.14 + resolution: "daisyui@npm:4.12.14" dependencies: css-selector-tokenizer: "npm:^0.8" culori: "npm:^3" picocolors: "npm:^1" postcss-js: "npm:^4" - checksum: 10c0/f677d9717d6241d6c829141645ff15a5d6aaa9e279a90e1acb248613c9cc25d7d0b9fcac55ec572537f6bc472e1ab5f0bed7797a1815b6fde9a644be62f357d0 + checksum: 10c0/8b665e285cea4fa8775428ea6b6ca5f86b41077ac37db2faae9566bc97c9dc4fc637243791a795ba3db17fe62beeef01fb02092d26323cab90e93ce2768b7d14 languageName: node linkType: hard @@ -11080,12 +11863,14 @@ __metadata: resolution: "dapp-agoric-orca-contract@workspace:contract" dependencies: "@agoric/async-flow": "npm:^0.1.1-u17.1" + "@agoric/cosmic-proto": "npm:latest" "@agoric/deploy-script-support": "npm:^0.10.4-u17.1" "@agoric/ertp": "npm:^0.16.3-u17.1" "@agoric/eslint-config": "npm:^0.4.1-u17.1" "@agoric/governance": "npm:^0.10.4-u17.1" "@agoric/inter-protocol": "npm:^0.17.0-u17.1" "@agoric/internal": "npm:^0.4.0-u17.1" + "@agoric/network": "npm:0.1.1-dev-d1562a1.0" "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch" "@agoric/smart-wallet": "npm:^0.5.4-u17.1" "@agoric/store": "npm:^0.9.3-u17.1" @@ -11094,20 +11879,22 @@ __metadata: "@agoric/vats": "npm:^0.16.0-u17.1" "@agoric/vow": "npm:^0.2.0-u17.1" "@agoric/zoe": "npm:^0.26.3-u17.1" - "@agoric/zone": "npm:^0.3.0-u17.1" + "@agoric/zone": "npm:latest" "@ava/typescript": "npm:^5.0.0" "@cosmjs/proto-signing": "npm:^0.32.3" + "@endo/base64": "npm:latest" "@endo/bundle-source": "npm:^3.5.0" "@endo/errors": "npm:^1.2.4" "@endo/eslint-plugin": "npm:^2.2.0" "@endo/far": "npm:^1.1.4" "@endo/init": "npm:^1.1.3" - "@endo/marshal": "npm:^1.5.2" + "@endo/marshal": "npm:^1.6.1" "@endo/nat": "npm:^5.0.9" - "@endo/patterns": "npm:^1.4.2" + "@endo/patterns": "npm:^1.4.6" "@endo/promise-kit": "npm:^1.1.4" "@endo/ses-ava": "npm:^1.2.2" "@jessie.js/eslint-plugin": "npm:^0.4.1" + "@noble/hashes": "npm:latest" "@rollup/plugin-commonjs": "npm:^25.0.8" "@rollup/plugin-json": "npm:^6.1.0" "@rollup/plugin-node-resolve": "npm:^15.2.3" @@ -11231,19 +12018,19 @@ __metadata: linkType: hard "dc-polyfill@npm:^0.1.4": - version: 0.1.4 - resolution: "dc-polyfill@npm:0.1.4" - checksum: 10c0/5ab07dc2f2e6e9b5949577c0be0df1d8c1be3d5cc389cea0fac97558f944dd0029689092b144eaf46c3f179c93d02075e3414705b9b6b32b7d9394d72f1fa032 + version: 0.1.6 + resolution: "dc-polyfill@npm:0.1.6" + checksum: 10c0/bf717f68a7e95dd9118072274613cb4010bfc7bc7946c46f6395bb3c76356a5d0196e121a1c2218f83483ed025f7db6db98604d33c2b7afb37d26bbb669efec6 languageName: node linkType: hard "dd-trace@npm:^3.3.0": - version: 3.54.0 - resolution: "dd-trace@npm:3.54.0" + version: 3.58.0 + resolution: "dd-trace@npm:3.58.0" dependencies: - "@datadog/native-appsec": "npm:7.1.0" - "@datadog/native-iast-rewriter": "npm:2.3.0" - "@datadog/native-iast-taint-tracking": "npm:1.7.0" + "@datadog/native-appsec": "npm:7.1.1" + "@datadog/native-iast-rewriter": "npm:2.3.1" + "@datadog/native-iast-taint-tracking": "npm:2.1.0" "@datadog/native-metrics": "npm:^2.0.0" "@datadog/pprof": "npm:5.2.0" "@datadog/sketches-js": "npm:^2.1.0" @@ -11252,7 +12039,7 @@ __metadata: crypto-randomuuid: "npm:^1.0.0" dc-polyfill: "npm:^0.1.4" ignore: "npm:^5.2.4" - import-in-the-middle: "npm:^1.7.3" + import-in-the-middle: "npm:^1.7.4" int64-buffer: "npm:^0.1.9" ipaddr.js: "npm:^2.1.0" istanbul-lib-coverage: "npm:3.2.0" @@ -11273,7 +12060,7 @@ __metadata: semver: "npm:^7.5.4" shell-quote: "npm:^1.8.1" tlhunter-sorted-set: "npm:^0.1.0" - checksum: 10c0/16878dd1fd0acba6a94f46536d99c14765bdf990f69a85fbacc377a2108c3a36800169f4fca8f0a430f474fc46d4675662af407ff910d88d1a4cbaee8bf5c726 + checksum: 10c0/b705e55dc390edd2e3fa59f3344642419fe16a3f25566e7d2c351518ace7d112ad45db408f29be479f015286b01e3cf375fea5eeccc8d000b270134710987928 languageName: node linkType: hard @@ -11408,7 +12195,7 @@ __metadata: languageName: node linkType: hard -"defu@npm:^6.1.3, defu@npm:^6.1.4": +"defu@npm:^6.1.4": version: 6.1.4 resolution: "defu@npm:6.1.4" checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5 @@ -11436,7 +12223,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 @@ -11529,7 +12316,7 @@ __metadata: languageName: node linkType: hard -"diffie-hellman@npm:^5.0.0": +"diffie-hellman@npm:^5.0.3": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" dependencies: @@ -11600,10 +12387,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.724 - resolution: "electron-to-chromium@npm:1.4.724" - checksum: 10c0/bc7a3f153d952325bac09c1e67325bfc6d686130541550d1b7429cf72a1202256eed09299c4d8010684aa3683332336f05324acf03bc0be7c7060f4e0820c267 +"electron-to-chromium@npm:^1.5.41": + version: 1.5.63 + resolution: "electron-to-chromium@npm:1.5.63" + checksum: 10c0/fe1b175805309b04e5a2242c3168f22543e5369aed01fceedfe0f0eafe3931e8609d8a140e527394b314cfe64d581913aba6f1d3c72c23069c7d8241e5dfa4ef languageName: node linkType: hard @@ -11618,13 +12405,28 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 + checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 + languageName: node + linkType: hard + +"elliptic@npm:6.6.0": + version: 6.6.0 + resolution: "elliptic@npm:6.6.0" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/42eb3492e218017bf8923a5d14a86f414952f2f771361805b3ae9f380923b5da53e203d0d92be95cb0a248858a78db7db5934a346e268abb757e6fe561d401c9 languageName: node linkType: hard -"elliptic@npm:^6.4.0, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5": - version: 6.5.5 - resolution: "elliptic@npm:6.5.5" +"elliptic@npm:^6.4.0, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5, elliptic@npm:^6.5.7": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" dependencies: bn.js: "npm:^4.11.9" brorand: "npm:^1.1.0" @@ -11633,7 +12435,7 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/3e591e93783a1b66f234ebf5bd3a8a9a8e063a75073a35a671e03e3b25253b6e33ac121f7efe9b8808890fffb17b40596cc19d01e6e8d1fa13b9a56ff65597c8 + checksum: 10c0/8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 languageName: node linkType: hard @@ -11713,9 +12515,9 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": + version: 1.23.5 + resolution: "es-abstract@npm:1.23.5" dependencies: array-buffer-byte-length: "npm:^1.0.1" arraybuffer.prototype.slice: "npm:^1.0.3" @@ -11732,7 +12534,7 @@ __metadata: function.prototype.name: "npm:^1.1.6" get-intrinsic: "npm:^1.2.4" get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" + globalthis: "npm:^1.0.4" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.2" has-proto: "npm:^1.0.3" @@ -11748,10 +12550,10 @@ __metadata: is-string: "npm:^1.0.7" is-typed-array: "npm:^1.1.13" is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" + object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" + regexp.prototype.flags: "npm:^1.5.3" safe-array-concat: "npm:^1.1.2" safe-regex-test: "npm:^1.0.3" string.prototype.trim: "npm:^1.2.9" @@ -11763,7 +12565,7 @@ __metadata: typed-array-length: "npm:^1.0.6" unbox-primitive: "npm:^1.0.2" which-typed-array: "npm:^1.1.15" - checksum: 10c0/d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + checksum: 10c0/1f6f91da9cf7ee2c81652d57d3046621d598654d1d1b05c1578bafe5c4c2d3d69513901679bdca2de589f620666ec21de337e4935cec108a4ed0871d5ef04a5d languageName: node linkType: hard @@ -11783,28 +12585,6 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.15": - version: 1.0.19 - resolution: "es-iterator-helpers@npm:1.0.19" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.3" - es-errors: "npm:^1.3.0" - es-set-tostringtag: "npm:^2.0.3" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - globalthis: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.7" - iterator.prototype: "npm:^1.1.2" - safe-array-concat: "npm:^1.1.2" - checksum: 10c0/ae8f0241e383b3d197383b9842c48def7fce0255fb6ed049311b686ce295595d9e389b466f6a1b7d4e7bb92d82f5e716d6fae55e20c1040249bf976743b038c5 - languageName: node - linkType: hard - "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -11845,22 +12625,6 @@ __metadata: languageName: node linkType: hard -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 10c0/2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: "npm:^4.0.3" - checksum: 10c0/23284c6a733cbf7842ec98f41eac742c9f288a78753c4fe46652bae826446ced7615b9e8a5c5f121a08812b1cd478ea58630f3e1c3d70835bd5dcd69c7cd75c9 - languageName: node - linkType: hard - "esbuild@npm:^0.18.10": version: 0.18.20 resolution: "esbuild@npm:0.18.20" @@ -11938,33 +12702,33 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.20.1": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -12014,7 +12778,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/66398f9fb2c65e456a3e649747b39af8a001e47963b25e86d9c09d2a48d61aa641b27da0ce5cad63df95ad246105e1d83e7fee0e1e22a0663def73b1c5101112 + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de languageName: node linkType: hard @@ -12101,10 +12865,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 languageName: node linkType: hard @@ -12182,15 +12946,15 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.9.0": - version: 2.11.1 - resolution: "eslint-module-utils@npm:2.11.1" +"eslint-module-utils@npm:^2.12.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10c0/d1c23397eddc42a7824de08348095483bc270a4a3222bc0d54a76382c6411111c33e44a0a1819489e1e209d9e4721de2a8438e7ca4e6fe6be32ff818af9b11b4 + checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 languageName: node linkType: hard @@ -12213,13 +12977,13 @@ __metadata: linkType: hard "eslint-plugin-escompat@npm:^3.3.3": - version: 3.4.0 - resolution: "eslint-plugin-escompat@npm:3.4.0" + version: 3.11.4 + resolution: "eslint-plugin-escompat@npm:3.11.4" dependencies: - browserslist: "npm:^4.21.0" + browserslist: "npm:^4.23.1" peerDependencies: eslint: ">=5.14.1" - checksum: 10c0/df981270d3e7059caf739cbab94c837304381bd23192a001f137bd53f713fc8d3300aba1c301e54553b0e87355bfdbe649283395306e5ee3b6d0bc86aa189783 + checksum: 10c0/c434905e223ebba150b5cd604221c64180a8786bdfd99037a7d620b6ac75f58daee83cd1f6cf9f0670abf057bfe017fe33d4874e0c450fa441199aae8d0efddc languageName: node linkType: hard @@ -12288,8 +13052,8 @@ __metadata: linkType: hard "eslint-plugin-import@npm:^2.25.2, eslint-plugin-import@npm:^2.29.1": - version: 2.30.0 - resolution: "eslint-plugin-import@npm:2.30.0" + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" dependencies: "@rtsao/scc": "npm:^1.1.0" array-includes: "npm:^3.1.8" @@ -12299,7 +13063,7 @@ __metadata: debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.9.0" + eslint-module-utils: "npm:^2.12.0" hasown: "npm:^2.0.2" is-core-module: "npm:^2.15.1" is-glob: "npm:^4.0.3" @@ -12308,10 +13072,11 @@ __metadata: object.groupby: "npm:^1.0.3" object.values: "npm:^1.2.0" semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" tsconfig-paths: "npm:^3.15.0" peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10c0/4c9dcb1f27505c4d5dd891d2b551f56c70786d136aa3992a77e785bdc67c9f60200a2c7fb0ce55b7647fe550b12bc433d5dfa59e2c00ab44227791c5ab86badf + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a languageName: node linkType: hard @@ -12335,35 +13100,34 @@ __metadata: linkType: hard "eslint-plugin-jsx-a11y@npm:^6.7.1": - version: 6.8.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: - "@babel/runtime": "npm:^7.23.2" - aria-query: "npm:^5.3.0" - array-includes: "npm:^3.1.7" + aria-query: "npm:^5.3.2" + array-includes: "npm:^3.1.8" array.prototype.flatmap: "npm:^1.3.2" ast-types-flow: "npm:^0.0.8" - axe-core: "npm:=4.7.0" - axobject-query: "npm:^3.2.1" + axe-core: "npm:^4.10.0" + axobject-query: "npm:^4.1.0" damerau-levenshtein: "npm:^1.0.8" emoji-regex: "npm:^9.2.2" - es-iterator-helpers: "npm:^1.0.15" - hasown: "npm:^2.0.0" + hasown: "npm:^2.0.2" jsx-ast-utils: "npm:^3.3.5" language-tags: "npm:^1.0.9" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.7" - object.fromentries: "npm:^2.0.7" + object.fromentries: "npm:^2.0.8" + safe-regex-test: "npm:^1.0.3" + string.prototype.includes: "npm:^2.0.1" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10c0/d93354e03b0cf66f018d5c50964e074dffe4ddf1f9b535fa020d19c4ae45f89c1a16e9391ca61ac3b19f7042c751ac0d361a056a65cbd1de24718a53ff8daa6e languageName: node linkType: hard "eslint-plugin-no-only-tests@npm:^3.0.0": - version: 3.1.0 - resolution: "eslint-plugin-no-only-tests@npm:3.1.0" - checksum: 10c0/c710ae04094cfa4695c44efe8d5036eb881893157accf3564b96f3ee5626edef855c93ec1801557e888e390e1892775da79d9564e1a33b83941fba994725b9cd + version: 3.3.0 + resolution: "eslint-plugin-no-only-tests@npm:3.3.0" + checksum: 10c0/a04425d9d3bcd745267168782eb12a3a712b8357264ddd4e204204318975c2c21e2c1efe68113181de908548a85762205b61d8f92ec9dc5e0a5ae54c0240a24d languageName: node linkType: hard @@ -12388,20 +13152,20 @@ __metadata: linkType: hard "eslint-plugin-react-hooks@npm:^4.6.0": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10c0/58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65 + checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc languageName: node linkType: hard "eslint-plugin-react-refresh@npm:^0.4.5": - version: 0.4.6 - resolution: "eslint-plugin-react-refresh@npm:0.4.6" + version: 0.4.14 + resolution: "eslint-plugin-react-refresh@npm:0.4.14" peerDependencies: eslint: ">=7" - checksum: 10c0/931d5623c7c694526e9d34f61af856bb1949a0b9b9b509da29cba6c3c68fd4e1e7e36d8a340f6aecfd22329d0425c7fbb2388dd7d24b0d05218067747f5d6fe3 + checksum: 10c0/427108008ffcc2e0be36897398e61a2fae54c5bf092af0171bc4cf1927080d40619bb07be02ecd7c515372210228cf849023997cfa0252d37115f9b0c0debcd2 languageName: node linkType: hard @@ -12440,7 +13204,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -12566,28 +13330,29 @@ __metadata: languageName: node linkType: hard -"eth-block-tracker@npm:6.1.0": - version: 6.1.0 - resolution: "eth-block-tracker@npm:6.1.0" +"eth-block-tracker@npm:^7.1.0": + version: 7.1.0 + resolution: "eth-block-tracker@npm:7.1.0" dependencies: - "@metamask/safe-event-emitter": "npm:^2.0.0" - "@metamask/utils": "npm:^3.0.1" + "@metamask/eth-json-rpc-provider": "npm:^1.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" json-rpc-random-id: "npm:^1.0.1" pify: "npm:^3.0.0" - checksum: 10c0/31cee76eeab18e68363aafbc1687f496f21e6e1a3aab9efe2582abc1885f77c37191006809f1819c81611019512375f9987f9fcae1ed4ac4650fb1582387fdcf + checksum: 10c0/86a5cabef7fa8505c27b5fad1b2f0100c21fda11ad64a701f76eb4224f8c7edab706181fd0934e106a71f5465d57278448af401eb3e584b3529d943ddd4d7dfb languageName: node linkType: hard -"eth-json-rpc-filters@npm:5.1.0": - version: 5.1.0 - resolution: "eth-json-rpc-filters@npm:5.1.0" +"eth-json-rpc-filters@npm:^6.0.0": + version: 6.0.1 + resolution: "eth-json-rpc-filters@npm:6.0.1" dependencies: - "@metamask/safe-event-emitter": "npm:^2.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" async-mutex: "npm:^0.2.6" eth-query: "npm:^2.1.2" json-rpc-engine: "npm:^6.1.0" pify: "npm:^5.0.0" - checksum: 10c0/70598749ed369e1ae2013d7f48421a82636f3dc803976f5e7a4a7109e8df6ef0532010a635645e5f83fa8ed8054b5338d4dbd4901d41392155eec91c69df5492 + checksum: 10c0/69699460fd7837e13e42c1c74fbbfc44c01139ffd694e50235c78773c06059988be5c83dbe3a14d175ecc2bf3e385c4bfd3d6ab5d2d4714788b0b461465a3f56 languageName: node linkType: hard @@ -12601,15 +13366,6 @@ __metadata: languageName: node linkType: hard -"eth-rpc-errors@npm:4.0.2": - version: 4.0.2 - resolution: "eth-rpc-errors@npm:4.0.2" - dependencies: - fast-safe-stringify: "npm:^2.0.6" - checksum: 10c0/e777788481945e7cfa1068bbf2e6368dfa2c65e0b8e50d15ea902369cc9509d7c157c8e384341ddfcd7e7d045a5f0d8e28cac7c6d0d4dffe94c35342e78f7e3f - languageName: node - linkType: hard - "eth-rpc-errors@npm:^4.0.2": version: 4.0.3 resolution: "eth-rpc-errors@npm:4.0.3" @@ -12619,6 +13375,18 @@ __metadata: languageName: node linkType: hard +"ethereum-cryptography@npm:^2.0.0": + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" + dependencies: + "@noble/curves": "npm:1.4.2" + "@noble/hashes": "npm:1.4.0" + "@scure/bip32": "npm:1.4.0" + "@scure/bip39": "npm:1.3.0" + checksum: 10c0/c6c7626d393980577b57f709878b2eb91f270fe56116044b1d7afb70d5c519cddc0c072e8c05e4a335e05342eb64d9c3ab39d52f78bb75f76ad70817da9645ef + languageName: node + linkType: hard + "ethers@npm:5.7.2, ethers@npm:^5.7.1, ethers@npm:^5.7.2": version: 5.7.2 resolution: "ethers@npm:5.7.2" @@ -12664,6 +13432,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:5.0.1, eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10c0/4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -12707,8 +13482,8 @@ __metadata: linkType: hard "execa@npm:^9.2.0": - version: 9.4.0 - resolution: "execa@npm:9.4.0" + version: 9.5.1 + resolution: "execa@npm:9.5.1" dependencies: "@sindresorhus/merge-streams": "npm:^4.0.0" cross-spawn: "npm:^7.0.3" @@ -12722,7 +13497,7 @@ __metadata: signal-exit: "npm:^4.1.0" strip-final-newline: "npm:^4.0.0" yoctocolors: "npm:^2.0.0" - checksum: 10c0/6ad06c627b5d7bb007bc7b6cc35d7e32b5a3365375ffc8ddbcc12d2423651fa9928ba0c447cc9e60079e505e9b24fbe0a57f80371511d7d20302c04c2d3ce95e + checksum: 10c0/1a628d535c5a088f9e17a735bb3143efc4198095392b319ba877b2975d5c3c57724536dccb6f68f1cd9b3af331c5a9e8c1aeb338d52ab316b1e008ff453374a7 languageName: node linkType: hard @@ -12760,19 +13535,12 @@ __metadata: languageName: node linkType: hard -"eyes@npm:^0.1.8": - version: 0.1.8 - resolution: "eyes@npm:0.1.8" - checksum: 10c0/4c79a9cbf45746d8c9f48cc957e35ad8ea336add1c7b8d5a0e002efc791a7a62b27b2188184ef1a1eea7bc3cd06b161791421e0e6c5fe78309705a162c53eea8 - languageName: node - linkType: hard - "fast-check@npm:^3.0.0": - version: 3.17.1 - resolution: "fast-check@npm:3.17.1" + version: 3.23.1 + resolution: "fast-check@npm:3.23.1" dependencies: pure-rand: "npm:^6.1.0" - checksum: 10c0/60e653035bf8e15976ee668772771998306c0f1894a64d6fea664ca285ec8b4d1a2829082e23bffa5933e23f697d224218a57e13e3862eeb242585e1e13f968c + checksum: 10c0/d61ee4a7a2e1abc5126bf2f1894413f532f686b3d1fc15c67fefb60dcca66024934b69a6454d3eba92e6568ac1abbb9882080e212d255865c3b3bbe52c5bf702 languageName: node linkType: hard @@ -12790,7 +13558,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": +"fast-glob@npm:3, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -12838,10 +13606,10 @@ __metadata: languageName: node linkType: hard -"fast-stable-stringify@npm:^1.0.0": - version: 1.0.0 - resolution: "fast-stable-stringify@npm:1.0.0" - checksum: 10c0/1d773440c7a9615950577665074746c2e92edafceefa789616ecb6166229e0ccc6dae206ca9b9f7da0d274ba5779162aab2d07940a0f6e52a41a4e555392eb3b +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 languageName: node linkType: hard @@ -12912,12 +13680,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard @@ -12970,9 +13738,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 languageName: node linkType: hard @@ -12984,21 +13752,21 @@ __metadata: linkType: hard "focus-trap@npm:^7.5.4": - version: 7.5.4 - resolution: "focus-trap@npm:7.5.4" + version: 7.6.2 + resolution: "focus-trap@npm:7.6.2" dependencies: tabbable: "npm:^6.2.0" - checksum: 10c0/c09e12b957862b2608977ff90de782645f99c3555cc5d93977240c179befa8723b9b1183e93890b4ad9d364d52a1af36416e63a728522ecce656a447d9ddd945 + checksum: 10c0/8d7a5a2bcd53b52392712b9abe7ea349476747cb89afb93ac551d91e9cdc066c6befe2a2d7d76b06d8a7696f4086afcf8b0b2e76e2fa103b5b830f551047f7b4 languageName: node linkType: hard "follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f languageName: node linkType: hard @@ -13022,13 +13790,13 @@ __metadata: linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.1 + resolution: "form-data@npm:4.0.1" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" mime-types: "npm:^2.1.12" - checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + checksum: 10c0/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 languageName: node linkType: hard @@ -13108,7 +13876,7 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": +"function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" dependencies: @@ -13253,6 +14021,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.0": + version: 11.0.0 + resolution: "glob@npm:11.0.0" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/419866015d8795258a8ac51de5b9d1a99c72634fc3ead93338e4da388e89773ab21681e494eac0fbc4250b003451ca3110bb4f1c9393d15d14466270094fdb4e + languageName: node + linkType: hard + "glob@npm:^7.1.3, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -13296,7 +14080,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.1, globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -13341,9 +14125,9 @@ __metadata: linkType: hard "google-protobuf@npm:^3.17.3": - version: 3.21.2 - resolution: "google-protobuf@npm:3.21.2" - checksum: 10c0/df20b41aad9eba4d842d69c717a4d73ac6d321084c12f524ad5eb79a47ad185323bd1b477c19565a15fd08b6eef29e475c8ac281dbc6fe547b81d8b6b99974f5 + version: 3.21.4 + resolution: "google-protobuf@npm:3.21.4" + checksum: 10c0/28f2800f7fe1a8fc55eb58ba76e158268407bfb3b90646eaf8a177dd92a2e522459b773f8132ae546e60ac3b6f5947557a1cf3d963a05bb594f43bcde640f54f languageName: node linkType: hard @@ -13370,21 +14154,21 @@ __metadata: languageName: node linkType: hard -"h3@npm:^1.10.2, h3@npm:^1.11.1": - version: 1.11.1 - resolution: "h3@npm:1.11.1" +"h3@npm:^1.12.0, h3@npm:^1.13.0": + version: 1.13.0 + resolution: "h3@npm:1.13.0" dependencies: - cookie-es: "npm:^1.0.0" - crossws: "npm:^0.2.2" + cookie-es: "npm:^1.2.2" + crossws: "npm:>=0.2.0 <0.4.0" defu: "npm:^6.1.4" destr: "npm:^2.0.3" - iron-webcrypto: "npm:^1.0.0" - ohash: "npm:^1.1.3" - radix3: "npm:^1.1.0" - ufo: "npm:^1.4.0" + iron-webcrypto: "npm:^1.2.1" + ohash: "npm:^1.1.4" + radix3: "npm:^1.1.2" + ufo: "npm:^1.5.4" uncrypto: "npm:^0.1.3" - unenv: "npm:^1.9.0" - checksum: 10c0/bd02bfae536a0facb9ddcd85bd51ad16264ea6fd331a548540a0846e426348449fcbcb10b0fa08673cd1d9c60e6ff5d8f56e7ec2e1ee43fda460d8c16866cbfa + unenv: "npm:^1.10.0" + checksum: 10c0/d2e91d44c7133c31c62e39288961be28fb9f2c75f91d83a4a0416e29ff408b3207b79e46ba25a2652e13aea78a3e6f10d12c53d746feb00e91b864e1f4b21302 languageName: node linkType: hard @@ -13395,13 +14179,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -13452,7 +14229,7 @@ __metadata: languageName: node linkType: hard -"hash-base@npm:~3.0": +"hash-base@npm:~3.0, hash-base@npm:~3.0.4": version: 3.0.4 resolution: "hash-base@npm:3.0.4" dependencies: @@ -13547,23 +14324,14 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: "npm:^2.0.0" - checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a - languageName: node - linkType: hard - "i18n-js@npm:^4.3.2": - version: 4.4.3 - resolution: "i18n-js@npm:4.4.3" + version: 4.5.0 + resolution: "i18n-js@npm:4.5.0" dependencies: bignumber.js: "npm:*" lodash: "npm:*" make-plural: "npm:*" - checksum: 10c0/545ce16b5fe9323d1a92637c91c6cd503c1065577fcbe96dabb34cae822a9da6642e2953eeb0e9e610a912b92f98c885c4c9717163e351593aaf0c2e5695442d + checksum: 10c0/d316b38dc6f8203d9f744cbcf9e627b056fe33e869e4c72de27ee71487b5fe416c9a666b58ec561184e3e8f72552e2565cb7072ecaf0f4f02614dee6079db567 languageName: node linkType: hard @@ -13616,9 +14384,9 @@ __metadata: linkType: hard "ignore@npm:^5.0.5, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -13639,15 +14407,15 @@ __metadata: languageName: node linkType: hard -"import-in-the-middle@npm:^1.7.3": - version: 1.7.3 - resolution: "import-in-the-middle@npm:1.7.3" +"import-in-the-middle@npm:^1.7.4": + version: 1.11.2 + resolution: "import-in-the-middle@npm:1.11.2" dependencies: acorn: "npm:^8.8.2" - acorn-import-assertions: "npm:^1.9.0" + acorn-import-attributes: "npm:^1.9.5" cjs-module-lexer: "npm:^1.2.2" module-details-from-path: "npm:^1.0.3" - checksum: 10c0/68a904ba5893670a212a9e6b651fb535feab274cdd86b38a095a2a9ff3d344306fa6a1b4aa2dc21bfa3206f81912ad1b633b5da5e81ddfbbce4a5d62900bf65f + checksum: 10c0/9bf95a68c6678b7b2361da73f9047575dee9a3ed932c055ac3376a94580808e3ccfd05a7e38d8fcfea7f805a7e4ac0bea915653627074dc6cb1d800c8319d5f1 languageName: node linkType: hard @@ -13696,7 +14464,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -13752,14 +14520,14 @@ __metadata: linkType: hard "intl-messageformat@npm:^10.1.0": - version: 10.5.11 - resolution: "intl-messageformat@npm:10.5.11" + version: 10.7.7 + resolution: "intl-messageformat@npm:10.7.7" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.6" - tslib: "npm:^2.4.0" - checksum: 10c0/423f1c879ce2d0e7b9e0b4c1787a81ead7fe4d1734e0366a20fef56b06c09146e7ca3618e2e78b4f8b8f2b59cafe6237ceed21530fe0c16cfb47d915fc80222d + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/icu-messageformat-parser": "npm:2.9.4" + tslib: "npm:2" + checksum: 10c0/691895fb6a73a2feb2569658706e0d452861441de184dd1c9201e458a39fb80fc80080dd40d3d370400a52663f87de7a6d5a263c94245492f7265dd760441a95 languageName: node linkType: hard @@ -13783,16 +14551,16 @@ __metadata: linkType: hard "ipaddr.js@npm:^2.1.0": - version: 2.1.0 - resolution: "ipaddr.js@npm:2.1.0" - checksum: 10c0/9aa43ff99771e3d14ab3683df3909b3b033fe81337646bc63780b00ec9bc51d4a696a047c0b261c05867c0a25086ab03f0ce32ea444a6b39e10fac1315d53cab + version: 2.2.0 + resolution: "ipaddr.js@npm:2.2.0" + checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 languageName: node linkType: hard -"iron-webcrypto@npm:^1.0.0": - version: 1.1.0 - resolution: "iron-webcrypto@npm:1.1.0" - checksum: 10c0/58c783a3f18128e37918f83c8cd2703b2494ccec9316a0de5194b0b52282d9eac12a5a0a8c18da6b55940c3f9957a5ae10b786616692a1e5a12caaa019dde8de +"iron-webcrypto@npm:^1.2.1": + version: 1.2.1 + resolution: "iron-webcrypto@npm:1.2.1" + checksum: 10c0/5cf27c6e2bd3ef3b4970e486235fd82491ab8229e2ed0ac23307c28d6c80d721772a86ed4e9fe2a5cabadd710c2f024b706843b40561fb83f15afee58f809f66 languageName: node linkType: hard @@ -13830,15 +14598,6 @@ __metadata: languageName: node linkType: hard -"is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 - languageName: node - linkType: hard - "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -13901,7 +14660,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": +"is-date-object@npm:^1.0.1": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -13933,15 +14692,6 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -13956,7 +14706,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -13999,13 +14749,6 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.3": - version: 2.0.3 - resolution: "is-map@npm:2.0.3" - checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc - languageName: node - linkType: hard - "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" @@ -14100,13 +14843,6 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.3": - version: 2.0.3 - resolution: "is-set@npm:2.0.3" - checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 - languageName: node - linkType: hard - "is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" @@ -14192,13 +14928,6 @@ __metadata: languageName: node linkType: hard -"is-weakmap@npm:^2.0.2": - version: 2.0.2 - resolution: "is-weakmap@npm:2.0.2" - checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 - languageName: node - linkType: hard - "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -14208,16 +14937,6 @@ __metadata: languageName: node linkType: hard -"is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a - languageName: node - linkType: hard - "is-wsl@npm:^3.1.0": version: 3.1.0 resolution: "is-wsl@npm:3.1.0" @@ -14264,16 +14983,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-unfetch@npm:3.1.0": - version: 3.1.0 - resolution: "isomorphic-unfetch@npm:3.1.0" - dependencies: - node-fetch: "npm:^2.6.1" - unfetch: "npm:^4.2.0" - checksum: 10c0/d3b61fca06304db692b7f76bdfd3a00f410e42cfa7403c3b250546bf71589d18cf2f355922f57198e4cc4a9872d3647b20397a5c3edf1a347c90d57c83cf2a89 - languageName: node - linkType: hard - "isomorphic-ws@npm:^4.0.1": version: 4.0.1 resolution: "isomorphic-ws@npm:4.0.1" @@ -14292,6 +15001,15 @@ __metadata: languageName: node linkType: hard +"isows@npm:1.0.6": + version: 1.0.6 + resolution: "isows@npm:1.0.6" + peerDependencies: + ws: "*" + checksum: 10c0/f89338f63ce2f497d6cd0f86e42c634209328ebb43b3bdfdc85d8f1589ee75f02b7e6d9e1ba274101d0f6f513b1b8cbe6985e6542b4aaa1f0c5fd50d9c1be95c + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:3.2.0": version: 3.2.0 resolution: "istanbul-lib-coverage@npm:3.2.0" @@ -14299,19 +15017,6 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" - dependencies: - define-properties: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - reflect.getprototypeof: "npm:^1.0.4" - set-function-name: "npm:^2.0.1" - checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 - languageName: node - linkType: hard - "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -14325,25 +15030,12 @@ __metadata: languageName: node linkType: hard -"jayson@npm:^4.1.0": - version: 4.1.0 - resolution: "jayson@npm:4.1.0" +"jackspeak@npm:^4.0.1": + version: 4.0.2 + resolution: "jackspeak@npm:4.0.2" dependencies: - "@types/connect": "npm:^3.4.33" - "@types/node": "npm:^12.12.54" - "@types/ws": "npm:^7.4.4" - JSONStream: "npm:^1.3.5" - commander: "npm:^2.20.3" - delay: "npm:^5.0.0" - es6-promisify: "npm:^5.0.0" - eyes: "npm:^0.1.8" - isomorphic-ws: "npm:^4.0.1" - json-stringify-safe: "npm:^5.0.1" - uuid: "npm:^8.3.2" - ws: "npm:^7.4.5" - bin: - jayson: bin/jayson.js - checksum: 10c0/1b3a642eab65e7c07be45d6b9c08c1713348ed71454e37536f479400eb6c7257061fab74430d4677d1cedbed18db8fe8370202f0b52fac87d9c7af1140aa293d + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10c0/b26039d11c0163a95b1e58851b9ac453cce64ad6d1eb98a00b303ad5eeb761b29d33c9419d1e16c016d3f7151c8edf7df223e6cf93a1907655fd95d6ce85c0de languageName: node linkType: hard @@ -14365,12 +15057,21 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.21.0": - version: 1.21.0 - resolution: "jiti@npm:1.21.0" +"jiti@npm:^1.21.6": + version: 1.21.6 + resolution: "jiti@npm:1.21.6" bin: jiti: bin/jiti.js - checksum: 10c0/7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f + checksum: 10c0/05b9ed58cd30d0c3ccd3c98209339e74f50abd9a17e716f65db46b6a35812103f6bde6e134be7124d01745586bca8cc5dae1d0d952267c3ebe55171949c32e56 + languageName: node + linkType: hard + +"jiti@npm:^2.1.2": + version: 2.4.0 + resolution: "jiti@npm:2.4.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/f97365a83169e0544b0a6e7f415f1ee69ca9c0bdd55e336035490b4b7a6ff99b63b9df89c70babfc49e924247dfbdc730f9eb0c5ed4771d3db989ac70e49bf18 languageName: node linkType: hard @@ -14449,6 +15150,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -14456,7 +15166,7 @@ __metadata: languageName: node linkType: hard -"json-rpc-engine@npm:6.1.0, json-rpc-engine@npm:^6.1.0": +"json-rpc-engine@npm:^6.1.0": version: 6.1.0 resolution: "json-rpc-engine@npm:6.1.0" dependencies: @@ -14544,13 +15254,6 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.2.1 - resolution: "jsonc-parser@npm:3.2.1" - checksum: 10c0/ada66dec143d7f9cb0e2d0d29c69e9ce40d20f3a4cb96b0c6efb745025ac7f9ba647d7ac0990d0adfc37a2d2ae084a12009a9c833dbdbeadf648879a99b9df89 - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -14571,13 +15274,6 @@ __metadata: languageName: node linkType: hard -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 10c0/89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 - languageName: node - linkType: hard - "jsx-ast-utils@npm:^3.3.2, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -14601,7 +15297,7 @@ __metadata: languageName: node linkType: hard -"keccak@npm:^3.0.1, keccak@npm:^3.0.2": +"keccak@npm:^3.0.2, keccak@npm:^3.0.3": version: 3.0.4 resolution: "keccak@npm:3.0.4" dependencies: @@ -14644,9 +15340,9 @@ __metadata: linkType: hard "language-subtag-registry@npm:^0.3.20": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 10c0/d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c languageName: node linkType: hard @@ -14669,35 +15365,35 @@ __metadata: languageName: node linkType: hard -"libsodium-sumo@npm:^0.7.13": - version: 0.7.13 - resolution: "libsodium-sumo@npm:0.7.13" - checksum: 10c0/8159205cc36cc4bdf46ee097e5f998d5cac7d11612be7406a8396ca3ee31560871ac17daa69e47ff0e8407eeae9f49313912ea95dbc8715875301b004c28ef5b +"libsodium-sumo@npm:^0.7.15": + version: 0.7.15 + resolution: "libsodium-sumo@npm:0.7.15" + checksum: 10c0/5a1437ccff03c72669e7b49da702034e171df9ff6a4e65698297ab63ad0bf8f889d3dd51494e29418c643143526d8d7f08cbba3929d220334cddbe3e74a1560e languageName: node linkType: hard "libsodium-wrappers-sumo@npm:^0.7.11": - version: 0.7.13 - resolution: "libsodium-wrappers-sumo@npm:0.7.13" + version: 0.7.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" dependencies: - libsodium-sumo: "npm:^0.7.13" - checksum: 10c0/51a151d0f73418632dcf9cf0184b14d8eb6e16b9a3f01a652c7401c6d1bf8ead4f5ce40a4f00bd4754c5719a7a5fb71d6125691896aeb7a9c1abcfe4b73afc02 + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 languageName: node linkType: hard "libsodium-wrappers@npm:^0.7.6": - version: 0.7.13 - resolution: "libsodium-wrappers@npm:0.7.13" + version: 0.7.15 + resolution: "libsodium-wrappers@npm:0.7.15" dependencies: - libsodium: "npm:^0.7.13" - checksum: 10c0/3de2c09a41991832333b379f4eefadd3113abb216c5be8d141eb053bbe904a4d529c01a4bbb8f46c1e2a987c3de1fb9adbb0cf7980155822e06504a38dc16cbb + libsodium: "npm:^0.7.15" + checksum: 10c0/852c4879f3b3c48332fe704454c4dfc2a1387f9f3930faf84d8626c9670f93365e56aa186d14e2995e5d352f08af07c99c06a2c26d5f44818039f1014d404171 languageName: node linkType: hard -"libsodium@npm:^0.7.13": - version: 0.7.13 - resolution: "libsodium@npm:0.7.13" - checksum: 10c0/91a65df81e123d8374b1dcfc1214970203139b4ac75c8032cc2ca390c6173f456d15dbdbf8b79115337086fc2f5a3faa8f96625d909a788125b6ead5894cd5f5 +"libsodium@npm:^0.7.15": + version: 0.7.15 + resolution: "libsodium@npm:0.7.15" + checksum: 10c0/7bdb529681f30be0533f33921509c36823d18f6fc158d66842e50d33cd9635ebb0dd02eb1fe3b51e192996ff173949f846793e10103371c8b179e5c29525556c languageName: node linkType: hard @@ -14709,9 +15405,9 @@ __metadata: linkType: hard "lilconfig@npm:^3.0.0": - version: 3.1.1 - resolution: "lilconfig@npm:3.1.1" - checksum: 10c0/311b559794546894e3fe176663427326026c1c644145be9e8041c58e268aa9328799b8dfe7e4dd8c6a4ae305feae95a1c9e007db3569f35b42b6e1bc8274754c + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe languageName: node linkType: hard @@ -14729,32 +15425,32 @@ __metadata: languageName: node linkType: hard -"listhen@npm:^1.7.2": - version: 1.7.2 - resolution: "listhen@npm:1.7.2" +"listhen@npm:^1.9.0": + version: 1.9.0 + resolution: "listhen@npm:1.9.0" dependencies: "@parcel/watcher": "npm:^2.4.1" "@parcel/watcher-wasm": "npm:^2.4.1" citty: "npm:^0.1.6" clipboardy: "npm:^4.0.0" consola: "npm:^3.2.3" - crossws: "npm:^0.2.0" + crossws: "npm:>=0.2.0 <0.4.0" defu: "npm:^6.1.4" get-port-please: "npm:^3.1.2" - h3: "npm:^1.10.2" + h3: "npm:^1.12.0" http-shutdown: "npm:^1.2.2" - jiti: "npm:^1.21.0" - mlly: "npm:^1.6.1" + jiti: "npm:^2.1.2" + mlly: "npm:^1.7.1" node-forge: "npm:^1.3.1" pathe: "npm:^1.1.2" std-env: "npm:^3.7.0" - ufo: "npm:^1.4.0" + ufo: "npm:^1.5.4" untun: "npm:^0.1.3" uqr: "npm:^0.1.2" bin: listen: bin/listhen.mjs listhen: bin/listhen.mjs - checksum: 10c0/cd4d0651686b88c61a5bd5d5afc03feb99e352eb7862260112010655cf7997fb3356e61317f09555e2b7412175ae05265fc9e97458aa014586bf9fa4ab22bd5a + checksum: 10c0/b13e732eec48a49017121013853bb0f184c6f40dc9839a8ccad03b57a50a29186a57edafe5807e892cf65b49cb710026ba95d064bdcf294e135b95c6553fe36b languageName: node linkType: hard @@ -14896,9 +15592,9 @@ __metadata: languageName: node linkType: hard -"logform@npm:^2.2.0, logform@npm:^2.3.2": - version: 2.6.0 - resolution: "logform@npm:2.6.0" +"logform@npm:^2.2.0, logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" dependencies: "@colors/colors": "npm:1.6.0" "@types/triple-beam": "npm:^1.3.2" @@ -14906,7 +15602,7 @@ __metadata: ms: "npm:^2.1.1" safe-stable-stringify: "npm:^2.3.1" triple-beam: "npm:^1.3.0" - checksum: 10c0/6e02f8617a03155b2fce451bacf777a2c01da16d32c4c745b3ec85be6c3f2602f2a4953a8bd096441cb4c42c447b52318541d6b6bc335dce903cb9ad77a1749f + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f languageName: node linkType: hard @@ -14942,6 +15638,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: 10c0/c993b8e06ead0b24b969c1dbb5b301716aed66e320e9014a80012f5febe280b438f28ff50046b2c55ff404e889351ccb332ff91f8dd175a21f5eae80e3fb155f + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -14968,11 +15671,11 @@ __metadata: linkType: hard "magic-string@npm:^0.30.3": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" + version: 0.30.13 + resolution: "magic-string@npm:0.30.13" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/b9eb370773d0bd90ca11a848753409d8e5309b1ad56d2a1aa49d6649da710a6d2fe7237ad1a643c5a5d3800de2b9946ed9690acdfc00e6cc1aeafff3ab1752c4 + checksum: 10c0/a275faeca1564c545019b4742c38a42ca80226c8c9e0805c32d1a1cc58b0e6ff7bbd914ed885fd10043858a7da0f732cb8f49c8975c3ecebde9cad4b57db5115 languageName: node linkType: hard @@ -15049,8 +15752,8 @@ __metadata: linkType: hard "mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-from-markdown@npm:2.0.0" + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" dependencies: "@types/mdast": "npm:^4.0.0" "@types/unist": "npm:^3.0.0" @@ -15064,7 +15767,7 @@ __metadata: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/fb66e917f66e33fc60d6964264c4abd519fd8829a4a58ff9c61b2ba5c337554fb954b9ec31ca1c34e83c1163a73f310c39072d656f9a2d3184fe39c87cbba65a + checksum: 10c0/76eb2bd2c6f7a0318087c73376b8af6d7561c1e16654e7667e640f391341096c56142618fd0ff62f6d39e5ab4895898b9789c84cd7cec2874359a437a0e1ff15 languageName: node linkType: hard @@ -15117,6 +15820,13 @@ __metadata: languageName: node linkType: hard +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: 10c0/b87d35a52aded13cf2daca8d4eaa84e218722b6f83c75ddd77d74f32cc62e699a672e338e1ee19ceae0de91d19cc24dcc1a7c7d78c81f51042fe55f01b196ed3 + languageName: node + linkType: hard + "micro-spelling-correcter@npm:^1.1.1": version: 1.1.1 resolution: "micro-spelling-correcter@npm:1.1.1" @@ -15125,8 +15835,8 @@ __metadata: linkType: hard "micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-core-commonmark@npm:2.0.2" dependencies: decode-named-character-reference: "npm:^1.0.0" devlop: "npm:^1.0.0" @@ -15144,200 +15854,200 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/a0b280b1b6132f600518e72cb29a4dd1b2175b85f5ed5b25d2c5695e42b876b045971370daacbcfc6b4ce8cf7acbf78dd3a0284528fb422b450144f4b3bebe19 + checksum: 10c0/87c7a75cd339189eb6f1d6323037f7d108d1331d953b84fe839b37fd385ee2292b27222327c1ceffda46ba5d5d4dee703482475e5ee8744be40c9e308d8acb77 languageName: node linkType: hard "micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/b73492f687d41a6a379159c2f3acbf813042346bcea523d9041d0cc6124e6715f0779dbb2a0b3422719e9764c3b09f9707880aa159557e3cb4aeb03b9d274915 + checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c languageName: node linkType: hard "micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" dependencies: devlop: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/8ffad00487a7891941b1d1f51d53a33c7a659dcf48617edb7a4008dad7aff67ec316baa16d55ca98ae3d75ce1d81628dbf72fedc7c6f108f740dec0d5d21c8ee + checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 languageName: node linkType: hard "micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/103ca954dade963d4ff1d2f27d397833fe855ddc72590205022832ef68b775acdea67949000cee221708e376530b1de78c745267b0bf8366740840783eb37122 + checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb languageName: node linkType: hard "micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2b2188e7a011b1b001faf8c860286d246d5c3485ef8819270c60a5808f4c7613e49d4e481dbdff62600ef7acdba0f5100be2d125cbd2a15e236c26b3668a8ebd + checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 languageName: node linkType: hard "micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/4e91baab0cc71873095134bd0e225d01d9786cde352701402d71b72d317973954754e8f9f1849901f165530e6421202209f4d97c460a27bb0808ec5a3fc3148c + checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 languageName: node linkType: hard "micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fc37a76aaa5a5138191ba2bef1ac50c36b3bcb476522e98b1a42304ab4ec76f5b036a746ddf795d3de3e7004b2c09f21dd1bad42d161f39b8cfc0acd067e6373 + checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 languageName: node linkType: hard "micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/043b5f2abc8c13a1e2e4c378ead191d1a47ed9e0cd6d0fa5a0a430b2df9e17ada9d5de5a20688a000bbc5932507e746144acec60a9589d9a79fa60918e029203 + checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 languageName: node linkType: hard "micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2bf5fa5050faa9b69f6c7e51dbaaf02329ab70fabad8229984381b356afbbf69db90f4617bec36d814a7d285fb7cad8e3c4e38d1daf4387dc9e240aa7f9a292a + checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 languageName: node linkType: hard "micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" dependencies: micromark-util-chunked: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/cd4c8d1a85255527facb419ff3b3cc3d7b7f27005c5ef5fa7ef2c4d0e57a9129534fc292a188ec2d467c2c458642d369c5f894bc8a9e142aed6696cc7989d3ea + checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 languageName: node linkType: hard "micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/3f6d684ee8f317c67806e19b3e761956256cb936a2e0533aad6d49ac5604c6536b2041769c6febdd387ab7175b7b7e551851bf2c1f78da943e7a3671ca7635ac + checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df languageName: node linkType: hard "micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" dependencies: decode-named-character-reference: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-decode-numeric-character-reference: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/f5413bebb21bdb686cfa1bcfa7e9c93093a523d1b42443ead303b062d2d680a94e5e8424549f57b8ba9d786a758e5a26a97f56068991bbdbca5d1885b3aa7227 + checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb languageName: node linkType: hard "micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 10c0/ebdaafff23100bbf4c74e63b4b1612a9ddf94cd7211d6a076bc6fb0bc32c1b48d6fb615aa0953e607c62c97d849f97f1042260d3eb135259d63d372f401bbbb2 + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a languageName: node linkType: hard "micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: 10c0/988aa26367449bd345b627ae32cf605076daabe2dc1db71b578a8a511a47123e14af466bcd6dcbdacec60142f07bc2723ec5f7a0eed0f5319ce83b5e04825429 + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 languageName: node linkType: hard "micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/93bf8789b8449538f22cf82ac9b196363a5f3b2f26efd98aef87c4c1b1f8c05be3ef6391ff38316ff9b03c1a6fd077342567598019ddd12b9bd923dacc556333 + checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd languageName: node linkType: hard "micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" dependencies: micromark-util-types: "npm:^2.0.0" - checksum: 10c0/3b912e88453dcefe728a9080c8934a75ac4732056d6576ceecbcaf97f42c5d6fa2df66db8abdc8427eb167c5ffddefe26713728cfe500bc0e314ed260d6e2746 + checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-encode: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 + checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c languageName: node linkType: hard "micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" + version: 2.0.3 + resolution: "micromark-util-subtokenize@npm:2.0.3" dependencies: devlop: "npm:^1.0.0" micromark-util-chunked: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/000cefde827db129f4ed92b8fbdeb4866c5f9c93068c0115485564b0426abcb9058080aa257df9035e12ca7fa92259d66623ea750b9eb3bcdd8325d3fb6fc237 + checksum: 10c0/75501986ecb02a6f06c0f3e58b584ae3ff3553b520260e8ce27d2db8c79b8888861dd9d3b26e30f5c6084fddd90f96dc3ff551f02c2ac4d669ebe920e483b6d6 languageName: node linkType: hard "micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: 10c0/4e76186c185ce4cefb9cea8584213d9ffacd77099d1da30c0beb09fa21f46f66f6de4c84c781d7e34ff763fe3a06b530e132fa9004882afab9e825238d0aa8b3 + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 languageName: node linkType: hard "micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 10c0/d74e913b9b61268e0d6939f4209e3abe9dada640d1ee782419b04fd153711112cfaaa3c4d5f37225c9aee1e23c3bb91a1f5223e1e33ba92d33e83956a53e61de + version: 2.0.1 + resolution: "micromark-util-types@npm:2.0.1" + checksum: 10c0/872ec9334bb42afcc91c5bed8b7ee03b75654b36c6f221ab4d2b1bb0299279f00db948bf38ec6bc1ec03d0cf7842c21ab805190bf676157ba587eb0386d38b71 languageName: node linkType: hard "micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" + version: 4.0.1 + resolution: "micromark@npm:4.0.1" dependencies: "@types/debug": "npm:^4.0.0" debug: "npm:^4.0.0" @@ -15356,17 +16066,17 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/7e91c8d19ff27bc52964100853f1b3b32bb5b2ece57470a34ba1b2f09f4e2a183d90106c4ae585c9f2046969ee088576fed79b2f7061cba60d16652ccc2c64fd + checksum: 10c0/b5d950c84664ce209575e5a54946488f0a1e1240d080544e657b65074c9b08208a5315d9db066b93cbc199ec05f68552ba8b09fd5e716c726f4a4712275a7c5c languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - braces: "npm:^3.0.2" + braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 languageName: node linkType: hard @@ -15453,12 +16163,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:6 || 7 || 8 || 9, minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" +"minimatch@npm:6 || 7 || 8 || 9 || 10, minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + checksum: 10c0/e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d languageName: node linkType: hard @@ -15480,6 +16190,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + "minimist@npm:1, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -15596,22 +16315,22 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.2.0, mlly@npm:^1.6.1": - version: 1.6.1 - resolution: "mlly@npm:1.6.1" +"mlly@npm:^1.7.1, mlly@npm:^1.7.2": + version: 1.7.3 + resolution: "mlly@npm:1.7.3" dependencies: - acorn: "npm:^8.11.3" + acorn: "npm:^8.14.0" pathe: "npm:^1.1.2" - pkg-types: "npm:^1.0.3" - ufo: "npm:^1.3.2" - checksum: 10c0/a7bf26b3d4f83b0f5a5232caa3af44be08b464f562f31c11d885d1bc2d43b7d717137d47b0c06fdc69e1b33ffc09f902b6d2b18de02c577849d40914e8785092 + pkg-types: "npm:^1.2.1" + ufo: "npm:^1.5.4" + checksum: 10c0/b530887fe95a6e3458c1b24e9775dc61c167d402126f2f5f13a13845a3fb77c3db8d79cb32077c98679a392d8ecfdc4e5df3d6925bf650d807dc2dfe8cc35b53 languageName: node linkType: hard "mobx@npm:^6.1.7": - version: 6.12.3 - resolution: "mobx@npm:6.12.3" - checksum: 10c0/33e1d27d33adea0ceb4de32eb66b4384e81a249be5e01baa6bf556f458fd62a83d23bfa0cf8ba9e87c28f0d810ae301ee0e7322fd48a3bf47db33ffb08d5826c + version: 6.13.5 + resolution: "mobx@npm:6.13.5" + checksum: 10c0/43691c836363aa1f13c44e43c86ab89fc8f4b83ef408bc6c68d799260e74b4ff08ebba2ef16bda447c6b7bca3558768e15927c0b21ffbb10e99b610783f28859 languageName: node linkType: hard @@ -15643,14 +16362,7 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.2.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -15697,18 +16409,18 @@ __metadata: linkType: hard "n-readlines@npm:^1.0.0": - version: 1.0.1 - resolution: "n-readlines@npm:1.0.1" - checksum: 10c0/a2ba1c74e365ac5b8b2dde03301ddcb193c81edb0d3691dd71b3d9a1c71b3dde30b86c32483578efbc3161d295b272123668de11533b02a99bd93704d637f83e + version: 1.0.3 + resolution: "n-readlines@npm:1.0.3" + checksum: 10c0/436c27ac071409314093da35dc3a4c5198c94fb10ad12b1c4d2b3e44bdb634da0a7a8ab0c107c1f4815788cbf5e0c7c180e3037ba3d974f34637cab363a95a74 languageName: node linkType: hard "nan@npm:^2.13.2": - version: 2.19.0 - resolution: "nan@npm:2.19.0" + version: 2.22.0 + resolution: "nan@npm:2.22.0" dependencies: node-gyp: "npm:latest" - checksum: 10c0/b8d05d75f92ee9d94affa50d0aa41b6c698254c848529452d7ab67c2e0d160a83f563bfe2cbd53e077944eceb48c757f83c93634c7c9ff404c9ec1ed4e5ced1a + checksum: 10c0/d5d31aefdb218deba308d44867c5f432b4d3aabeb57c70a2b236d62652e9fee7044e5d5afd380d9fef022fe7ebb2f2d6c85ca3cbcac5031aaca3592c844526bb languageName: node linkType: hard @@ -15729,9 +16441,9 @@ __metadata: linkType: hard "napi-wasm@npm:^1.1.0": - version: 1.1.0 - resolution: "napi-wasm@npm:1.1.0" - checksum: 10c0/074df6b5b72698f07b39ca3c448a3fcbaf8e6e78521f0cb3aefd8c2f059d69eae0e3bfe367b4aa3df1976c25e351e4e52a359f22fb2c379eb6781bfa042f582b + version: 1.1.3 + resolution: "napi-wasm@npm:1.1.3" + checksum: 10c0/7c365ab9dc59e6f20d7b7886279ecc03ffc7c3d502ed66d32652e3681c3a56c372f00f29b110aefd9b074a6bab6a997e9b602968c18622e2586818f417e41a5d languageName: node linkType: hard @@ -15743,9 +16455,9 @@ __metadata: linkType: hard "negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea languageName: node linkType: hard @@ -15761,11 +16473,11 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.57.0 - resolution: "node-abi@npm:3.57.0" + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/8d78542e39a3c49ac476d12c70ef0366f26a40a215af44498656e75fc85e5646309765a3277e1cbb2ec40283a9e86f7aefcdd699e30576c582f6bb931e6c802b + checksum: 10c0/dbd0792ea729329cd9d099f28a5681ff9e8a6db48cf64e1437bf6a7fd669009d1e758a784619a1c4cc8bfd1ed17162f042c787654edf19a1f64b5018457c9c1f languageName: node linkType: hard @@ -15804,15 +16516,15 @@ __metadata: linkType: hard "node-addon-api@npm:^7.0.0": - version: 7.1.0 - resolution: "node-addon-api@npm:7.1.0" + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" dependencies: node-gyp: "npm:latest" - checksum: 10c0/2e096ab079e3c46d33b0e252386e9c239c352f7cc6d75363d9a3c00bdff34c1a5da170da861917512843f213c32d024ced9dc9552b968029786480d18727ec66 + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 languageName: node linkType: hard -"node-fetch-native@npm:^1.6.1, node-fetch-native@npm:^1.6.2, node-fetch-native@npm:^1.6.3": +"node-fetch-native@npm:^1.6.4": version: 1.6.4 resolution: "node-fetch-native@npm:1.6.4" checksum: 10c0/78334dc6def5d1d95cfe87b33ac76c4833592c5eb84779ad2b0c23c689f9dd5d1cfc827035ada72d6b8b218f717798968c5a99aeff0a1a8bf06657e80592f9c3 @@ -15866,13 +16578,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0, node-gyp-build@npm:^4.4.0, node-gyp-build@npm:^4.5.0": - version: 4.8.0 - resolution: "node-gyp-build@npm:4.8.0" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10c0/85324be16f81f0235cbbc42e3eceaeb1b5ab94c8d8f5236755e1435b4908338c65a4e75f66ee343cbcb44ddf9b52a428755bec16dcd983295be4458d95c8e1ad + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 languageName: node linkType: hard @@ -15896,10 +16608,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 languageName: node linkType: hard @@ -15968,10 +16680,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 languageName: node linkType: hard @@ -16004,7 +16716,7 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.5, object.entries@npm:^1.1.7": +"object.entries@npm:^1.1.5": version: 1.1.8 resolution: "object.entries@npm:1.1.8" dependencies: @@ -16015,7 +16727,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": +"object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -16049,21 +16761,21 @@ __metadata: languageName: node linkType: hard -"ofetch@npm:^1.3.3": - version: 1.3.4 - resolution: "ofetch@npm:1.3.4" +"ofetch@npm:^1.4.1": + version: 1.4.1 + resolution: "ofetch@npm:1.4.1" dependencies: destr: "npm:^2.0.3" - node-fetch-native: "npm:^1.6.3" - ufo: "npm:^1.5.3" - checksum: 10c0/39855005c3f8aa11c11d3a3b0c4366b67d316da58633f4cf5d4a5af0a61495fd68699f355e70deda70355ead25f27b41c3bde2fdd1d24ce3f85ac79608dd8677 + node-fetch-native: "npm:^1.6.4" + ufo: "npm:^1.5.4" + checksum: 10c0/fd712e84058ad5058a5880fe805e9bb1c2084fb7f9c54afa99a2c7e84065589b4312fa6e2dcca4432865e44ad1ec13fcd055c1bf7977ced838577a45689a04fa languageName: node linkType: hard -"ohash@npm:^1.1.3": - version: 1.1.3 - resolution: "ohash@npm:1.1.3" - checksum: 10c0/928f5bdbd8cd73f90cf544c0533dbda8e0a42d9b8c7454ab89e64e4d11bc85f85242830b4e107426ce13dc4dd3013286f8f5e0c84abd8942a014b907d9692540 +"ohash@npm:^1.1.4": + version: 1.1.4 + resolution: "ohash@npm:1.1.4" + checksum: 10c0/73c3bcab2891ee2155ed62bb4c2906f622bf2204a3c9f4616ada8a6a76276bb6b4b4180eaf273b7c7d6232793e4d79d486aab436ebfc0d06d92a997f07122864 languageName: node linkType: hard @@ -16127,16 +16839,16 @@ __metadata: linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": "npm:^1.2.3" deep-is: "npm:^0.1.3" fast-levenshtein: "npm:^2.0.6" levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - checksum: 10c0/66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 languageName: node linkType: hard @@ -16171,6 +16883,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.1.2": + version: 0.1.2 + resolution: "ox@npm:0.1.2" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9d0615e9a95c316063587fe08dc268476e67429eea897598b2f69cb1509ac66739f888b0b9bc1cfd0b4bd2f1a3fd0af4d3e81d40ba0bf3abd53e36a6f5b21323 + languageName: node + linkType: hard + "p-defer@npm:^1.0.0": version: 1.0.0 resolution: "p-defer@npm:1.0.0" @@ -16274,9 +17006,9 @@ __metadata: linkType: hard "package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b languageName: node linkType: hard @@ -16376,10 +17108,20 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c + languageName: node + linkType: hard + "path-to-regexp@npm:^0.1.2": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 + version: 0.1.11 + resolution: "path-to-regexp@npm:0.1.11" + checksum: 10c0/8ad06c6ac418cde34db4b0792204a628667a67141dc197cb85b5ad9f35810cbee34bd1aed336f960876dbd47326df30c8c5774fedf501cd67de87fb08384cfdf languageName: node linkType: hard @@ -16390,14 +17132,14 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": +"pathe@npm:^1.1.1, pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 languageName: node linkType: hard -"pbkdf2@npm:^3.0.3, pbkdf2@npm:^3.1.2": +"pbkdf2@npm:^3.1.2": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" dependencies: @@ -16410,10 +17152,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1, picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 +"picocolors@npm:^1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard @@ -16424,6 +17166,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + "pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" @@ -16509,14 +17258,14 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.0.3": - version: 1.0.3 - resolution: "pkg-types@npm:1.0.3" +"pkg-types@npm:^1.2.1": + version: 1.2.1 + resolution: "pkg-types@npm:1.2.1" dependencies: - jsonc-parser: "npm:^3.2.0" - mlly: "npm:^1.2.0" - pathe: "npm:^1.1.0" - checksum: 10c0/7f692ff2005f51b8721381caf9bdbc7f5461506ba19c34f8631660a215c8de5e6dca268f23a319dd180b8f7c47a0dc6efea14b376c485ff99e98d810b8f786c4 + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.2" + pathe: "npm:^1.1.2" + checksum: 10c0/4aef765c039e3ec3ca55171bb8ad776cf060d894c45ddf92b9d680b3fdb1817c8d1c428f74ea6aae144493fa1d6a97df6b8caec6dc31e418f1ce1f728d38014e languageName: node linkType: hard @@ -16536,6 +17285,13 @@ __metadata: languageName: node linkType: hard +"pony-cause@npm:^2.1.10": + version: 2.1.11 + resolution: "pony-cause@npm:2.1.11" + checksum: 10c0/d5db6489ec42f8fcce0fd9ad2052be98cd8f63814bf32819694ec1f4c6a01bc3be6181050d83bc79e95272174a5b9776d1c2af1fa79ef51e0ccc0f97c22b1420 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -16567,7 +17323,7 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^4.0.1": +"postcss-load-config@npm:^4.0.2": version: 4.0.2 resolution: "postcss-load-config@npm:4.0.2" dependencies: @@ -16585,24 +17341,24 @@ __metadata: languageName: node linkType: hard -"postcss-nested@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-nested@npm:6.0.1" +"postcss-nested@npm:^6.2.0": + version: 6.2.0 + resolution: "postcss-nested@npm:6.2.0" dependencies: - postcss-selector-parser: "npm:^6.0.11" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.2.14 - checksum: 10c0/2a50aa36d5d103c2e471954830489f4c024deed94fa066169101db55171368d5f80b32446b584029e0471feee409293d0b6b1d8ede361f6675ba097e477b3cbd + checksum: 10c0/7f9c3f2d764191a39364cbdcec350f26a312431a569c9ef17408021424726b0d67995ff5288405e3724bb7152a4c92f73c027e580ec91e798800ed3c52e2bc6e languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11": - version: 6.0.16 - resolution: "postcss-selector-parser@npm:6.0.16" +"postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/0e11657cb3181aaf9ff67c2e59427c4df496b4a1b6a17063fae579813f80af79d444bf38f82eeb8b15b4679653fd3089e66ef0283f9aab01874d885e6cf1d2cf + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e languageName: node linkType: hard @@ -16613,14 +17369,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.23, postcss@npm:^8.4.27, postcss@npm:^8.4.35, postcss@npm:^8.4.38": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:^8.4.27, postcss@npm:^8.4.35, postcss@npm:^8.4.43, postcss@npm:^8.4.47": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.2.0" - checksum: 10c0/955407b8f70cf0c14acf35dab3615899a2a60a26718a63c848cf3c29f2467b0533991b985a2b994430d890bd7ec2b1963e36352b0774a19143b5f591540f7c06 + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 languageName: node linkType: hard @@ -16631,10 +17387,10 @@ __metadata: languageName: node linkType: hard -"preact@npm:^10.12.0, preact@npm:^10.5.9": - version: 10.21.0 - resolution: "preact@npm:10.21.0" - checksum: 10c0/1f3cfcb5ca83b780b53593bcb917ae2e8d10a37405c32fb6774be1b5f1f3167d2156bd22c058627388330acc54da35fe8d4bbe7d38ae567a10e5d8fd943a1a06 +"preact@npm:^10.12.0, preact@npm:^10.16.0": + version: 10.24.3 + resolution: "preact@npm:10.24.3" + checksum: 10c0/c863df6d7be6a660480189762d8a8f2d4148733fc2bb9efbd9d2fd27315d2c7ede850a16077d716c91666c915c0349bd3c9699733e4f08457226a0519f408761 languageName: node linkType: hard @@ -16690,8 +17446,8 @@ __metadata: linkType: hard "prettier-plugin-tailwindcss@npm:^0.5.11": - version: 0.5.13 - resolution: "prettier-plugin-tailwindcss@npm:0.5.13" + version: 0.5.14 + resolution: "prettier-plugin-tailwindcss@npm:0.5.14" peerDependencies: "@ianvs/prettier-plugin-sort-imports": "*" "@prettier/plugin-pug": "*" @@ -16740,7 +17496,7 @@ __metadata: optional: true prettier-plugin-svelte: optional: true - checksum: 10c0/017e85276952c0110a11c5bf114781c006f1335be29944daa7c5210d81168467efc9d1d212d6ac13ff7a30b2ec30de90619dbe0bf96f61d9b0dd510bf5841a02 + checksum: 10c0/9857873cb8cb0d9b7b895806e7f6265617a08805691125d282767dffb1cb3d2c4c662f2b9168ef391edc40dff1b81beb99eee488f96544e01b8924db694f2299 languageName: node linkType: hard @@ -16763,11 +17519,11 @@ __metadata: linkType: hard "pretty-ms@npm:^9.0.0": - version: 9.1.0 - resolution: "pretty-ms@npm:9.1.0" + version: 9.2.0 + resolution: "pretty-ms@npm:9.2.0" dependencies: parse-ms: "npm:^4.0.0" - checksum: 10c0/fd111aad8800a04dfd654e6016da69bdaa6fc6a4c280f8e727cffd8b5960558e94942f1a94d4aa6e4d179561a0fbb0366a9ebe0ccefbbb0f8ff853b129cdefb9 + checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb languageName: node linkType: hard @@ -16891,7 +17647,7 @@ __metadata: languageName: node linkType: hard -"public-encrypt@npm:^4.0.0": +"public-encrypt@npm:^4.0.3": version: 4.0.3 resolution: "public-encrypt@npm:4.0.3" dependencies: @@ -16906,12 +17662,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: 10c0/bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f languageName: node linkType: hard @@ -16943,7 +17699,7 @@ __metadata: languageName: node linkType: hard -"qrcode@npm:1.5.3, qrcode@npm:^1.5.1": +"qrcode@npm:1.5.3": version: 1.5.3 resolution: "qrcode@npm:1.5.3" dependencies: @@ -16957,12 +17713,16 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.3": - version: 6.12.1 - resolution: "qs@npm:6.12.1" +"qrcode@npm:^1.5.1": + version: 1.5.4 + resolution: "qrcode@npm:1.5.4" dependencies: - side-channel: "npm:^1.0.6" - checksum: 10c0/439e6d7c6583e7c69f2cab2c39c55b97db7ce576e4c7c469082b938b7fc8746e8d547baacb69b4cd2b6666484776c3f4840ad7163a4c5326300b0afa0acdd84b + dijkstrajs: "npm:^1.0.1" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10c0/ae1d57c9cff6099639a590b432c71b15e3bd3905ce4353e6d00c95dee6bb769a8f773f6a7575ecc1b8ed476bf79c5138a4a65cb380c682de3b926d7205d34d10 languageName: node linkType: hard @@ -17004,7 +17764,7 @@ __metadata: languageName: node linkType: hard -"radix3@npm:^1.1.0": +"radix3@npm:^1.1.2": version: 1.1.2 resolution: "radix3@npm:1.1.2" checksum: 10c0/d4a295547f71af079868d2c2ed3814a9296ee026c5488212d58c106e6b4797c6eaec1259b46c9728913622f2240c9a944bfc8e2b3b5f6e4a5045338b1609f1e4 @@ -17030,7 +17790,7 @@ __metadata: languageName: node linkType: hard -"randomfill@npm:^1.0.3": +"randomfill@npm:^1.0.4": version: 1.0.4 resolution: "randomfill@npm:1.0.4" dependencies: @@ -17055,50 +17815,51 @@ __metadata: linkType: hard "react-aria@npm:^3.29.1": - version: 3.34.3 - resolution: "react-aria@npm:3.34.3" - dependencies: - "@internationalized/string": "npm:^3.2.3" - "@react-aria/breadcrumbs": "npm:^3.5.16" - "@react-aria/button": "npm:^3.9.8" - "@react-aria/calendar": "npm:^3.5.11" - "@react-aria/checkbox": "npm:^3.14.6" - "@react-aria/combobox": "npm:^3.10.3" - "@react-aria/datepicker": "npm:^3.11.2" - "@react-aria/dialog": "npm:^3.5.17" - "@react-aria/dnd": "npm:^3.7.2" - "@react-aria/focus": "npm:^3.18.2" - "@react-aria/gridlist": "npm:^3.9.3" - "@react-aria/i18n": "npm:^3.12.2" - "@react-aria/interactions": "npm:^3.22.2" - "@react-aria/label": "npm:^3.7.11" - "@react-aria/link": "npm:^3.7.4" - "@react-aria/listbox": "npm:^3.13.3" - "@react-aria/menu": "npm:^3.15.3" - "@react-aria/meter": "npm:^3.4.16" - "@react-aria/numberfield": "npm:^3.11.6" - "@react-aria/overlays": "npm:^3.23.2" - "@react-aria/progress": "npm:^3.4.16" - "@react-aria/radio": "npm:^3.10.7" - "@react-aria/searchfield": "npm:^3.7.8" - "@react-aria/select": "npm:^3.14.9" - "@react-aria/selection": "npm:^3.19.3" - "@react-aria/separator": "npm:^3.4.2" - "@react-aria/slider": "npm:^3.7.11" - "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/switch": "npm:^3.6.7" - "@react-aria/table": "npm:^3.15.3" - "@react-aria/tabs": "npm:^3.9.5" - "@react-aria/tag": "npm:^3.4.5" - "@react-aria/textfield": "npm:^3.14.8" - "@react-aria/tooltip": "npm:^3.7.7" - "@react-aria/utils": "npm:^3.25.2" - "@react-aria/visually-hidden": "npm:^3.8.15" - "@react-types/shared": "npm:^3.24.1" + version: 3.35.1 + resolution: "react-aria@npm:3.35.1" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/breadcrumbs": "npm:^3.5.18" + "@react-aria/button": "npm:^3.10.1" + "@react-aria/calendar": "npm:^3.5.13" + "@react-aria/checkbox": "npm:^3.14.8" + "@react-aria/color": "npm:^3.0.1" + "@react-aria/combobox": "npm:^3.10.5" + "@react-aria/datepicker": "npm:^3.11.4" + "@react-aria/dialog": "npm:^3.5.19" + "@react-aria/dnd": "npm:^3.7.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/meter": "npm:^3.4.17" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/progress": "npm:^3.4.17" + "@react-aria/radio": "npm:^3.10.9" + "@react-aria/searchfield": "npm:^3.7.10" + "@react-aria/select": "npm:^3.14.11" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/separator": "npm:^3.4.3" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/switch": "npm:^3.6.9" + "@react-aria/table": "npm:^3.15.5" + "@react-aria/tabs": "npm:^3.9.7" + "@react-aria/tag": "npm:^3.4.7" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/tooltip": "npm:^3.7.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/69f801d70d93a0da399723c86f3c67259896bc42062ef838a51f467154b907e11376f508d8ccb63286761fb37f22a28b090c9cb4f384c6de9ba48dbd9751d6b0 + checksum: 10c0/2211d5bf2b10d25d929dfeea589e4bb38aa2a1854afbeeeb2c57c6989fb94ff2006384b5cfd45af4974c61d81d0eeb553855f7e738ae23fb54e70989bf7bd846 languageName: node linkType: hard @@ -17112,14 +17873,14 @@ __metadata: linkType: hard "react-daisyui@npm:^5.0.0": - version: 5.0.0 - resolution: "react-daisyui@npm:5.0.0" + version: 5.0.5 + resolution: "react-daisyui@npm:5.0.5" peerDependencies: - daisyui: ^4.4.6 + daisyui: ^4.12.10 react: ">=16" react-dom: ">=16" tailwindcss: ">=3.2.7" - checksum: 10c0/8f1034fe54da0a81a76b1662b504e5f2034d2ffcef93eab5310dfd7e5289b11d0c81f2fca7e9ace5388c833aee075d209384dd9d470d012f355ab7e05e5fc5d8 + checksum: 10c0/2dc3dcf3a3fa55ecae76d05613964ee48ee3d0b2800fe47dcb12fd87ab21fbeb917c2cb1f35f2cdef27e3e229d39988de3c0720ca84cacd8ba0b65dfd29c0e2b languageName: node linkType: hard @@ -17156,10 +17917,10 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.14.0": - version: 0.14.0 - resolution: "react-refresh@npm:0.14.0" - checksum: 10c0/b8ae07ad153357d77830928a7f1fc2df837aabefee907fa273ba04c7643f3b860e986f1d4b7ada9b721c8d79b8c24b5b911a314a1a2398b105f1b13d19ea2b8d +"react-refresh@npm:^0.14.2": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: 10c0/875b72ef56b147a131e33f2abd6ec059d1989854b3ff438898e4f9310bfcc73acff709445b7ba843318a953cb9424bcc2c05af2b3d80011cee28f25aef3e2ebb languageName: node linkType: hard @@ -17199,35 +17960,36 @@ __metadata: linkType: hard "react-stately@npm:^3.27.1": - version: 3.32.2 - resolution: "react-stately@npm:3.32.2" - dependencies: - "@react-stately/calendar": "npm:^3.5.4" - "@react-stately/checkbox": "npm:^3.6.8" - "@react-stately/collections": "npm:^3.10.9" - "@react-stately/combobox": "npm:^3.9.2" - "@react-stately/data": "npm:^3.11.6" - "@react-stately/datepicker": "npm:^3.10.2" - "@react-stately/dnd": "npm:^3.4.2" - "@react-stately/form": "npm:^3.0.5" - "@react-stately/list": "npm:^3.10.8" - "@react-stately/menu": "npm:^3.8.2" - "@react-stately/numberfield": "npm:^3.9.6" - "@react-stately/overlays": "npm:^3.6.10" - "@react-stately/radio": "npm:^3.10.7" - "@react-stately/searchfield": "npm:^3.5.6" - "@react-stately/select": "npm:^3.6.7" - "@react-stately/selection": "npm:^3.16.2" - "@react-stately/slider": "npm:^3.5.7" - "@react-stately/table": "npm:^3.12.2" - "@react-stately/tabs": "npm:^3.6.9" - "@react-stately/toggle": "npm:^3.7.7" - "@react-stately/tooltip": "npm:^3.4.12" - "@react-stately/tree": "npm:^3.8.4" - "@react-types/shared": "npm:^3.24.1" + version: 3.33.0 + resolution: "react-stately@npm:3.33.0" + dependencies: + "@react-stately/calendar": "npm:^3.5.5" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/data": "npm:^3.11.7" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/radio": "npm:^3.10.8" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/table": "npm:^3.12.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-stately/toggle": "npm:^3.7.8" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e331c0391115438623b1f9890634882b47436a69fbcfd453a2e2e37c992bd0e8339c470356ed66a3457d57c45f0437c3b53c497084041dbc3cf930e83f09437e + checksum: 10c0/c5be8c2fa2ec76ca5fc1778f274ce0cda184ef03cf10e5a2676f0fc5f22559a8db70aac4fc4c2ce4b44d912a35f75714b6c47f7cd8e12e1f36cf2b0d6e89692f languageName: node linkType: hard @@ -17290,7 +18052,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -17324,21 +18086,6 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.6 - resolution: "reflect.getprototypeof@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.1" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - globalthis: "npm:^1.0.3" - which-builtin-type: "npm:^1.1.3" - checksum: 10c0/baf4ef8ee6ff341600f4720b251cf5a6cb552d6a6ab0fdc036988c451bf16f920e5feb0d46bd4f530a5cce568f1f7aca2d77447ca798920749cfc52783c39b55 - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.14.0": version: 0.14.1 resolution: "regenerator-runtime@npm:0.14.1" @@ -17346,15 +18093,15 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 + set-function-name: "npm:^2.0.2" + checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 languageName: node linkType: hard @@ -17416,7 +18163,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.4": +"resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -17429,7 +18176,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -17495,6 +18242,18 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^6.0.1": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" + dependencies: + glob: "npm:^11.0.0" + package-json-from-dist: "npm:^1.0.0" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/b30b6b072771f0d1e73b4ca5f37bb2944ee09375be9db5f558fcd3310000d29dfcfa93cf7734d75295ad5a7486dc8e40f63089ced1722a664539ffc0c3ece8c6 + languageName: node + linkType: hard + "ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": version: 2.0.2 resolution: "ripemd160@npm:2.0.2" @@ -17506,8 +18265,8 @@ __metadata: linkType: hard "rollup@npm:^2.79.1": - version: 2.79.1 - resolution: "rollup@npm:2.79.1" + version: 2.79.2 + resolution: "rollup@npm:2.79.2" dependencies: fsevents: "npm:~2.3.2" dependenciesMeta: @@ -17515,13 +18274,13 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/421418687f5dcd7324f4387f203c6bfc7118b7ace789e30f5da022471c43e037a76f5fd93837052754eeeae798a4fb266ac05ccee1e594406d912a59af98dde9 + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 languageName: node linkType: hard "rollup@npm:^3.27.1": - version: 3.29.4 - resolution: "rollup@npm:3.29.4" + version: 3.29.5 + resolution: "rollup@npm:3.29.5" dependencies: fsevents: "npm:~2.3.2" dependenciesMeta: @@ -17529,31 +18288,33 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/65eddf84bf389ea8e4d4c1614b1c6a298d08f8ae785c0c087e723a879190c8aaddbab4aa3b8a0524551b9036750c9f8bfea27b377798accfd2ba5084ceff5aaa - languageName: node - linkType: hard - -"rollup@npm:^4.13.0, rollup@npm:^4.18.0": - version: 4.22.4 - resolution: "rollup@npm:4.22.4" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.22.4" - "@rollup/rollup-android-arm64": "npm:4.22.4" - "@rollup/rollup-darwin-arm64": "npm:4.22.4" - "@rollup/rollup-darwin-x64": "npm:4.22.4" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.22.4" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.22.4" - "@rollup/rollup-linux-arm64-gnu": "npm:4.22.4" - "@rollup/rollup-linux-arm64-musl": "npm:4.22.4" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.22.4" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.22.4" - "@rollup/rollup-linux-s390x-gnu": "npm:4.22.4" - "@rollup/rollup-linux-x64-gnu": "npm:4.22.4" - "@rollup/rollup-linux-x64-musl": "npm:4.22.4" - "@rollup/rollup-win32-arm64-msvc": "npm:4.22.4" - "@rollup/rollup-win32-ia32-msvc": "npm:4.22.4" - "@rollup/rollup-win32-x64-msvc": "npm:4.22.4" - "@types/estree": "npm:1.0.5" + checksum: 10c0/a1fa26f21f0d6cf93b6d05ea284ad5854905b585f28a14c27d439b0f9b859cba13ea25f376303d86770e59b4686bedc52b4706e57442514f0414c6fd3c5b8e71 + languageName: node + linkType: hard + +"rollup@npm:^4.18.0, rollup@npm:^4.20.0": + version: 4.27.3 + resolution: "rollup@npm:4.27.3" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.27.3" + "@rollup/rollup-android-arm64": "npm:4.27.3" + "@rollup/rollup-darwin-arm64": "npm:4.27.3" + "@rollup/rollup-darwin-x64": "npm:4.27.3" + "@rollup/rollup-freebsd-arm64": "npm:4.27.3" + "@rollup/rollup-freebsd-x64": "npm:4.27.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.27.3" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.27.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.27.3" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.27.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-s390x-gnu": "npm:4.27.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-x64-musl": "npm:4.27.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.27.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.27.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.27.3" + "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -17564,6 +18325,10 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true "@rollup/rollup-linux-arm-musleabihf": @@ -17592,25 +18357,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/4c96b6e2e0c5dbe73b4ba899cea894a05115ab8c65ccff631fbbb944e2b3a9f2eb3b99c2dce3dd91b179647df1892ffc44ecee29381ccf155ba8000b22712a32 - languageName: node - linkType: hard - -"rpc-websockets@npm:^7.11.0": - version: 7.11.0 - resolution: "rpc-websockets@npm:7.11.0" - dependencies: - bufferutil: "npm:^4.0.1" - eventemitter3: "npm:^4.0.7" - utf-8-validate: "npm:^5.0.2" - uuid: "npm:^8.3.2" - ws: "npm:^8.5.0" - dependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/d643c050e914147a214ee167afb04ee145bfec888f771265cc3ec90acfc1c84cdcb18f802f359f142fdb18ed8e529bd64829ba6523f3db235e5b4bbd52370c21 + checksum: 10c0/789885d3f852ed7ca45bed14194a2ac7a2cf16b6b62b54f691c79e27d5557d31a2d612d3680c26c527a1957e0bd6811806ddd765e0dae589404cf24544ff2838 languageName: node linkType: hard @@ -17630,15 +18377,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^6.6.3": - version: 6.6.7 - resolution: "rxjs@npm:6.6.7" - dependencies: - tslib: "npm:^1.9.0" - checksum: 10c0/e556a13a9aa89395e5c9d825eabcfa325568d9c9990af720f3f29f04a888a3b854f25845c2b55875d875381abcae2d8100af9cacdc57576e7ed6be030a01d2fe - languageName: node - linkType: hard - "rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" @@ -17686,9 +18424,9 @@ __metadata: linkType: hard "safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 10c0/81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 languageName: node linkType: hard @@ -17699,16 +18437,7 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd - languageName: node - linkType: hard - -"scheduler@npm:^0.23.2": +"scheduler@npm:^0.23.0, scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" dependencies: @@ -17725,14 +18454,14 @@ __metadata: linkType: hard "secp256k1@npm:^4.0.2": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" + version: 4.0.4 + resolution: "secp256k1@npm:4.0.4" dependencies: - elliptic: "npm:^6.5.4" - node-addon-api: "npm:^2.0.0" + elliptic: "npm:^6.5.7" + node-addon-api: "npm:^5.0.0" node-gyp: "npm:latest" node-gyp-build: "npm:^4.2.0" - checksum: 10c0/de0a0e525a6f8eb2daf199b338f0797dbfe5392874285a145bb005a72cabacb9d42c0197d0de129a1a0f6094d2cc4504d1f87acb6a8bbfb7770d4293f252c401 + checksum: 10c0/cf7a74343566d4774c64332c07fc2caf983c80507f63be5c653ff2205242143d6320c50ee4d793e2b714a56540a79e65a8f0056e343b25b0cdfed878bc473fd8 languageName: node linkType: hard @@ -17763,13 +18492,6 @@ __metadata: languageName: node linkType: hard -"ses@npm:^0.18.4": - version: 0.18.4 - resolution: "ses@npm:0.18.4" - checksum: 10c0/d0d3e296bed05eb6cfc0afee7b41f78b85d599cb1c9a8decc77ada79c6fafdf766e7e0085f8112776de59d62b6a774db6fc85d5049778e596e3c9841a8c003bf - languageName: node - linkType: hard - "ses@npm:^0.18.5, ses@npm:^0.18.8": version: 0.18.8 resolution: "ses@npm:0.18.8" @@ -17779,7 +18501,7 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.10.0": +"ses@npm:^1.10.0, ses@npm:^1.8.0": version: 1.10.0 resolution: "ses@npm:1.10.0" dependencies: @@ -17788,15 +18510,6 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.8.0": - version: 1.8.0 - resolution: "ses@npm:1.8.0" - dependencies: - "@endo/env-options": "npm:^1.1.6" - checksum: 10c0/4b2114e586a547dd2a71477e0a42e8ea5d0ea9c3ff135d0dbfb63569eeda19c7152db76b82bcad12a2969d3f5fb09e5fa52e921b5a2831560e6876ca1f9ba207 - languageName: node - linkType: hard - "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -17818,7 +18531,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -17865,7 +18578,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": +"side-channel@npm:^1.0.4": version: 1.0.6 resolution: "side-channel@npm:1.0.6" dependencies: @@ -18008,10 +18721,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard @@ -18054,9 +18767,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.17 - resolution: "spdx-license-ids@npm:3.0.17" - checksum: 10c0/ddf9477b5afc70f1a7d3bf91f0b8e8a1c1b0fa65d2d9a8b5c991b1a2ba91b693d8b9749700119d5ce7f3fbf307ac421087ff43d321db472605e98a5804f80eac + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c languageName: node linkType: hard @@ -18119,19 +18832,9 @@ __metadata: linkType: hard "std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10c0/60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e - languageName: node - linkType: hard - -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: "npm:~2.0.4" - readable-stream: "npm:^3.5.0" - checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10c0/f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 languageName: node linkType: hard @@ -18171,6 +18874,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.9": version: 1.2.9 resolution: "string.prototype.trim@npm:1.2.9" @@ -18276,7 +18990,7 @@ __metadata: languageName: node linkType: hard -"sucrase@npm:^3.32.0": +"sucrase@npm:^3.35.0": version: 3.35.0 resolution: "sucrase@npm:3.35.0" dependencies: @@ -18294,13 +19008,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^0.14.2": - version: 0.14.2 - resolution: "superstruct@npm:0.14.2" - checksum: 10c0/e5518f6701524fb8cbae504a84dc9c304bf3fe01616230a5eb4e14af9bfc4e3518b94bfe457e57a5d1b99a2b54f82881b4a39e0b266caa6053f84aa294613b94 - languageName: node - linkType: hard - "superstruct@npm:^1.0.3": version: 1.0.4 resolution: "superstruct@npm:1.0.4" @@ -18320,15 +19027,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -18371,12 +19069,12 @@ __metadata: linkType: hard "synckit@npm:^0.9.1": - version: 0.9.1 - resolution: "synckit@npm:0.9.1" + version: 0.9.2 + resolution: "synckit@npm:0.9.2" dependencies: "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: 10c0/d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e + checksum: 10c0/e0c262817444e5b872708adb6f5ad37951ba33f6b2d1d4477d45db1f57573a784618ceed5e6614e0225db330632b1f6b95bb74d21e4d013e45ad4bde03d0cb59 languageName: node linkType: hard @@ -18408,35 +19106,35 @@ __metadata: linkType: hard "tailwindcss@npm:^3.4.1": - version: 3.4.3 - resolution: "tailwindcss@npm:3.4.3" + version: 3.4.15 + resolution: "tailwindcss@npm:3.4.15" dependencies: "@alloc/quick-lru": "npm:^5.2.0" arg: "npm:^5.0.2" - chokidar: "npm:^3.5.3" + chokidar: "npm:^3.6.0" didyoumean: "npm:^1.2.2" dlv: "npm:^1.1.3" - fast-glob: "npm:^3.3.0" + fast-glob: "npm:^3.3.2" glob-parent: "npm:^6.0.2" is-glob: "npm:^4.0.3" - jiti: "npm:^1.21.0" + jiti: "npm:^1.21.6" lilconfig: "npm:^2.1.0" - micromatch: "npm:^4.0.5" + micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" object-hash: "npm:^3.0.0" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.23" + picocolors: "npm:^1.1.1" + postcss: "npm:^8.4.47" postcss-import: "npm:^15.1.0" postcss-js: "npm:^4.0.1" - postcss-load-config: "npm:^4.0.1" - postcss-nested: "npm:^6.0.1" - postcss-selector-parser: "npm:^6.0.11" - resolve: "npm:^1.22.2" - sucrase: "npm:^3.32.0" + postcss-load-config: "npm:^4.0.2" + postcss-nested: "npm:^6.2.0" + postcss-selector-parser: "npm:^6.1.2" + resolve: "npm:^1.22.8" + sucrase: "npm:^3.35.0" bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 10c0/11e5546494f2888f693ebaa271b218b3a8e52fe59d7b629e54f2dffd6eaafd5ded2e9f0c37ad04e6a866dffb2b116d91becebad77e1441beee8bf016bb2392f9 + checksum: 10c0/709058837c5adf0b7e1386ba353983dcf2af3d390e8822fac8d53ecaaad0f6f040fd3050b1db636e2abd46ae775317a89b350ce925477ea96cca8f6c56d901df languageName: node linkType: hard @@ -18495,13 +19193,6 @@ __metadata: languageName: node linkType: hard -"text-encoding-utf-8@npm:^1.0.2": - version: 1.0.2 - resolution: "text-encoding-utf-8@npm:1.0.2" - checksum: 10c0/87a64b394c850e8387c2ca7fc6929a26ce97fb598f1c55cd0fdaec4b8e2c3ed6770f65b2f3309c9175ef64ac5e403c8e48b53ceeb86d2897940c5e19cc00bb99 - languageName: node - linkType: hard - "text-hex@npm:1.0.x": version: 1.0.0 resolution: "text-hex@npm:1.0.0" @@ -18543,7 +19234,7 @@ __metadata: languageName: node linkType: hard -"through@npm:>=2.2.7 <3, through@npm:^2.3.6": +"through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc @@ -18558,8 +19249,8 @@ __metadata: linkType: hard "tiny-secp256k1@npm:^1.1.3": - version: 1.1.6 - resolution: "tiny-secp256k1@npm:1.1.6" + version: 1.1.7 + resolution: "tiny-secp256k1@npm:1.1.7" dependencies: bindings: "npm:^1.3.0" bn.js: "npm:^4.11.8" @@ -18567,7 +19258,7 @@ __metadata: elliptic: "npm:^6.4.0" nan: "npm:^2.13.2" node-gyp: "npm:latest" - checksum: 10c0/b47ceada38f6fa65190906e8a98b58d1584b0640383f04db8196a7098c726e926cfba6271a53e97d98d4c67e2b364618d7b3d7e402f63e44f0e07a4aca82ac8b + checksum: 10c0/3e2abe9e77676be0e233042f101cedef44da167290b12c4130489b6c6f7f52c497d8a13c39119fa15ed68411e5de02afa4a0f2e678958b6936576c422acc7c74 languageName: node linkType: hard @@ -18594,13 +19285,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -18639,20 +19323,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" - peerDependencies: - typescript: ">=4.2.0" - checksum: 10c0/f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c - languageName: node - linkType: hard - -"ts-api-utils@npm:~1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.4.0 + resolution: "ts-api-utils@npm:1.4.0" peerDependencies: typescript: ">=4.2.0" - checksum: 10c0/9408338819c3aca2a709f0bc54e3f874227901506cacb1163612a6c8a43df224174feb965a5eafdae16f66fc68fd7bfee8d3275d0fa73fbb8699e03ed26520c9 + checksum: 10c0/1b2bfa50ea52771d564bb143bb69010d25cda03ed573095fbac9b86f717012426443af6647e00e3db70fca60360482a30c1be7cf73c3521c321f6bf5e3594ea0 languageName: node linkType: hard @@ -18711,8 +19386,8 @@ __metadata: linkType: hard "tsconfck@npm:^3.0.3": - version: 3.0.3 - resolution: "tsconfck@npm:3.0.3" + version: 3.1.4 + resolution: "tsconfck@npm:3.1.4" peerDependencies: typescript: ^5.0.0 peerDependenciesMeta: @@ -18720,7 +19395,7 @@ __metadata: optional: true bin: tsconfck: bin/tsconfck.js - checksum: 10c0/d45009230c4caa5fc765bdded96f3b8703a7cdd44a1d63024914b0fb1c4dabf9e94d28cc9f9edccaef9baa7b99adc963502d34943d82fcb07b92e1161ee03c56 + checksum: 10c0/5120e91b3388574b449d57d08f45d05d9966cf4b9d6aa1018652c1fff6d7d37b1ed099b07e6ebf6099aa40b8a16968dd337198c55b7274892849112b942861ed languageName: node linkType: hard @@ -18737,34 +19412,34 @@ __metadata: linkType: hard "tsimp@npm:^2.0.10": - version: 2.0.11 - resolution: "tsimp@npm:2.0.11" + version: 2.0.12 + resolution: "tsimp@npm:2.0.12" dependencies: "@isaacs/cached": "npm:^1.0.1" "@isaacs/catcher": "npm:^1.0.4" foreground-child: "npm:^3.1.1" mkdirp: "npm:^3.0.1" pirates: "npm:^4.0.6" - rimraf: "npm:^5.0.5" + rimraf: "npm:^6.0.1" signal-exit: "npm:^4.1.0" sock-daemon: "npm:^1.4.2" - walk-up-path: "npm:^3.0.1" + walk-up-path: "npm:^4.0.0" peerDependencies: typescript: ^5.1.0 bin: tsimp: dist/esm/bin.mjs - checksum: 10c0/20743dc21ce31678050582903bfcd2d600fa17305f70162cb4127f2fd208116354549a921574f6c26cdfca5cb07c24526094e5519bb294f2ddd13c06cd2f43eb + checksum: 10c0/c56c03a6a4df3ab5ebcefcc0b473992cbb7150173c331be6bda01670d5ae3965e65f30c42757cd391100a1c21485e167a05a350d875f41826b35c45008e5fac8 languageName: node linkType: hard -"tslib@npm:1 || 2, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb +"tslib@npm:1 || 2, tslib@npm:2, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.6.2, tslib@npm:^2.8.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard -"tslib@npm:1.14.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0": +"tslib@npm:1.14.1, tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 @@ -18783,8 +19458,8 @@ __metadata: linkType: hard "tsx@npm:^4.19.1": - version: 4.19.1 - resolution: "tsx@npm:4.19.1" + version: 4.19.2 + resolution: "tsx@npm:4.19.2" dependencies: esbuild: "npm:~0.23.0" fsevents: "npm:~2.3.3" @@ -18794,7 +19469,7 @@ __metadata: optional: true bin: tsx: dist/cli.mjs - checksum: 10c0/cbea9baf57e7406fa0ecc2c03b9bb2501ee740dc28c938f949180a646a28e5d65e7cccbfba340508923bfd45e90320ef9eef7f815cae4515b6ef2ee429edc7ee + checksum: 10c0/63164b889b1d170403e4d8753a6755dec371f220f5ce29a8e88f1f4d6085a784a12d8dc2ee669116611f2c72757ac9beaa3eea5c452796f541bdd2dc11753721 languageName: node linkType: hard @@ -18816,30 +19491,31 @@ __metadata: languageName: node linkType: hard -"type-coverage-core@npm:^2.28.1": - version: 2.28.1 - resolution: "type-coverage-core@npm:2.28.1" +"type-coverage-core@npm:^2.29.7": + version: 2.29.7 + resolution: "type-coverage-core@npm:2.29.7" dependencies: fast-glob: "npm:3" - minimatch: "npm:6 || 7 || 8 || 9" + minimatch: "npm:6 || 7 || 8 || 9 || 10" normalize-path: "npm:3" tslib: "npm:1 || 2" tsutils: "npm:3" peerDependencies: typescript: 2 || 3 || 4 || 5 - checksum: 10c0/b4a90e401be263d426d03b7b95173f3554a6bfdcb8bf098a66d31f94637ee2988db56ffbb50a81e61b3741ea3d43ac2ba6698499efb8679a913d7924308c5e88 + checksum: 10c0/bc13f773b1931fe5afde432c9531d6a0cad3a26fad2c3f4765cf975f1f286b8130e7dffc7dfc2a819d91f7f8238370d5e75dc64d5e94d4804d0119b050e35aad languageName: node linkType: hard "type-coverage@npm:^2.26.3": - version: 2.28.2 - resolution: "type-coverage@npm:2.28.2" + version: 2.29.7 + resolution: "type-coverage@npm:2.29.7" dependencies: + chalk: "npm:4.1.2" minimist: "npm:1" - type-coverage-core: "npm:^2.28.1" + type-coverage-core: "npm:^2.29.7" bin: type-coverage: bin/type-coverage - checksum: 10c0/215665a2b205bc04b2f35e40ede73dd0d19eeecdc01fc3dc67b7c5497498abc9583965930b0a4c573132180ed253c2fe72b833d91c5cdb095209a052ac11df7c + checksum: 10c0/96f701bad0c48f40cc8f976327de047823be9a72f6340def0347fbbdecc1ca497586f04b016cf14a30e22927c4a74ee98c536007f59eb855968e54de42458be5 languageName: node linkType: hard @@ -18948,7 +19624,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.2.2, typescript@npm:^5.5.2, typescript@npm:^5.6.3, typescript@npm:~5.6.3": version: 5.6.3 resolution: "typescript@npm:5.6.3" bin: @@ -18958,17 +19634,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2, typescript@npm:^5.5.2, typescript@npm:~5.6.1-rc": - version: 5.6.2 - resolution: "typescript@npm:5.6.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/3ed8297a8c7c56b7fec282532503d1ac795239d06e7c4966b42d4330c6cf433a170b53bcf93a130a7f14ccc5235de5560df4f1045eb7f3550b46ebed16d3c5e5 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": +"typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin, typescript@patch:typescript@npm%3A~5.6.3#optional!builtin": version: 5.6.3 resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" bin: @@ -18978,27 +19644,28 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A~5.6.1-rc#optional!builtin": - version: 5.6.2 - resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=74658d" +"ua-parser-js@npm:^1.0.35": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/e6c1662e4852e22fe4bbdca471dca3e3edc74f6f1df043135c44a18a7902037023ccb0abdfb754595ca9028df8920f2f8492c00fc3cbb4309079aae8b7de71cd + ua-parser-js: script/cli.js + checksum: 10c0/c6452b0c683000f10975cb0a7e74cb1119ea95d4522ae85f396fa53b0b17884358a24ffdd86a66030c6b2981bdc502109a618c79fdaa217ee9032c9e46fcc78a languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: 10c0/dac8cf82a55b2e097bd2286954e01454c4cfcf23c9d9b56961ce94bda3cec5a38ca536e6e84c20a4000a9d4b4a4abcbd98ec634ccebe21be36595ea3069126e4 +"ufo@npm:^1.5.4": + version: 1.5.4 + resolution: "ufo@npm:1.5.4" + checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 languageName: node linkType: hard -"ufo@npm:^1.3.2, ufo@npm:^1.4.0, ufo@npm:^1.5.3": - version: 1.5.3 - resolution: "ufo@npm:1.5.3" - checksum: 10c0/1df10702582aa74f4deac4486ecdfd660e74be057355f1afb6adfa14243476cf3d3acff734ccc3d0b74e9bfdefe91d578f3edbbb0a5b2430fe93cd672370e024 +"uint8arrays@npm:3.1.0": + version: 3.1.0 + resolution: "uint8arrays@npm:3.1.0" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 10c0/e54e64593a76541330f0fea97b1b5dea6becbbec3572b9bb88863d064f2630bede4d42eafd457f19c6ef9125f50bfc61053d519c4d71b59c3b7566a0691e3ba2 languageName: node linkType: hard @@ -19037,23 +19704,16 @@ __metadata: languageName: node linkType: hard -"unenv@npm:^1.9.0": - version: 1.9.0 - resolution: "unenv@npm:1.9.0" +"unenv@npm:^1.10.0": + version: 1.10.0 + resolution: "unenv@npm:1.10.0" dependencies: consola: "npm:^3.2.3" - defu: "npm:^6.1.3" + defu: "npm:^6.1.4" mime: "npm:^3.0.0" - node-fetch-native: "npm:^1.6.1" - pathe: "npm:^1.1.1" - checksum: 10c0/d00012badc83731c07f08d5129c702c49c0212375eb3732b27aae89ace3c67162dbaea4496965676f18fc06b0ec445d91385e283f5fd3e4540dda8b0b5424f81 - languageName: node - linkType: hard - -"unfetch@npm:^4.2.0": - version: 4.2.0 - resolution: "unfetch@npm:4.2.0" - checksum: 10c0/a5c0a896a6f09f278b868075aea65652ad185db30e827cb7df45826fe5ab850124bf9c44c4dafca4bf0c55a0844b17031e8243467fcc38dd7a7d435007151f1b + node-fetch-native: "npm:^1.6.4" + pathe: "npm:^1.1.2" + checksum: 10c0/354180647e21204b6c303339e7364b920baadb2672b540a88af267bc827636593e0bf79f59753dcc6b7ab5d4c83e71d69a9171a3596befb8bf77e0bb3c7612b9 languageName: node linkType: hard @@ -19099,33 +19759,33 @@ __metadata: linkType: hard "unstorage@npm:^1.9.0": - version: 1.10.2 - resolution: "unstorage@npm:1.10.2" + version: 1.13.1 + resolution: "unstorage@npm:1.13.1" dependencies: anymatch: "npm:^3.1.3" chokidar: "npm:^3.6.0" + citty: "npm:^0.1.6" destr: "npm:^2.0.3" - h3: "npm:^1.11.1" - listhen: "npm:^1.7.2" - lru-cache: "npm:^10.2.0" - mri: "npm:^1.2.0" - node-fetch-native: "npm:^1.6.2" - ofetch: "npm:^1.3.3" - ufo: "npm:^1.4.0" + h3: "npm:^1.13.0" + listhen: "npm:^1.9.0" + lru-cache: "npm:^10.4.3" + node-fetch-native: "npm:^1.6.4" + ofetch: "npm:^1.4.1" + ufo: "npm:^1.5.4" peerDependencies: - "@azure/app-configuration": ^1.5.0 - "@azure/cosmos": ^4.0.0 + "@azure/app-configuration": ^1.7.0 + "@azure/cosmos": ^4.1.1 "@azure/data-tables": ^13.2.2 - "@azure/identity": ^4.0.1 - "@azure/keyvault-secrets": ^4.8.0 - "@azure/storage-blob": ^12.17.0 - "@capacitor/preferences": ^5.0.7 - "@netlify/blobs": ^6.5.0 || ^7.0.0 - "@planetscale/database": ^1.16.0 - "@upstash/redis": ^1.28.4 + "@azure/identity": ^4.5.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.25.0 + "@capacitor/preferences": ^6.0.2 + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 "@vercel/kv": ^1.0.1 idb-keyval: ^6.2.1 - ioredis: ^5.3.2 + ioredis: ^5.4.1 peerDependenciesMeta: "@azure/app-configuration": optional: true @@ -19153,7 +19813,7 @@ __metadata: optional: true ioredis: optional: true - checksum: 10c0/89d61e6b2165ddc78005b8a4a340576877b56b70ec0b318f7cf2e74ee7ab19006036267ba28587100fa7256c573db3bd720700daf6586bbdcad4ed60b64c4284 + checksum: 10c0/809f79b76d8fe0e72579dfee1e17b5fb9faec476d02d5b9ab664b9f6eb8822ddeb14aa1aa6a2bfa8e58cda9db133995d487aaa201882e2d83f703df5c7fc4e73 languageName: node linkType: hard @@ -19170,17 +19830,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.0" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 languageName: node linkType: hard @@ -19249,7 +19909,7 @@ __metadata: languageName: node linkType: hard -"utf-8-validate@npm:^5.0.2, utf-8-validate@npm:^5.0.5": +"utf-8-validate@npm:^5.0.5": version: 5.0.10 resolution: "utf-8-validate@npm:5.0.10" dependencies: @@ -19266,7 +19926,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.4, util@npm:^0.12.5": +"util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -19286,15 +19946,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - "uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" @@ -19350,7 +20001,7 @@ __metadata: languageName: node linkType: hard -"viem@npm:^1.0.0, viem@npm:^1.6.0": +"viem@npm:^1.0.0": version: 1.21.4 resolution: "viem@npm:1.21.4" dependencies: @@ -19371,6 +20022,28 @@ __metadata: languageName: node linkType: hard +"viem@npm:^2.1.1": + version: 2.21.48 + resolution: "viem@npm:2.21.48" + dependencies: + "@noble/curves": "npm:1.6.0" + "@noble/hashes": "npm:1.5.0" + "@scure/bip32": "npm:1.5.0" + "@scure/bip39": "npm:1.4.0" + abitype: "npm:1.0.6" + isows: "npm:1.0.6" + ox: "npm:0.1.2" + webauthn-p256: "npm:0.0.10" + ws: "npm:8.18.0" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/e9b2799535263a859bddda25d962b13d2c76aec191e1849dd0f268c32a43eb65932a05cc5be270c92e19d79aafda73884690c0b0fbdb9311266a01ea3f659082 + languageName: node + linkType: hard + "vite-tsconfig-paths@npm:^4.2.0": version: 4.3.2 resolution: "vite-tsconfig-paths@npm:4.3.2" @@ -19388,8 +20061,8 @@ __metadata: linkType: hard "vite@npm:^4.3.2": - version: 4.5.3 - resolution: "vite@npm:4.5.3" + version: 4.5.5 + resolution: "vite@npm:4.5.5" dependencies: esbuild: "npm:^0.18.10" fsevents: "npm:~2.3.2" @@ -19423,23 +20096,24 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/caeb1eecc0a8e0865782899e2f83d2993a9816562badc1c8291316d80d49b82f12038abd8cb8b8c627b6f369f58dfb25972ef4517d5e6e1b6e1bf7ee5b63a8a6 + checksum: 10c0/cde5a1d80ae61b2c0b2e2a04938e10aa8821a4c2c625f1dcd6eff179f0c9ce98a5b3c8fd62b54a81299568f7747fff4d35ffecc0e7f7ff34d76124d94a24ce9b languageName: node linkType: hard "vite@npm:^5.1.4": - version: 5.2.7 - resolution: "vite@npm:5.2.7" + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: - esbuild: "npm:^0.20.1" + esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.38" - rollup: "npm:^4.13.0" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -19455,6 +20129,8 @@ __metadata: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -19463,7 +20139,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/ca927a8df388f75df194d5a5ba2be4ee46dc1d99d5be277f13c6d1ed4a4df833cc953741ef8e984061ea38b531df84e15e2a9f5deea1626317bcbec63c8ca01c + checksum: 10c0/d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 languageName: node linkType: hard @@ -19488,10 +20164,10 @@ __metadata: languageName: node linkType: hard -"walk-up-path@npm:^3.0.1": - version: 3.0.1 - resolution: "walk-up-path@npm:3.0.1" - checksum: 10c0/3184738e0cf33698dd58b0ee4418285b9c811e58698f52c1f025435a85c25cbc5a63fee599f1a79cb29ca7ef09a44ec9417b16bfd906b1a37c305f7aa20ee5bc +"walk-up-path@npm:^4.0.0": + version: 4.0.0 + resolution: "walk-up-path@npm:4.0.0" + checksum: 10c0/fabe344f91387d1d41df230af962ef18bf703dd4178006d55cd6412caacd187b54440002d4d53a982d4f7f0455567dcffb6d3884533c8b2268928eca3ebd8a19 languageName: node linkType: hard @@ -19504,7 +20180,24 @@ __metadata: languageName: node linkType: hard -"webextension-polyfill@npm:>=0.10.0 <1.0, webextension-polyfill@npm:^0.10.0": +"webauthn-p256@npm:0.0.10": + version: 0.0.10 + resolution: "webauthn-p256@npm:0.0.10" + dependencies: + "@noble/curves": "npm:^1.4.0" + "@noble/hashes": "npm:^1.4.0" + checksum: 10c0/27d836d81a1fec24a31d2d9b652f8ff6876b51940d1003bbd14dc5cfa57c58d84223b5a4eece229516522fd997bc0bc7be618ac42b129fb5fa42fa530060b16d + languageName: node + linkType: hard + +"webextension-polyfill@npm:>=0.10.0 <1.0": + version: 0.12.0 + resolution: "webextension-polyfill@npm:0.12.0" + checksum: 10c0/5ace2aaaf6a203515bdd2fb948622f186a5fbb50099b539ce9c0ad54896f9cc1fcc3c0e2a71d1f7071dd7236d7daebba1e0cbcf43bfdfe54361addf0333ee7d1 + languageName: node + linkType: hard + +"webextension-polyfill@npm:^0.10.0": version: 0.10.0 resolution: "webextension-polyfill@npm:0.10.0" checksum: 10c0/6a45278f1fed8fbd5355f9b19a7b0b3fadc91fa3a6eef69125a1706bb3efa2181235eefbfb3f538443bb396cfcb97512361551888ce8465c08914431cb2d5b6d @@ -19548,38 +20241,6 @@ __metadata: languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" - dependencies: - function.prototype.name: "npm:^1.1.5" - has-tostringtag: "npm:^1.0.0" - is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.0.5" - is-finalizationregistry: "npm:^1.0.2" - is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.1.4" - is-weakref: "npm:^1.0.2" - isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.0.2" - which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.9" - checksum: 10c0/2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4 - languageName: node - linkType: hard - -"which-collection@npm:^1.0.1": - version: 1.0.2 - resolution: "which-collection@npm:1.0.2" - dependencies: - is-map: "npm:^2.0.3" - is-set: "npm:^2.0.3" - is-weakmap: "npm:^2.0.2" - is-weakset: "npm:^2.0.3" - checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 - languageName: node - linkType: hard - "which-module@npm:^2.0.0": version: 2.0.1 resolution: "which-module@npm:2.0.1" @@ -19587,7 +20248,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" dependencies: @@ -19632,13 +20293,13 @@ __metadata: linkType: hard "winston-transport@npm:^4.4.0": - version: 4.7.0 - resolution: "winston-transport@npm:4.7.0" + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" dependencies: - logform: "npm:^2.3.2" - readable-stream: "npm:^3.6.0" + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" triple-beam: "npm:^1.3.0" - checksum: 10c0/cd16f3d0ab56697f93c4899e0eb5f89690f291bb6cf309194819789326a7c7ed943ef00f0b2fab513b114d371314368bde1a7ae6252ad1516181a79f90199cd2 + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 languageName: node linkType: hard @@ -19659,6 +20320,13 @@ __metadata: languageName: node linkType: hard +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -19739,33 +20407,33 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.2.0, ws@npm:^7.4.5, ws@npm:^7.5.1, ws@npm:^7.5.9": - version: 7.5.9 - resolution: "ws@npm:7.5.9" +"ws@npm:8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 10c0/aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 languageName: node linkType: hard -"ws@npm:^8.5.0": - version: 8.17.0 - resolution: "ws@npm:8.17.0" +"ws@npm:^7, ws@npm:^7.2.0, ws@npm:^7.5.1, ws@npm:^7.5.9": + version: 7.5.10 + resolution: "ws@npm:7.5.10" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 10c0/55241ec93a66fdfc4bf4f8bc66c8eb038fda2c7a4ee8f6f157f2ca7dc7aa76aea0c0da0bf3adb2af390074a70a0e45456a2eaf80e581e630b75df10a64b0a990 + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d languageName: node linkType: hard @@ -19815,11 +20483,11 @@ __metadata: linkType: hard "yaml@npm:^2.3.4": - version: 2.4.1 - resolution: "yaml@npm:2.4.1" + version: 2.6.1 + resolution: "yaml@npm:2.6.1" bin: yaml: bin.mjs - checksum: 10c0/816057dbaea16a7dfb0b868ace930f143dece96bbb4c4fbb6f38aa389166f897240d9fa535dbfd6b1b0d9442416f4abcc698e63f82394d0c67b329aa6c2be576 + checksum: 10c0/aebf07f61c72b38c74d2b60c3a3ccf89ee4da45bcd94b2bfb7899ba07a5257625a7c9f717c65a6fc511563d48001e01deb1d9e55f0133f3e2edf86039c8c1be7 languageName: node linkType: hard @@ -19889,9 +20557,9 @@ __metadata: linkType: hard "yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 10c0/856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 languageName: node linkType: hard From ec7c4c569b590dc41f758e4ff0be411f40a77b99 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 15:17:25 +0500 Subject: [PATCH 24/31] fixup! files relocation --- contract/rollup.config.mjs | 2 +- contract/src/auto-stake-it.contract.js | 4 +- contract/src/cosmos-api.ts | 350 ++++++++++++++++++ contract/src/exos/chain-hub.js | 2 +- .../src/exos/cosmos-orchestration-account.js | 8 +- contract/src/exos/exo-interfaces.ts | 2 +- contract/src/exos/ica-account-kit.js | 4 +- contract/src/exos/icq-connection-kit.js | 2 +- .../src/exos/local-orchestration-account.js | 8 +- .../{orca.contract.ts => orca.contract.js} | 48 ++- contract/src/{orca.flows.ts => orca.flows.js} | 41 +- contract/src/orca.proposal.js | 2 +- contract/src/orchestration-api.ts | 282 ++++++++++++++ contract/src/utils/address.js | 103 ------ contract/src/utils/amounts.js | 59 --- contract/src/utils/cosmos.js | 82 ---- contract/src/utils/denomHash.js | 22 -- contract/src/utils/orc.js | 38 -- contract/src/utils/orchestrationAccount.js | 40 -- contract/src/utils/packet.js | 112 ------ contract/src/utils/registry.js | 130 ------- contract/src/utils/start-helper.js | 214 ----------- contract/src/utils/time.js | 48 --- contract/src/utils/zcf-tools.js | 35 -- contract/src/utils/zoe-tools.js | 186 ---------- contract/test/auto-stake-it.contract.test.ts | 2 +- contract/test/bundle-source.test.js | 2 +- contract/test/old_network-fakes.js | 268 -------------- contract/test/orca-contract.test.js | 4 +- contract/tools/ibc-mocks.ts | 2 +- contract/utils/address.js | 2 +- contract/utils/start-helper.js | 16 +- contract/utils/zcf-tools.js | 2 +- 33 files changed, 719 insertions(+), 1403 deletions(-) create mode 100644 contract/src/cosmos-api.ts rename contract/src/{orca.contract.ts => orca.contract.js} (77%) rename contract/src/{orca.flows.ts => orca.flows.js} (69%) create mode 100644 contract/src/orchestration-api.ts delete mode 100644 contract/src/utils/address.js delete mode 100644 contract/src/utils/amounts.js delete mode 100644 contract/src/utils/cosmos.js delete mode 100644 contract/src/utils/denomHash.js delete mode 100644 contract/src/utils/orc.js delete mode 100644 contract/src/utils/orchestrationAccount.js delete mode 100644 contract/src/utils/packet.js delete mode 100644 contract/src/utils/registry.js delete mode 100644 contract/src/utils/start-helper.js delete mode 100644 contract/src/utils/time.js delete mode 100644 contract/src/utils/zcf-tools.js delete mode 100644 contract/src/utils/zoe-tools.js delete mode 100644 contract/test/old_network-fakes.js diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index bffb741a..7c5f8836 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -38,7 +38,7 @@ import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js const config1 = ({ name, coreEntry = `./src/${name}.proposal.js`, - contractEntry = `./src/${name}.contract.ts`, + contractEntry = `./src/${name}.contract.js`, coreScript = `bundles/deploy-${name}.js`, coreScriptOptions = undefined, permitFile = `deploy-${name}-permit.json`, diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js index a78f7bb5..7a365c07 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/auto-stake-it.contract.js @@ -5,13 +5,13 @@ import { import { M } from '@endo/patterns'; import { prepareChainHubAdmin } from './exos/chain-hub-admin.js'; import { preparePortfolioHolder } from './exos/portfolio-holder-kit.js'; -import { withOrchestration } from './utils/start-helper.js'; +import { withOrchestration } from '../utils/start-helper.js'; import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; import * as flows from './auto-stake-it.flows.js'; /** * @import {Zone} from '@agoric/zone'; - * @import {OrchestrationPowers, OrchestrationTools} from './utils/start-helper.js'; + * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; * @import { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; */ diff --git a/contract/src/cosmos-api.ts b/contract/src/cosmos-api.ts new file mode 100644 index 00000000..83d97c9e --- /dev/null +++ b/contract/src/cosmos-api.ts @@ -0,0 +1,350 @@ +import type { AnyJson, TypedJson, JsonSafe } from '@agoric/cosmic-proto'; +import type { + Delegation, + DelegationResponse, + Redelegation, + RedelegationResponse, + UnbondingDelegation, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; +import type { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import type { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; +import type { FungibleTokenPacketData } from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; +import type { + State as IBCChannelState, + Order, +} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; +import type { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; +import type { + RequestQuery, + ResponseQuery, +} from '@agoric/cosmic-proto/tendermint/abci/types.js'; +import type { Brand, Purse, Payment, Amount } from '@agoric/ertp/src/types.js'; +import type { Port } from '@agoric/network'; +import type { + IBCChannelID, + IBCConnectionID, + VTransferIBCEvent, +} from '@agoric/vats'; +import type { + TargetApp, + TargetRegistration, +} from '@agoric/vats/src/bridge-target.js'; +import type { + LocalIbcAddress, + RemoteIbcAddress, +} from '@agoric/vats/tools/ibc-utils.js'; +import type { QueryDelegationTotalRewardsResponse } from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; +import type { AmountArg, ChainAddress, Denom, DenomAmount } from './types.js'; + +/** An address for a validator on some blockchain, e.g., cosmos, eth, etc. */ +export type CosmosValidatorAddress = ChainAddress & { + // infix for Validator Operator https://docs.cosmos.network/main/learn/beginner/accounts#addresses + value: `${string}valoper${string}`; + encoding: 'bech32'; +}; + +/** Represents an IBC Connection between two chains, which can contain multiple Channels. */ +export interface IBCConnectionInfo { + id: IBCConnectionID; // e.g. connection-0 + client_id: string; // '07-tendermint-0' + state: IBCConnectionState; + counterparty: { + client_id: string; + connection_id: IBCConnectionID; + }; + transferChannel: { + portId: string; + channelId: IBCChannelID; + counterPartyPortId: string; + counterPartyChannelId: IBCChannelID; + ordering: Order; + state: IBCChannelState; + version: string; // e.eg. 'ics20-1' + }; +} + +/** + * https://github.com/cosmos/chain-registry/blob/master/assetlist.schema.json + */ +export interface CosmosAssetInfo extends Record { + base: Denom; + name: string; + display: string; + symbol: string; + denom_units: Array<{ denom: Denom; exponent: number }>; + traces?: Array<{ + type: 'ibc'; + counterparty: { + chain_name: string; + base_denom: Denom; + channel_id: IBCChannelID; + }; + chain: { + channel_id: IBCChannelID; + path: string; + }; + }>; +} + +/** + * Info for a Cosmos-based chain. + */ +export type CosmosChainInfo = Readonly<{ + /** can be used to lookup chainInfo (chainId) from an address value */ + bech32Prefix?: string; + chainId: string; + + connections?: Record; // chainId or wellKnownName + // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 + icqEnabled?: boolean; + + /** + * cf https://github.com/cosmos/chain-registry/blob/master/chain.schema.json#L117 + */ + stakingTokens?: Readonly>; +}>; + +// #region Orchestration views on Cosmos response types +// Naming scheme: Cosmos for the chain system, Rewards b/c getRewards function, +// and Response because it's the return value. + +/** @see {QueryDelegationTotalRewardsResponse} */ +export interface CosmosRewardsResponse { + rewards: { validator: CosmosValidatorAddress; reward: DenomAmount[] }[]; + total: DenomAmount[]; +} + +/** @see {DelegationResponse} */ +export interface CosmosDelegationResponse { + delegator: ChainAddress; + validator: CosmosValidatorAddress; + amount: DenomAmount; +} +// #endregion + +/** + * Queries for the staking properties of an account. + * + * @see {@link https://docs.cosmos.network/main/build/modules/staking#messages x/staking messages} + * {@link https://cosmos.github.io/cosmjs/latest/stargate/interfaces/StakingExtension.html StakingExtension} in cosmjs + */ +export interface StakingAccountQueries { + /** + * @returns all active delegations from the account to any validator (or [] if none) + */ + getDelegations: () => Promise; + + /** + * @returns the active delegation from the account to a specific validator. Return an + * empty Delegation if there is no delegation. + */ + getDelegation: ( + validator: CosmosValidatorAddress, + ) => Promise; + + /** + * @returns the unbonding delegations from the account to any validator (or [] if none) + */ + getUnbondingDelegations: () => Promise; + + /** + * @returns the unbonding delegations from the account to a specific validator (or [] if none) + */ + getUnbondingDelegation: ( + validator: CosmosValidatorAddress, + ) => Promise; + + getRedelegations: () => Promise; + + /** + * Get the pending rewards for the account. + * @returns the amounts of the account's rewards pending from all validators + */ + getRewards: () => Promise; + + /** + * Get the rewards pending with a specific validator. + * @param validator - the validator address to query for + * @returns the amount of the account's rewards pending from a specific validator + */ + getReward: (validator: CosmosValidatorAddress) => Promise; +} + +/** + * Transactions for doing staking operations on an individual account. + * + * @see {@link https://docs.cosmos.network/main/build/modules/staking#messages x/staking messages} and + * {@link https://cosmos.github.io/cosmjs/latest/stargate/interfaces/StakingExtension.html StakingExtension} in cosmjs + */ +export interface StakingAccountActions { + /** + * Delegate an amount to a validator. The promise settles when the delegation is complete. + * @param validator - the validator to delegate to + * @param amount - the amount to delegate + * @returns void + */ + delegate: ( + validator: CosmosValidatorAddress, + amount: AmountArg, + ) => Promise; + + /** + * Redelegate from one delegator to another. + * Settles when the redelegation is established, not 21 days later. + * @param srcValidator - the current validator for the delegation. + * @param dstValidator - the validator that will receive the delegation. + * @param amount - how much to redelegate. + * @returns + */ + redelegate: ( + srcValidator: CosmosValidatorAddress, + dstValidator: CosmosValidatorAddress, + amount: AmountArg, + ) => Promise; + + /** + * Undelegate multiple delegations (concurrently). To delegate independently, pass an array with one item. + * Resolves when the undelegation is complete and the tokens are no longer bonded. Note it may take weeks. + * The unbonding time is padded by 10 minutes to account for clock skew. + * @param delegations - the delegation to undelegate + */ + undelegate: ( + delegations: { + amount: AmountArg; + delegator?: ChainAddress; + validator: CosmosValidatorAddress; + }[], + ) => Promise; + + /** + * Withdraw rewards from all validators. The promise settles when the rewards are withdrawn. + * @returns The total amounts of rewards withdrawn + */ + withdrawRewards: () => Promise; + + /** + * Withdraw rewards from a specific validator. The promise settles when the rewards are withdrawn. + * @param validator - the validator to withdraw rewards from + * @returns + */ + withdrawReward: (validator: CosmosValidatorAddress) => Promise; +} + +/** + * Low level methods from IcaAccount that we pass through to CosmosOrchestrationAccount + */ + +export interface IcaAccountMethods { + /** + * Submit a transaction on behalf of the remote account for execution on the remote chain. + * @param msgs - records for the transaction + * @param [opts] - optional parameters for the Tx, like `timeoutHeight` and `memo` + * @returns acknowledgement string + */ + executeEncodedTx: ( + msgs: AnyJson[], + opts?: Partial>, + ) => Promise; + /** + * Deactivates the ICA account by closing the ICA channel. The `Port` is + * persisted so holders can always call `.reactivate()` to re-establish a new + * channel with the same chain address. + * CAVEAT: Does not retrieve assets so they may be lost if left. + * @throws {Error} if connection is not available or already deactivated + */ + deactivate: () => Promise; + /** + * Reactivates the ICA account by re-establishing a new channel with the + * original Port and requested address. + * If a channel is closed for an unexpected reason, such as a packet timeout, + * an automatic attempt to re will be made and the holder should not need + * to call `.reactivate()`. + * @throws {Error} if connection is currently active + */ + reactivate: () => Promise; +} + +/** + * Low level object that supports queries and operations for an account on a remote chain. + */ +export interface IcaAccount extends IcaAccountMethods { + /** + * @returns the address of the account on the remote chain + */ + getAddress: () => ChainAddress; + + /** + * Submit a transaction on behalf of the remote account for execution on the remote chain. + * @param msgs - records for the transaction + * @returns acknowledgement string + */ + executeTx: (msgs: TypedJson[]) => Promise; + /** @returns the address of the remote channel */ + getRemoteAddress: () => RemoteIbcAddress; + /** @returns the address of the local channel */ + getLocalAddress: () => LocalIbcAddress; + /** @returns the port the ICA channel is bound to */ + getPort: () => Port; +} + +/** Methods on chains that support Liquid Staking */ +export interface LiquidStakingMethods { + liquidStake: (amount: AmountArg) => Promise; +} + +// TODO support StakingAccountQueries +/** Methods supported only on Agoric chain accounts */ +export interface LocalAccountMethods extends StakingAccountActions { + /** deposit payment (from zoe, for example) to the account */ + deposit: (payment: Payment<'nat'>) => Promise>; + /** withdraw a Payment from the account */ + withdraw: (amount: Amount<'nat'>) => Promise>; + /** + * Register a handler that receives an event each time ICS-20 transfers are + * sent or received by the underlying account. + * + * Handler includes {@link VTransferIBCEvent} and + * {@link FungibleTokenPacketData} that can be used for application logic. + * + * Each account may be associated with at most one handler at a given time. + * + * Does not grant the handler the ability to intercept a transfer. For a + * blocking handler, aka 'IBC Hooks', leverage `registerActiveTap` from + * `transferMiddleware` directly. + * + * @param tap + */ + monitorTransfers: (tap: TargetApp) => Promise; +} + +/** + * Options for {@link OrchestrationAccountI} `transfer` method. + * + * @see {@link https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures ICS 20 Data Structures} + */ +export interface IBCMsgTransferOptions { + timeoutHeight?: MsgTransfer['timeoutHeight']; + timeoutTimestamp?: MsgTransfer['timeoutTimestamp']; + memo?: string; +} + +/** + * Cosmos-specific methods to extend `OrchestrationAccountI`, parameterized + * by `CosmosChainInfo`. + * + * In particular, if the chain info includes a staking token, {@link StakingAccountActions} + * are available. + * + * @see {OrchestrationAccountI} + */ +export type CosmosChainAccountMethods = + IcaAccountMethods & + (CCI extends { + stakingTokens: {}; + } + ? StakingAccountActions & StakingAccountQueries + : {}); + +export type ICQQueryFunction = ( + msgs: JsonSafe[], +) => Promise[]>; diff --git a/contract/src/exos/chain-hub.js b/contract/src/exos/chain-hub.js index 368ce240..a7a31472 100644 --- a/contract/src/exos/chain-hub.js +++ b/contract/src/exos/chain-hub.js @@ -9,7 +9,7 @@ import { CosmosChainInfoShape, IBCConnectionInfoShape, } from '../typeGuards.js'; -import { getBech32Prefix } from '../utils/address.js'; +import { getBech32Prefix } from '../../utils/address.js'; /** * @import {NameHub} from '@agoric/vats'; diff --git a/contract/src/exos/cosmos-orchestration-account.js b/contract/src/exos/cosmos-orchestration-account.js index cc33d39c..837eb2ad 100644 --- a/contract/src/exos/cosmos-orchestration-account.js +++ b/contract/src/exos/cosmos-orchestration-account.js @@ -53,7 +53,7 @@ import { Proto3Shape, TxBodyOptsShape, } from '../typeGuards.js'; -import { coerceCoin, coerceDenom } from '../utils/amounts.js'; +import { coerceCoin, coerceDenom } from '../../utils/amounts.js'; import { maxClockSkew, toCosmosDelegationResponse, @@ -61,9 +61,9 @@ import { toDenomAmount, toTruncatedDenomAmount, tryDecodeResponse, -} from '../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../utils/time.js'; +} from '../../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../../utils/time.js'; /** * @import {HostOf} from '@agoric/async-flow'; diff --git a/contract/src/exos/exo-interfaces.ts b/contract/src/exos/exo-interfaces.ts index 41f321d1..1cf2ffc2 100644 --- a/contract/src/exos/exo-interfaces.ts +++ b/contract/src/exos/exo-interfaces.ts @@ -1,7 +1,7 @@ import type { IBCConnectionID } from '@agoric/vats'; import type { Vow } from '@agoric/vow'; import type { IcaAccount } from '../cosmos-api.js'; -import type { ICAChannelAddressOpts } from '../utils/address.js'; +import type { ICAChannelAddressOpts } from '../../utils/address.js'; import type { ICQConnection } from './icq-connection-kit.js'; /** diff --git a/contract/src/exos/ica-account-kit.js b/contract/src/exos/ica-account-kit.js index 1802666b..920047c8 100644 --- a/contract/src/exos/ica-account-kit.js +++ b/contract/src/exos/ica-account-kit.js @@ -10,8 +10,8 @@ import { Proto3Shape, TxBodyOptsShape, } from '../typeGuards.js'; -import { findAddressField } from '../utils/address.js'; -import { makeTxPacket, parseTxPacket } from '../utils/packet.js'; +import { findAddressField } from '../../utils/address.js'; +import { makeTxPacket, parseTxPacket } from '../../utils/packet.js'; /** * @import {HostOf} from '@agoric/async-flow'; diff --git a/contract/src/exos/icq-connection-kit.js b/contract/src/exos/icq-connection-kit.js index e01e4499..9597d8e2 100644 --- a/contract/src/exos/icq-connection-kit.js +++ b/contract/src/exos/icq-connection-kit.js @@ -4,7 +4,7 @@ import { E } from '@endo/far'; import { M } from '@endo/patterns'; import { VowShape } from '@agoric/vow'; import { NonNullish, makeTracer } from '@agoric/internal'; -import { makeQueryPacket, parseQueryPacket } from '../utils/packet.js'; +import { makeQueryPacket, parseQueryPacket } from '../../utils/packet.js'; import { ICQMsgShape, OutboundConnectionHandlerI } from '../typeGuards.js'; /** diff --git a/contract/src/exos/local-orchestration-account.js b/contract/src/exos/local-orchestration-account.js index bc5e1f2a..65a00d92 100644 --- a/contract/src/exos/local-orchestration-account.js +++ b/contract/src/exos/local-orchestration-account.js @@ -18,12 +18,12 @@ import { TimestampProtoShape, TypedJsonShape, } from '../typeGuards.js'; -import { maxClockSkew, toDenomAmount } from '../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../utils/time.js'; +import { maxClockSkew, toDenomAmount } from '../../utils/cosmos.js'; +import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; +import { makeTimestampHelper } from '../../utils/time.js'; import { preparePacketTools } from './packet-tools.js'; import { prepareIBCTools } from './ibc-packet.js'; -import { coerceCoin, coerceDenomAmount } from '../utils/amounts.js'; +import { coerceCoin, coerceDenomAmount } from '../../utils/amounts.js'; /** * @import {HostOf} from '@agoric/async-flow'; diff --git a/contract/src/orca.contract.ts b/contract/src/orca.contract.js similarity index 77% rename from contract/src/orca.contract.ts rename to contract/src/orca.contract.js index f9a194e4..22b93311 100644 --- a/contract/src/orca.contract.ts +++ b/contract/src/orca.contract.js @@ -1,20 +1,20 @@ -/// -/// - import { AmountShape } from '@agoric/ertp'; import { makeTracer } from '@agoric/internal'; import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { ChainInfoShape } from '@agoric/orchestration/src/typeGuards.js'; import { InvitationShape } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; -import * as flows from './orca.flows.ts'; - -import type { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; -import type { CosmosChainInfo } from '@agoric/orchestration'; -import type { OrchestrationPowers, OrchestrationTools } from '@agoric/orchestration/src/utils/start-helper.js'; -import type { Zone } from '@agoric/zone'; +import * as flows from './orca.flows.js'; +/** + * @import {Marshaller} from '@agoric/internal/src/lib-chainStorage.js'; + * @import {CosmosChainInfo} from '@agoric/orchestration'; + * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; + * @import {Zone} from '@agoric/zone'; + */ +/// +/// const { entries, keys } = Object; const trace = makeTracer('OrchDev1'); @@ -34,8 +34,8 @@ const OrchestrationPowersShape = M.splitRecord({ agoricNames: M.remotable('agoricNames'), }); - -export const meta: ContractMeta = { +/** @type {ContractMeta} */ +export const meta = { privateArgsShape: M.and( OrchestrationPowersShape, M.splitRecord({ @@ -48,15 +48,23 @@ export const meta: ContractMeta = { }; harden(meta); -type OrcaTerms = { - chainDetails: Record -} - +/** + * @typedef {{ + * chainDetails: Record + * }} OrcaTerms + * + * @param {ZCF} zcf + * @param {OrchestrationPowers & { + * marshaller: Marshaller; + * }} privateArgs + * @param {Zone} zone + * @param {OrchestrationTools} tools + */ const contract = async ( - zcf: ZCF, - privateArgs: OrchestrationPowers & {marshaller: Marshaller}, - zone: Zone, - { orchestrateAll, zoeTools, chainHub }: OrchestrationTools, + zcf, + privateArgs, + zone, + { orchestrateAll, zoeTools, chainHub }, ) => { trace('orca start contract'); @@ -105,4 +113,4 @@ const contract = async ( export const start = withOrchestration(contract); harden(start); -export type OrcaSF = typeof start; \ No newline at end of file +/** @typedef {typeof start} OrcaSF */ diff --git a/contract/src/orca.flows.ts b/contract/src/orca.flows.js similarity index 69% rename from contract/src/orca.flows.ts rename to contract/src/orca.flows.js index f27fbe8f..8349a29d 100644 --- a/contract/src/orca.flows.ts +++ b/contract/src/orca.flows.js @@ -1,6 +1,13 @@ -import type { Orchestrator } from '@agoric/orchestration'; -import type { ZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; -import type { DenomArg } from '@agoric/orchestration'; +/** + * @import {GuestOf} from '@agoric/async-flow'; + * @import {Amount} from '@agoric/ertp/src/types.js'; + * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js'; + * @import {ChainAddress, Orchestrator} from '@agoric/orchestration'; + * @import {ZoeTools} from '@agoric/orchestration/src/utils/zoe-tools.js'; + * @import {Transfer} from './orca.contract.js'; + * @import {DenomArg} from '@agoric/orchestration'; + + */ import { M, mustMatch } from '@endo/patterns'; import { makeTracer } from './debug.js'; @@ -10,13 +17,13 @@ const trace = makeTracer('OrchFlows'); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. + * + * @param {Orchestrator} orch + * @param {unknown} _ctx + * @param {ZCFSeat} seat + * @param {{ chainName: string, denom: string }} offerArgs */ -export const makeAccount = async ( - orch: Orchestrator, - _ctx: unknown, - seat: ZCFSeat, - offerArgs: { chainName: string; denom: string }, -) => { +export const makeAccount = async (orch, _ctx, seat, offerArgs) => { trace('makeAccount'); mustMatch(offerArgs, M.splitRecord({ chainName: M.string() })); const { chainName } = offerArgs; @@ -32,12 +39,18 @@ harden(makeAccount); /** * Create an account on a Cosmos chain and return a continuing offer with * invitations makers for Delegate, WithdrawRewards, Transfer, etc. + * + * @param {Orchestrator} orch + * @param {object} ctx + * @param {ZoeTools['localTransfer']} ctx.localTransfer + * @param {ZCFSeat} seat + * @param {{ chainName: string, denom: DenomArg }} offerArgs */ export const makeCreateAndFund = async ( - orch: Orchestrator, - { localTransfer }: { localTransfer: ZoeTools['localTransfer'] }, - seat: ZCFSeat, - { chainName, denom }: { chainName: string; denom: DenomArg }, + orch, + { localTransfer }, + seat, + { chainName, denom }, ) => { trace( `invoked makeCreateAndFund with chain ${chainName}, and denom ${denom}`, @@ -87,4 +100,4 @@ export const makeCreateAndFund = async ( return remoteAccount.asContinuingOffer(); }; -harden(makeCreateAndFund); \ No newline at end of file +harden(makeCreateAndFund); diff --git a/contract/src/orca.proposal.js b/contract/src/orca.proposal.js index 68344a87..c5db7943 100644 --- a/contract/src/orca.proposal.js +++ b/contract/src/orca.proposal.js @@ -8,7 +8,7 @@ import { makeTracer } from './debug.js'; * @import {ERef} from '@endo/far'; * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; * @import {ChainInfo, IBCConnectionInfo,} from '@agoric/orchestration'; - * @import {OrcaSF} from './orca.contract.ts'; + * @import {OrcaSF} from './orca.contract.js'; * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; */ diff --git a/contract/src/orchestration-api.ts b/contract/src/orchestration-api.ts new file mode 100644 index 00000000..986c66ea --- /dev/null +++ b/contract/src/orchestration-api.ts @@ -0,0 +1,282 @@ +/* eslint-disable no-use-before-define */ +/** + * @file General API of orchestration + * - must not have chain-specific types without runtime narrowing by chain id + * - should remain relatively stable. + */ +import type { Amount, Brand, NatAmount } from '@agoric/ertp/src/types.js'; +import type { CurrentWalletRecord } from '@agoric/smart-wallet/src/smartWallet.js'; +import type { Timestamp } from '@agoric/time'; +import type { QueryManyFn } from '@agoric/vats/src/localchain.js'; +import type { ResolvedPublicTopic } from '@agoric/zoe/src/contractSupport/topics.js'; +import type { Passable } from '@endo/marshal'; +import type { + AgoricChainMethods, + ChainInfo, + CosmosChainAccountMethods, + CosmosChainInfo, + IBCMsgTransferOptions, + KnownChains, + LocalAccountMethods, + ICQQueryFunction, +} from './types.js'; +import type { ResolvedContinuingOfferResult } from './utils/zoe-tools.js'; + +/** + * A denom that designates a path to a token type on some blockchain. + * + * Multiple denoms may designate the same underlying base denom (e.g., `uist`, + * `uatom`) on different Chains or on the same Chain via different paths. On + * Cosmos chains, all but the base denom are IBC style denoms, but that may vary + * across other chains. All the denoms that designate the same underlying base + * denom form an equivalence class, along with the unique Brand on the local + * Chain. Some operations accept any member of the equivalence class to + * effectively designate the corresponding token type on the target chain. + */ +export type Denom = string; // ibc/... or uist + +// ??? when multiple Denoms provide paths to the same remote token type, +// should the brand be 1:1 with that equivalence class or each Denom? +/** + * In many cases, either a denom string or a local Brand can be used to + * designate a remote token type. + */ +export type DenomArg = Denom | Brand<'nat'>; + +/** + * Count of some fungible token on some blockchain. + * + * @see {@link Orchestrator.asAmount} to convert to an Amount surjectively + */ +export type DenomAmount = { + denom: Denom; + value: bigint; // Nat +}; + +/** Amounts can be provided as pure data using denoms or as ERTP Amounts */ +export type AmountArg = DenomAmount | Amount<'nat'>; + +/** An address on some blockchain, e.g., cosmos, eth, etc. */ +export type ChainAddress = { + /** e.g. 1 for Ethereum, agoric-3 for Agoric, cosmoshub-4 for Cosmos */ + chainId: string; + /** The address value used on-chain */ + value: string; + encoding: 'bech32' | 'ethereum'; +}; + +/** + * Object that controls an account on a particular chain. + * + * The methods available depend on the chain and its capabilities. + */ +export type OrchestrationAccount = OrchestrationAccountI & + (CI extends CosmosChainInfo + ? CI['chainId'] extends `agoric${string}` + ? LocalAccountMethods + : CosmosChainAccountMethods + : {}); + +/** + * An object for access the core functions of a remote chain. + * + * Note that "remote" can mean the local chain; it's just that + * accounts are treated as remote/arms length for consistency. + */ +export interface Chain { + getChainInfo: () => Promise; + + // "makeAccount" suggests an operation within a vat + /** + * Creates a new Orchestration Account on the current Chain. + * @returns an object that controls the account + */ + makeAccount: () => Promise>; + // FUTURE supply optional port object; also fetch port object + + query: CI extends { icqEnabled: true } + ? ICQQueryFunction + : CI['chainId'] extends `agoric${string}` + ? QueryManyFn + : never; + + // TODO provide a way to get the local denom/brand/whatever for this chain +} + +export interface DenomInfo< + HoldingChain extends keyof KnownChains, + IssuingChain extends keyof KnownChains, +> { + /** The well-known Brand on Agoric for the direct asset */ + brand?: Brand; + /** The Chain at which the argument `denom` exists (where the asset is currently held) */ + chain: Chain; + /** The Chain that is the issuer of the underlying asset */ + base: Chain; + /** the Denom for the underlying asset on its issuer chain */ + baseDenom: Denom; +} + +/** + * Provided in the callback to `orchestrate()`. + */ +export interface Orchestrator { + /** + * Get a Chain object for working with the given chain. + * + * @param {C} chainName name of the chain in KnownChains or the ChainHub backing the Orchestrator + */ + getChain: ( + chainName: C, + ) => Promise< + Chain & + (C extends 'agoric' ? AgoricChainMethods : {}) + >; + + /** + * For a denom, return information about a denom including the equivalent + * local Brand, the Chain on which the denom is held, and the Chain that + * issues the corresponding asset. + * @param denom + */ + getDenomInfo: < + HoldingChain extends keyof KnownChains, + IssuingChain extends keyof KnownChains, + >( + denom: Denom, + ) => DenomInfo; + + /** + * Convert an amount described in native data to a local, structured Amount. + * @param amount - the described amount + * @returns the Amount in local structuerd format + */ + asAmount: (amount: DenomAmount) => NatAmount; +} + +/** + * An object that supports high-level operations for an account on a remote chain. + */ +export interface OrchestrationAccountI { + /** + * @returns the address of the account on the remote chain + */ + getAddress: () => ChainAddress; + + /** @returns an array of amounts for every balance in the account. */ + getBalances: () => Promise; + + /** @returns the balance of a specific denom for the account. */ + getBalance: (denom: DenomArg) => Promise; + + /** + * Transfer amount to another account on the same chain. The promise settles when the transfer is complete. + * @param toAccount - the account to send the amount to. MUST be on the same chain + * @param amount - the amount to send + * @returns void + */ + send: (toAccount: ChainAddress, amounts: AmountArg) => Promise; + + /** + * Transfer multiple amounts to another account on the same chain. The promise settles when the transfer is complete. + * @param toAccount - the account to send the amount to. MUST be on the same chain + * @param amounts - the amounts to send + * @returns void + */ + sendAll: (toAccount: ChainAddress, amounts: AmountArg[]) => Promise; + + /** + * Transfer an amount to another account, typically on another chain. + * The promise settles when the transfer is complete. + * @param amount - the amount to transfer. Can be provided as pure data using denoms or as ERTP Amounts. + * @param destination - the account to transfer the amount to. + * @param [opts] - an optional memo to include with the transfer, which could drive custom PFM behavior, and timeout parameters + * @returns void + * + * TODO document the mapping from the address to the destination chain. + */ + transfer: ( + destination: ChainAddress, + amount: AmountArg, + opts?: IBCMsgTransferOptions, + ) => Promise; + + /** + * Transfer an amount to another account in multiple steps. The promise settles when + * the entire path of the transfer is complete. + * @param amount - the amount to transfer + * @param msg - the transfer message, including follow-up steps + * @returns void + */ + transferSteps: (amount: AmountArg, msg: TransferMsg) => Promise; + + /** + * Returns `invitationMakers` and `publicSubscribers` to the account + * holder's smart wallet so they can continue interacting with the account + * and read account state in vstorage if published. + */ + asContinuingOffer: () => Promise; + + /** + * Public topics are a map to different vstorage paths and subscribers that + * can be shared with on or offchain clients. + * When returned as part of a continuing invitation, it will appear + * in the {@link CurrentWalletRecord} in vstorage. + */ + getPublicTopics: () => Promise>>; +} + +/** + * Flows to orchestrate are regular Javascript functions but have some + * constraints to fulfill the requirements of resumability after termination of + * the enclosing vat. Some requirements for each orchestration flow: + * - must not close over any values that could change between invocations + * - must satisfy the `OrchestrationFlow` interface + * - must be hardened + * - must not use `E()` (eventual send) + * + * The call to `orchestrate` using a flow function in reincarnations of the vat + * must have the same `durableName` as before. To help enforce these + * constraints, we recommend: + * + * - keeping flows in a `.flows.js` module + * - importing them all with `import * as flows` to get a single object keyed by + * the export name + * - using `orchestrateAll` to treat each export name as the `durableName` of + * the flow + * - adopting `@agoric/eslint-config` that has rules to help detect problems + */ +export interface OrchestrationFlow { + (orc: Orchestrator, ctx: CT, ...args: Passable[]): Promise; +} + +/** + * Internal structure for TransferMsgs. + * The type must be able to express transfers across different chains and transports. + * + * NOTE Expected to change, so consider an opaque structure. + * @internal + */ +export interface TransferMsg { + toAccount: ChainAddress; + timeout?: Timestamp; + next?: TransferMsg; + data?: object; +} + +/** @alpha */ +export interface AfterAction { + destChain: string; + destAddress: ChainAddress; +} +/** @alpha */ +export interface SwapExact { + amountIn: Amount; + amountOut: Amount; +} +/** @alpha */ +export interface SwapMaxSlippage { + amountIn: Amount; + brandOut: Brand; + slippage: number; +} diff --git a/contract/src/utils/address.js b/contract/src/utils/address.js deleted file mode 100644 index 8d39ed5a..00000000 --- a/contract/src/utils/address.js +++ /dev/null @@ -1,103 +0,0 @@ -import { Fail, q } from '@endo/errors'; - -/** - * @import {IBCConnectionID} from '@agoric/vats'; - * @import {ChainAddress} from '../types.js'; - * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -/** - * @typedef {object} ICAChannelAddressOpts - * @property {string} [encoding='proto3'] message encoding format for the - * channel - * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. - * currently only `ordered` is supported for ics27-1 - * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` - * @property {string} [version='ics27-1'] default is `ics27-1` - */ - -/** - * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID - * @param {IBCConnectionID} controllerConnectionId Self Connection ID - * @param {ICAChannelAddressOpts} [opts] - * @returns {RemoteIbcAddress} - */ -export const makeICAChannelAddress = ( - hostConnectionId, - controllerConnectionId, - { - version = 'ics27-1', - encoding = 'proto3', - ordering = 'ordered', - txType = 'sdk_multi_msg', - } = {}, -) => { - hostConnectionId || Fail`hostConnectionId is required`; - controllerConnectionId || Fail`controllerConnectionId is required`; - const connString = JSON.stringify({ - version, - controllerConnectionId, - hostConnectionId, - address: '', // will be provided by the counterparty after channelOpenAck - encoding, - txType, - }); - return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; -}; -harden(makeICAChannelAddress); - -export const DEFAULT_ICQ_VERSION = 'icq-1'; - -/** - * @param {IBCConnectionID} controllerConnectionId - * @param {string} version defaults to icq-1 - * @returns {RemoteIbcAddress} - */ -export const makeICQChannelAddress = ( - controllerConnectionId, - version = DEFAULT_ICQ_VERSION, -) => { - controllerConnectionId || Fail`controllerConnectionId is required`; - return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; -}; -harden(makeICQChannelAddress); - -/** - * Parse a chain address from a remote address string. Assumes the address - * string is in a JSON format and contains an "address" field. This function is - * designed to be safe against malformed inputs and unexpected data types, and - * will return `undefined` in those cases. - * - * @param {RemoteIbcAddress} remoteAddressString - remote address string, - * including version - * @returns {ChainAddress['value'] | undefined} returns undefined on error - */ -export const findAddressField = remoteAddressString => { - try { - // Extract JSON version string assuming it's always surrounded by {} - const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; - const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; - if (!jsonObj?.address?.length) return undefined; - return jsonObj.address; - } catch (error) { - return undefined; - } -}; -harden(findAddressField); - -/** - * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. - * - * see - * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) - * for reference implementation - * - * @param {string} address - */ -export const getBech32Prefix = address => { - assert(address, 'address is required'); - const split = address.lastIndexOf('1'); - if (split === -1) return Fail`No separator character for ${q(address)}`; - if (split === 0) return Fail`Missing prefix for ${q(address)}`; - return address.slice(0, split); -}; diff --git a/contract/src/utils/amounts.js b/contract/src/utils/amounts.js deleted file mode 100644 index 3974f922..00000000 --- a/contract/src/utils/amounts.js +++ /dev/null @@ -1,59 +0,0 @@ -import { makeError } from '@endo/errors'; - -/** - * @import {ChainHub} from "../types.js"; - * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - */ - -/** - * @param {ChainHub} chainHub - * @param {DenomArg} denomArg - * @returns {Denom} - * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom - * mapping - */ -export const coerceDenom = (chainHub, denomArg) => { - if (typeof denomArg === 'string') { - return denomArg; - } - const denom = chainHub.getDenom(denomArg); - if (!denom) { - throw makeError(`No denom for brand ${denomArg}`); - } - return denom; -}; - -/** - * @param {ChainHub} chainHub - * @param {DenomAmount | Amount<'nat'>} amount - * @returns {DenomAmount} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceDenomAmount = (chainHub, amount) => { - if ('denom' in amount) { - return amount; - } - const denom = coerceDenom(chainHub, amount.brand); - return harden({ - denom, - value: amount.value, - }); -}; - -/** - * @param {ChainHub} chainHub - * @param {AmountArg} amount - * @returns {Coin} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceCoin = (chainHub, amount) => { - const denom = - 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); - return harden({ - denom, - amount: String(amount.value), - }); -}; diff --git a/contract/src/utils/cosmos.js b/contract/src/utils/cosmos.js deleted file mode 100644 index 5082a1c5..00000000 --- a/contract/src/utils/cosmos.js +++ /dev/null @@ -1,82 +0,0 @@ -import { makeError } from '@endo/errors'; -import { decodeBase64 } from '@endo/base64'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; - -/** - * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' - * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; - */ - -/** maximum clock skew, in seconds, for unbonding time reported from other chain */ -export const maxClockSkew = 10n * 60n; - -/** - * @template T - * @param {string} ackStr - * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg - */ -export const tryDecodeResponse = (ackStr, fromProtoMsg) => { - try { - const any = Any.decode(decodeBase64(ackStr)); - const protoMsg = Any.decode(any.value); - - const msg = fromProtoMsg(protoMsg); - return msg; - } catch (cause) { - throw makeError(`bad response: ${ackStr}`, undefined, { cause }); - } -}; - -/** - * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - * @see {@link toTruncatedDenomAmount} for DecCoin - */ -export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); - -/** - * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by - * truncating the fractional portion. - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - */ -export const toTruncatedDenomAmount = c => ({ - denom: c.denom, - value: BigInt(c.amount.split('.')[0]), -}); - -/** - * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration - * {@link CosmosValidatorAddress} - * - * @type {( - * r: { validatorAddress: string }, - * chainId: string, - * ) => CosmosValidatorAddress} - */ -export const toCosmosValidatorAddress = (r, chainId) => ({ - encoding: 'bech32', - value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), - chainId, -}); - -/** - * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration - * {@link CosmosDelegationResponse} - * - * @type {( - * chainInfo: { chainId: string }, - * r: DelegationResponse, - * ) => CosmosDelegationResponse} - */ -export const toCosmosDelegationResponse = ({ chainId }, r) => ({ - delegator: { - chainId, - encoding: 'bech32', - value: r.delegation.delegatorAddress, - }, - validator: toCosmosValidatorAddress(r.delegation, chainId), - amount: toDenomAmount(r.balance), -}); diff --git a/contract/src/utils/denomHash.js b/contract/src/utils/denomHash.js deleted file mode 100644 index 561ee4b5..00000000 --- a/contract/src/utils/denomHash.js +++ /dev/null @@ -1,22 +0,0 @@ -// @ts-check -import { sha256 } from '@noble/hashes/sha256'; -import { bytesToHex } from '@noble/hashes/utils'; - -/** - * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ - * - * @param {object} opts - * @param {string} [opts.portId] - * @param {string} [opts.channelId] required unless `path` is supplied - * @param {string} [opts.path] alternative to portId, channelId - * @param {string} opts.denom base denom - */ -export const denomHash = ({ - portId = 'transfer', - channelId = /** @type {string | undefined} */ (undefined), - path = `${portId}/${channelId}`, - denom, -}) => { - const h = sha256.create().update(`${path}/${denom}`).digest(); - return bytesToHex(h).toUpperCase(); -}; diff --git a/contract/src/utils/orc.js b/contract/src/utils/orc.js deleted file mode 100644 index 47a0d260..00000000 --- a/contract/src/utils/orc.js +++ /dev/null @@ -1,38 +0,0 @@ -/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ - -export const orcUtils = { - /** - * unwinds denom with PFM, if necessary - * - * @param {Omit} _args - * @returns {TransferMsg} - */ - makeTransferMsg: _args => { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, - /** - * SwapExact or SwapMaxSlippage, with optional AfterAction - * - * @param {(SwapExact | SwapMaxSlippage) & - * (AfterAction | Record)} _args - * - * @returns {TransferMsg} - */ - makeOsmosisSwap(_args) { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, -}; diff --git a/contract/src/utils/orchestrationAccount.js b/contract/src/utils/orchestrationAccount.js deleted file mode 100644 index 23f5337d..00000000 --- a/contract/src/utils/orchestrationAccount.js +++ /dev/null @@ -1,40 +0,0 @@ -import { BrandShape } from '@agoric/ertp'; -import { Shape as NetworkShape } from '@agoric/network'; -import { VowShape } from '@agoric/vow'; -import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { M } from '@endo/patterns'; -import { - AmountArgShape, - ChainAddressShape, - DenomAmountShape, - IBCTransferOptionsShape, -} from '../typeGuards.js'; - -/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ - -const { Vow$ } = NetworkShape; // TODO #9611 - -/** @see {OrchestrationAccountI} */ -export const orchestrationAccountMethods = { - getAddress: M.call().returns(ChainAddressShape), - getBalance: M.call(M.or(BrandShape, M.string())).returns( - Vow$(DenomAmountShape), - ), - getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), - send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), - sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( - VowShape, - ), - transfer: M.call(ChainAddressShape, AmountArgShape) - .optional(IBCTransferOptionsShape) - .returns(VowShape), - transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), - asContinuingOffer: M.call().returns( - Vow$({ - publicSubscribers: TopicsRecordShape, - invitationMakers: M.any(), - holder: M.remotable(), - }), - ), - getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), -}; diff --git a/contract/src/utils/packet.js b/contract/src/utils/packet.js deleted file mode 100644 index 70564cff..00000000 --- a/contract/src/utils/packet.js +++ /dev/null @@ -1,112 +0,0 @@ -import { Fail } from '@endo/errors'; -import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; -import { - RequestQuery, - ResponseQuery, -} from '@agoric/cosmic-proto/tendermint/abci/types.js'; -import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; -import { - CosmosQuery, - CosmosResponse, -} from '@agoric/cosmic-proto/icq/v1/packet.js'; -import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - -/** - * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; - * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; - */ - -/** - * Makes an IBC transaction packet from an array of messages. Expects the - * `value` of each message to be base64 encoded bytes. Skips checks for - * malformed messages in favor of interface guards. - * - * @param {AnyJson[]} msgs - * @param {Partial>} [opts] - * @returns {string} stringified InterchainAccountPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeTxPacket(msgs, opts) { - const messages = msgs.map(Any.fromJSON); - const bytes = TxBody.encode( - TxBody.fromPartial({ - messages, - ...opts, - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - type: PacketType.TYPE_EXECUTE_TX, - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeTxPacket); - -/** - * Makes an IBC query packet from an array of query messages. Expects the `data` - * of each message to be base64 encoded bytes. Skips checks for malformed - * messages in favor of interface guards. - * - * @param {JsonSafe[]} msgs - * @returns {string} stringified InterchainQueryPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeQueryPacket(msgs) { - const bytes = CosmosQuery.encode( - CosmosQuery.fromPartial({ - requests: msgs.map(RequestQuery.fromJSON), - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeQueryPacket); - -/** - * Looks for a result or error key in the response string, and returns a - * Base64Bytes string. This string can be decoded using the corresponding - * Msg*Response object. Error strings seem to be plain text and do not need - * decoding. - * - * @param {string} response - * @returns {string} - base64 encoded bytes string - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseTxPacket(response) { - const { result, error } = JSON.parse(response); - if (result) return result; - else if (error) throw Error(error); - else throw Fail`expected either result or error: ${response}`; -} -harden(parseTxPacket); - -/** - * Looks for a result or error key in the response string. If a result is found, - * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on - * the resulting entries are base64 encoded for inter-vat communication. These - * can be decoded using the corresponding Query*Response objects. Error strings - * seem to be plain text and do not need decoding. - * - * @param {string} response - * @returns {JsonSafe[]} - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseQueryPacket(response) { - const result = parseTxPacket(response); - const { data } = JSON.parse(atob(result)); - const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); - return harden(responses.map(ResponseQuery.toJSON)); -} -harden(parseQueryPacket); diff --git a/contract/src/utils/registry.js b/contract/src/utils/registry.js deleted file mode 100644 index 25789864..00000000 --- a/contract/src/utils/registry.js +++ /dev/null @@ -1,130 +0,0 @@ -import { - State as IBCChannelState, - Order, -} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; -import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; -import assert from 'node:assert'; - -/** - * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; - * @import {Chain, IBCInfo} from '@chain-registry/types'; - * @import {ChainRegistryClient} from '@chain-registry/client'; - * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; - */ - -/** - * @param {IBCInfo} ibcInfo - * @param {string} name - * @param {Record} chainInfo - * @returns {[string, IBCConnectionInfo] | []} - */ -function toConnectionEntry(ibcInfo, name, chainInfo) { - // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order - const fromChain1 = ibcInfo.chain_1.chain_name === name; - const [from, to] = fromChain1 - ? [ibcInfo.chain_1, ibcInfo.chain_2] - : [ibcInfo.chain_2, ibcInfo.chain_1]; - assert.equal(from.chain_name, name); - const transferChannels = ibcInfo.channels.filter( - c => - c.chain_1.port_id === 'transfer' && - // @ts-expect-error tags does not specify keys - c.tags?.preferred, - ); - if (transferChannels.length === 0) { - console.warn( - 'no transfer channel for [', - from.chain_name, - to.chain_name, - ']', - '(skipping)', - ); - return []; - } - if (transferChannels.length > 1) { - console.warn( - 'multiple preferred transfer channels [', - from.chain_name, - to.chain_name, - ']:', - transferChannels, - '(choosing first)', - ); - } - const [channel] = transferChannels; - const [channelFrom, channelTo] = fromChain1 - ? [channel.chain_1, channel.chain_2] - : [channel.chain_2, channel.chain_1]; - const record = { - id: /** @type {IBCConnectionID} */ (from.connection_id), - client_id: from.client_id, - counterparty: { - client_id: to.client_id, - connection_id: /** @type {IBCConnectionID} */ (to.connection_id), - }, - state: IBCConnectionState.STATE_OPEN, // XXX presumably - transferChannel: { - channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), - portId: channelFrom.port_id, - counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), - counterPartyPortId: channelTo.port_id, - // FIXME mapping, our guard expects a numerical enum - ordering: Order.ORDER_NONE_UNSPECIFIED, - state: IBCChannelState.STATE_OPEN, // XXX presumably - version: channel.version, - }, - }; - const destChainId = chainInfo[to.chain_name].chainId; - return [destChainId, record]; -} - -/** - * Converts the given chain info to our local config format - * - * @param {Pick} registry - */ -export const convertChainInfo = async registry => { - /** @type {Record} */ - const chainInfo = {}; - - for (const chain of registry.chains) { - console.log('processing info', chain.chain_name); - chainInfo[chain.chain_name] = { - bech32Prefix: chain.bech32_prefix, - chainId: chain.chain_id, - stakingTokens: chain.staking?.staking_tokens, - // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 - icqEnabled: chain.chain_name === 'osmosis', - }; - } - - // XXX probably easier to keep ibc separate - const ibcLookup = {}; - for (const ibc of registry.ibcData) { - ibcLookup[ibc.chain_1.chain_name] ||= []; - ibcLookup[ibc.chain_2.chain_name] ||= []; - - ibcLookup[ibc.chain_1.chain_name].push(ibc); - ibcLookup[ibc.chain_2.chain_name].push(ibc); - } - - const chainNames = registry.chains.map(c => c.chain_name).sort(); - - // iterate this after chainInfo is filled out - for (const name of chainNames) { - console.log('processing connections', name); - - const ibcData = ibcLookup[name]; - const connections = Object.fromEntries( - ibcData - .map(datum => toConnectionEntry(datum, name, chainInfo)) - .filter(entry => entry.length > 0) - // sort alphabetically for consistency - .sort(([a], [b]) => a.localeCompare(b)), - ); - chainInfo[name] = { ...chainInfo[name], connections }; - } - - // return object with insertion in alphabetical order of chain name - return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); -}; diff --git a/contract/src/utils/start-helper.js b/contract/src/utils/start-helper.js deleted file mode 100644 index 902c7194..00000000 --- a/contract/src/utils/start-helper.js +++ /dev/null @@ -1,214 +0,0 @@ -import { prepareAsyncFlowTools } from '@agoric/async-flow'; -import { prepareVowTools } from '@agoric/vow'; -import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; -import { makeDurableZone } from '@agoric/zone/durable.js'; -import { makeChainHub } from '../exos/chain-hub.js'; -import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; -import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; -import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; -import { prepareOrchestrator } from '../exos/orchestrator.js'; -import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; -import { makeOrchestrationFacade } from '../facade.js'; -import { makeZoeTools } from './zoe-tools.js'; -import { makeZcfTools } from './zcf-tools.js'; - -/** - * @import {LocalChain} from '@agoric/vats/src/localchain.js'; - * @import {TimerService, TimerBrand} from '@agoric/time'; - * @import {Baggage} from '@agoric/vat-data'; - * @import {NameHub} from '@agoric/vats'; - * @import {Remote} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; - */ - -/** - * @typedef {{ - * localchain: Remote; - * orchestrationService: Remote; - * storageNode: Remote; - * timerService: Remote; - * agoricNames: Remote; - * }} OrchestrationPowers - */ - -/** - * Helper that a contract start function can use to set up the objects needed - * for orchestration. - * - * TODO strip problematic operations from ZCF (e.g., getPayouts) - * - * @param {ZCF} zcf - * @param {Baggage} baggage - * @param {OrchestrationPowers} remotePowers - * @param {Marshaller} marshaller - * @internal - */ -export const provideOrchestration = ( - zcf, - baggage, - remotePowers, - marshaller, -) => { - // separate zones - const zones = (() => { - const zone = makeDurableZone(baggage); - return { - /** system names for async flow */ - asyncFlow: zone.subZone('asyncFlow'), - /** system names for orchestration implementation */ - orchestration: zone.subZone('orchestration'), - /** system names for chainHub */ - chainHub: zone.subZone('chainHub'), - /** system names for vows */ - vows: zone.subZone('vows'), - /** contract-provided names, and subzones */ - contract: zone.subZone('contract'), - }; - })(); - - const { agoricNames, timerService, localchain } = remotePowers; - - const vowTools = prepareVowTools(zones.vows); - - const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); - - const zoeTools = makeZoeTools(zcf, vowTools); - - const zcfTools = makeZcfTools(zcf, vowTools); - - const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); - const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( - zones.orchestration, - { - makeRecorderKit, - zcf, - timerService, - vowTools, - chainHub, - localchain, - zoeTools, - }, - ); - - const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { - vowTools, - }); - - const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( - zones.orchestration, - { - chainHub, - makeRecorderKit, - timerService, - vowTools, - zcf, - }, - ); - - const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { - makeCosmosOrchestrationAccount, - orchestration: remotePowers.orchestrationService, - storageNode: remotePowers.storageNode, - timer: remotePowers.timerService, - vowTools, - }); - - const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { - makeLocalOrchestrationAccountKit, - localchain: remotePowers.localchain, - // FIXME what path? - storageNode: remotePowers.storageNode, - agoricNames, - orchestration: remotePowers.orchestrationService, - timer: remotePowers.timerService, - vowTools, - }); - - const makeOrchestrator = prepareOrchestrator(zones.orchestration, { - chainHub, - makeLocalChainFacade, - makeRemoteChainFacade, - vowTools, - }); - - /** - * Create orchestrate functions in a specific zone, instead of the default - * `contract.orchestration` zone. This is used for modules that add their own - * orchestration functions (e.g., a Portfolio with orchestration flows for - * continuing offers) - * - * @param {Zone} zone - */ - const makeOrchestrateKit = zone => - makeOrchestrationFacade({ - zone, - zcf, - makeRecorderKit, - makeOrchestrator, - asyncFlowTools, - vowTools, - ...remotePowers, - }); - - // Create orchestrate functions for the default `contract.orchestration` zone - const defaultOrchestrateKit = makeOrchestrateKit( - zones.contract.subZone('orchestration'), - ); - - zcf.setTestJig(() => ({ - baggage, - chainHub, - })); - - return { - ...defaultOrchestrateKit, - makeOrchestrateKit, - chainHub, - vowTools, - asyncFlowTools, - zcfTools, - zoeTools, - zone: zones.contract, - }; -}; -harden(provideOrchestration); - -/** @typedef {Omit, 'zone'>} OrchestrationTools */ - -/** - * Simplifies contract functions for Orchestration by wrapping a simpler - * function with all the tools it needs in order to use Orchestration. - * - * @example - * - * ```js - * const contract = (zcf, privateArgs, zone, tools) => { ... }; - * export const start = withOrchestration(contract); - * ``` - * - * @template {Record} CT - * @template {OrchestrationPowers & { - * marshaller: Marshaller; - * }} PA - * @template R - * @param {( - * zcf: ZCF, - * privateArgs: PA, - * zone: Zone, - * tools: OrchestrationTools, - * ) => Promise} contractFn - * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a - * Zoe start function - */ -export const withOrchestration = - contractFn => async (zcf, privateArgs, baggage) => { - const { zone, ...tools } = provideOrchestration( - zcf, - baggage, - privateArgs, - privateArgs.marshaller, - ); - return contractFn(zcf, privateArgs, zone, tools); - }; -harden(withOrchestration); diff --git a/contract/src/utils/time.js b/contract/src/utils/time.js deleted file mode 100644 index 06f995ab..00000000 --- a/contract/src/utils/time.js +++ /dev/null @@ -1,48 +0,0 @@ -import { E } from '@endo/far'; -import { TimeMath } from '@agoric/time'; - -/** - * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - */ - -export const SECONDS_PER_MINUTE = 60n; -export const MILLISECONDS_PER_SECOND = 1000n; -export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; -export const NANOSECONDS_PER_SECOND = 1_000_000_000n; - -/** - * XXX should this be durable? resumable? - * - * @param {Remote} timer - */ -export function makeTimestampHelper(timer) { - return harden({ - /** - * XXX do this need to be resumable / use Vows? - * - * Takes the current time from ChainTimerService and adds a relative time to - * determine a timeout timestamp in nanoseconds. Useful for - * {@link MsgTransfer.timeoutTimestamp}. - * - * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes - * @returns {Promise} Timeout timestamp in absolute nanoseconds - * since unix epoch - */ - async getTimeoutTimestampNS(relativeTime) { - const currentTime = await E(timer).getCurrentTimestamp(); - const timeout = - relativeTime || - TimeMath.coerceRelativeTimeRecord( - SECONDS_PER_MINUTE * 5n, - currentTime.timerBrand, - ); - return ( - TimeMath.addAbsRel(currentTime, timeout).absValue * - NANOSECONDS_PER_SECOND - ); - }, - }); -} - -/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/src/utils/zcf-tools.js b/contract/src/utils/zcf-tools.js deleted file mode 100644 index d3843695..00000000 --- a/contract/src/utils/zcf-tools.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @import {HostInterface} from '@agoric/async-flow'; - * @import {VowTools} from '@agoric/vow'; - * @import {ZcfTools} from '../types.js'; - */ - -import { M, mustMatch } from '@endo/patterns'; - -const HandlerShape = M.remotable('OfferHandler'); - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - * @returns {HostInterface} - */ -export const makeZcfTools = (zcf, vowTools) => - harden({ - makeInvitation(offerHandler, description, customDetails, proposalShape) { - mustMatch(offerHandler, HandlerShape); - return vowTools.watch( - zcf.makeInvitation( - offerHandler, - description, - customDetails, - proposalShape, - ), - ); - }, - atomicRearrange(transfers) { - zcf.atomicRearrange(transfers); - }, - assertUniqueKeyword(keyword) { - zcf.assertUniqueKeyword(keyword); - }, - }); diff --git a/contract/src/utils/zoe-tools.js b/contract/src/utils/zoe-tools.js deleted file mode 100644 index a5cbbe38..00000000 --- a/contract/src/utils/zoe-tools.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file Helper functions for transferring payments between a LocalChainAccount - * and a ZCFSeat. - * - * Maintainers: This exists as an endowment for orchestrated async-flows so we - * can make use of E and promises. The logic for recovering partial failures - * is also an added convenience for developers. - * - * Functions are written using `asVow` and non-resumable promises as we expect - * each invocation to resolve promptly - there are no timers or interchain - * network calls. - * - * A promise resolved promptly is currently safe from being severed by an - * upgrade because we only trigger vat upgrades as the result of network - * input. - */ - -import { makeError, q, Fail } from '@endo/errors'; -import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; -import { E } from '@endo/far'; - -const { assign, keys, values } = Object; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; - * @import {VowTools} from '@agoric/vow'; - * @import {LocalAccountMethods} from '../types.js'; - */ - -/** - * @typedef {{ - * invitationMakers: InvitationMakers; - * publicSubscribers: Record>; - * }} ResolvedContinuingOfferResult - * - * @see {ContinuingOfferResult} - */ - -/** - * @typedef {( - * srcSeat: ZCFSeat, - * localAccount: LocalAccountMethods, - * amounts: AmountKeywordRecord, - * ) => Promise} LocalTransfer - */ - -/** - * @typedef {( - * localAccount: LocalAccountMethods, - * destSeat: ZCFSeat, - * amounts: AmountKeywordRecord, - * ) => Promise} WithdrawToSeat - */ - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - */ -export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { - /** - * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the - * deposits fail, everything will be rolled back to the `srcSeat`. Supports - * multiple items in the `amounts` {@link AmountKeywordRecord}. - * - * @type {HostOf} - */ - const localTransfer = (srcSeat, localAccount, amounts) => - asVow(async () => { - !srcSeat.hasExited() || Fail`The seat cannot have exited.`; - const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); - const userSeat = await userSeatP; - zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); - tempSeat.exit(); - // TODO (#9541) get the userSeat into baggage so it's at least recoverable - // const userSeat = await subzone.makeOnce( - // 'localTransferHelper', - // async () => { - // const { zcfSeat: tempSeat, userSeat: userSeatP } = - // zcf.makeEmptySeatKit(); - // const uSeat = await userSeatP; - // // TODO how do I store in the place for this retryable? - // atomicTransfer(zcf, srcSeat, tempSeat, amounts); - // tempSeat.exit(); - // return uSeat; - // }, - // ); - - // Now all the `amounts` are accessible, so we can move them to the localAccount - const payments = await Promise.all( - keys(amounts).map(kw => E(userSeat).getPayout(kw)), - ); - const settleDeposits = await when( - allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), - ); - // if any of the deposits to localAccount failed, unwind all of the allocations - if (settleDeposits.find(x => x.status === 'rejected')) { - const amts = values(amounts); - const errors = []; - // withdraw the successfully deposited payments - const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { - if (x.status === 'rejected') { - errors.push(x.reason); - return payments[i]; - } - return E(localAccount).withdraw(amts[i]); - }); - - // return all payments to the srcSeat - const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); - const paymentKwr = harden( - keys(amounts).reduce( - (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - srcSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - throw makeError(`One or more deposits failed ${q(errors)}`); - } - // TODO #9541 remove userSeat from baggage - }); - - /** - * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any - * of the withdrawals fail, everything will be rolled back to the - * `srcLocalAccount`. Supports multiple items in the `amounts` - * {@link PaymentKeywordRecord} - * - * @type {HostOf} - */ - const withdrawToSeat = (localAccount, destSeat, amounts) => - asVow(async () => { - !destSeat.hasExited() || Fail`The seat cannot have exited.`; - - const settledWithdrawals = await when( - allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), - ); - - // if any of the withdrawals were rejected, unwind the successful ones - if (settledWithdrawals.find(x => x.status === 'rejected')) { - const returnPaymentVs = []; - const errors = []; - for (const result of settledWithdrawals) { - if (result.status === 'fulfilled') { - returnPaymentVs.push(E(localAccount).deposit(result.value)); - } else { - errors.push(result.reason); - } - } - await when(allVows(returnPaymentVs)); - throw makeError(`One or more withdrawals failed ${q(errors)}`); - } - // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat - const paymentKwr = harden( - keys(amounts).reduce( - (acc, kw, i) => - assign(acc, { - [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] - .value, - }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - destSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - }); - - return harden({ - localTransfer, - withdrawToSeat, - }); -}; - -/** @typedef {ReturnType} ZoeTools */ diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index 8df36680..b680b0fa 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -17,7 +17,7 @@ const contractName = 'auto-stake-it'; const contractFile = `${dirname}/../src/${contractName}.contract.js`; type StartFn = - typeof import('/Users/lupin/work/agoric/dapp-orchestration-basics/contract/src/auto-stake-it.contract.js').start; + typeof import('../src/auto-stake-it.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); diff --git a/contract/test/bundle-source.test.js b/contract/test/bundle-source.test.js index 0beed6ce..4e958445 100644 --- a/contract/test/bundle-source.test.js +++ b/contract/test/bundle-source.test.js @@ -11,7 +11,7 @@ import { E, passStyleOf } from '@endo/far'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; const myRequire = createRequire(import.meta.url); -const contractPath = myRequire.resolve(`../src/orca.contract.ts`); +const contractPath = myRequire.resolve(`../src/orca.contract.js`); test('bundleSource() bundles the contract for use with zoe', async t => { const bundle = await bundleSource(contractPath); diff --git a/contract/test/old_network-fakes.js b/contract/test/old_network-fakes.js deleted file mode 100644 index 4e9b5e93..00000000 --- a/contract/test/old_network-fakes.js +++ /dev/null @@ -1,268 +0,0 @@ -// import { VowTools } from '@agoric/vow'; -import { - prepareEchoConnectionKit, - prepareLoopbackProtocolHandler, - prepareNetworkPowers, - preparePortAllocator, - prepareRouterProtocol, -} from '@agoric/network'; -// import type { Zone } from '@agoric/zone'; -// import type { -// IBCChannelID, -// IBCMethod, -// IBCEvent, -// ScopedBridgeManagerMethods, -// IBCConnectionID, -// } from '@agoric/vats'; -import { - prepareCallbacks as prepareIBCCallbacks, - prepareIBCProtocol, -} from '@agoric/vats/src/ibc.js'; -import { BridgeId } from '@agoric/internal'; -import { E, Far } from '@endo/far'; -// import type { Guarded } from '@endo/exo'; -import { defaultMockAckMap, errorAcknowledgments } from './ibc-mocks.js'; - -/** - * Mimic IBC Channel version negotation - * - * As part of the IBC Channel initialization, the version field is negotiated - * with the host. `version` is a String or JSON string as determined by the IBC - * Application protol. - * - * @param version requested version string - * @param {object} params mock parameters to add to version string - * @param {string} params.address for ICS-27, the bech32 address provided by the host - */ -const addParamsIfJsonVersion = (version, params) => { - try { - const parsed = JSON.parse(version); - return JSON.stringify({ - ...parsed, - ...params, - }); - } catch { - return version; - } -}; - -// type ImplementedIBCEvents = 'channelOpenAck' | 'acknowledgementPacket'; - -export const ibcBridgeMocks = { - channelOpenAck: ( - obj, - { bech32Prefix, sequence, channelID, counterpartyChannelID }, - ) => { - const mockChainAddress = - sequence > 0 ? `${bech32Prefix}1test${sequence}` : `${bech32Prefix}1test`; - - return { - type: 'IBC_EVENT', - blockHeight: 99, - blockTime: 1711571357, - event: 'channelOpenAck', - portID: obj.packet.source_port, - channelID, - counterparty: { - port_id: obj.packet.destination_port, - channel_id: counterpartyChannelID, - }, - counterpartyVersion: addParamsIfJsonVersion(obj.version, { - address: mockChainAddress, - }), - connectionHops: obj.hops, - order: obj.order, - version: obj.version, - }; - }, - - acknowledgementPacket: (obj, opts) => { - const { sequence, acknowledgement } = opts; - return { - acknowledgement, - blockHeight: 289, - blockTime: 1712180320, - event: 'acknowledgementPacket', - packet: { - data: obj.packet.data, - destination_channel: obj.packet.destination_channel, - destination_port: obj.packet.destination_port, - sequence, - source_channel: obj.packet.source_channel, - source_port: obj.packet.source_port, - timeout_height: 0, - timeout_timestamp: 1712183910866313000, - }, - relayer: 'agoric1gtkg0g6x8lqc734ht3qe2sdkrfugpdp2h7fuu0', - type: 'IBC_EVENT', - }; - }, -}; - -/** - * Make a fake IBC Bridge, extended from the dibc ScopedBridgeManager. - * - * Has extra `setMockAck` and `setAddressPrefix` met - * - * @param zone - */ -export const makeFakeIBCBridge = zone => { - let bridgeHandler; - /** - * Intended to mock an individual account's sequence, but is global for all - * accounts. - * XXX teach this about IBCConnections and store sequence on a - * per-channel basis. - * @type {number} - */ - let ibcSequenceNonce = 0; - /** - * The number of channels created. Currently used as a proxy to increment - * fake account addresses and channels. - * @type {number} - */ - let channelCount = 0; - let bech32Prefix = 'cosmos'; - - /** - * Keep track channels requested by remote chain. Used as a proxy for - * counterpaty channel ids - */ - const remoteChannelMap = {}; - - /** - * Packet byte string map of requests to responses - * @type {Record} - */ - let mockAckMap = defaultMockAckMap; - let bridgeEvents = []; - - return zone.exo('Fake IBC Bridge Manager', undefined, { - getBridgeId: () => BridgeId.DIBC, - toBridge: async obj => { - if (obj.type === 'IBC_METHOD') { - switch (obj.method) { - case 'startChannelOpenInit': { - const connectionChannelCount = remoteChannelMap[obj.hops[0]] || 0; - const ackEvent = ibcBridgeMocks.channelOpenAck(obj, { - bech32Prefix, - sequence: channelCount, - channelID: `channel-${channelCount}`, - counterpartyChannelID: `channel-${connectionChannelCount}`, - }); - bridgeHandler?.fromBridge(ackEvent); - bridgeEvents = bridgeEvents.concat(ackEvent); - channelCount += 1; - remoteChannelMap[obj.hops[0]] = connectionChannelCount + 1; - return undefined; - } - case 'sendPacket': { - const ackEvent = ibcBridgeMocks.acknowledgementPacket(obj, { - sequence: ibcSequenceNonce, - acknowledgement: - mockAckMap?.[obj.packet.data] || errorAcknowledgments.error5, - }); - bridgeEvents = bridgeEvents.concat(ackEvent); - ibcSequenceNonce += 1; - bridgeHandler?.fromBridge(ackEvent); - return ackEvent.packet; - } - default: - return undefined; - } - } - return undefined; - }, - fromBridge: async obj => { - if (!bridgeHandler) throw Error('no handler!'); - return bridgeHandler.fromBridge(obj); - }, - initHandler: handler => { - if (bridgeHandler) throw Error('already init'); - bridgeHandler = handler; - }, - setHandler: handler => { - if (!bridgeHandler) throw Error('must init first'); - bridgeHandler = handler; - }, - /** - * Set a map of requests to responses to simulate different scenarios. Defaults to `defaultMockAckMap`. - * See `@agoric/orchestration/tools/ibc-mocks.js` for helpers to build this map. - * - * @param ackMap - */ - setMockAck: ackMap => { - mockAckMap = ackMap; - }, - /** - * Set a new bech32 prefix for the mocked ICA channel. Defaults to `cosmos`. - * - * @param newPrefix - */ - setAddressPrefix: newPrefix => { - bech32Prefix = newPrefix; - }, - /** - * for debugging and testing - */ - inspectDibcBridge() { - return bridgeEvents; - }, - }); -}; - -export const setupFakeNetwork = (zone, { vowTools }) => { - const powers = prepareNetworkPowers(zone, vowTools); - const makeRouterProtocol = prepareRouterProtocol(zone, powers); - const makePortAllocator = preparePortAllocator(zone, powers); - // const makeRouterProtocol = prepareRouterProtocol(zone, vowTools); - // const makePortAllocator = preparePortAllocator(zone, vowTools); - const makeLoopbackProtocolHandler = prepareLoopbackProtocolHandler( - zone, - vowTools, - ); - const makeEchoConnectionKit = prepareEchoConnectionKit(zone); - const makeIBCProtocolHandler = prepareIBCProtocol(zone, vowTools); - - const protocol = makeRouterProtocol(); - const portAllocator = makePortAllocator({ protocol }); - const ibcBridge = makeFakeIBCBridge(zone); - - const networkVat = Far('vat-network', { - registerProtocolHandler: (prefixes, handler) => - protocol.registerProtocolHandler(prefixes, handler), - makeLoopbackProtocolHandler, - makeEchoConnectionKit, - unregisterProtocolHandler: (prefix, handler) => - protocol.unregisterProtocolHandler(prefix, handler), - getPortAllocator: () => portAllocator, - }); - - const ibcVat = Far('vat-ibc', { - makeCallbacks: prepareIBCCallbacks(zone), - createHandlers(callbacks) { - const ibcHandler = makeIBCProtocolHandler(callbacks); - return harden(ibcHandler); - }, - }); - - const setupIBCProtocol = async () => { - const callbacks = await E(ibcVat).makeCallbacks(ibcBridge); - const { protocolHandler, bridgeHandler } = - await E(ibcVat).createHandlers(callbacks); - await E(ibcBridge).initHandler(bridgeHandler); - await E(networkVat).registerProtocolHandler( - ['/ibc-port', '/ibc-hop'], - protocolHandler, - ); - }; - - return { - portAllocator, - protocol, - ibcBridge, - networkVat, - ibcVat, - setupIBCProtocol, - }; -}; diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index a363101e..3ba77cad 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -18,12 +18,12 @@ import { installContract } from '../src/platform-goals/start-contract.js'; * @import {IcaAccount, MakeCosmosInterchainService} from '@agoric/orchestration'; * @import {LocalChain,LocalChainAccount} from '@agoric/vats/src/localchain.js'; * @import {TargetRegistration} from '@agoric/vats/src/bridge-target.js'; - * @import {OrcaSF} from '../src/orca.contract.ts'; + * @import {OrcaSF} from '../src/orca.contract.js'; */ const nodeRequire = createRequire(import.meta.url); -const contractPath = nodeRequire.resolve(`../src/orca.contract.ts`); +const contractPath = nodeRequire.resolve(`../src/orca.contract.js`); const scriptRoot = { orca: nodeRequire.resolve('../src/orca.proposal.js'), }; diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts index 96995b9e..2e20c46a 100644 --- a/contract/tools/ibc-mocks.ts +++ b/contract/tools/ibc-mocks.ts @@ -22,7 +22,7 @@ import type { import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; import type { ChainAddress } from '../src/orchestration-api.js'; -import { makeQueryPacket, makeTxPacket } from '../src/utils/packet.js'; +import { makeQueryPacket, makeTxPacket } from '../utils/packet.js'; interface EncoderI { encode: (message: T) => { diff --git a/contract/utils/address.js b/contract/utils/address.js index 8d39ed5a..4699afa4 100644 --- a/contract/utils/address.js +++ b/contract/utils/address.js @@ -2,7 +2,7 @@ import { Fail, q } from '@endo/errors'; /** * @import {IBCConnectionID} from '@agoric/vats'; - * @import {ChainAddress} from '../types.js'; + * @import {ChainAddress} from '../src/types.js'; * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; */ diff --git a/contract/utils/start-helper.js b/contract/utils/start-helper.js index 902c7194..8e2a21c6 100644 --- a/contract/utils/start-helper.js +++ b/contract/utils/start-helper.js @@ -1,14 +1,14 @@ import { prepareAsyncFlowTools } from '@agoric/async-flow'; -import { prepareVowTools } from '@agoric/vow'; +import { prepareVowTools } from '@agoric/vow/vat.js'; import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; import { makeDurableZone } from '@agoric/zone/durable.js'; -import { makeChainHub } from '../exos/chain-hub.js'; -import { prepareCosmosOrchestrationAccount } from '../exos/cosmos-orchestration-account.js'; -import { prepareLocalChainFacade } from '../exos/local-chain-facade.js'; -import { prepareLocalOrchestrationAccountKit } from '../exos/local-orchestration-account.js'; -import { prepareOrchestrator } from '../exos/orchestrator.js'; -import { prepareRemoteChainFacade } from '../exos/remote-chain-facade.js'; -import { makeOrchestrationFacade } from '../facade.js'; +import { makeChainHub } from '../src/exos/chain-hub.js'; +import { prepareCosmosOrchestrationAccount } from '../src/exos/cosmos-orchestration-account.js'; +import { prepareLocalChainFacade } from '../src/exos/local-chain-facade.js'; +import { prepareLocalOrchestrationAccountKit } from '../src/exos/local-orchestration-account.js'; +import { prepareOrchestrator } from '../src/exos/orchestrator.js'; +import { prepareRemoteChainFacade } from '../src/exos/remote-chain-facade.js'; +import { makeOrchestrationFacade } from '../src/facade.js'; import { makeZoeTools } from './zoe-tools.js'; import { makeZcfTools } from './zcf-tools.js'; diff --git a/contract/utils/zcf-tools.js b/contract/utils/zcf-tools.js index d3843695..bc8027e6 100644 --- a/contract/utils/zcf-tools.js +++ b/contract/utils/zcf-tools.js @@ -1,7 +1,7 @@ /** * @import {HostInterface} from '@agoric/async-flow'; * @import {VowTools} from '@agoric/vow'; - * @import {ZcfTools} from '../types.js'; + * @import {ZcfTools} from '../src/types.js'; */ import { M, mustMatch } from '@endo/patterns'; From 8278b41fa0ac9731dd1b9e7bb5e9a7d91a2d7ce4 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 15:36:02 +0500 Subject: [PATCH 25/31] fixup! removing duplicate files --- contract/src/auto-stake-it-tap-kit.js | 2 +- contract/src/exos/README.md | 4 +- contract/test/auto-stake-it.contract.test.ts | 3 +- contract/test/orca-contract.test.js | 2 +- contract/tsconfig.json | 6 +- contract/typeGuards.js | 197 ------------------- contract/utils/orchestrationAccount.js | 2 +- 7 files changed, 8 insertions(+), 208 deletions(-) delete mode 100644 contract/typeGuards.js diff --git a/contract/src/auto-stake-it-tap-kit.js b/contract/src/auto-stake-it-tap-kit.js index 8e73fc74..0c30f9c4 100644 --- a/contract/src/auto-stake-it-tap-kit.js +++ b/contract/src/auto-stake-it-tap-kit.js @@ -3,7 +3,7 @@ import { E } from '@endo/far'; import { VowShape } from '@agoric/vow'; import { makeTracer } from '@agoric/internal'; import { atob } from '@endo/base64'; -import { ChainAddressShape } from '../typeGuards.js'; +import { ChainAddressShape } from './typeGuards.js'; const trace = makeTracer('AutoStakeItTap'); diff --git a/contract/src/exos/README.md b/contract/src/exos/README.md index 0599cbbb..d3a59777 100644 --- a/contract/src/exos/README.md +++ b/contract/src/exos/README.md @@ -81,10 +81,10 @@ classDiagram } %% In api consumer vats - + LocalOrchestrationAccount --* LocalChainAccount CosmosOrchestrationAccount --* IcaAccount - + class LocalOrchestrationAccount { account: LocalChainAccount address: ChainAddress diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index b680b0fa..6804b030 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -16,8 +16,7 @@ const dirname = path.dirname(new URL(import.meta.url).pathname); const contractName = 'auto-stake-it'; const contractFile = `${dirname}/../src/${contractName}.contract.js`; -type StartFn = - typeof import('../src/auto-stake-it.contract.js').start; +type StartFn = typeof import('../src/auto-stake-it.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); diff --git a/contract/test/orca-contract.test.js b/contract/test/orca-contract.test.js index 3ba77cad..7a670a59 100644 --- a/contract/test/orca-contract.test.js +++ b/contract/test/orca-contract.test.js @@ -1,6 +1,7 @@ // @ts-check import { test as anyTest } from './prepare-test-env-ava.js'; + import { createRequire } from 'module'; import { E, Far, passStyleOf } from '@endo/far'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; @@ -364,7 +365,6 @@ const orchestrationAccountAndFundScenario = test.macro({ ); let offerResult; - offerResult = await E(seat).getOfferResult(); await t.throwsAsync( async () => (offerResult = await vt.when(E(seat).getOfferResult())), { message: /TODO: use IBC mocks or something/ }, diff --git a/contract/tsconfig.json b/contract/tsconfig.json index 08a01a83..4646fe56 100644 --- a/contract/tsconfig.json +++ b/contract/tsconfig.json @@ -12,10 +12,8 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "outDir": "./dist", - "allowImportingTsExtensions": true, - "noEmit": true + "outDir": "./dist" }, "include": ["tools", "test"], "exclude": ["node_modules"] -} \ No newline at end of file +} diff --git a/contract/typeGuards.js b/contract/typeGuards.js deleted file mode 100644 index 995754dd..00000000 --- a/contract/typeGuards.js +++ /dev/null @@ -1,197 +0,0 @@ -import { VowShape } from '@agoric/vow'; -import { M } from '@endo/patterns'; - -/** - * @import {TypedPattern} from '@agoric/internal'; - * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; - * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; - * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; - * @import {TypedJson} from '@agoric/cosmic-proto'; - */ - -/** - * Used for IBC Channel Connections that only send outgoing transactions. If - * your channel expects incoming transactions, please extend this interface to - * include the `onReceive` handler. - */ -export const OutboundConnectionHandlerI = M.interface( - 'OutboundConnectionHandler', - { - onOpen: M.callWhen(M.any(), M.string(), M.string(), M.any()).returns( - M.any(), - ), - onClose: M.callWhen(M.any(), M.any(), M.any()).returns(M.any()), - }, -); - -/** @type {TypedPattern} */ -export const ChainAddressShape = { - chainId: M.string(), - encoding: M.string(), - value: M.string(), -}; -harden(ChainAddressShape); - -/** @type {TypedPattern} */ -export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; -harden(ChainAddressShape); - -/** @internal */ -export const IBCTransferOptionsShape = M.splitRecord( - {}, - { - timeoutTimestamp: M.bigint(), - timeoutHeight: { - revisionHeight: M.bigint(), - revisionNumber: M.bigint(), - }, - memo: M.string(), - }, -); - -/** @internal */ -export const IBCChannelIDShape = M.string(); - -/** @internal */ -export const IBCChannelInfoShape = M.splitRecord({ - portId: M.string(), - channelId: IBCChannelIDShape, - counterPartyPortId: M.string(), - counterPartyChannelId: IBCChannelIDShape, - ordering: M.scalar(), // XXX - state: M.scalar(), // XXX - version: M.string(), -}); - -/** @internal */ -export const IBCConnectionIDShape = M.string(); - -/** @internal */ -export const IBCConnectionInfoShape = M.splitRecord({ - id: IBCConnectionIDShape, - client_id: M.string(), - state: M.scalar(), // XXX STATE_OPEN or... - counterparty: { - client_id: M.string(), - connection_id: IBCConnectionIDShape, - }, - transferChannel: IBCChannelInfoShape, -}); - -/** @type {TypedPattern} */ -export const CosmosAssetInfoShape = M.splitRecord({ - base: M.string(), - name: M.string(), - display: M.string(), - symbol: M.string(), - denom_units: M.arrayOf( - M.splitRecord({ denom: M.string(), exponent: M.number() }), - ), -}); - -/** @type {TypedPattern} */ -export const CosmosChainInfoShape = M.splitRecord( - { - chainId: M.string(), - }, - { - bech32Prefix: M.string(), - connections: M.record(), - stakingTokens: M.arrayOf({ denom: M.string() }), - // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 - icqEnabled: M.boolean(), - }, -); - -/** @type {TypedPattern} */ -export const ChainInfoShape = M.splitRecord({ - chainId: M.string(), -}); -export const DenomShape = M.string(); - -/** @type {TypedPattern>} */ -export const DenomInfoShape = { - chain: M.remotable('Chain'), - base: M.remotable('Chain'), - brand: M.or(M.remotable('Brand'), M.undefined()), - baseDenom: M.string(), -}; -harden(DenomInfoShape); - -/** @type {TypedPattern} */ -export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; -harden(DenomAmountShape); - -/** @type {TypedPattern>} */ -export const AnyNatAmountShape = { - brand: M.remotable('Brand'), - value: M.nat(), -}; -harden(AnyNatAmountShape); - -/** @type {TypedPattern} */ -export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); - -/** - * @type {TypedPattern<{ - * validator: CosmosValidatorAddress; - * amount: AmountArg; - * }>} - */ -export const DelegationShape = M.splitRecord( - { - validator: ChainAddressShape, - amount: AmountArgShape, - }, - { delegator: ChainAddressShape }, -); - -/** Approximately @see RequestQuery */ -export const ICQMsgShape = M.splitRecord( - { path: M.string(), data: M.string() }, - { height: M.string(), prove: M.boolean() }, -); - -/** @type {TypedPattern} */ -export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); - -/** @see {Chain} */ -export const chainFacadeMethods = { - getChainInfo: M.call().returns(VowShape), - makeAccount: M.call().returns(VowShape), -}; -harden(chainFacadeMethods); - -/** - * for google/protobuf/timestamp.proto, not to be confused with TimestampShape - * from `@agoric/time` - * - * `seconds` is a big integer but since it goes through JSON it is encoded as - * string - */ -export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; -harden(TimestampProtoShape); - -/** - * see {@link TxBody} for more details - * - * @internal - */ -export const TxBodyOptsShape = M.splitRecord( - {}, - { - memo: M.string(), - timeoutHeight: M.bigint(), - extensionOptions: M.arrayOf(M.any()), - nonCriticalExtensionOptions: M.arrayOf(M.any()), - }, -); - -/** - * Ensures at least one {@link AmountKeywordRecord} entry is present and only - * permits Nat (fungible) amounts. - */ -export const AnyNatAmountsRecord = M.and( - M.recordOf(M.string(), AnyNatAmountShape), - M.not({}), -); diff --git a/contract/utils/orchestrationAccount.js b/contract/utils/orchestrationAccount.js index 23f5337d..2290af54 100644 --- a/contract/utils/orchestrationAccount.js +++ b/contract/utils/orchestrationAccount.js @@ -8,7 +8,7 @@ import { ChainAddressShape, DenomAmountShape, IBCTransferOptionsShape, -} from '../typeGuards.js'; +} from '../src/typeGuards.js'; /** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ From c5ff488874466269143d00d034c8728a4948ada3 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 16:34:10 +0500 Subject: [PATCH 26/31] fixup! removed exos and utils dir --- contract/package.json | 2 +- contract/src/auto-stake-it.contract.js | 9 +- contract/src/auto-stake-it.flows.js | 3 +- contract/src/exos/README.md | 130 -- contract/src/exos/chain-hub-admin.js | 84 -- contract/src/exos/chain-hub.js | 488 ------- .../src/exos/combine-invitation-makers.js | 59 - .../src/exos/cosmos-interchain-service.js | 280 ---- .../src/exos/cosmos-orchestration-account.js | 1147 ----------------- contract/src/exos/exo-interfaces.ts | 35 - contract/src/exos/ibc-packet.js | 219 ---- contract/src/exos/ica-account-kit.js | 231 ---- contract/src/exos/icq-connection-kit.js | 132 -- contract/src/exos/local-chain-facade.js | 196 --- .../src/exos/local-orchestration-account.js | 747 ----------- contract/src/exos/orchestrator.js | 196 --- contract/src/exos/packet-tools.js | 372 ------ contract/src/exos/portfolio-holder-kit.js | 230 ---- contract/src/exos/remote-chain-facade.js | 269 ---- .../src/{chain-info.js => old_chain-info.js} | 0 contract/src/orchestration-api.ts | 3 +- contract/test/supports.ts | 8 +- contract/tools/ibc-mocks.ts | 4 +- contract/utils/address.js | 103 -- contract/utils/amounts.js | 59 - contract/utils/cosmos.js | 82 -- contract/utils/denomHash.js | 22 - contract/utils/orc.js | 38 - contract/utils/orchestrationAccount.js | 40 - contract/utils/packet.js | 112 -- contract/utils/registry.js | 130 -- contract/utils/start-helper.js | 214 --- contract/utils/time.js | 48 - contract/utils/zcf-tools.js | 35 - contract/utils/zoe-tools.js | 186 --- yarn.lock | 565 ++------ 36 files changed, 93 insertions(+), 6385 deletions(-) delete mode 100644 contract/src/exos/README.md delete mode 100644 contract/src/exos/chain-hub-admin.js delete mode 100644 contract/src/exos/chain-hub.js delete mode 100644 contract/src/exos/combine-invitation-makers.js delete mode 100644 contract/src/exos/cosmos-interchain-service.js delete mode 100644 contract/src/exos/cosmos-orchestration-account.js delete mode 100644 contract/src/exos/exo-interfaces.ts delete mode 100644 contract/src/exos/ibc-packet.js delete mode 100644 contract/src/exos/ica-account-kit.js delete mode 100644 contract/src/exos/icq-connection-kit.js delete mode 100644 contract/src/exos/local-chain-facade.js delete mode 100644 contract/src/exos/local-orchestration-account.js delete mode 100644 contract/src/exos/orchestrator.js delete mode 100644 contract/src/exos/packet-tools.js delete mode 100644 contract/src/exos/portfolio-holder-kit.js delete mode 100644 contract/src/exos/remote-chain-facade.js rename contract/src/{chain-info.js => old_chain-info.js} (100%) delete mode 100644 contract/utils/address.js delete mode 100644 contract/utils/amounts.js delete mode 100644 contract/utils/cosmos.js delete mode 100644 contract/utils/denomHash.js delete mode 100644 contract/utils/orc.js delete mode 100644 contract/utils/orchestrationAccount.js delete mode 100644 contract/utils/packet.js delete mode 100644 contract/utils/registry.js delete mode 100644 contract/utils/start-helper.js delete mode 100644 contract/utils/time.js delete mode 100644 contract/utils/zcf-tools.js delete mode 100644 contract/utils/zoe-tools.js diff --git a/contract/package.json b/contract/package.json index 8329cb22..1cfad472 100644 --- a/contract/package.json +++ b/contract/package.json @@ -26,7 +26,7 @@ "@agoric/inter-protocol": "^0.17.0-u17.1", "@agoric/internal": "^0.4.0-u17.1", "@agoric/network": "0.1.1-dev-d1562a1.0", - "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch", + "@agoric/orchestration": "0.2.0-u18.1", "@agoric/smart-wallet": "^0.5.4-u17.1", "@agoric/store": "^0.9.3-u17.1", "@agoric/time": "^0.3.3-u17.1", diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/auto-stake-it.contract.js index 7a365c07..c593c42e 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/auto-stake-it.contract.js @@ -3,15 +3,16 @@ import { InvitationShape, } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; -import { prepareChainHubAdmin } from './exos/chain-hub-admin.js'; -import { preparePortfolioHolder } from './exos/portfolio-holder-kit.js'; -import { withOrchestration } from '../utils/start-helper.js'; +import { prepareChainHubAdmin } from '@agoric/orchestration/src/exos/chain-hub-admin.js'; +import { preparePortfolioHolder } from '@agoric/orchestration/src/exos/portfolio-holder-kit.js'; +// import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; +import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; import * as flows from './auto-stake-it.flows.js'; /** * @import {Zone} from '@agoric/zone'; - * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; + * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; * @import { Marshaller } from '@agoric/internal/src/lib-chainStorage.js'; */ diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/auto-stake-it.flows.js index 16b10212..fa180e89 100644 --- a/contract/src/auto-stake-it.flows.js +++ b/contract/src/auto-stake-it.flows.js @@ -1,5 +1,6 @@ import { Fail } from '@endo/errors'; -import { denomHash } from '../utils/denomHash.js'; +import { denomHash } from '@agoric/orchestration/src/utils/denomHash.js'; +// import { denomHash } from '../utils/denomHash.js'; /** * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; diff --git a/contract/src/exos/README.md b/contract/src/exos/README.md deleted file mode 100644 index d3a59777..00000000 --- a/contract/src/exos/README.md +++ /dev/null @@ -1,130 +0,0 @@ -# Exo structure - -Last verified 2024-10-30 - -```mermaid -classDiagram - -%% Orchestration vat business logic (Zoe) - ICQConnection --* Port - ICQConnection --* Connection - IcaAccount --* Port - IcaAccount --* Connection - IcaAccount --* CosmosInterchainService - ICQConnection --* CosmosInterchainService - CosmosInterchainService --* PortAllocator - PortAllocator --* NetworkVat - LocalChainAccount --* LocalChainVat - - class IcaAccount { - port: Port - connection: Connection - localAddress: LocalIbcAddress - requestedRemoteAddress: string - remoteAddress: RemoteIbcAddress - chainAddress: ChainAddress - getAddress() - getLocalAddress() - getRemoteAddress() - getPort() - executeTx() - executeEncodedTx() - deactivate() - reactivate() - } - class ICQConnection { - port: Port - connection: Connection - localAddress: LocalIbcAddress - remoteAddress: RemoteIbcAddress - getLocalAddress() - getRemoteAddress() - query() - } - - class CosmosInterchainService { - portAllocator: PortAllocator - icqConnections: MapStore - sharedICQPort: Port - makeAccount() - provideICQConnection() - } - -%% In other vats - class Port { - addListener() - connect() - getLocalAddress() - removeListener() - revoke() - } - - class Connection { - getLocalAddress() - getRemoteAddress() - send() - close() - } - - class PortAllocator { - allocateCustomIBCPort() - allocateICAControllerPort() - allocateICQControllerPort() - } - - class LocalChainAccount { - deposit() - executeTx() - getBalance() - monitorTransfers() - withdraw() - } - -%% In api consumer vats - - LocalOrchestrationAccount --* LocalChainAccount - CosmosOrchestrationAccount --* IcaAccount - - class LocalOrchestrationAccount { - account: LocalChainAccount - address: ChainAddress - topicKit: RecorderKit - asContinuingOffer() - delegate() - deposit() - executeTx() - getAddress() - getBalance() - getBalances() - getPublicTopics() - monitorTransfers() - send() - sendAll() - transfer() - undelegate() - withdraw() - } - - class CosmosOrchestrationAccount { - account: LocalChainAccount - chainAddress: ChainAddress - icqConnection: ICQConnection | undefined - timer: Timer - topicKit: RecorderKit - asContinuingOffer() - deactivate() - delegate() - executeEncodedTx() - getAddress() - getBalance() - getBalances() - getPublicTopics() - reactivate() - redelegate() - send() - sendAll() - transfer() - undelegate() - withdrawReward() - } -``` diff --git a/contract/src/exos/chain-hub-admin.js b/contract/src/exos/chain-hub-admin.js deleted file mode 100644 index e790257b..00000000 --- a/contract/src/exos/chain-hub-admin.js +++ /dev/null @@ -1,84 +0,0 @@ -/* we expect promises to resolved promptly, */ -/* eslint-disable no-restricted-syntax */ -import { heapVowE } from '@agoric/vow/vat.js'; -import { M } from '@endo/patterns'; -import { CosmosChainInfoShape } from '../typeGuards.js'; -import { DenomDetailShape } from './chain-hub.js'; - -/** - * @import {Zone} from '@agoric/zone'; - * @import {CosmosChainInfo, Denom, IBCConnectionInfo} from '@agoric/orchestration'; - * @import {ChainHub, DenomDetail} from './chain-hub.js'; - */ - -/** - * For use with async-flow contracts: can be used as a creator facet that allows - * developers to add new chain configurations to a local chainHub, in the event - * the information is not available widely in `agoricNames`. - * - * @example - * - * ```js - * const chainHubAdmin = prepareChainHubAdmin(zone, chainHub); - * chainHubAdmin.initChain( - * 'hotNewChain', - * hotNewChainInfo, - * agoricTohotNewChainConnectionInfo, - * ); - * ``` - * - * @param {Zone} zone - * @param {ChainHub} chainHub - */ -export const prepareChainHubAdmin = (zone, chainHub) => { - const ConnectionInfoShape = M.record(); // TODO - const makeCreatorFacet = zone.exo( - 'ChainHub Admin', - M.interface('ChainHub Admin', { - registerChain: M.callWhen( - M.string(), - CosmosChainInfoShape, - ConnectionInfoShape, - ).returns(M.undefined()), - registerAsset: M.call(M.string(), DenomDetailShape).returns(M.promise()), - }), - { - /** - * Register information for a chain - * - * @param {string} chainName - must not exist in chainHub - * @param {CosmosChainInfo} chainInfo - * @param {IBCConnectionInfo} connectionInfo - from Agoric chain - */ - async registerChain(chainName, chainInfo, connectionInfo) { - // when() because chainHub methods return vows. If this were inside - // orchestrate() the membrane would wrap/unwrap automatically. - const agoricChainInfo = await heapVowE.when( - chainHub.getChainInfo('agoric'), - ); - chainHub.registerChain(chainName, chainInfo); - chainHub.registerConnection( - agoricChainInfo.chainId, - chainInfo.chainId, - connectionInfo, - ); - }, - /** - * Register an asset that may be held on a chain other than the issuing - * chain. - * - * @param {Denom} denom - on the holding chain, whose name is given in - * `detail.chainName` - * @param {DenomDetail} detail - chainName and baseName must be registered - */ - async registerAsset(denom, detail) { - // XXX async work necessary before the synchronous call - await heapVowE.when(chainHub.getChainInfo('agoric')); - chainHub.registerAsset(denom, detail); - }, - }, - ); - return makeCreatorFacet; -}; - -/** @typedef {ReturnType} ChainHubAdmin */ diff --git a/contract/src/exos/chain-hub.js b/contract/src/exos/chain-hub.js deleted file mode 100644 index a7a31472..00000000 --- a/contract/src/exos/chain-hub.js +++ /dev/null @@ -1,488 +0,0 @@ -import { Fail, makeError, q } from '@endo/errors'; -import { E } from '@endo/far'; -import { M } from '@endo/patterns'; -import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; - -import { VowShape } from '@agoric/vow'; -import { - ChainAddressShape, - CosmosChainInfoShape, - IBCConnectionInfoShape, -} from '../typeGuards.js'; -import { getBech32Prefix } from '../../utils/address.js'; - -/** - * @import {NameHub} from '@agoric/vats'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {CosmosAssetInfo, CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; - * @import {ChainInfo, KnownChains} from '../chain-info.js'; - * @import {ChainAddress, Denom} from '../orchestration-api.js'; - * @import {Remote} from '@agoric/internal'; - * @import {TypedPattern} from '@agoric/internal'; - */ - -/** - * If K matches a known chain, narrow the type from generic ChainInfo - * - * @template {string} K - * @typedef {K extends keyof KnownChains - * ? ChainInfo & Omit - * : ChainInfo} ActualChainInfo - * @internal - */ - -/** - * @typedef {object} DenomDetail - * @property {string} baseName - name of issuing chain; e.g. cosmoshub - * @property {Denom} baseDenom - e.g. uatom - * @property {string} chainName - name of holding chain; e.g. agoric - * @property {Brand<'nat'>} [brand] - vbank brand, if registered - * @see {ChainHub} `registerAsset` method - */ -/** @type {TypedPattern} */ -export const DenomDetailShape = M.splitRecord( - { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, - { brand: BrandShape }, -); - -/** - * @enum {(typeof HubName)[keyof typeof HubName]} - */ -export const HubName = /** @type {const} */ ({ - /** agoricNames key for ChainInfo hub */ - Chain: 'chain', - /** namehub for assets info */ - ChainAssets: 'chainAssets', - /** namehub for connection info */ - ChainConnection: 'chainConnection', -}); -harden(HubName); - -/** @deprecated use HubName.Chain */ -export const CHAIN_KEY = HubName.Chain; -/** @deprecated use HubName.ChainConnection */ -export const CONNECTIONS_KEY = HubName.ChainConnection; -/** @deprecated use HubName.ChainAssets */ -export const ASSETS_KEY = HubName.ChainAssets; - -/** - * Character used in a connection tuple key to separate the two chain ids. Valid - * because a chainId can contain only alphanumerics and dash. - * - * Vstorage keys can be only alphanumerics, dash or underscore. That leaves - * underscore as the only valid separator. - * - * @see {@link https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md} - */ -const CHAIN_ID_SEPARATOR = '_'; - -/** - * The entries of the top-level namehubs in agoricNames are reflected to - * vstorage. But only the top level. So we combine the 2 chain ids into 1 key. - * Connections are directionless, so we sort the ids. - * - * @param {string} chainId1 - * @param {string} chainId2 - */ -export const connectionKey = (chainId1, chainId2) => { - if ( - chainId1.includes(CHAIN_ID_SEPARATOR) || - chainId2.includes(CHAIN_ID_SEPARATOR) - ) { - Fail`invalid chain id ${chainId1} or ${chainId2}`; - } - return [chainId1, chainId2].sort().join(CHAIN_ID_SEPARATOR); -}; - -/** - * Utility to reverse connection info perspective. - * - * @param {IBCConnectionInfo} connInfo - * @returns {IBCConnectionInfo} - */ -const reverseConnInfo = connInfo => { - const { transferChannel } = connInfo; - return { - id: connInfo.counterparty.connection_id, - client_id: connInfo.counterparty.client_id, - counterparty: { - client_id: connInfo.client_id, - connection_id: connInfo.id, - }, - state: connInfo.state, - transferChannel: { - ...transferChannel, - channelId: transferChannel.counterPartyChannelId, - counterPartyChannelId: transferChannel.channelId, - portId: transferChannel.counterPartyPortId, - counterPartyPortId: transferChannel.portId, - }, - }; -}; - -/** - * Convert the info to an undirected form. - * - * @param {string} primaryChainId - * @param {string} counterChainId - * @param {IBCConnectionInfo} directed - * @returns {[string, IBCConnectionInfo]} - */ -export const normalizeConnectionInfo = ( - primaryChainId, - counterChainId, - directed, -) => { - const key = connectionKey(primaryChainId, counterChainId); - if (primaryChainId < counterChainId) { - return [key, directed]; - } else { - return [key, reverseConnInfo(directed)]; - } -}; - -/** - * Provide a view on the connection from the primary chain's perspective. - * - * @param {string} primaryChainId - * @param {string} counterChainId - * @param {IBCConnectionInfo} normalized - */ -const denormalizeConnectionInfo = ( - primaryChainId, - counterChainId, - normalized, -) => { - if (primaryChainId < counterChainId) { - return normalized; - } else { - return reverseConnInfo(normalized); - } -}; - -const ChainIdArgShape = M.or( - M.string(), - M.splitRecord( - { - chainId: M.string(), - }, - undefined, - M.any(), - ), -); - -const ChainHubI = M.interface('ChainHub', { - registerChain: M.call(M.string(), CosmosChainInfoShape).returns(), - getChainInfo: M.call(M.string()).returns(VowShape), - registerConnection: M.call( - M.string(), - M.string(), - IBCConnectionInfoShape, - ).returns(), - getConnectionInfo: M.call(ChainIdArgShape, ChainIdArgShape).returns(VowShape), - getChainsAndConnection: M.call(M.string(), M.string()).returns(VowShape), - registerAsset: M.call(M.string(), DenomDetailShape).returns(), - getAsset: M.call(M.string()).returns(M.or(DenomDetailShape, M.undefined())), - getDenom: M.call(BrandShape).returns(M.or(M.string(), M.undefined())), - makeChainAddress: M.call(M.string()).returns(ChainAddressShape), -}); - -/** - * Make a new ChainHub in the zone. - * - * The resulting object is an Exo singleton. It has no precious state. It's only - * state is a cache of queries to agoricNames and whatever info was provided in - * registration calls. When you need a newer version you can simply make a hub - * hub and repeat the registrations. - * - * @param {Zone} zone - * @param {Remote} agoricNames - * @param {VowTools} vowTools - */ -export const makeChainHub = (zone, agoricNames, vowTools) => { - /** @type {MapStore} */ - const chainInfos = zone.mapStore('chainInfos', { - keyShape: M.string(), - valueShape: CosmosChainInfoShape, - }); - /** @type {MapStore} */ - const connectionInfos = zone.mapStore('connectionInfos', { - keyShape: M.string(), - valueShape: IBCConnectionInfoShape, - }); - - /** @type {MapStore} */ - const denomDetails = zone.mapStore('denom', { - keyShape: M.string(), - valueShape: DenomDetailShape, - }); - /** @type {MapStore} */ - const brandDenoms = zone.mapStore('brandDenom', { - keyShape: BrandShape, - valueShape: M.string(), - }); - /** @type {MapStore} */ - const bech32PrefixToChainName = zone.mapStore('bech32PrefixToChainName', { - keyShape: M.string(), - valueShape: M.string(), - }); - - const lookupChainInfo = vowTools.retriable( - zone, - 'lookupChainInfo', - /** @param {string} chainName */ - // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices - async chainName => { - await null; - try { - const chainInfo = await E(agoricNames).lookup(HubName.Chain, chainName); - // It may have been set by another concurrent call - // TODO consider makeAtomicProvider for vows - if (!chainInfos.has(chainName)) { - chainInfos.init(chainName, chainInfo); - if (chainInfo.bech32Prefix) { - bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName); - } - } - return chainInfo; - } catch (e) { - console.error('lookupChainInfo', chainName, 'error', e); - throw makeError(`chain not found:${chainName}`); - } - }, - ); - - const lookupConnectionInfo = vowTools.retriable( - zone, - 'lookupConnectionInfo', - /** - * @param {string} chainId1 - * @param {string} chainId2 - */ - // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices - async (chainId1, chainId2) => { - await null; - const key = connectionKey(chainId1, chainId2); - try { - const connectionInfo = await E(agoricNames).lookup( - HubName.ChainConnection, - key, - ); - // It may have been set by another concurrent call - // TODO consider makeAtomicProvider for vows - if (!connectionInfos.has(key)) { - connectionInfos.init(key, connectionInfo); - } - - return denormalizeConnectionInfo(chainId1, chainId2, connectionInfo); - } catch (e) { - console.error('lookupConnectionInfo', chainId1, chainId2, 'error', e); - throw makeError(`connection not found: ${chainId1}<->${chainId2}`); - } - }, - ); - - /* eslint-disable no-use-before-define -- chainHub defined below */ - const lookupChainsAndConnection = vowTools.retriable( - zone, - 'lookupChainsAndConnection', - /** - * @template {string} C1 - * @template {string} C2 - * @param {C1} primaryName - * @param {C2} counterName - * @returns {Promise< - * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] - * >} - */ - // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices - async (primaryName, counterName) => { - const [primary, counter] = await vowTools.asPromise( - vowTools.allVows([ - chainHub.getChainInfo(primaryName), - chainHub.getChainInfo(counterName), - ]), - ); - const connectionInfo = await vowTools.asPromise( - chainHub.getConnectionInfo(primary, counter), - ); - return /** @type {[ActualChainInfo, ActualChainInfo, IBCConnectionInfo]} */ ([ - primary, - counter, - connectionInfo, - ]); - }, - ); - - const chainHub = zone.exo('ChainHub', ChainHubI, { - /** - * Register a new chain. The name will override a name in well known chain - * names. - * - * If a durable zone was not provided, registration will not survive a - * reincarnation of the vat. Then if the chain is not yet in the well known - * names at that point, it will have to be registered again. In an unchanged - * contract `start` the call will happen again naturally. - * - * @param {string} name - * @param {CosmosChainInfo} chainInfo - */ - registerChain(name, chainInfo) { - chainInfos.init(name, chainInfo); - if (chainInfo.bech32Prefix) { - bech32PrefixToChainName.init(chainInfo.bech32Prefix, name); - } - }, - /** - * @template {string} K - * @param {K} chainName - * @returns {Vow>} - */ - getChainInfo(chainName) { - // Either from registerChain or memoized remote lookup() - if (chainInfos.has(chainName)) { - return /** @type {Vow>} */ ( - vowTools.asVow(() => chainInfos.get(chainName)) - ); - } - - return lookupChainInfo(chainName); - }, - /** - * @param {string} primaryChainId - * @param {string} counterpartyChainId - * @param {IBCConnectionInfo} connectionInfo from primary to counterparty - */ - registerConnection(primaryChainId, counterpartyChainId, connectionInfo) { - const [key, normalized] = normalizeConnectionInfo( - primaryChainId, - counterpartyChainId, - connectionInfo, - ); - connectionInfos.init(key, normalized); - }, - - /** - * @param {string | { chainId: string }} primary the primary chain - * @param {string | { chainId: string }} counter the counterparty chain - * @returns {Vow} - */ - getConnectionInfo(primary, counter) { - const primaryId = typeof primary === 'string' ? primary : primary.chainId; - const counterId = typeof counter === 'string' ? counter : counter.chainId; - const key = connectionKey(primaryId, counterId); - if (connectionInfos.has(key)) { - return vowTools.asVow(() => - denormalizeConnectionInfo( - primaryId, - counterId, - connectionInfos.get(key), - ), - ); - } - - return lookupConnectionInfo(primaryId, counterId); - }, - - /** - * @template {string} C1 - * @template {string} C2 - * @param {C1} primaryName the primary chain name - * @param {C2} counterName the counterparty chain name - * @returns {Vow< - * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] - * >} - */ - getChainsAndConnection(primaryName, counterName) { - // @ts-expect-error XXX generic parameter propagation - return lookupChainsAndConnection(primaryName, counterName); - }, - - /** - * Register an asset that may be held on a chain other than the issuing - * chain. - * - * @param {Denom} denom - on the holding chain, whose name is given in - * `detail.chainName` - * @param {DenomDetail} detail - chainName and baseName must be registered - */ - registerAsset(denom, detail) { - const { chainName, baseName } = detail; - chainInfos.has(chainName) || - Fail`must register chain ${q(chainName)} first`; - chainInfos.has(baseName) || - Fail`must register chain ${q(baseName)} first`; - denomDetails.init(denom, detail); - if (detail.brand) { - brandDenoms.init(detail.brand, denom); - } - }, - /** - * Retrieve holding, issuing chain names etc. for a denom. - * - * @param {Denom} denom - * @returns {DenomDetail | undefined} - */ - getAsset(denom) { - if (denomDetails.has(denom)) { - return denomDetails.get(denom); - } - return undefined; - }, - /** - * Retrieve denom (string) for a Brand. - * - * @param {Brand} brand - * @returns {Denom | undefined} - */ - getDenom(brand) { - if (brandDenoms.has(brand)) { - return brandDenoms.get(brand); - } - return undefined; - }, - /** - * @param {string} address bech32 address - * @returns {ChainAddress} - */ - makeChainAddress(address) { - const prefix = getBech32Prefix(address); - if (!bech32PrefixToChainName.has(prefix)) { - throw makeError(`Chain info not found for bech32Prefix ${q(prefix)}`); - } - const chainName = bech32PrefixToChainName.get(prefix); - const { chainId } = chainInfos.get(chainName); - return harden({ - chainId, - value: address, - encoding: /** @type {const} */ ('bech32'), - }); - }, - }); - - return chainHub; -}; -/** @typedef {ReturnType} ChainHub */ - -/** - * Register assets with the given ChainHub so they are available for lookup - * - * @param {ChainHub} chainHub - * @param {string} name - * @param {CosmosAssetInfo[]} assets - */ -export const registerAssets = (chainHub, name, assets) => { - for (const { base, traces } of assets) { - const native = !traces; - native || traces.length === 1 || Fail`unexpected ${traces.length} traces`; - const [chainName, baseName, baseDenom] = native - ? [name, name, base] - : [ - name, - traces[0].counterparty.chain_name, - traces[0].counterparty.base_denom, - ]; - chainHub.registerAsset(base, { chainName, baseName, baseDenom }); - } -}; diff --git a/contract/src/exos/combine-invitation-makers.js b/contract/src/exos/combine-invitation-makers.js deleted file mode 100644 index 3dd20625..00000000 --- a/contract/src/exos/combine-invitation-makers.js +++ /dev/null @@ -1,59 +0,0 @@ -import { M } from '@endo/patterns'; -import { - prepareGuardedAttenuator, - makeSyncMethodCallback, -} from '@agoric/internal/src/callback.js'; -import { getMethodNames } from '@agoric/internal'; - -/** - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {Zone} from '@agoric/zone'; - */ - -// TODO use a helper from Endo https://github.com/endojs/endo/issues/2448 -/** - * Takes two or more InvitationMaker exos and combines them into a new one. - * Combine with `publicTopics` to form a {@link ContinuingOfferResult} that can - * be returned to a smart-wallet client. - * - * Useful for writing your own invitationMakers while preserving - * platform-provided ones like `Delegate`, `Transfer`, `Send`. - * - * @param {Zone} zone - * @param {import('@endo/patterns').InterfaceGuard[]} interfaceGuards - */ -export const prepareCombineInvitationMakers = (zone, ...interfaceGuards) => { - const methodGuards = interfaceGuards.map(ig => ig.payload.methodGuards); - const CombinedInterfaceGuard = M.interface( - 'CombinedInvitationMakers interface', - Object.assign({}, ...methodGuards), - ); - - const mixin = prepareGuardedAttenuator(zone, CombinedInterfaceGuard, { - tag: 'CombinedInvitationMakers', - }); - - /** - * @template {InvitationMakers[]} IM - * @param {IM} invitationMakers - * @returns {IM[number]} - */ - const combineInvitationMakers = (...invitationMakers) => { - const overrides = {}; - for (const invMakers of invitationMakers) { - // remove '__getInterfaceGuard__', '__getMethodNames__' - const names = getMethodNames(invMakers).filter(n => !n.startsWith('__')); - for (const key of names) { - overrides[key] = makeSyncMethodCallback(invMakers, key); - } - } - return mixin({ - overrides, - }); - }; - - return combineInvitationMakers; -}; - -/** @typedef {ReturnType} MakeCombineInvitationMakers */ -/** @typedef {ReturnType} CombinedInvitationMakers */ diff --git a/contract/src/exos/cosmos-interchain-service.js b/contract/src/exos/cosmos-interchain-service.js deleted file mode 100644 index c6d72b96..00000000 --- a/contract/src/exos/cosmos-interchain-service.js +++ /dev/null @@ -1,280 +0,0 @@ -/** @file Orchestration service */ - -import { Shape as NetworkShape } from '@agoric/network'; -import { pickFacet } from '@agoric/vat-data'; -import { E } from '@endo/far'; -import { M, mustMatch } from '@endo/patterns'; -import { - DEFAULT_ICQ_VERSION, - makeICAChannelAddress, - makeICQChannelAddress, -} from '../../utils/address.js'; -import { prepareIcaAccountKit } from './ica-account-kit.js'; -import { prepareICQConnectionKit } from './icq-connection-kit.js'; - -/** - * @import {Zone} from '@agoric/base-zone'; - * @import {Remote} from '@agoric/internal'; - * @import {Connection, Port, PortAllocator} from '@agoric/network'; - * @import {IBCConnectionID} from '@agoric/vats'; - * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {ICQConnection, IcaAccount, ICQConnectionKit, IcaAccountKit} from '../types.js'; - * @import {ICAChannelAddressOpts} from '../../utils/address.js'; - */ - -const { Vow$ } = NetworkShape; // TODO #9611 -/** - * @typedef {object} OrchestrationPowers - * @property {Remote} portAllocator - * @property {undefined} reserved reserve a state key for future use. can hold - * an additional power or a record of powers - */ - -/** @typedef {MapStore} ICQConnectionStore */ - -/** @typedef {IcaAccountKit | ICQConnectionKit} ConnectionKit */ - -/** - * @typedef {{ - * icqConnections: ICQConnectionStore; - * sharedICQPort: Remote | undefined; - * } & OrchestrationPowers} OrchestrationState - */ - -/** - * Creates a key for the icqConnections mapStore based on connectionId and - * version - * - * @param {IBCConnectionID} controllerConnectionId - * @param {string} [version] - * @returns {string} - */ -const getICQConnectionKey = (controllerConnectionId, version) => { - return `${controllerConnectionId}:${version || DEFAULT_ICQ_VERSION}`; -}; - -/** - * @param {Zone} zone - * @param {VowTools} vowTools - * @param {ReturnType} makeIcaAccountKit - * @param {ReturnType} makeICQConnectionKit - */ -const prepareCosmosOrchestrationServiceKit = ( - zone, - { watch, asVow }, - makeIcaAccountKit, - makeICQConnectionKit, -) => - zone.exoClassKit( - 'Orchestration', - { - requestICAChannelWatcher: M.interface('RequestICAChannelWatcher', { - onFulfilled: M.call(M.remotable('Port')) - .optional({ chainId: M.string(), remoteConnAddr: M.string() }) - .returns(Vow$(NetworkShape.Connection)), - }), - requestICQChannelWatcher: M.interface('RequestICQChannelWatcher', { - onFulfilled: M.call(M.remotable('Port')) - .optional({ - remoteConnAddr: M.string(), - icqLookupKey: M.string(), - }) - .returns(Vow$(NetworkShape.Connection)), - }), - channelOpenWatcher: M.interface('ChannelOpenWatcher', { - onFulfilled: M.call(M.remotable('Connection')) - .optional( - M.splitRecord( - { connectionKit: M.record(), returnFacet: M.string() }, - { icqLookupKey: M.string() }, - ), - ) - .returns(M.remotable('ConnectionKit Holder facet')), - }), - public: M.interface('CosmosInterchainService', { - makeAccount: M.call(M.string(), M.string(), M.string()) - .optional(M.record()) - .returns(Vow$(M.remotable('IcaAccountKit'))), - provideICQConnection: M.call(M.string()) - .optional(M.string()) - .returns(Vow$(M.remotable('ICQConnection'))), - }), - }, - /** @param {Partial} powers */ - powers => { - mustMatch(powers?.portAllocator, M.remotable('PortAllocator')); - const icqConnections = zone.detached().mapStore('ICQConnections'); - return /** @type {OrchestrationState} */ ({ - icqConnections, - sharedICQPort: undefined, - reserved: undefined, - ...powers, - }); - }, - { - requestICAChannelWatcher: { - /** - * @param {Port} port - * @param {{ - * chainId: string; - * remoteConnAddr: RemoteIbcAddress; - * }} watchContext - */ - onFulfilled(port, { chainId, remoteConnAddr }) { - const connectionKit = makeIcaAccountKit( - chainId, - port, - remoteConnAddr, - ); - return watch( - E(port).connect(remoteConnAddr, connectionKit.connectionHandler), - this.facets.channelOpenWatcher, - { returnFacet: 'account', connectionKit }, - ); - }, - }, - requestICQChannelWatcher: { - /** - * @param {Port} port - * @param {{ - * remoteConnAddr: RemoteIbcAddress; - * icqLookupKey: string; - * }} watchContext - */ - onFulfilled(port, { remoteConnAddr, icqLookupKey }) { - if (!this.state.sharedICQPort) { - this.state.sharedICQPort = port; - } - const connectionKit = makeICQConnectionKit(port); - return watch( - E(port).connect(remoteConnAddr, connectionKit.connectionHandler), - this.facets.channelOpenWatcher, - { - connectionKit, - returnFacet: 'connection', - icqLookupKey, - }, - ); - }, - }, - /** - * Waits for a channel (ICA, ICQ) to open and returns the consumer-facing - * facet of the ConnectionKit, specified by `returnFacet`. Saves the - * ConnectionKit if `saveICQConnection` is provided. - */ - channelOpenWatcher: { - /** - * @param {Connection} _connection - * @param {{ - * connectionKit: ConnectionKit; - * returnFacet: string; - * icqLookupKey?: string; - * }} watchContext - */ - onFulfilled(_connection, { connectionKit, returnFacet, icqLookupKey }) { - if (icqLookupKey) { - this.state.icqConnections.init( - icqLookupKey, - /** @type {ICQConnectionKit} */ (connectionKit), - ); - } - return connectionKit[returnFacet]; - }, - }, - public: { - /** - * @satisfies {CosmosInterchainService['makeAccount']} - * @param {string} chainId - * @param {IBCConnectionID} hostConnectionId the counterparty - * connection_id - * @param {IBCConnectionID} controllerConnectionId self connection_id - * @param {ICAChannelAddressOpts} [opts] optional to configure the - * channel address, such as version and ordering - * @returns {Vow} - */ - makeAccount(chainId, hostConnectionId, controllerConnectionId, opts) { - const remoteConnAddr = makeICAChannelAddress( - hostConnectionId, - controllerConnectionId, - opts, - ); - const { portAllocator } = this.state; - return watch( - E(portAllocator).allocateICAControllerPort(), - this.facets.requestICAChannelWatcher, - { - chainId, - remoteConnAddr, - }, - ); - }, - /** - * @satisfies {CosmosInterchainService['provideICQConnection']} - * @param {IBCConnectionID} controllerConnectionId - * @param {string} [version] - * @returns {Vow | ICQConnection} - */ - provideICQConnection(controllerConnectionId, version) { - const icqLookupKey = getICQConnectionKey( - controllerConnectionId, - version, - ); - if (this.state.icqConnections.has(icqLookupKey)) { - return asVow( - () => this.state.icqConnections.get(icqLookupKey).connection, - ); - } - const remoteConnAddr = makeICQChannelAddress( - controllerConnectionId, - version, - ); - const { portAllocator, sharedICQPort } = this.state; - const portOrPortVow = - sharedICQPort || E(portAllocator).allocateICQControllerPort(); - - return watch(portOrPortVow, this.facets.requestICQChannelWatcher, { - remoteConnAddr, - icqLookupKey, - }); - }, - }, - }, - { - stateShape: { - icqConnections: M.remotable('icqConnections mapStore'), - sharedICQPort: M.or(M.remotable('Port'), M.undefined()), - portAllocator: M.remotable('PortAllocator'), - reserved: M.any(), - }, - }, - ); - -/** - * Used only by vat-orchestration and tests mocking it - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @internal - */ -export const prepareCosmosInterchainService = (zone, vowTools) => { - const makeIcaAccountKit = prepareIcaAccountKit(zone, vowTools); - const makeICQConnectionKit = prepareICQConnectionKit(zone, vowTools); - const makeCosmosOrchestrationServiceKit = - prepareCosmosOrchestrationServiceKit( - zone, - vowTools, - makeIcaAccountKit, - makeICQConnectionKit, - ); - - const makeCosmosInterchainService = pickFacet( - makeCosmosOrchestrationServiceKit, - 'public', - ); - - return makeCosmosInterchainService; -}; -harden(prepareCosmosInterchainService); - -/** @typedef {ReturnType} MakeCosmosInterchainService */ diff --git a/contract/src/exos/cosmos-orchestration-account.js b/contract/src/exos/cosmos-orchestration-account.js deleted file mode 100644 index 837eb2ad..00000000 --- a/contract/src/exos/cosmos-orchestration-account.js +++ /dev/null @@ -1,1147 +0,0 @@ -/** @file Use-object for the owner of a staking account */ -import { toRequestQueryJson } from '@agoric/cosmic-proto'; -import { - QueryAllBalancesRequest, - QueryAllBalancesResponse, - QueryBalanceRequest, - QueryBalanceResponse, -} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; -import { MsgSend } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; -import { - QueryDelegationRewardsRequest, - QueryDelegationRewardsResponse, - QueryDelegationTotalRewardsRequest, - QueryDelegationTotalRewardsResponse, -} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; -import { - MsgWithdrawDelegatorReward, - MsgWithdrawDelegatorRewardResponse, -} from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/tx.js'; -import { - QueryDelegationRequest, - QueryDelegationResponse, - QueryDelegatorDelegationsRequest, - QueryDelegatorDelegationsResponse, - QueryDelegatorUnbondingDelegationsRequest, - QueryDelegatorUnbondingDelegationsResponse, - QueryRedelegationsRequest, - QueryRedelegationsResponse, - QueryUnbondingDelegationRequest, - QueryUnbondingDelegationResponse, -} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/query.js'; -import { - MsgBeginRedelegate, - MsgDelegate, - MsgUndelegate, - MsgUndelegateResponse, -} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; -import { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; -import { makeTracer } from '@agoric/internal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { M } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; -import { decodeBase64 } from '@endo/base64'; -import { Fail, makeError, q } from '@endo/errors'; -import { E } from '@endo/far'; -import { - AmountArgShape, - ChainAddressShape, - DelegationShape, - DenomAmountShape, - IBCTransferOptionsShape, - Proto3Shape, - TxBodyOptsShape, -} from '../typeGuards.js'; -import { coerceCoin, coerceDenom } from '../../utils/amounts.js'; -import { - maxClockSkew, - toCosmosDelegationResponse, - toCosmosValidatorAddress, - toDenomAmount, - toTruncatedDenomAmount, - tryDecodeResponse, -} from '../../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../../utils/time.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {AmountArg, IcaAccount, ChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, OrchestrationAccountI, CosmosRewardsResponse, IBCConnectionInfo, IBCMsgTransferOptions, ChainHub, CosmosDelegationResponse} from '../types.js'; - * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - * @import {Remote} from '@agoric/internal'; - * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {TimerService} from '@agoric/time'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; - * @import {JsonSafe} from '@agoric/cosmic-proto'; - * @import {Matcher} from '@endo/patterns'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -const trace = makeTracer('ComosOrchestrationAccountHolder'); - -const { Vow$ } = NetworkShape; // TODO #9611 - -/** - * @typedef {object} ComosOrchestrationAccountNotification - * @property {ChainAddress} chainAddress - */ - -/** - * @private - * @typedef {{ - * topicKit: RecorderKit; - * account: IcaAccount; - * chainAddress: ChainAddress; - * localAddress: LocalIbcAddress; - * remoteAddress: RemoteIbcAddress; - * icqConnection: ICQConnection | undefined; - * timer: Remote; - * }} State - * Internal to the IcaAccountHolder exo - */ - -/** - * @typedef {{ - * localAddress: LocalIbcAddress; - * remoteAddress: RemoteIbcAddress; - * }} CosmosOrchestrationAccountStorageState - */ - -/** @see {StakingAccountActions} */ -const stakingAccountActionsMethods = { - delegate: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), - redelegate: M.call( - ChainAddressShape, - ChainAddressShape, - AmountArgShape, - ).returns(VowShape), - undelegate: M.call(M.arrayOf(DelegationShape)).returns(VowShape), - withdrawReward: M.call(ChainAddressShape).returns( - Vow$(M.arrayOf(DenomAmountShape)), - ), - withdrawRewards: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), -}; - -/** @see {StakingAccountQueries} */ -const stakingAccountQueriesMethods = { - getDelegation: M.call(ChainAddressShape).returns(VowShape), - getDelegations: M.call().returns(VowShape), - getUnbondingDelegation: M.call(ChainAddressShape).returns(VowShape), - getUnbondingDelegations: M.call().returns(VowShape), - getRedelegations: M.call().returns(VowShape), - getReward: M.call(ChainAddressShape).returns(VowShape), - getRewards: M.call().returns(VowShape), -}; - -/** @see {OrchestrationAccountI} */ -export const IcaAccountHolderI = M.interface('IcaAccountHolder', { - ...orchestrationAccountMethods, - ...stakingAccountActionsMethods, - ...stakingAccountQueriesMethods, - deactivate: M.call().returns(VowShape), - reactivate: M.call().returns(VowShape), - executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) - .optional(TxBodyOptsShape) - .returns(VowShape), -}); - -/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ -const PUBLIC_TOPICS = { - account: ['Staking Account holder status', M.any()], -}; - -export const CosmosOrchestrationInvitationMakersI = M.interface( - 'invitationMakers', - { - Delegate: M.call(ChainAddressShape, AmountArgShape).returns(M.promise()), - Redelegate: M.call( - ChainAddressShape, - ChainAddressShape, - AmountArgShape, - ).returns(M.promise()), - WithdrawReward: M.call(ChainAddressShape).returns(M.promise()), - Undelegate: M.call(M.arrayOf(DelegationShape)).returns(M.promise()), - DeactivateAccount: M.call().returns(M.promise()), - ReactivateAccount: M.call().returns(M.promise()), - TransferAccount: M.call().returns(M.promise()), - Send: M.call().returns(M.promise()), - SendAll: M.call().returns(M.promise()), - Transfer: M.call().returns(M.promise()), - }, -); -harden(CosmosOrchestrationInvitationMakersI); - -/** - * @param {Zone} zone - * @param {object} powers - * @param {ChainHub} powers.chainHub - * @param {MakeRecorderKit} powers.makeRecorderKit - * @param {Remote} powers.timerService - * @param {VowTools} powers.vowTools - * @param {ZCF} powers.zcf - */ -export const prepareCosmosOrchestrationAccountKit = ( - zone, - { - chainHub, - makeRecorderKit, - timerService, - vowTools: { watch, asVow, when, allVows }, - zcf, - }, -) => { - const timestampHelper = makeTimestampHelper(timerService); - const makeCosmosOrchestrationAccountKit = zone.exoClassKit( - 'Cosmos Orchestration Account Holder', - { - helper: M.interface('helper', { - owned: M.call().returns(M.remotable()), - getUpdater: M.call().returns(M.remotable()), - amountToCoin: M.call(AmountArgShape).returns(M.record()), - }), - returnVoidWatcher: M.interface('returnVoidWatcher', { - onFulfilled: M.call(M.or(M.string(), M.record())) - .optional(M.arrayOf(M.undefined())) - .returns(M.undefined()), - }), - balanceQueryWatcher: M.interface('balanceQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(M.or(M.record(), M.undefined())), - }), - allBalancesQueryWatcher: M.interface('allBalancesQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - undelegateWatcher: M.interface('undelegateWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(Vow$(M.promise())), - }), - withdrawRewardWatcher: M.interface('withdrawRewardWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(M.arrayOf(DenomAmountShape)), - }), - transferWatcher: M.interface('transferWatcher', { - onFulfilled: M.call([M.record(), M.nat()]) - .optional({ - destination: ChainAddressShape, - opts: M.or(M.undefined(), IBCTransferOptionsShape), - token: { - denom: M.string(), - amount: M.string(), - }, - }) - .returns(Vow$(M.record())), - }), - delegationQueryWatcher: M.interface('delegationQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), - }), - delegationsQueryWatcher: M.interface('delegationsQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - unbondingDelegationQueryWatcher: M.interface( - 'unbondingDelegationQueryWatcher', - { - onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), - }, - ), - unbondingDelegationsQueryWatcher: M.interface( - 'unbondingDelegationsQueryWatcher', - { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }, - ), - redelegationQueryWatcher: M.interface('redelegationQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - redelegationsQueryWatcher: M.interface('redelegationsQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - rewardQueryWatcher: M.interface('rewardQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns( - M.arrayOf(M.record()), - ), - }), - rewardsQueryWatcher: M.interface('rewardsQueryWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())).returns(M.record()), - }), - holder: IcaAccountHolderI, - invitationMakers: CosmosOrchestrationInvitationMakersI, - }, - /** - * @param {object} info - * @param {ChainAddress} info.chainAddress - * @param {LocalIbcAddress} info.localAddress - * @param {RemoteIbcAddress} info.remoteAddress - * @param {object} io - * @param {IcaAccount} io.account - * @param {Remote} io.storageNode - * @param {ICQConnection | undefined} io.icqConnection - * @param {Remote} io.timer - * @returns {State} - */ - ({ chainAddress, localAddress, remoteAddress }, io) => { - const { storageNode } = io; - // must be the fully synchronous maker because the kit is held in durable state - const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); - // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 - // XXX consider parsing local/remoteAddr to portId, channelId, counterpartyPortId, counterpartyChannelId, connectionId, counterpartyConnectionId - // FIXME these values will not update if IcaAccount gets new values after reopening. - // consider having IcaAccount responsible for the owning the writer. It might choose to share it with COA. - void E(topicKit.recorder).write( - /** @type {CosmosOrchestrationAccountStorageState} */ ({ - localAddress, - remoteAddress, - }), - ); - - const { account, icqConnection, timer } = io; - return { - account, - chainAddress, - icqConnection, - localAddress, - remoteAddress, - timer, - topicKit, - }; - }, - { - helper: { - /** @throws if this holder no longer owns the account */ - owned() { - const { account } = this.state; - if (!account) { - throw Fail`Using account holder after transfer`; - } - return account; - }, - getUpdater() { - return this.state.topicKit.recorder; - }, - /** - * @param {AmountArg} amount - * @returns {Coin} - */ - amountToCoin(amount) { - return coerceCoin(chainHub, amount); - }, - }, - balanceQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { balance } = QueryBalanceResponse.decode( - decodeBase64(result.key), - ); - if (!balance) throw Fail`Result lacked balance key: ${result}`; - return harden(toDenomAmount(balance)); - }, - }, - delegationQueryWatcher: { - /** - * @param {JsonSafe[]} results - * @returns {CosmosDelegationResponse} - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { delegationResponse } = QueryDelegationResponse.decode( - decodeBase64(result.key), - ); - if (!delegationResponse) - throw Fail`Result lacked delegationResponse key: ${result}`; - const { chainAddress } = this.state; - return harden( - toCosmosDelegationResponse(chainAddress, delegationResponse), - ); - }, - }, - delegationsQueryWatcher: { - /** - * @param {JsonSafe[]} results - * @returns {CosmosDelegationResponse[]} - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { delegationResponses } = - QueryDelegatorDelegationsResponse.decode(decodeBase64(result.key)); - if (!delegationResponses) - throw Fail`Result lacked delegationResponses key: ${result}`; - const { chainAddress } = this.state; - return harden( - delegationResponses.map(r => - toCosmosDelegationResponse(chainAddress, r), - ), - ); - }, - }, - unbondingDelegationQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { unbond } = QueryUnbondingDelegationResponse.decode( - decodeBase64(result.key), - ); - if (!unbond) throw Fail`Result lacked unbond key: ${result}`; - return harden(unbond); - }, - }, - unbondingDelegationsQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { unbondingResponses } = - QueryDelegatorUnbondingDelegationsResponse.decode( - decodeBase64(result.key), - ); - if (!unbondingResponses) - throw Fail`Result lacked unbondingResponses key: ${result}`; - return harden(unbondingResponses); - }, - }, - redelegationQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { redelegationResponses } = QueryRedelegationsResponse.decode( - decodeBase64(result.key), - ); - if (!redelegationResponses) - throw Fail`Result lacked redelegationResponses key: ${result}`; - return harden(redelegationResponses); - }, - }, - redelegationsQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { redelegationResponses } = QueryRedelegationsResponse.decode( - decodeBase64(result.key), - ); - if (!redelegationResponses) - throw Fail`Result lacked redelegationResponses key: ${result}`; - return harden(redelegationResponses); - }, - }, - rewardQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { rewards } = QueryDelegationRewardsResponse.decode( - decodeBase64(result.key), - ); - if (!rewards) throw Fail`Result lacked rewards key: ${result}`; - return harden(rewards.map(toTruncatedDenomAmount)); - }, - }, - rewardsQueryWatcher: { - /** - * @param {JsonSafe[]} results - * @returns {CosmosRewardsResponse} - */ - onFulfilled([result]) { - if (!result?.key) throw Fail`Error parsing result ${result}`; - const { rewards, total } = QueryDelegationTotalRewardsResponse.decode( - decodeBase64(result.key), - ); - if (!rewards || !total) - throw Fail`Result lacked rewards or total key: ${result}`; - const { chainAddress } = this.state; - return harden({ - rewards: rewards.map(reward => ({ - validator: toCosmosValidatorAddress(reward, chainAddress.chainId), - reward: reward.reward.map(toTruncatedDenomAmount), - })), - total: total.map(toTruncatedDenomAmount), - }); - }, - }, - allBalancesQueryWatcher: { - /** - * @param {JsonSafe[]} results - */ - onFulfilled([result]) { - let response; - try { - response = QueryAllBalancesResponse.decode( - // note: an empty string for result.key is a valid result - decodeBase64(result.key), - ); - } catch (cause) { - throw makeError( - `Error parsing QueryAllBalances result ${q(result)}`, - undefined, - { cause }, - ); - } - const { balances } = response; - if (!balances) throw Fail`Result lacked balances key: ${q(result)}`; - return harden(balances.map(coin => toDenomAmount(coin))); - }, - }, - undelegateWatcher: { - /** - * @param {string} result - */ - onFulfilled(result) { - const response = tryDecodeResponse( - result, - MsgUndelegateResponse.fromProtoMsg, - ); - trace('undelegate response', response); - const { completionTime } = response; - completionTime || Fail`No completion time result ${result}`; - return watch( - // ignore nanoseconds and just use seconds from Timestamp - E(this.state.timer).wakeAt(completionTime.seconds + maxClockSkew), - ); - }, - }, - /** - * takes an array of results (from `executeEncodedTx`) and returns void - * since we are not interested in the result - */ - returnVoidWatcher: { - /** @param {string | Record} result */ - onFulfilled(result) { - trace('Result', result); - return undefined; - }, - }, - withdrawRewardWatcher: { - /** @param {string} result */ - onFulfilled(result) { - const response = tryDecodeResponse( - result, - MsgWithdrawDelegatorRewardResponse.fromProtoMsg, - ); - trace('withdrawReward response', response); - const { amount: coins } = response; - return harden(coins.map(toDenomAmount)); - }, - }, - transferWatcher: { - /** - * @param {[ - * { transferChannel: IBCConnectionInfo['transferChannel'] }, - * bigint, - * ]} results - * @param {{ - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * token: Coin; - * }} ctx - */ - onFulfilled( - [{ transferChannel }, timeoutTimestamp], - { opts, token, destination }, - ) { - const results = E(this.facets.helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgTransfer.toProtoMsg({ - sourcePort: transferChannel.portId, - sourceChannel: transferChannel.channelId, - token, - sender: this.state.chainAddress.value, - receiver: destination.value, - timeoutHeight: opts?.timeoutHeight ?? { - revisionHeight: 0n, - revisionNumber: 0n, - }, - timeoutTimestamp, - memo: opts?.memo ?? '', - }), - ), - ]); - return watch(results, this.facets.returnVoidWatcher); - }, - }, - invitationMakers: { - /** - * @param {CosmosValidatorAddress} validator - * @param {AmountArg} amount - */ - Delegate(validator, amount) { - trace('Delegate', validator, amount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.delegate(validator, amount)); - }, 'Delegate'); - }, - /** - * @param {CosmosValidatorAddress} srcValidator - * @param {CosmosValidatorAddress} dstValidator - * @param {AmountArg} amount - */ - Redelegate(srcValidator, dstValidator, amount) { - trace('Redelegate', srcValidator, dstValidator, amount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch( - this.facets.holder.redelegate(srcValidator, dstValidator, amount), - ); - }, 'Redelegate'); - }, - /** @param {CosmosValidatorAddress} validator */ - WithdrawReward(validator) { - trace('WithdrawReward', validator); - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.withdrawReward(validator)); - }, 'WithdrawReward'); - }, - /** - * @param {{ - * amount: AmountArg; - * validator: CosmosValidatorAddress; - * }[]} delegations - */ - Undelegate(delegations) { - trace('Undelegate', delegations); - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.undelegate(delegations)); - }, 'Undelegate'); - }, - DeactivateAccount() { - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.deactivate()); - }, 'DeactivateAccount'); - }, - ReactivateAccount() { - return zcf.makeInvitation(seat => { - seat.exit(); - return watch(this.facets.holder.reactivate()); - }, 'ReactivateAccount'); - }, - Send() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amount: AmountArg } - * >} - */ - const offerHandler = (seat, { toAccount, amount }) => { - seat.exit(); - return watch(this.facets.holder.send(toAccount, amount)); - }; - return zcf.makeInvitation(offerHandler, 'Send'); - }, - SendAll() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amounts: AmountArg[] } - * >} - */ - const offerHandler = (seat, { toAccount, amounts }) => { - seat.exit(); - return watch(this.facets.holder.sendAll(toAccount, amounts)); - }; - return zcf.makeInvitation(offerHandler, 'SendAll'); - }, - /** - * Starting a transfer revokes the account holder. The associated - * updater will get a special notification that the account is being - * transferred. - */ - TransferAccount() { - throw Error('not yet implemented'); - }, - Transfer() { - /** - * @type {OfferHandler< - * Vow, - * { - * amount: AmountArg; - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * } - * >} - */ - const offerHandler = (seat, { amount, destination, opts }) => { - seat.exit(); - return watch( - this.facets.holder.transfer(destination, amount, opts), - ); - }; - return zcf.makeInvitation(offerHandler, 'Transfer'); - }, - }, - holder: { - /** @type {HostOf} */ - asContinuingOffer() { - // @ts-expect-error XXX invitationMakers - // getPublicTopics resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { holder, invitationMakers: im } = this.facets; - // XXX cast to a type that has string index signature - const invitationMakers = /** @type {InvitationMakers} */ ( - /** @type {unknown} */ (im) - ); - - return harden({ - // getPublicTopics returns a vow, for membrane compatibility. - // it's safe to unwrap to a promise and get the result as we - // expect this complete in the same run - publicSubscribers: await when(holder.getPublicTopics()), - invitationMakers, - }); - }); - }, - /** @type {HostOf} */ - getPublicTopics() { - // getStoragePath resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { topicKit } = this.state; - return harden({ - account: { - description: PUBLIC_TOPICS.account[0], - subscriber: topicKit.subscriber, - storagePath: await topicKit.recorder.getStoragePath(), - }, - }); - }); - }, - - /** @type {HostOf} */ - getAddress() { - return this.state.chainAddress; - }, - /** @type {HostOf} */ - delegate(validator, amount) { - return asVow(() => { - trace('delegate', validator, amount); - const { helper } = this.facets; - const { chainAddress } = this.state; - - const amountAsCoin = helper.amountToCoin(amount); - - const results = E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgDelegate.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - amount: amountAsCoin, - }), - ), - ]); - return watch(results, this.facets.returnVoidWatcher); - }); - }, - - /** @type {HostOf} */ - redelegate(srcValidator, dstValidator, amount) { - return asVow(() => { - trace('redelegate', srcValidator, dstValidator, amount); - const { helper } = this.facets; - const { chainAddress } = this.state; - - const results = E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgBeginRedelegate.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorSrcAddress: srcValidator.value, - validatorDstAddress: dstValidator.value, - amount: helper.amountToCoin(amount), - }), - ), - ]); - - return watch( - results, - // NOTE: response, including completionTime, is currently discarded. - this.facets.returnVoidWatcher, - ); - }); - }, - /** @type {HostOf} */ - withdrawReward(validator) { - return asVow(() => { - trace('withdrawReward', validator); - const { helper } = this.facets; - const { chainAddress } = this.state; - const msg = MsgWithdrawDelegatorReward.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - }); - const account = helper.owned(); - - const results = E(account).executeEncodedTx([Any.toJSON(msg)]); - return watch(results, this.facets.withdrawRewardWatcher); - }); - }, - /** @type {HostOf} */ - getBalance(denom) { - return asVow(() => { - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryBalanceRequest.toProtoMsg({ - address: chainAddress.value, - denom: coerceDenom(chainHub, denom), - }), - ), - ]); - return watch(results, this.facets.balanceQueryWatcher); - }); - }, - - /** @type {HostOf} */ - getBalances() { - return asVow(() => { - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryAllBalancesRequest.toProtoMsg({ - address: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.allBalancesQueryWatcher); - }); - }, - - /** @type {HostOf} */ - send(toAccount, amount) { - return asVow(() => { - trace('send', toAccount, amount); - const { helper } = this.facets; - const { chainAddress } = this.state; - return watch( - E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgSend.toProtoMsg({ - fromAddress: chainAddress.value, - toAddress: toAccount.value, - amount: [helper.amountToCoin(amount)], - }), - ), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - - /** @type {HostOf} */ - sendAll(toAccount, amounts) { - return asVow(() => { - trace('sendAll', toAccount, amounts); - const { helper } = this.facets; - const { chainAddress } = this.state; - return watch( - E(helper.owned()).executeEncodedTx([ - Any.toJSON( - MsgSend.toProtoMsg({ - fromAddress: chainAddress.value, - toAddress: toAccount.value, - amount: amounts.map(x => helper.amountToCoin(x)), - }), - ), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - - /** @type {HostOf} */ - transfer(destination, amount, opts) { - trace('transfer', destination, amount, opts); - return asVow(() => { - const { helper } = this.facets; - const token = helper.amountToCoin(amount); - - const connectionInfoV = watch( - chainHub.getConnectionInfo( - this.state.chainAddress.chainId, - destination.chainId, - ), - ); - - // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` - // TODO #9324 what's a reasonable default? currently 5 minutes - const timeoutTimestampVowOrValue = - opts?.timeoutTimestamp ?? - (opts?.timeoutHeight - ? 0n - : E(timestampHelper).getTimeoutTimestampNS()); - - // Resolves when host chain successfully submits, but not when - // the receiving chain acknowledges. - // See https://github.com/Agoric/agoric-sdk/issues/9784 for a - // solution that tracks the acknowledgement on the receiving chain. - return watch( - allVows([connectionInfoV, timeoutTimestampVowOrValue]), - this.facets.transferWatcher, - { opts, token, destination }, - ); - }); - }, - - /** @type {HostOf} */ - transferSteps(amount, msg) { - console.log('transferSteps got', amount, msg); - return asVow(() => Fail`not yet implemented`); - }, - - /** @type {HostOf} */ - withdrawRewards() { - return asVow(() => Fail`Not Implemented. Try using withdrawReward.`); - }, - - /** @type {HostOf} */ - undelegate(delegations) { - return asVow(() => { - trace('undelegate', delegations); - const { helper } = this.facets; - const { chainAddress } = this.state; - - delegations.every(d => - d.delegator ? d.delegator.value === chainAddress.value : true, - ) || Fail`Some delegation record is for another delegator`; - - const undelegateV = watch( - E(helper.owned()).executeEncodedTx( - delegations.map(({ validator, amount }) => - Any.toJSON( - MsgUndelegate.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - amount: coerceCoin(chainHub, amount), - }), - ), - ), - ), - this.facets.undelegateWatcher, - ); - return watch(undelegateV, this.facets.returnVoidWatcher); - }); - }, - /** @type {HostOf} */ - deactivate() { - return asVow(() => watch(E(this.facets.helper.owned()).deactivate())); - }, - /** @type {HostOf} */ - reactivate() { - return asVow(() => watch(E(this.facets.helper.owned()).reactivate())); - }, - /** @type {HostOf} */ - getDelegation(validator) { - return asVow(() => { - trace('getDelegation', validator); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegationRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - validatorAddr: validator.value, - }), - ), - ]); - return watch(results, this.facets.delegationQueryWatcher); - }); - }, - /** @type {HostOf} */ - getDelegations() { - return asVow(() => { - trace('getDelegations'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegatorDelegationsRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.delegationsQueryWatcher); - }); - }, - /** @type {HostOf} */ - getUnbondingDelegation(validator) { - return asVow(() => { - trace('getUnbondingDelegation', validator); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryUnbondingDelegationRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - validatorAddr: validator.value, - }), - ), - ]); - return watch(results, this.facets.unbondingDelegationQueryWatcher); - }); - }, - /** @type {HostOf} */ - getUnbondingDelegations() { - return asVow(() => { - trace('getUnbondingDelegations'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegatorUnbondingDelegationsRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.unbondingDelegationsQueryWatcher); - }); - }, - /** @type {HostOf} */ - getRedelegations() { - return asVow(() => { - trace('getRedelegations'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryRedelegationsRequest.toProtoMsg({ - delegatorAddr: chainAddress.value, - // These are optional but the protobufs require values to be set - dstValidatorAddr: '', - srcValidatorAddr: '', - }), - ), - ]); - return watch(results, this.facets.redelegationsQueryWatcher); - }); - }, - /** @type {HostOf} */ - getReward(validator) { - return asVow(() => { - trace('getReward', validator); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegationRewardsRequest.toProtoMsg({ - delegatorAddress: chainAddress.value, - validatorAddress: validator.value, - }), - ), - ]); - return watch(results, this.facets.rewardQueryWatcher); - }); - }, - /** @type {HostOf} */ - getRewards() { - return asVow(() => { - trace('getRewards'); - const { chainAddress, icqConnection } = this.state; - if (!icqConnection) { - throw Fail`Queries not available for chain ${q(chainAddress.chainId)}`; - } - const results = E(icqConnection).query([ - toRequestQueryJson( - QueryDelegationTotalRewardsRequest.toProtoMsg({ - delegatorAddress: chainAddress.value, - }), - ), - ]); - return watch(results, this.facets.rewardsQueryWatcher); - }); - }, - /** @type {HostOf} */ - executeEncodedTx(msgs, opts) { - return asVow(() => - watch(E(this.facets.helper.owned()).executeEncodedTx(msgs, opts)), - ); - }, - }, - }, - ); - - return makeCosmosOrchestrationAccountKit; -}; - -/** - * @typedef {ReturnType< - * ReturnType - * >} CosmosOrchestrationAccountKit - */ - -/** - * @param {Zone} zone - * @param {object} powers - * @param {ChainHub} powers.chainHub - * @param {MakeRecorderKit} powers.makeRecorderKit - * @param {Remote} powers.timerService - * @param {VowTools} powers.vowTools - * @param {ZCF} powers.zcf - * @returns {( - * ...args: Parameters< - * ReturnType - * > - * ) => CosmosOrchestrationAccountKit['holder']} - */ -export const prepareCosmosOrchestrationAccount = ( - zone, - { chainHub, makeRecorderKit, timerService, vowTools, zcf }, -) => { - const makeKit = prepareCosmosOrchestrationAccountKit(zone, { - chainHub, - makeRecorderKit, - timerService, - vowTools, - zcf, - }); - return (...args) => makeKit(...args).holder; -}; -/** @typedef {CosmosOrchestrationAccountKit['holder']} CosmosOrchestrationAccount */ diff --git a/contract/src/exos/exo-interfaces.ts b/contract/src/exos/exo-interfaces.ts deleted file mode 100644 index 1cf2ffc2..00000000 --- a/contract/src/exos/exo-interfaces.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { IBCConnectionID } from '@agoric/vats'; -import type { Vow } from '@agoric/vow'; -import type { IcaAccount } from '../cosmos-api.js'; -import type { ICAChannelAddressOpts } from '../../utils/address.js'; -import type { ICQConnection } from './icq-connection-kit.js'; - -/** - * Authority to make a Cosmos interchain account or an interchain query connection. - */ -export interface CosmosInterchainService { - /** - * @param {string} chainId - * @param {IBCConnectionID} hostConnectionId the counterparty - * connection_id - * @param {IBCConnectionID} controllerConnectionId self connection_id - * @param {ICAChannelAddressOpts} [opts] optional to configure the - * channel address, such as version and ordering - * @returns {Vow} - */ - makeAccount( - chainId: string, - hostConnectionId: IBCConnectionID, - controllerConnectionId: IBCConnectionID, - opts?: ICAChannelAddressOpts | undefined, - ): Vow; - /** - * @param {IBCConnectionID} controllerConnectionId - * @param {string} [version] - * @returns {Vow | ICQConnection} - */ - provideICQConnection( - controllerConnectionId: IBCConnectionID, - version?: string | undefined, - ): Vow | ICQConnection; -} diff --git a/contract/src/exos/ibc-packet.js b/contract/src/exos/ibc-packet.js deleted file mode 100644 index dd25ac55..00000000 --- a/contract/src/exos/ibc-packet.js +++ /dev/null @@ -1,219 +0,0 @@ -import { assertAllDefined } from '@agoric/internal'; -import { base64ToBytes, Shape as NetworkShape } from '@agoric/network'; -import { M } from '@endo/patterns'; -import { E } from '@endo/far'; - -// As specified in ICS20, the success result is a base64-encoded '\0x1' byte. -export const ICS20_TRANSFER_SUCCESS_RESULT = 'AQ=='; - -/** - * @import {JsonSafe, TypedJson, ResponseTo} from '@agoric/cosmic-proto'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; - * @import {PacketOptions} from './packet-tools.js'; - */ - -const { Fail, bare } = assert; -const { Vow$ } = NetworkShape; // TODO #9611 - -/** - * Create a pattern for alterative representations of a sequence number. - * - * @param {any} sequence - * @returns {Pattern} - */ -export const createSequencePattern = sequence => { - const sequencePatterns = []; - - try { - const bintSequence = BigInt(sequence); - bintSequence > 0n && sequencePatterns.push(bintSequence); - } catch (e) { - // ignore - } - - const numSequence = Number(sequence); - numSequence > 0 && - Number.isSafeInteger(numSequence) && - sequencePatterns.push(numSequence); - - const strSequence = String(sequence); - strSequence && sequencePatterns.push(strSequence); - - if (!sequencePatterns.find(seq => seq === sequence)) { - sequencePatterns.push(sequence); - } - - switch (sequencePatterns.length) { - case 0: - throw Fail`sequence ${sequence} is not valid`; - case 1: - return sequencePatterns[0]; - default: - return M.or(...sequencePatterns); - } -}; -harden(createSequencePattern); - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools & { makeIBCReplyKit: MakeIBCReplyKit }} powers - */ -export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => { - const makeIBCTransferSenderKit = zone.exoClassKit( - 'IBCTransferSenderKit', - { - public: M.interface('IBCTransferSender', { - sendPacket: M.call(Vow$(M.any()), M.any()).returns(Vow$(M.record())), - }), - responseWatcher: M.interface('responseWatcher', { - onFulfilled: M.call([M.record()], M.record()).returns(M.any()), - }), - verifyTransferSuccess: M.interface('verifyTransferSuccess', { - onFulfilled: M.call(M.any()).returns(), - }), - }, - /** - * @param {{ - * executeTx: LocalChainAccount['executeTx']; - * }} txExecutor - * @param {TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'>} transferMsg - */ - (txExecutor, transferMsg) => ({ - txExecutor, - transferMsg: harden(transferMsg), - }), - { - public: { - sendPacket(match, opts) { - const { txExecutor, transferMsg } = this.state; - return watch( - E(txExecutor).executeTx([transferMsg]), - this.facets.responseWatcher, - { opts, match }, - ); - }, - }, - responseWatcher: { - /** - * Wait for successfully sending the transfer packet. - * - * @param {[ - * JsonSafe< - * ResponseTo< - * TypedJson<'/ibc.applications.transfer.v1.MsgTransfer'> - * > - * >, - * ]} response - * @param {Record} ctx - */ - onFulfilled([{ sequence }], ctx) { - const { match } = ctx; - const { transferMsg } = this.state; - - // Match the port/channel and sequence number. - const replyPacketPattern = M.splitRecord({ - source_port: transferMsg.sourcePort, - source_channel: transferMsg.sourceChannel, - sequence: createSequencePattern(sequence), - }); - - const { resultV: ackDataV, ...rest } = makeIBCReplyKit( - replyPacketPattern, - match, - ctx, - ); - const resultV = watch(ackDataV, this.facets.verifyTransferSuccess); - return harden({ resultV, ...rest }); - }, - }, - verifyTransferSuccess: { - onFulfilled(ackData) { - let obj; - try { - obj = JSON.parse(ackData); - } catch { - Fail`ICS20-1 transfer ack data is not JSON: ${ackData}`; - } - const { result, error } = obj; - error === undefined || Fail`ICS20-1 transfer error ${error}`; - result ?? Fail`Missing result in ICS20-1 transfer ack ${obj}`; - result === ICS20_TRANSFER_SUCCESS_RESULT || - Fail`ICS20-1 transfer unsuccessful with ack result ${result}`; - }, - }, - }, - ); - - /** - * @param {Parameters} args - */ - return (...args) => makeIBCTransferSenderKit(...args).public; -}; -harden(prepareIBCTransferSender); - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools} vowTools - */ -export const prepareIBCReplyKit = (zone, vowTools) => { - const { watch } = vowTools; - const ibcWatcher = zone.exo( - 'ibcResultWatcher', - M.interface('processIBCWatcher', { - onFulfilled: M.call(M.record(), M.record()).returns(Vow$(M.string())), - }), - { - onFulfilled({ event, acknowledgement }, { opName = 'unknown' }) { - assertAllDefined({ event, acknowledgement }); - switch (event) { - case 'acknowledgementPacket': - return base64ToBytes(acknowledgement); - case 'timeoutPacket': - throw Fail`${bare(opName)} operation received timeout packet`; - default: - throw Fail`Unexpected event: ${event}`; - } - }, - }, - ); - - /** - * @param {Pattern} replyPacketPattern - * @param {Vow} matchV - * @param {PacketOptions} opts - */ - const makeIBCReplyKit = (replyPacketPattern, matchV, opts) => { - const eventPattern = M.or( - M.splitRecord({ - event: 'acknowledgementPacket', - packet: replyPacketPattern, - acknowledgement: M.string(), - }), - M.splitRecord({ - event: 'timeoutPacket', - packet: replyPacketPattern, - }), - ); - const resultV = watch(matchV, ibcWatcher, opts); - return harden({ eventPattern, resultV }); - }; - - return makeIBCReplyKit; -}; -harden(prepareIBCReplyKit); -/** @typedef {ReturnType} MakeIBCReplyKit */ - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools} vowTools - */ -export const prepareIBCTools = (zone, vowTools) => { - const makeIBCReplyKit = prepareIBCReplyKit(zone, vowTools); - const makeIBCTransferSender = prepareIBCTransferSender(zone, { - makeIBCReplyKit, - ...vowTools, - }); - return harden({ makeIBCTransferSender, makeIBCReplyKit }); -}; -harden(prepareIBCTools); diff --git a/contract/src/exos/ica-account-kit.js b/contract/src/exos/ica-account-kit.js deleted file mode 100644 index 920047c8..00000000 --- a/contract/src/exos/ica-account-kit.js +++ /dev/null @@ -1,231 +0,0 @@ -/** @file IcaAccount exo */ -import { Fail } from '@endo/errors'; -import { E } from '@endo/far'; -import { M } from '@endo/patterns'; -import { NonNullish, makeTracer } from '@agoric/internal'; -import { VowShape } from '@agoric/vow'; -import { - ChainAddressShape, - OutboundConnectionHandlerI, - Proto3Shape, - TxBodyOptsShape, -} from '../typeGuards.js'; -import { findAddressField } from '../../utils/address.js'; -import { makeTxPacket, parseTxPacket } from '../../utils/packet.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {Zone} from '@agoric/base-zone'; - * @import {Connection, Port} from '@agoric/network'; - * @import {Remote, Vow, VowTools} from '@agoric/vow'; - * @import {AnyJson} from '@agoric/cosmic-proto'; - * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - * @import {ChainAddress, IcaAccount} from '../types.js'; - */ - -const trace = makeTracer('IcaAccountKit'); - -const UNPARSABLE_CHAIN_ADDRESS = 'UNPARSABLE_CHAIN_ADDRESS'; - -export const IcaAccountI = M.interface('IcaAccount', { - getAddress: M.call().returns(ChainAddressShape), - getLocalAddress: M.call().returns(M.string()), - getRemoteAddress: M.call().returns(M.string()), - getPort: M.call().returns(M.remotable('Port')), - executeTx: M.call(M.arrayOf(M.record())).returns(VowShape), - executeEncodedTx: M.call(M.arrayOf(Proto3Shape)) - .optional(TxBodyOptsShape) - .returns(VowShape), - deactivate: M.call().returns(VowShape), - reactivate: M.call().returns(VowShape), -}); - -// XXX none of these modifiers are working to exclude this type from api-docs -/** - * @private - * @typedef {{ - * chainId: string; - * port: Port; - * connection: Remote | undefined; - * localAddress: LocalIbcAddress | undefined; - * requestedRemoteAddress: string; - * remoteAddress: RemoteIbcAddress | undefined; - * chainAddress: ChainAddress | undefined; - * isInitiatingClose: boolean; - * }} State - * Internal to the IcaAccountKit exo - * @internal - */ - -/** - * Used only by CosmosInterchainService - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @internal - */ -export const prepareIcaAccountKit = (zone, { watch, asVow }) => - zone.exoClassKit( - 'IcaAccountKit', - { - account: IcaAccountI, - connectionHandler: OutboundConnectionHandlerI, - parseTxPacketWatcher: M.interface('ParseTxPacketWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // does not need watcherContext - .returns(M.string()), - }), - }, - /** - * @param {string} chainId - * @param {Port} port - * @param {string} requestedRemoteAddress - */ - (chainId, port, requestedRemoteAddress) => - /** @type {State} */ ({ - chainId, - port, - connection: undefined, - requestedRemoteAddress, - remoteAddress: undefined, - chainAddress: undefined, - localAddress: undefined, - isInitiatingClose: false, - }), - { - parseTxPacketWatcher: { - /** @param {string} ack */ - onFulfilled(ack) { - return parseTxPacket(ack); - }, - }, - account: { - /** @returns {ChainAddress} */ - getAddress() { - return NonNullish( - this.state.chainAddress, - 'ICA channel creation acknowledgement not yet received.', - ); - }, - getLocalAddress() { - return NonNullish( - this.state.localAddress, - 'local address not available', - ); - }, - getRemoteAddress() { - return NonNullish( - this.state.remoteAddress, - 'remote address not available', - ); - }, - getPort() { - return this.state.port; - }, - executeTx() { - return asVow(() => Fail`not yet implemented`); - }, - /** - * Submit a transaction on behalf of the remote account for execution on - * the remote chain. - * - * @param {AnyJson[]} msgs - * @param {Omit} [opts] - * @returns {Vow} - base64 encoded bytes string. Can be decoded - * using the corresponding `Msg*Response` object. - * @throws {Error} if packet fails to send or an error is returned - */ - executeEncodedTx(msgs, opts) { - return asVow(() => { - const { connection } = this.state; - if (!connection) { - throw Fail`Account not available or deactivated.`; - } - return watch( - E(connection).send(makeTxPacket(msgs, opts)), - this.facets.parseTxPacketWatcher, - ); - }); - }, - /** @type {HostOf} */ - deactivate() { - return asVow(() => { - const { connection } = this.state; - if (!connection) throw Fail`Account not available or deactivated.`; - this.state.isInitiatingClose = true; - return E(connection).close(); - }); - }, - /** @type {HostOf} */ - reactivate() { - return asVow(() => { - const { connection, port, requestedRemoteAddress } = this.state; - if (connection) { - throw Fail`Account is already active.`; - } - return watch( - E(port).connect( - requestedRemoteAddress, - this.facets.connectionHandler, - ), - ); - }); - }, - }, - connectionHandler: { - /** - * @param {Remote} connection - * @param {LocalIbcAddress} localAddr - * @param {RemoteIbcAddress} remoteAddr - */ - async onOpen(connection, localAddr, remoteAddr) { - trace(`ICA Channel Opened for ${localAddr} at ${remoteAddr}`); - this.state.connection = connection; - this.state.remoteAddress = remoteAddr; - this.state.localAddress = localAddr; - const address = findAddressField(remoteAddr); - if (!address) { - console.error('⚠️ failed to parse chain address', remoteAddr); - } - this.state.chainAddress = harden({ - value: address || UNPARSABLE_CHAIN_ADDRESS, - chainId: this.state.chainId, - encoding: 'bech32', - }); - }, - /** - * This handler fires any time the connection (channel) closes. This - * could be due to external factors (e.g. a packet timeout), or a holder - * initiated action (`.deactivate()`). - * - * Here, if a connection is opened again, we clear the connection and - * addresses from state as they will change - a new channel will be - * established if the connection is reopened. - * - * If the holder did not initiate the closure, a new connection is - * established using the original requested remote address. This will - * result in a new channelID but the ChainAddress will be preserved. - * - * @param {Remote} _connection - * @param {unknown} reason - * @see {@link https://docs.cosmos.network/v0.45/ibc/overview.html#:~:text=In%20ORDERED%20channels%2C%20a%20timeout%20of%20a%20single%20packet%20in%20the%20channel%20closes%20the%20channel.} - */ - async onClose(_connection, reason) { - trace(`ICA Channel closed. Reason: ${reason}`); - this.state.connection = undefined; - this.state.localAddress = undefined; - this.state.remoteAddress = undefined; - if (this.state.isInitiatingClose === true) { - trace('Account deactivated by holder. Skipping reactivation.'); - this.state.isInitiatingClose = false; - } else { - trace('Account closed unexpectedly. Automatically reactivating.'); - void watch(this.facets.account.reactivate()); - } - }, - }, - }, - ); - -/** @typedef {ReturnType>} IcaAccountKit */ diff --git a/contract/src/exos/icq-connection-kit.js b/contract/src/exos/icq-connection-kit.js deleted file mode 100644 index 9597d8e2..00000000 --- a/contract/src/exos/icq-connection-kit.js +++ /dev/null @@ -1,132 +0,0 @@ -/** @file ICQConnection Exo */ -import { Fail } from '@endo/errors'; -import { E } from '@endo/far'; -import { M } from '@endo/patterns'; -import { VowShape } from '@agoric/vow'; -import { NonNullish, makeTracer } from '@agoric/internal'; -import { makeQueryPacket, parseQueryPacket } from '../../utils/packet.js'; -import { ICQMsgShape, OutboundConnectionHandlerI } from '../typeGuards.js'; - -/** - * @import {Zone} from '@agoric/base-zone'; - * @import {Connection, Port} from '@agoric/network'; - * @import {Remote, Vow, VowTools} from '@agoric/vow'; - * @import {JsonSafe} from '@agoric/cosmic-proto'; - * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -const trace = makeTracer('Orchestration:ICQConnection'); - -export const ICQConnectionI = M.interface('ICQConnection', { - getLocalAddress: M.call().returns(M.string()), - getRemoteAddress: M.call().returns(M.string()), - query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), -}); - -/** - * @typedef {{ - * port: Port; - * connection: Remote | undefined; - * localAddress: LocalIbcAddress | undefined; - * remoteAddress: RemoteIbcAddress | undefined; - * }} ICQConnectionKitState - */ - -/** - * Used only by CosmosInterchainService - * - * Prepares an ICQ Connection Kit based on the - * {@link https://github.com/cosmos/ibc-apps/blob/e9b46e4bf0ad0a66cf6bc53b5e5496f6e2b4b02b/modules/async-icq/README.md | `icq/v1` IBC application protocol}. - * - * `icq/v1`, also referred to as `async-icq`, is a protocol for asynchronous - * queries between IBC-enabled chains. It allows a chain to send queries to - * another chain and receive responses asynchronously. - * - * The ICQ connection kit provides the necessary functionality to establish and - * manage an ICQ connection between two chains. It includes methods for - * retrieving the local and remote addresses of the connection, as well as - * sending queries and handling connection events. - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @internal - */ -export const prepareICQConnectionKit = (zone, { watch, asVow }) => - zone.exoClassKit( - 'ICQConnectionKit', - { - connection: ICQConnectionI, - connectionHandler: OutboundConnectionHandlerI, - parseQueryPacketWatcher: M.interface('ParseQueryPacketWatcher', { - onFulfilled: M.call(M.string()) - .optional(M.arrayOf(M.undefined())) // does not need watcherContext - .returns(M.arrayOf(M.record())), - }), - }, - /** @param {Port} port */ - port => - /** @type {ICQConnectionKitState} */ ({ - port, - connection: undefined, - remoteAddress: undefined, - localAddress: undefined, - }), - { - connection: { - getLocalAddress() { - return NonNullish( - this.state.localAddress, - 'local address not available', - ); - }, - getRemoteAddress() { - return NonNullish( - this.state.remoteAddress, - 'remote address not available', - ); - }, - /** - * Vow rejects if packet fails to send or an error is returned - * - * @param {JsonSafe[]} msgs - * @returns {Vow[]>} - */ - query(msgs) { - return asVow(() => { - const { connection } = this.state; - if (!connection) throw Fail`connection not available`; - return watch( - E(connection).send(makeQueryPacket(msgs)), - this.facets.parseQueryPacketWatcher, - ); - }); - }, - }, - parseQueryPacketWatcher: { - /** @param {string} ack packet acknowledgement string */ - onFulfilled(ack) { - return parseQueryPacket(ack); - }, - }, - connectionHandler: { - /** - * @param {Remote} connection - * @param {LocalIbcAddress} localAddr - * @param {RemoteIbcAddress} remoteAddr - */ - async onOpen(connection, localAddr, remoteAddr) { - trace(`ICQ Channel Opened for ${localAddr} at ${remoteAddr}`); - this.state.connection = connection; - this.state.remoteAddress = remoteAddr; - this.state.localAddress = localAddr; - }, - async onClose(_connection, reason) { - trace(`ICQ Channel closed. Reason: ${reason}`); - }, - }, - }, - ); - -/** @typedef {ReturnType>} ICQConnectionKit */ -/** @typedef {ICQConnectionKit['connection']} ICQConnection */ diff --git a/contract/src/exos/local-chain-facade.js b/contract/src/exos/local-chain-facade.js deleted file mode 100644 index 7f4ace2d..00000000 --- a/contract/src/exos/local-chain-facade.js +++ /dev/null @@ -1,196 +0,0 @@ -/** @file Localchain Facade exo */ -import { E } from '@endo/far'; -// eslint-disable-next-line no-restricted-syntax -- just the import -import { heapVowE } from '@agoric/vow/vat.js'; -import { M } from '@endo/patterns'; -import { pickFacet } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; - -import { chainFacadeMethods, TypedJsonShape } from '../typeGuards.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {Zone} from '@agoric/base-zone'; - * @import {TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - * @import {LocalChain, LocalChainAccount, QueryManyFn} from '@agoric/vats/src/localchain.js'; - * @import {AssetInfo} from '@agoric/vats/src/vat-bank.js'; - * @import {NameHub} from '@agoric/vats'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {CosmosInterchainService} from './exo-interfaces.js'; - * @import {LocalOrchestrationAccountKit, MakeLocalOrchestrationAccountKit} from './local-orchestration-account.js'; - * @import {Chain, ChainAddress, ChainInfo, CosmosChainInfo, IBCConnectionInfo, OrchestrationAccount} from '../types.js'; - */ - -/** - * Chain facade methods unique to the Agoric (local) chain. - * - * @typedef {object} AgoricChainMethods - * @property {() => Promise} getVBankAssetInfo Get asset info from - * agoricNames.vbankAsset. - * - * Caches the query to agoricNames in the first call. - */ - -/** - * @typedef {{ - * makeLocalOrchestrationAccountKit: MakeLocalOrchestrationAccountKit; - * orchestration: Remote; - * storageNode: Remote; - * agoricNames: Remote; - * timer: Remote; - * localchain: Remote; - * vowTools: VowTools; - * }} LocalChainFacadePowers - */ - -/** - * @param {Zone} zone - * @param {LocalChainFacadePowers} powers - */ -const prepareLocalChainFacadeKit = ( - zone, - { - makeLocalOrchestrationAccountKit, - agoricNames, - localchain, - // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 - // consider making an `accounts` childNode - storageNode, - vowTools: { allVows, watch, asVow }, - }, -) => - zone.exoClassKit( - 'LocalChainFacade', - { - public: M.interface('LocalChainFacade', { - ...chainFacadeMethods, - query: M.call(M.arrayOf(TypedJsonShape)).returns(VowShape), - getVBankAssetInfo: M.call().optional(M.boolean()).returns(VowShape), - }), - vbankAssetValuesWatcher: M.interface('vbankAssetValuesWatcher', { - onFulfilled: M.call(M.arrayOf(M.record())) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(VowShape), - }), - makeAccountWatcher: M.interface('makeAccountWatcher', { - onFulfilled: M.call([M.remotable('LCA Account'), M.string()]) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(VowShape), - }), - makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { - onFulfilled: M.call(M.remotable()) - .optional({ account: M.remotable(), address: M.string() }) // empty context - .returns(M.remotable()), - }), - }, - /** - * @param {CosmosChainInfo} localChainInfo - */ - localChainInfo => { - return { - localChainInfo, - vbankAssets: /** @type {AssetInfo[] | undefined} */ (undefined), - }; - }, - { - public: { - getChainInfo() { - return watch(this.state.localChainInfo); - }, - - /** @returns {Vow} */ - makeAccount() { - const lcaP = E(localchain).makeAccount(); - return watch( - // XXX makeAccount returns a Promise for an exo but reserves being able to return a vow - // so we use heapVowE to shorten the promise path - // eslint-disable-next-line no-restricted-syntax -- will run in one turn - allVows([lcaP, heapVowE(lcaP).getAddress()]), - this.facets.makeAccountWatcher, - ); - }, - /** @type {HostOf['query']>} */ - query(requests) { - return watch(E(localchain).queryMany(requests)); - }, - /** @type {HostOf} */ - getVBankAssetInfo() { - return asVow(() => { - const { vbankAssets } = this.state; - if (vbankAssets) { - return vbankAssets; - } - const vbankAssetNameHubP = E(agoricNames).lookup('vbankAsset'); - const vbankAssetValuesP = E(vbankAssetNameHubP).values(); - const { vbankAssetValuesWatcher } = this.facets; - return watch(vbankAssetValuesP, vbankAssetValuesWatcher); - }); - }, - }, - vbankAssetValuesWatcher: { - /** - * @param {AssetInfo[]} assets - */ - onFulfilled(assets) { - const { state } = this; - return asVow(() => { - state.vbankAssets = assets; - return assets; - }); - }, - }, - makeAccountWatcher: { - /** - * @param {[LocalChainAccount, ChainAddress['value']]} results - */ - onFulfilled([account, address]) { - return watch( - E(storageNode).makeChildNode(address), - this.facets.makeChildNodeWatcher, - { account, address }, - ); - }, - }, - makeChildNodeWatcher: { - /** - * @param {Remote} childNode - * @param {{ - * account: LocalChainAccount; - * address: ChainAddress['value']; - * }} ctx - */ - onFulfilled(childNode, { account, address }) { - const { localChainInfo } = this.state; - const { holder } = makeLocalOrchestrationAccountKit({ - account, - address: harden({ - value: address, - encoding: 'bech32', - chainId: localChainInfo.chainId, - }), - // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 - storageNode: childNode, - }); - return holder; - }, - }, - }, - ); -harden(prepareLocalChainFacadeKit); - -/** - * Used only by `withOrchestration` helper - * - * @param {Zone} zone - * @param {LocalChainFacadePowers} powers - * @internal - */ -export const prepareLocalChainFacade = (zone, powers) => { - const makeLocalChainFacadeKit = prepareLocalChainFacadeKit(zone, powers); - return pickFacet(makeLocalChainFacadeKit, 'public'); -}; -harden(prepareLocalChainFacade); - -/** @typedef {ReturnType} MakeLocalChainFacade */ -/** @typedef {ReturnType} LocalChainFacade */ diff --git a/contract/src/exos/local-orchestration-account.js b/contract/src/exos/local-orchestration-account.js deleted file mode 100644 index 65a00d92..00000000 --- a/contract/src/exos/local-orchestration-account.js +++ /dev/null @@ -1,747 +0,0 @@ -/** @file Use-object for the owner of a localchain account */ -import { typedJson } from '@agoric/cosmic-proto'; -import { AmountShape, PaymentShape } from '@agoric/ertp'; -import { makeTracer } from '@agoric/internal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { M } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; -import { E } from '@endo/far'; -import { Fail, q } from '@endo/errors'; - -import { - AmountArgShape, - AnyNatAmountsRecord, - ChainAddressShape, - DenomAmountShape, - DenomShape, - IBCTransferOptionsShape, - TimestampProtoShape, - TypedJsonShape, -} from '../typeGuards.js'; -import { maxClockSkew, toDenomAmount } from '../../utils/cosmos.js'; -import { orchestrationAccountMethods } from '../../utils/orchestrationAccount.js'; -import { makeTimestampHelper } from '../../utils/time.js'; -import { preparePacketTools } from './packet-tools.js'; -import { prepareIBCTools } from './ibc-packet.js'; -import { coerceCoin, coerceDenomAmount } from '../../utils/amounts.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {LocalChain, LocalChainAccount} from '@agoric/vats/src/localchain.js'; - * @import {AmountArg, ChainAddress, DenomAmount, IBCMsgTransferOptions, IBCConnectionInfo, OrchestrationAccountI, LocalAccountMethods} from '@agoric/orchestration'; - * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. - * @import {Zone} from '@agoric/zone'; - * @import {Remote} from '@agoric/internal'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {TimerService, TimestampRecord} from '@agoric/time'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {TypedJson, JsonSafe, ResponseTo} from '@agoric/cosmic-proto'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - * @import {Matcher} from '@endo/patterns'; - * @import {ChainHub} from './chain-hub.js'; - * @import {PacketTools} from './packet-tools.js'; - * @import {ZoeTools} from '../utils/zoe-tools.js'; - */ - -const trace = makeTracer('LOA'); - -const { Vow$ } = NetworkShape; // TODO #9611 - -const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); - -/** - * @typedef {object} LocalChainAccountNotification - * @property {string} address - */ - -/** - * @private - * @typedef {{ - * topicKit: RecorderKit; - * packetTools: PacketTools; - * account: LocalChainAccount; - * address: ChainAddress; - * }} State - * Internal to the LocalOrchestrationAccount exo - */ - -const HolderI = M.interface('holder', { - ...orchestrationAccountMethods, - delegate: M.call(M.string(), AmountShape).returns(VowShape), - undelegate: M.call(M.string(), AmountShape).returns(VowShape), - deposit: M.call(PaymentShape).returns(VowShape), - withdraw: M.call(AmountShape).returns(Vow$(PaymentShape)), - executeTx: M.call(M.arrayOf(M.record())).returns(Vow$(M.record())), - sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) - .optional(M.any()) - .returns(EVow$(M.string())), - matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), - monitorTransfers: M.call(M.remotable('TargetApp')).returns(EVow$(M.any())), -}); - -/** @type {{ [name: string]: [description: string, valueShape: Matcher] }} */ -const PUBLIC_TOPICS = { - account: ['Account holder status', M.any()], -}; - -/** - * @param {Zone} zone - * @param {object} powers - * @param {MakeRecorderKit} powers.makeRecorderKit - * @param {ZCF} powers.zcf - * @param {Remote} powers.timerService - * @param {VowTools} powers.vowTools - * @param {ChainHub} powers.chainHub - * @param {Remote} powers.localchain - * @param {ZoeTools} powers.zoeTools - */ -export const prepareLocalOrchestrationAccountKit = ( - zone, - { - makeRecorderKit, - zcf, - timerService, - vowTools, - chainHub, - localchain, - zoeTools, - }, -) => { - const { watch, allVows, asVow, when } = vowTools; - const { makeIBCTransferSender } = prepareIBCTools( - zone.subZone('ibcTools'), - vowTools, - ); - const makePacketTools = preparePacketTools( - zone.subZone('packetTools'), - vowTools, - ); - const timestampHelper = makeTimestampHelper(timerService); - - /** Make an object wrapping an LCA with Zoe interfaces. */ - const makeLocalOrchestrationAccountKit = zone.exoClassKit( - 'Local Orchestration Account Kit', - { - helper: M.interface('helper', { - amountToCoin: M.call(AmountArgShape).returns(M.record()), - }), - holder: HolderI, - undelegateWatcher: M.interface('undelegateWatcher', { - onFulfilled: M.call([ - M.splitRecord({ completionTime: TimestampProtoShape }), - ]) - .optional(M.arrayOf(M.undefined())) // empty context - .returns(VowShape), - }), - transferWatcher: M.interface('transferWatcher', { - onFulfilled: M.call([M.record(), M.nat()]) - .optional({ - destination: ChainAddressShape, - opts: M.or(M.undefined(), IBCTransferOptionsShape), - amount: DenomAmountShape, - }) - .returns(Vow$(M.record())), - }), - extractFirstResultWatcher: M.interface('extractFirstResultWatcher', { - onFulfilled: M.call([M.record()]) - .optional(M.arrayOf(M.undefined())) - .returns(M.any()), - }), - returnVoidWatcher: M.interface('returnVoidWatcher', { - onFulfilled: M.call(M.any()).optional(M.any()).returns(M.undefined()), - }), - seatExiterHandler: M.interface('seatExiterHandler', { - onFulfilled: M.call(M.undefined(), M.remotable()).returns( - M.undefined(), - ), - onRejected: M.call(M.error(), M.remotable()).returns(M.undefined()), - }), - getBalanceWatcher: M.interface('getBalanceWatcher', { - onFulfilled: M.call(AmountShape, DenomShape).returns(DenomAmountShape), - }), - queryBalanceWatcher: M.interface('queryBalanceWatcher', { - onFulfilled: M.call(TypedJsonShape).returns(DenomAmountShape), - }), - queryBalancesWatcher: M.interface('queryBalancesWatcher', { - onFulfilled: M.call(TypedJsonShape).returns( - M.arrayOf(DenomAmountShape), - ), - }), - invitationMakers: M.interface('invitationMakers', { - CloseAccount: M.call().returns(M.promise()), - Delegate: M.call(M.string(), AmountShape).returns(M.promise()), - Deposit: M.call().returns(M.promise()), - Send: M.call().returns(M.promise()), - SendAll: M.call().returns(M.promise()), - Transfer: M.call().returns(M.promise()), - Undelegate: M.call(M.string(), AmountShape).returns(M.promise()), - Withdraw: M.call().returns(M.promise()), - }), - }, - /** - * @param {object} initState - * @param {LocalChainAccount} initState.account - * @param {ChainAddress} initState.address - * @param {Remote} initState.storageNode - * @returns {State} - */ - ({ account, address, storageNode }) => { - // must be the fully synchronous maker because the kit is held in durable state - const topicKit = makeRecorderKit(storageNode, PUBLIC_TOPICS.account[1]); - // TODO determine what goes in vstorage https://github.com/Agoric/agoric-sdk/issues/9066 - void E(topicKit.recorder).write(''); - const packetTools = makePacketTools(account); - - return { account, address, topicKit, packetTools }; - }, - { - helper: { - /** - * @param {AmountArg} amount - * @returns {Coin} - */ - amountToCoin(amount) { - return coerceCoin(chainHub, amount); - }, - }, - invitationMakers: { - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - */ - Delegate(validatorAddress, ertpAmount) { - trace('Delegate', validatorAddress, ertpAmount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch( - this.facets.holder.delegate(validatorAddress, ertpAmount), - ); - }, 'Delegate'); - }, - Deposit() { - trace('Deposit'); - return zcf.makeInvitation( - seat => { - const { give } = seat.getProposal(); - return watch( - zoeTools.localTransfer( - seat, - // @ts-expect-error LocalAccount vs LocalAccountMethods - this.state.account, - give, - ), - this.facets.seatExiterHandler, - seat, - ); - }, - 'Deposit', - undefined, - M.splitRecord({ give: AnyNatAmountsRecord, want: {} }), - ); - }, - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - */ - Undelegate(validatorAddress, ertpAmount) { - trace('Undelegate', validatorAddress, ertpAmount); - - return zcf.makeInvitation(seat => { - seat.exit(); - return watch( - this.facets.holder.undelegate(validatorAddress, ertpAmount), - ); - }, 'Undelegate'); - }, - CloseAccount() { - throw Error('not yet implemented'); - }, - Send() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amount: AmountArg } - * >} - */ - const offerHandler = (seat, { toAccount, amount }) => { - seat.exit(); - return watch(this.facets.holder.send(toAccount, amount)); - }; - return zcf.makeInvitation(offerHandler, 'Send'); - }, - SendAll() { - /** - * @type {OfferHandler< - * Vow, - * { toAccount: ChainAddress; amounts: AmountArg[] } - * >} - */ - const offerHandler = (seat, { toAccount, amounts }) => { - seat.exit(); - return watch(this.facets.holder.sendAll(toAccount, amounts)); - }; - return zcf.makeInvitation(offerHandler, 'SendAll'); - }, - Transfer() { - /** - * @type {OfferHandler< - * Vow, - * { - * amount: AmountArg; - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * } - * >} - */ - const offerHandler = (seat, { amount, destination, opts }) => { - seat.exit(); - return watch( - this.facets.holder.transfer(destination, amount, opts), - ); - }; - return zcf.makeInvitation(offerHandler, 'Transfer'); - }, - Withdraw() { - trace('Withdraw'); - return zcf.makeInvitation( - seat => { - const { want } = seat.getProposal(); - return watch( - zoeTools.withdrawToSeat( - // @ts-expect-error LocalAccount vs LocalAccountMethods - this.state.account, - seat, - want, - ), - this.facets.seatExiterHandler, - seat, - ); - }, - 'Withdraw', - undefined, - M.splitRecord({ give: {}, want: AnyNatAmountsRecord }), - ); - }, - }, - undelegateWatcher: { - /** - * @param {[ - * JsonSafe< - * TypedJson<'/cosmos.staking.v1beta1.MsgUndelegateResponse'> - * >, - * ]} response - */ - onFulfilled(response) { - const { completionTime } = response[0]; - return watch( - E(timerService).wakeAt( - // ignore nanoseconds and just use seconds from Timestamp - BigInt(completionTime.seconds) + maxClockSkew, - ), - this.facets.returnVoidWatcher, - ); - }, - }, - transferWatcher: { - /** - * @param {[ - * { transferChannel: IBCConnectionInfo['transferChannel'] }, - * bigint, - * ]} results - * @param {{ - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * amount: DenomAmount; - * }} ctx - */ - onFulfilled( - [{ transferChannel }, timeoutTimestamp], - { opts, amount, destination }, - ) { - const transferMsg = typedJson( - '/ibc.applications.transfer.v1.MsgTransfer', - { - sourcePort: transferChannel.portId, - sourceChannel: transferChannel.channelId, - token: { - amount: String(amount.value), - denom: amount.denom, - }, - sender: this.state.address.value, - receiver: destination.value, - timeoutHeight: opts?.timeoutHeight ?? { - revisionHeight: 0n, - revisionNumber: 0n, - }, - timeoutTimestamp, - memo: opts?.memo ?? '', - }, - ); - - const { holder } = this.facets; - const sender = makeIBCTransferSender( - /** @type {any} */ (holder), - transferMsg, - ); - // Begin capturing packets, send the transfer packet, then return a - // vow that rejects unless the packet acknowledgment comes back and is - // verified. - return holder.sendThenWaitForAck(sender); - }, - }, - /** - * takes an array of results (from `executeEncodedTx`) and returns the - * first result - */ - extractFirstResultWatcher: { - /** - * @param {Record[]} results - */ - onFulfilled(results) { - results.length === 1 || - Fail`expected exactly one result; got ${results}`; - return results[0]; - }, - }, - returnVoidWatcher: { - onFulfilled() { - return undefined; - }, - }, - /** - * handles a request for balance from a bank purse and returns the balance - * as a Chain Amount - */ - getBalanceWatcher: { - /** - * @param {Amount<'nat'>} natAmount - * @param {DenomAmount['denom']} denom - * @returns {DenomAmount} - */ - onFulfilled(natAmount, denom) { - return harden({ denom, value: natAmount.value }); - }, - }, - /** exits or fails a seat depending the outcome */ - seatExiterHandler: { - /** - * @param {undefined} _ - * @param {ZCFSeat} seat - */ - onFulfilled(_, seat) { - seat.exit(); - }, - /** - * @param {Error} reason - * @param {ZCFSeat} seat - */ - onRejected(reason, seat) { - seat.exit(reason); - throw reason; - }, - }, - /** - * handles a QueryBalanceRequest from localchain.query and returns the - * balance as a DenomAmount - */ - queryBalanceWatcher: { - /** - * @param {ResponseTo< - * TypedJson<'/cosmos.bank.v1beta1.QueryBalanceRequest'> - * >} result - * @returns {DenomAmount} - */ - onFulfilled(result) { - const { balance } = result; - if (!balance || !balance?.denom) { - throw Fail`Expected balance ${q(result)};`; - } - return harden(toDenomAmount(balance)); - }, - }, - /** - * handles a QueryAllBalancesRequest from localchain.query and returns the - * balances as a DenomAmounts - */ - queryBalancesWatcher: { - /** - * @param {JsonSafe< - * ResponseTo< - * TypedJson<'/cosmos.bank.v1beta1.QueryAllBalancesRequest'> - * > - * >} result - * @returns {DenomAmount[]} - */ - onFulfilled(result) { - const { balances } = result; - if (!balances || !Array.isArray(balances)) { - throw Fail`Expected balances ${q(result)};`; - } - return harden(balances.map(toDenomAmount)); - }, - }, - holder: { - /** @type {HostOf} */ - asContinuingOffer() { - // @ts-expect-error XXX invitationMakers - // getPublicTopics resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { holder, invitationMakers: im } = this.facets; - // XXX cast to a type that has string index signature - const invitationMakers = /** @type {InvitationMakers} */ ( - /** @type {unknown} */ (im) - ); - - return harden({ - // getPublicTopics returns a vow, for membrane compatibility. - // it's safe to unwrap to a promise and get the result as we - // expect this complete in the same run - publicSubscribers: await when(holder.getPublicTopics()), - invitationMakers, - }); - }); - }, - /** - * @type {HostOf} - */ - getBalance(denomArg) { - return asVow(() => { - const [brand, denom] = - typeof denomArg === 'string' - ? [chainHub.getAsset(denomArg)?.brand, denomArg] - : [denomArg, chainHub.getDenom(denomArg)]; - - if (!denom) { - throw Fail`No denom for brand: ${denomArg}`; - } - - if (brand) { - return watch( - E(this.state.account).getBalance(brand), - this.facets.getBalanceWatcher, - denom, - ); - } - - return watch( - E(localchain).query( - typedJson('/cosmos.bank.v1beta1.QueryBalanceRequest', { - address: this.state.address.value, - denom, - }), - ), - this.facets.queryBalanceWatcher, - ); - }); - }, - /** @type {HostOf} */ - getBalances() { - return watch( - E(localchain).query( - typedJson('/cosmos.bank.v1beta1.QueryAllBalancesRequest', { - address: this.state.address.value, - }), - ), - this.facets.queryBalancesWatcher, - ); - }, - - /** - * @type {HostOf} - */ - getPublicTopics() { - // getStoragePath resolves promptly (same run), so we don't need a watcher - // eslint-disable-next-line no-restricted-syntax - return asVow(async () => { - await null; - const { topicKit } = this.state; - return harden({ - account: { - description: PUBLIC_TOPICS.account[0], - subscriber: topicKit.subscriber, - storagePath: await topicKit.recorder.getStoragePath(), - }, - }); - }); - }, - // FIXME take ChainAddress to match OrchestrationAccountI - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - */ - delegate(validatorAddress, ertpAmount) { - const { account: lca } = this.state; - - const amount = coerceCoin(chainHub, ertpAmount); - - return watch( - E(lca).executeTx([ - typedJson('/cosmos.staking.v1beta1.MsgDelegate', { - amount, - validatorAddress, - delegatorAddress: this.state.address.value, - }), - ]), - this.facets.extractFirstResultWatcher, - ); - }, - // FIXME take ChainAddress to match OrchestrationAccountI - /** - * @param {string} validatorAddress - * @param {Amount<'nat'>} ertpAmount - * @returns {Vow} - */ - undelegate(validatorAddress, ertpAmount) { - const amount = coerceCoin(chainHub, ertpAmount); - const { account: lca } = this.state; - return watch( - E(lca).executeTx([ - typedJson('/cosmos.staking.v1beta1.MsgUndelegate', { - amount, - validatorAddress, - delegatorAddress: this.state.address.value, - }), - ]), - this.facets.undelegateWatcher, - ); - }, - /** - * Starting a transfer revokes the account holder. The associated - * updater will get a special notification that the account is being - * transferred. - */ - /** @type {HostOf} */ - deposit(payment) { - return watch( - E(this.state.account).deposit(payment), - this.facets.returnVoidWatcher, - ); - }, - /** @type {HostOf} */ - withdraw(amount) { - return watch(E(this.state.account).withdraw(amount)); - }, - /** @type {HostOf} */ - executeTx(messages) { - return watch(E(this.state.account).executeTx(messages)); - }, - /** @type {OrchestrationAccountI['getAddress']} */ - getAddress() { - return this.state.address; - }, - /** - * XXX consider using ERTP to send if it's vbank asset - * - * @type {HostOf} - */ - send(toAccount, amount) { - return asVow(() => { - trace('send', toAccount, amount); - const { helper } = this.facets; - return watch( - E(this.state.account).executeTx([ - typedJson('/cosmos.bank.v1beta1.MsgSend', { - amount: [helper.amountToCoin(amount)], - toAddress: toAccount.value, - fromAddress: this.state.address.value, - }), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - /** - * XXX consider using ERTP to send if it's vbank asset - * - * @type {HostOf} - */ - sendAll(toAccount, amounts) { - return asVow(() => { - trace('sendAll', toAccount, amounts); - const { helper } = this.facets; - return watch( - E(this.state.account).executeTx([ - typedJson('/cosmos.bank.v1beta1.MsgSend', { - amount: amounts.map(a => helper.amountToCoin(a)), - toAddress: toAccount.value, - fromAddress: this.state.address.value, - }), - ]), - this.facets.returnVoidWatcher, - ); - }); - }, - /** - * @param {ChainAddress} destination - * @param {AmountArg} amount an ERTP {@link Amount} or a - * {@link DenomAmount} - * @param {IBCMsgTransferOptions} [opts] if either timeoutHeight or - * timeoutTimestamp are not supplied, a default timeoutTimestamp will - * be set for 5 minutes in the future - * @returns {Vow} - */ - transfer(destination, amount, opts) { - return asVow(() => { - trace('Transferring funds from LCA over IBC'); - - const connectionInfoV = watch( - chainHub.getConnectionInfo( - this.state.address.chainId, - destination.chainId, - ), - ); - - // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` - // TODO #9324 what's a reasonable default? currently 5 minutes - const timeoutTimestampVowOrValue = - opts?.timeoutTimestamp ?? - (opts?.timeoutHeight - ? 0n - : E(timestampHelper).getTimeoutTimestampNS()); - - // don't resolve the vow until the transfer is confirmed on remote - // and reject vow if the transfer fails for any reason - const resultV = watch( - allVows([connectionInfoV, timeoutTimestampVowOrValue]), - this.facets.transferWatcher, - { - opts, - amount: coerceDenomAmount(chainHub, amount), - destination, - }, - ); - return resultV; - }); - }, - /** @type {HostOf} */ - transferSteps(amount, msg) { - return asVow(() => { - console.log('transferSteps got', amount, msg); - throw Fail`not yet implemented`; - }); - }, - /** @type {HostOf} */ - sendThenWaitForAck(sender, opts) { - return watch( - E(this.state.packetTools).sendThenWaitForAck(sender, opts), - ); - }, - /** @type {HostOf} */ - matchFirstPacket(patternV) { - return watch(E(this.state.packetTools).matchFirstPacket(patternV)); - }, - /** @type {HostOf} */ - monitorTransfers(tap) { - return watch(E(this.state.packetTools).monitorTransfers(tap)); - }, - }, - }, - ); - return makeLocalOrchestrationAccountKit; -}; - -/** @typedef {ReturnType} MakeLocalOrchestrationAccountKit */ -/** @typedef {ReturnType} LocalOrchestrationAccountKit */ diff --git a/contract/src/exos/orchestrator.js b/contract/src/exos/orchestrator.js deleted file mode 100644 index 70e02ee6..00000000 --- a/contract/src/exos/orchestrator.js +++ /dev/null @@ -1,196 +0,0 @@ -/** @file Orchestrator exo */ -import { AmountShape } from '@agoric/ertp'; -import { pickFacet } from '@agoric/vat-data'; -import { makeTracer } from '@agoric/internal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { Fail, q } from '@endo/errors'; -import { M } from '@endo/patterns'; -import { - DenomInfoShape, - ChainInfoShape, - DenomAmountShape, - DenomShape, -} from '../typeGuards.js'; - -/** - * @import {Zone} from '@agoric/base-zone'; - * @import {ActualChainInfo, ChainHub} from './chain-hub.js'; - * @import {AsyncFlowTools, HostInterface, HostOf} from '@agoric/async-flow'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {TimerService} from '@agoric/time'; - * @import {LocalChain} from '@agoric/vats/src/localchain.js'; - * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. - * @import {Remote} from '@agoric/internal'; - * @import {PickFacet} from '@agoric/swingset-liveslots'; - * @import {CosmosInterchainService} from './exo-interfaces.js'; - * @import {MakeLocalChainFacade} from './local-chain-facade.js'; - * @import {MakeRemoteChainFacade} from './remote-chain-facade.js'; - * @import {Chain, ChainInfo, IBCConnectionInfo, KnownChains, Orchestrator} from '../types.js'; - */ - -const { Vow$ } = NetworkShape; // TODO #9611 -const trace = makeTracer('Orchestrator'); - -/** @see {Orchestrator} */ -export const OrchestratorI = M.interface('Orchestrator', { - getChain: M.call(M.string()).returns(Vow$(ChainInfoShape)), - getDenomInfo: M.call(DenomShape).returns(DenomInfoShape), - asAmount: M.call(DenomAmountShape).returns(AmountShape), -}); - -/** - * @param {Zone} zone - * @param {{ - * chainHub: ChainHub; - * makeLocalChainFacade: MakeLocalChainFacade; - * makeRemoteChainFacade: MakeRemoteChainFacade; - * vowTools: VowTools; - * }} powers - */ -const prepareOrchestratorKit = ( - zone, - { - chainHub, - makeLocalChainFacade, - makeRemoteChainFacade, - vowTools: { watch, asVow }, - }, -) => { - /** - * @template T - * @typedef {{ vow: Vow; pending: true } | { value: T; pending: false }} MaybePendingValue - */ - - /** @type {MapStore>>} */ - const chainByName = zone.mapStore('chainName'); - - return zone.exoClassKit( - 'Orchestrator', - { - orchestrator: OrchestratorI, - makeLocalChainFacadeWatcher: M.interface('makeLocalChainFacadeWatcher', { - onFulfilled: M.call(M.record()).returns(M.remotable()), - }), - makeRemoteChainFacadeWatcher: M.interface( - 'makeRemoteChainFacadeWatcher', - { - onFulfilled: M.call(M.any(), M.string()) - .optional(M.arrayOf(M.undefined())) // XXX needed? - .returns(M.remotable()), - }, - ), - }, - () => { - trace('making an Orchestrator'); - return {}; - }, - { - /** Waits for `chainInfo` and returns a LocalChainFacade */ - makeLocalChainFacadeWatcher: { - /** - * @param {ActualChainInfo<'agoric'>} agoricChainInfo - */ - onFulfilled(agoricChainInfo) { - const it = makeLocalChainFacade(agoricChainInfo); - chainByName.set('agoric', harden({ value: it, pending: false })); - return it; - }, - }, - /** - * Waits for `chainInfo` for `agoric` and a remote chain and returns a - * RemoteChainFacade - */ - makeRemoteChainFacadeWatcher: { - /** - * Waits for `chainInfo` for `agoric` and a remote chain and returns a - * RemoteChainFacade - * - * @param {[ChainInfo, ChainInfo, IBCConnectionInfo]} chainsAndConnection - * @param {string} name - */ - onFulfilled([_agoricChainInfo, remoteChainInfo, connectionInfo], name) { - const it = makeRemoteChainFacade(remoteChainInfo, connectionInfo); - chainByName.set(name, harden({ value: it, pending: false })); - return it; - }, - }, - orchestrator: { - /** @type {HostOf} */ - getChain(name) { - return asVow(() => { - if (chainByName.has(name)) { - const maybeChain = chainByName.get(name); - return maybeChain.pending ? maybeChain.vow : maybeChain.value; - } - const vow = - name === 'agoric' - ? watch( - chainHub.getChainInfo('agoric'), - this.facets.makeLocalChainFacadeWatcher, - ) - : watch( - chainHub.getChainsAndConnection('agoric', name), - this.facets.makeRemoteChainFacadeWatcher, - name, - ); - chainByName.init(name, harden({ vow, pending: true })); - return vow; - }); - }, - /** @type {HostOf} */ - getDenomInfo(denom) { - const denomDetail = chainHub.getAsset(denom); - if (!denomDetail) throw Fail`No denom detail for ${q(denom)}`; - const { chainName, baseName, baseDenom, brand } = denomDetail; - chainByName.has(chainName) || - Fail`use getChain(${q(chainName)}) before getDenomInfo(${q(denom)})`; - const maybeChain = chainByName.get(chainName); - if (maybeChain.pending) { - throw Fail`wait until getChain(${q(chainName)}) completes before getDenomInfo(${q(denom)})`; - } - const chain = - /** @type {HostInterface>} */ ( - maybeChain.value - ); - chainByName.has(baseName) || - Fail`use getChain(${q(baseName)}) before getDenomInfo(${q(denom)})`; - const maybeBase = chainByName.get(baseName); - if (maybeBase.pending) { - throw Fail`wait until getChain(${q(baseName)}) completes before getDenomInfo(${q(denom)})`; - } - const base = - /** @type {HostInterface>} */ ( - maybeBase.value - ); - return harden({ chain, base, brand, baseDenom }); - }, - /** @type {HostOf} */ - asAmount: () => Fail`not yet implemented`, - }, - }, - ); -}; -harden(prepareOrchestratorKit); - -/** - * @param {Zone} zone - * @param {{ - * chainHub: ChainHub; - * makeLocalChainFacade: MakeLocalChainFacade; - * makeRemoteChainFacade: MakeRemoteChainFacade; - * vowTools: VowTools; - * }} powers - */ -export const prepareOrchestrator = (zone, powers) => { - const makeOrchestratorKit = prepareOrchestratorKit(zone, powers); - return pickFacet(makeOrchestratorKit, 'orchestrator'); -}; - -/** - * Host side of the Orchestrator interface. (Methods return vows instead of - * promises as the interface within the guest function.) - * - * @typedef {ReturnType< - * ReturnType - * >['orchestrator']} HostOrchestrator - */ diff --git a/contract/src/exos/packet-tools.js b/contract/src/exos/packet-tools.js deleted file mode 100644 index a4ba79c2..00000000 --- a/contract/src/exos/packet-tools.js +++ /dev/null @@ -1,372 +0,0 @@ -import { makeMarshal, decodeToJustin } from '@endo/marshal'; -import { Shape as NetworkShape } from '@agoric/network'; -import { M, matches } from '@endo/patterns'; -import { E } from '@endo/far'; -import { pickFacet } from '@agoric/vat-data'; - -const { toCapData } = makeMarshal(undefined, undefined, { - marshalName: 'JustEncoder', - serializeBodyFormat: 'capdata', -}); -const just = obj => { - const { body } = toCapData(obj); - return decodeToJustin(JSON.parse(body), true); -}; - -/** - * @import {Pattern} from '@endo/patterns'; - * @import {EVow, Remote, Vow, VowResolver, VowTools} from '@agoric/vow'; - * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js'; - * @import {TargetApp, TargetRegistration} from '@agoric/vats/src/bridge-target.js'; - */ - -/** - * @callback MatchEvent - * @param {EVow} pattern - * @returns {Vow<{ resolver: VowResolver; match: Vow }>} - */ - -/** - * @typedef {object} PacketSender - * @property {( - * opts: PacketOptions, - * ) => Vow<{ eventPattern: Pattern; resultV: Vow }>} sendPacket - */ - -/** - * @typedef {object} PacketOptions - * @property {string} [opName] - * @property {PacketTimeout} [timeout] - */ - -/** - * @typedef {Pick< - * import('../cosmos-api').IBCMsgTransferOptions, - * 'timeoutHeight' | 'timeoutTimestamp' - * >} PacketTimeout - */ - -const { Vow$ } = NetworkShape; // TODO #9611 - -const EVow$ = shape => M.or(Vow$(shape), M.promise(/* shape */)); - -const sink = () => {}; -harden(sink); - -/** - * @param {import('@agoric/base-zone').Zone} zone - * @param {VowTools} vowTools - */ -export const preparePacketTools = (zone, vowTools) => { - const { allVows, makeVowKit, watch, when } = vowTools; - - const makePacketToolsKit = zone.exoClassKit( - 'PacketToolsKit', - { - public: M.interface('PacketTools', { - sendThenWaitForAck: M.call(EVow$(M.remotable('PacketSender'))) - .optional(M.any()) - .returns(EVow$(M.any())), - matchFirstPacket: M.call(M.any()).returns(EVow$(M.any())), - monitorTransfers: M.call(M.remotable('TargetApp')).returns( - EVow$(M.any()), - ), - }), - tap: M.interface('tap', { - // eslint-disable-next-line no-restricted-syntax - receiveUpcall: M.callWhen(M.any()).returns(M.any()), - }), - monitorRegistration: M.interface('monitorRegistration', { - // eslint-disable-next-line no-restricted-syntax - updateTargetApp: M.callWhen( - M.await(M.remotable('TargetApp')), - ).returns(), - // eslint-disable-next-line no-restricted-syntax - revoke: M.callWhen().returns(), - }), - watchPacketMatch: M.interface('watchPacketMatch', { - onFulfilled: M.call(M.any(), M.record()).returns(M.any()), - }), - watchPacketPattern: M.interface('watchPacketPattern', { - onFulfilled: M.call(M.any(), M.record()).returns(M.any()), - onRejected: M.call(M.any(), M.record()).returns(M.any()), - }), - watchDecrPendingPatterns: M.interface('watchDecrPendingPatterns', { - onFulfilled: M.call(M.any()).returns(M.any()), - onRejected: M.call(M.any()).returns(M.any()), - }), - sendPacketWatcher: M.interface('sendPacketWatcher', { - onFulfilled: M.call( - [M.record(), M.remotable('PacketSender')], - M.record(), - ).returns(M.any()), - }), - packetWasSentWatcher: M.interface('packetWasSentWatcher', { - onFulfilled: M.call( - { eventPattern: M.pattern(), resultV: Vow$(M.any()) }, - M.record(), - ).returns(M.any()), - }), - utils: M.interface('utils', { - subscribeToTransfers: M.call().returns(M.promise()), - unsubscribeFromTransfers: M.call().returns(M.undefined()), - incrPendingPatterns: M.call().returns(Vow$(M.undefined())), - decrPendingPatterns: M.call().returns(Vow$(M.undefined())), - }), - rejectResolverAndRethrowWatcher: M.interface('rejectResolverWatcher', { - onRejected: M.call(M.any(), { - resolver: M.remotable('resolver'), - }).returns(M.any()), - }), - }, - /** - * @param {LocalChainAccount} lca - */ - lca => { - const resolverToPattern = zone.detached().mapStore('resolverToPattern'); - return { - lca, - reg: /** @type {Remote | null} */ (null), - resolverToPattern, - upcallQueue: /** @type {any[] | null} */ (null), - pending: 0, - extra: null, - monitor: /** @type {Remote | null} */ (null), - }; - }, - { - public: { - /** - * @param {ERef} monitor - */ - // eslint-disable-next-line no-restricted-syntax - async monitorTransfers(monitor) { - // We set the monitor here, but we only ever subscribe our - // this.facets.tap handler to transfers. - const mreg = this.facets.monitorRegistration; - await mreg.updateTargetApp(monitor); - return mreg; - }, - /** - * @type {MatchEvent} - */ - matchFirstPacket(patternP) { - return watch( - this.facets.utils.incrPendingPatterns(), - this.facets.watchPacketMatch, - { patternP }, - ); - }, - /** - * @param {Remote} packetSender - * @param {PacketOptions} [opts] - * @returns {Vow} - */ - sendThenWaitForAck(packetSender, opts = {}) { - /** @type {import('@agoric/vow').VowKit} */ - const pattern = makeVowKit(); - - // Establish the packet matcher immediately, but don't fulfill - // the match until after pattern.vow has been resolved. - const matchV = watch( - allVows([ - this.facets.public.matchFirstPacket(pattern.vow), - packetSender, - ]), - this.facets.sendPacketWatcher, - { opts }, - ); - - // When the packet is sent, resolve the resultV for the reply. - const resultV = watch(matchV, this.facets.packetWasSentWatcher, { - opts, - patternResolver: pattern.resolver, - }); - - // If anything fails, try to reject the packet sender. - return watch(resultV, this.facets.rejectResolverAndRethrowWatcher, { - resolver: pattern.resolver, - }); - }, - }, - monitorRegistration: { - /** @type {TargetRegistration['updateTargetApp']} */ - // eslint-disable-next-line no-restricted-syntax - async updateTargetApp(tap) { - this.state.monitor = await tap; - await this.facets.utils.subscribeToTransfers(); - }, - /** @type {TargetRegistration['revoke']} */ - // eslint-disable-next-line no-restricted-syntax - async revoke() { - this.state.monitor = null; - }, - }, - tap: { - // eslint-disable-next-line no-restricted-syntax - async receiveUpcall(obj) { - const { monitor, resolverToPattern, upcallQueue, pending } = - this.state; - console.debug( - `Trying ${resolverToPattern.getSize()} current patterns and ${pending} pending patterns against`, - just(obj), - ); - - if (monitor) { - // Call the monitor (if any), but in a future turn. - void E(monitor).receiveUpcall(obj); - } - // Check all our fulfilled patterns for matches. - for (const [resolver, pattern] of resolverToPattern.entries()) { - if (matches(obj, pattern)) { - console.debug('Matched pattern:', just(pattern)); - resolver.resolve(obj); - resolverToPattern.delete(resolver); - return; - } - } - if (upcallQueue) { - // We have some pending patterns (ones that have been requested but - // haven't yet settled) that may match this object. - console.debug('Stashing object in upcallQueue'); - this.state.upcallQueue = harden(upcallQueue.concat(obj)); - } - console.debug('No match yet.'); - }, - }, - sendPacketWatcher: { - onFulfilled([{ match }, sender], ctx) { - return watch(E(sender).sendPacket(match, ctx.opts)); - }, - }, - packetWasSentWatcher: { - onFulfilled({ eventPattern, resultV }, ctx) { - const { patternResolver } = ctx; - patternResolver.resolve(eventPattern); - return resultV; - }, - }, - rejectResolverAndRethrowWatcher: { - onRejected(rej, { resolver }) { - resolver.reject(rej); - throw rej; - }, - }, - watchPacketMatch: { - onFulfilled(_, { patternP }) { - const { vow, resolver } = makeVowKit(); - const patternV = watch( - patternP, - this.facets.watchPacketPattern, - harden({ resolver }), - ); - /* void */ watch(patternV, this.facets.watchDecrPendingPatterns); - return harden({ match: vow, resolver }); - }, - }, - watchDecrPendingPatterns: { - onFulfilled() { - return this.facets.utils.decrPendingPatterns(); - }, - onRejected() { - return this.facets.utils.decrPendingPatterns(); - }, - }, - watchPacketPattern: { - onFulfilled(pattern, { resolver }) { - const { resolverToPattern, upcallQueue } = this.state; - - console.debug('watchPacketPattern onFulfilled', just(pattern)); - if (!upcallQueue) { - // Save the pattern for later. - console.debug('No upcall queue yet. Save the pattern for later.'); - resolverToPattern.init(resolver, pattern); - return; - } - - // Try matching the first in queue. - const i = upcallQueue.findIndex(obj => matches(obj, pattern)); - if (i < 0) { - // No match yet. Save the pattern for later. - console.debug('No match yet. Save the pattern for later.'); - resolverToPattern.init(resolver, pattern); - return; - } - - // Success! Remove the matched object from the queue. - console.debug( - 'Success! Remove the matched object from the queue.', - just(upcallQueue[i]), - ); - resolver.resolve(upcallQueue[i]); - this.state.upcallQueue = harden( - upcallQueue.slice(0, i).concat(upcallQueue.slice(i + 1)), - ); - }, - onRejected(reason, { resolver }) { - resolver.reject(reason); - }, - }, - - utils: { - incrPendingPatterns() { - const { pending, reg, upcallQueue } = this.state; - this.state.pending += 1; - if (!upcallQueue) { - this.state.upcallQueue = harden([]); - } - if (reg || pending > 0) { - return watch(undefined); - } - return watch(this.facets.utils.subscribeToTransfers()); - }, - decrPendingPatterns() { - this.state.pending -= 1; - if (this.state.pending > 0) { - return; - } - this.state.pending = 0; - this.state.upcallQueue = null; - // FIXME when it returns undefined this causes an error: - // In "unsubscribeFromTransfers" method of (PacketToolsKit utils): result: undefined "[undefined]" - Must be a promise - return watch(this.facets.utils.unsubscribeFromTransfers()); - }, - subscribeToTransfers() { - // Subscribe to the transfers for this account. - const { lca, reg } = this.state; - if (reg) { - return when(reg); - } - const { tap } = this.facets; - // XXX racy; fails if subscribeToTransfers is called while this promise is in flight - // e.g. 'Target "agoric1fakeLCAAddress" already registered' - return when(E(lca).monitorTransfers(tap), r => { - this.state.reg = r; - return r; - }); - }, - unsubscribeFromTransfers() { - const { reg, monitor } = this.state; - if (!reg || monitor) { - return undefined; - } - // this.state.reg = null; - // return E(reg).revoke().then(sink); - }, - }, - }, - { - finish(context) { - void context.facets.utils.subscribeToTransfers(); - }, - }, - ); - - const makePacketTools = pickFacet(makePacketToolsKit, 'public'); - return makePacketTools; -}; -harden(preparePacketTools); - -/** - * @typedef {Awaited>>} PacketTools - */ diff --git a/contract/src/exos/portfolio-holder-kit.js b/contract/src/exos/portfolio-holder-kit.js deleted file mode 100644 index a5c03ece..00000000 --- a/contract/src/exos/portfolio-holder-kit.js +++ /dev/null @@ -1,230 +0,0 @@ -import { M, mustMatch } from '@endo/patterns'; -import { E } from '@endo/far'; -import { Fail } from '@endo/errors'; -import { PublicTopicShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { makeScalarBigMapStore } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; - -const { fromEntries } = Object; - -/** - * @import {HostInterface, HostOf} from '@agoric/async-flow'; - * @import {MapStore} from '@agoric/store'; - * @import {VowTools} from '@agoric/vow'; - * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; - * @import {Zone} from '@agoric/zone'; - * @import {OrchestrationAccount, OrchestrationAccountI, MakeCombineInvitationMakers} from '@agoric/orchestration'; - */ - -/** - * @typedef {{ - * accounts: MapStore>>; - * publicTopics: MapStore>; - * }} PortfolioHolderState - */ - -const ChainNameShape = M.string(); - -const AccountEntriesShape = M.arrayOf([ - M.string(), - M.remotable('OrchestrationAccount'), -]); -const PublicTopicEntriesShape = M.arrayOf([M.string(), PublicTopicShape]); - -/** - * Kit that holds several OrchestrationAccountKits and returns a invitation - * makers. - * - * @param {Zone} zone - * @param {VowTools} vowTools - */ -const preparePortfolioHolderKit = (zone, { asVow, when }) => { - return zone.exoClassKit( - 'PortfolioHolderKit', - { - invitationMakers: M.interface('InvitationMakers', { - Proxying: M.call(ChainNameShape, M.string()) - .optional(M.arrayOf(M.any())) - .returns(M.promise()), - }), - holder: M.interface('Holder', { - asContinuingOffer: M.call().returns(VowShape), - getPublicTopics: M.call().returns(VowShape), - getAccount: M.call(ChainNameShape).returns(VowShape), - addAccount: M.call( - ChainNameShape, - M.remotable(), - PublicTopicShape, - ).returns(VowShape), - }), - }, - /** - * @param {Iterable<[string, OrchestrationAccount]>} accountEntries - * @param {Iterable<[string, ResolvedPublicTopic]>} publicTopicEntries - */ - (accountEntries, publicTopicEntries) => { - mustMatch(accountEntries, AccountEntriesShape, 'must provide accounts'); - mustMatch( - publicTopicEntries, - PublicTopicEntriesShape, - 'must provide public topics', - ); - const accounts = harden( - makeScalarBigMapStore('accounts', { durable: true }), - ); - const publicTopics = harden( - makeScalarBigMapStore('publicTopics', { durable: true }), - ); - accounts.addAll(accountEntries); - publicTopics.addAll(publicTopicEntries); - return /** @type {PortfolioHolderState} */ ( - harden({ - accounts, - publicTopics, - }) - ); - }, - { - invitationMakers: { - /** - * @template {unknown[]} IA - * @param {string} chainName key where the account is stored - * @param {string} action invitation maker name, e.g. 'Delegate' - * @param {IA} [invitationArgs] - * @returns {Promise>} - */ - Proxying(chainName, action, invitationArgs) { - const { accounts } = this.state; - accounts.has(chainName) || Fail`no account found for ${chainName}`; - const account = accounts.get(chainName); - // @ts-expect-error XXX invitationMakers - return when(E(account).asContinuingOffer(), ({ invitationMakers }) => - E(invitationMakers)[action](...(invitationArgs || [])), - ); - }, - }, - holder: { - // FIXME /** @type {HostOf} */ - asContinuingOffer() { - return asVow(() => { - const { invitationMakers } = this.facets; - const { publicTopics } = this.state; - return harden({ - publicSubscribers: fromEntries(publicTopics.entries()), - invitationMakers, - }); - }); - }, - // FIXME /** @type {HostOf} */ - getPublicTopics() { - return asVow(() => { - const { publicTopics } = this.state; - return harden(fromEntries(publicTopics.entries())); - }); - }, - /** - * @param {string} chainName key where the account is stored - * @param {HostInterface>} account - * @param {ResolvedPublicTopic} publicTopic - */ - addAccount(chainName, account, publicTopic) { - return asVow(() => { - if (this.state.accounts.has(chainName)) { - throw Fail`account already exists for ${chainName}`; - } - zone.isStorable(account) || - Fail`account for ${chainName} must be storable`; - zone.isStorable(publicTopic) || - Fail`publicTopic for ${chainName} must be storable`; - - this.state.publicTopics.init(chainName, publicTopic); - this.state.accounts.init(chainName, account); - }); - }, - /** - * @param {string} chainName key where the account is stored - */ - getAccount(chainName) { - return asVow(() => this.state.accounts.get(chainName)); - }, - }, - }, - ); -}; - -/** - * A portfolio holder stores two or more OrchestrationAccounts and combines - * ContinuingOfferResult's from each into a single result. - * - * The invitationMakers can be accessed via the `Proxy` invitationMaker, which - * calls out to other invitationMakers. - * - * See {@link MakeCombineInvitationMakers} for an exo that allows a developer to - * define extra invitationMakers to combine with platform-provided ones. - * - * @example - * - * ```js - * // in contract start/prepare - * const makePortfolioHolder = preparePortfolioHolder( - * rootZone.subZone('portfolio'), - * vowTools, - * ); - * - * // in a flow - * const accounts = { - * cosmoshub: await cosmosChain.makeAccount(), - * agoric: await agoricChain.makeAccount(), - * }; - * const accountEntries = harden(Object.entries(accounts)); - * const publicTopicEntries = harden( - * await Promise.all( - * Object.entries(accounts).map(async ([chainName, holder]) => { - * const { account } = await E(holder).getPublicTopics(); - * return [chainName, account]; - * }), - * ), - * ); - * const holder = makePortfolioHolder(accountEntries, publicTopicEntries); - * - * // return ContinuingOfferResult to client - * return E(holder).asContinuingOffer(); - * - * const { invitationMakers } = await E(holder).asContinuingOffer(); - * - * // with invitationArgs - * const delegateInv = await E(invitationMakers).Proxying( - * 'cosmoshub', - * 'Delegate', - * [ - * { - * value: 'cosmos1valoper', - * chainId: 'cosmoshub-99', - * encoding: 'bech32', - * }, - * { - * denom: 'uatom', - * value: 10n, - * }, - * ], - * ); - * - * // without invitationArgs - * const transferInv = await E(invitationMakers).Proxying( - * 'cosmoshub', - * 'Transfer', - * ); - * ``` - * - * @param {Zone} zone - * @param {VowTools} vowTools - * @returns {( - * ...args: Parameters> - * ) => ReturnType>['holder']} - */ -export const preparePortfolioHolder = (zone, vowTools) => { - const makeKit = preparePortfolioHolderKit(zone, vowTools); - return (...args) => makeKit(...args).holder; -}; -/** @typedef {ReturnType} MakePortfolioHolder */ -/** @typedef {ReturnType} PortfolioHolder */ diff --git a/contract/src/exos/remote-chain-facade.js b/contract/src/exos/remote-chain-facade.js deleted file mode 100644 index 3efebfff..00000000 --- a/contract/src/exos/remote-chain-facade.js +++ /dev/null @@ -1,269 +0,0 @@ -/** @file Remote Chain Facade exo */ -import { makeTracer } from '@agoric/internal'; -import { E } from '@endo/far'; -import { Fail, q } from '@endo/errors'; -import { M } from '@endo/patterns'; -import { pickFacet } from '@agoric/vat-data'; -import { VowShape } from '@agoric/vow'; -import { - ChainAddressShape, - chainFacadeMethods, - ICQMsgShape, -} from '../typeGuards.js'; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {Zone} from '@agoric/base-zone'; - * @import {JsonSafe} from '@agoric/cosmic-proto'; - * @import {RequestQuery, ResponseQuery} from '@agoric/cosmic-proto/tendermint/abci/types.js'; - * @import {TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - * @import {Vow, VowTools} from '@agoric/vow'; - * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - * @import {CosmosInterchainService} from './exo-interfaces.js'; - * @import {prepareCosmosOrchestrationAccount} from './cosmos-orchestration-account.js'; - * @import {CosmosChainInfo, IBCConnectionInfo, ChainAddress, IcaAccount, Chain, ICQConnection} from '../types.js'; - */ - -const trace = makeTracer('RemoteChainFacade'); - -/** - * @typedef {{ - * makeCosmosOrchestrationAccount: ReturnType< - * typeof prepareCosmosOrchestrationAccount - * >; - * orchestration: Remote; - * storageNode: Remote; - * timer: Remote; - * vowTools: VowTools; - * }} RemoteChainFacadePowers - */ - -/** - * @typedef {{ - * remoteChainInfo: CosmosChainInfo; - * connectionInfo: IBCConnectionInfo; - * icqConnection: ICQConnection | undefined; - * }} RemoteChainFacadeState - */ - -/** - * @param {Zone} zone - * @param {RemoteChainFacadePowers} powers - */ -const prepareRemoteChainFacadeKit = ( - zone, - { - makeCosmosOrchestrationAccount, - orchestration, - // TODO vstorage design https://github.com/Agoric/agoric-sdk/issues/9066 - // consider making an `accounts` childNode - storageNode, - timer, - vowTools: { allVows, asVow, watch }, - }, -) => - zone.exoClassKit( - 'RemoteChainFacade', - { - public: M.interface('RemoteChainFacade', { - ...chainFacadeMethods, - query: M.call(M.arrayOf(ICQMsgShape)).returns(VowShape), - }), - makeICQConnectionQueryWatcher: M.interface( - 'makeICQConnectionQueryWatcher', - { - onFulfilled: M.call(M.remotable(), M.arrayOf(ICQMsgShape)).returns( - VowShape, - ), - }, - ), - makeAccountAndProvideQueryConnWatcher: M.interface( - 'makeAccountAndProvideQueryConnWatcher', - { - onFulfilled: M.call([ - M.remotable(), - M.or(M.remotable(), M.undefined()), - ]).returns(VowShape), - }, - ), - getAddressesWatcher: M.interface('getAddressWatcher', { - onFulfilled: M.call( - [ChainAddressShape, M.string(), M.string()], - M.remotable(), - ).returns(VowShape), - }), - makeChildNodeWatcher: M.interface('makeChildNodeWatcher', { - onFulfilled: M.call(M.remotable(), { - account: M.remotable(), - chainAddress: ChainAddressShape, - localAddress: M.string(), - remoteAddress: M.string(), - }).returns(M.remotable()), - }), - }, - /** - * @param {CosmosChainInfo} remoteChainInfo - * @param {IBCConnectionInfo} connectionInfo - */ - (remoteChainInfo, connectionInfo) => { - trace('making a RemoteChainFacade'); - return /** @type {RemoteChainFacadeState} */ ({ - remoteChainInfo, - connectionInfo, - icqConnection: undefined, - }); - }, - { - public: { - /** @type {HostOf} */ - getChainInfo() { - return watch(this.state.remoteChainInfo); - }, - - /** @type {HostOf} */ - makeAccount() { - return asVow(() => { - const { remoteChainInfo, connectionInfo } = this.state; - const stakingDenom = remoteChainInfo.stakingTokens?.[0]?.denom; - if (!stakingDenom) throw Fail`chain info lacks staking denom`; - - // icqConnection is ultimately retrieved from state, but let's - // create a connection if it doesn't exist - const icqConnOrUndefinedV = - remoteChainInfo.icqEnabled && !this.state.icqConnection - ? E(orchestration).provideICQConnection(connectionInfo.id) - : undefined; - - const makeAccountV = E(orchestration).makeAccount( - remoteChainInfo.chainId, - connectionInfo.counterparty.connection_id, - connectionInfo.id, - ); - - return watch( - allVows([makeAccountV, icqConnOrUndefinedV]), - this.facets.makeAccountAndProvideQueryConnWatcher, - ); - }); - }, - /** - * @type {HostOf< - * Chain['query'] - * >} - */ - query(msgs) { - return asVow(() => { - const { - remoteChainInfo: { icqEnabled, chainId }, - connectionInfo, - } = this.state; - if (!icqEnabled) { - throw Fail`Queries not available for chain ${q(chainId)}`; - } - // if none exists, make one and still send the query in the handler - if (!this.state.icqConnection) { - return watch( - E(orchestration).provideICQConnection(connectionInfo.id), - this.facets.makeICQConnectionQueryWatcher, - msgs, - ); - } - return watch(E(this.state.icqConnection).query(msgs)); - }); - }, - }, - makeAccountAndProvideQueryConnWatcher: { - /** - * @param {[IcaAccount, ICQConnection | undefined]} account - */ - onFulfilled([account, icqConnection]) { - if (icqConnection && !this.state.icqConnection) { - this.state.icqConnection = icqConnection; - // no need to pass icqConnection in ctx; we can get it from state - } - return watch( - allVows([ - E(account).getAddress(), - E(account).getLocalAddress(), - E(account).getRemoteAddress(), - ]), - this.facets.getAddressesWatcher, - account, - ); - }, - }, - makeICQConnectionQueryWatcher: { - /** - * @param {ICQConnection} icqConnection - * @param {JsonSafe[]} msgs - * @returns {Vow[]>} - */ - onFulfilled(icqConnection, msgs) { - if (!this.state.icqConnection) { - this.state.icqConnection = icqConnection; - } - return watch(E(icqConnection).query(msgs)); - }, - }, - getAddressesWatcher: { - /** - * @param {[ChainAddress, LocalIbcAddress, RemoteIbcAddress]} chainAddresses - * @param {IcaAccount} account - */ - onFulfilled([chainAddress, localAddress, remoteAddress], account) { - return watch( - E(storageNode).makeChildNode(chainAddress.value), - this.facets.makeChildNodeWatcher, - { account, chainAddress, localAddress, remoteAddress }, - ); - }, - }, - makeChildNodeWatcher: { - /** - * @param {Remote} childNode - * @param {{ - * account: IcaAccount; - * chainAddress: ChainAddress; - * localAddress: LocalIbcAddress; - * remoteAddress: RemoteIbcAddress; - * }} ctx - */ - onFulfilled( - childNode, - { account, chainAddress, localAddress, remoteAddress }, - ) { - const { icqConnection } = this.state; - - return makeCosmosOrchestrationAccount( - { - chainAddress, - localAddress, - remoteAddress, - }, - { - account, - // FIXME storage path https://github.com/Agoric/agoric-sdk/issues/9066 - storageNode: childNode, - icqConnection, - timer, - }, - ); - }, - }, - }, - ); -harden(prepareRemoteChainFacadeKit); - -/** - * @param {Zone} zone - * @param {RemoteChainFacadePowers} powers - */ -export const prepareRemoteChainFacade = (zone, powers) => { - const makeLocalChainFacadeKit = prepareRemoteChainFacadeKit(zone, powers); - return pickFacet(makeLocalChainFacadeKit, 'public'); -}; -harden(prepareRemoteChainFacade); - -/** @typedef {ReturnType} MakeRemoteChainFacade */ -/** @typedef {ReturnType} RemoteChainFacade */ diff --git a/contract/src/chain-info.js b/contract/src/old_chain-info.js similarity index 100% rename from contract/src/chain-info.js rename to contract/src/old_chain-info.js diff --git a/contract/src/orchestration-api.ts b/contract/src/orchestration-api.ts index 986c66ea..7777dc8d 100644 --- a/contract/src/orchestration-api.ts +++ b/contract/src/orchestration-api.ts @@ -20,7 +20,8 @@ import type { LocalAccountMethods, ICQQueryFunction, } from './types.js'; -import type { ResolvedContinuingOfferResult } from './utils/zoe-tools.js'; +import type { ResolvedContinuingOfferResult } from '@agoric/orchestration/src/utils/zoe-tools.js'; +// import type { ResolvedContinuingOfferResult } from '../utils/zoe-tools.js'; /** * A denom that designates a path to a token type on some blockchain. diff --git a/contract/test/supports.ts b/contract/test/supports.ts index dbf539c0..0d43fc53 100644 --- a/contract/test/supports.ts +++ b/contract/test/supports.ts @@ -20,10 +20,10 @@ import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; import { makeHeapZone } from '@agoric/zone'; import { E } from '@endo/far'; import type { ExecutionContext } from 'ava'; -import { registerKnownChains } from '../src/chain-info.js'; -import { makeChainHub } from '../src/exos/chain-hub.js'; -import { prepareCosmosInterchainService } from '../src/exos/cosmos-interchain-service.js'; -import fetchedChainInfo from '../src/fetched-chain-info.js'; +import { registerKnownChains } from '@agoric/orchestration/src/chain-info.js'; +import { makeChainHub } from '@agoric/orchestration/src/exos/chain-hub.js'; +import { prepareCosmosInterchainService } from '@agoric/orchestration/src/exos/cosmos-interchain-service.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; import { buildVTransferEvent } from '../tools/ibc-mocks.js'; import { setupFakeNetwork } from './network-fakes.js'; diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts index 2e20c46a..757c4c2b 100644 --- a/contract/tools/ibc-mocks.ts +++ b/contract/tools/ibc-mocks.ts @@ -21,8 +21,8 @@ import type { } from '@agoric/vats'; import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; -import type { ChainAddress } from '../src/orchestration-api.js'; -import { makeQueryPacket, makeTxPacket } from '../utils/packet.js'; +import type { ChainAddress } from '@agoric/orchestration/src/orchestration-api.js'; +import { makeQueryPacket, makeTxPacket } from '@agoric/orchestration/src/utils/packet.js'; interface EncoderI { encode: (message: T) => { diff --git a/contract/utils/address.js b/contract/utils/address.js deleted file mode 100644 index 4699afa4..00000000 --- a/contract/utils/address.js +++ /dev/null @@ -1,103 +0,0 @@ -import { Fail, q } from '@endo/errors'; - -/** - * @import {IBCConnectionID} from '@agoric/vats'; - * @import {ChainAddress} from '../src/types.js'; - * @import {RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; - */ - -/** - * @typedef {object} ICAChannelAddressOpts - * @property {string} [encoding='proto3'] message encoding format for the - * channel - * @property {'ordered' | 'unordered'} [ordering='ordered'] channel ordering. - * currently only `ordered` is supported for ics27-1 - * @property {string} [txType='sdk_multi_msg'] default is `sdk_multi_msg` - * @property {string} [version='ics27-1'] default is `ics27-1` - */ - -/** - * @param {IBCConnectionID} hostConnectionId Counterparty Connection ID - * @param {IBCConnectionID} controllerConnectionId Self Connection ID - * @param {ICAChannelAddressOpts} [opts] - * @returns {RemoteIbcAddress} - */ -export const makeICAChannelAddress = ( - hostConnectionId, - controllerConnectionId, - { - version = 'ics27-1', - encoding = 'proto3', - ordering = 'ordered', - txType = 'sdk_multi_msg', - } = {}, -) => { - hostConnectionId || Fail`hostConnectionId is required`; - controllerConnectionId || Fail`controllerConnectionId is required`; - const connString = JSON.stringify({ - version, - controllerConnectionId, - hostConnectionId, - address: '', // will be provided by the counterparty after channelOpenAck - encoding, - txType, - }); - return `/ibc-hop/${controllerConnectionId}/ibc-port/icahost/${ordering}/${connString}`; -}; -harden(makeICAChannelAddress); - -export const DEFAULT_ICQ_VERSION = 'icq-1'; - -/** - * @param {IBCConnectionID} controllerConnectionId - * @param {string} version defaults to icq-1 - * @returns {RemoteIbcAddress} - */ -export const makeICQChannelAddress = ( - controllerConnectionId, - version = DEFAULT_ICQ_VERSION, -) => { - controllerConnectionId || Fail`controllerConnectionId is required`; - return `/ibc-hop/${controllerConnectionId}/ibc-port/icqhost/unordered/${version}`; -}; -harden(makeICQChannelAddress); - -/** - * Parse a chain address from a remote address string. Assumes the address - * string is in a JSON format and contains an "address" field. This function is - * designed to be safe against malformed inputs and unexpected data types, and - * will return `undefined` in those cases. - * - * @param {RemoteIbcAddress} remoteAddressString - remote address string, - * including version - * @returns {ChainAddress['value'] | undefined} returns undefined on error - */ -export const findAddressField = remoteAddressString => { - try { - // Extract JSON version string assuming it's always surrounded by {} - const jsonStr = remoteAddressString?.match(/{.*?}/)?.[0]; - const jsonObj = jsonStr ? JSON.parse(jsonStr) : undefined; - if (!jsonObj?.address?.length) return undefined; - return jsonObj.address; - } catch (error) { - return undefined; - } -}; -harden(findAddressField); - -/** - * Extracts the human readable part (HRP), aka `bech32Prefix`, from an address. - * - * see - * [bech32.js](https://github.com/bitcoinjs/bech32/blob/5ceb0e3d4625561a459c85643ca6947739b2d83c/src/index.ts#L146) - * for reference implementation - * - * @param {string} address - */ -export const getBech32Prefix = address => { - assert(address, 'address is required'); - const split = address.lastIndexOf('1'); - if (split === -1) return Fail`No separator character for ${q(address)}`; - if (split === 0) return Fail`Missing prefix for ${q(address)}`; - return address.slice(0, split); -}; diff --git a/contract/utils/amounts.js b/contract/utils/amounts.js deleted file mode 100644 index 3974f922..00000000 --- a/contract/utils/amounts.js +++ /dev/null @@ -1,59 +0,0 @@ -import { makeError } from '@endo/errors'; - -/** - * @import {ChainHub} from "../types.js"; - * @import {AmountArg, Denom, DenomAmount, DenomArg} from "../orchestration-api.js"; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; - */ - -/** - * @param {ChainHub} chainHub - * @param {DenomArg} denomArg - * @returns {Denom} - * @throws {Error} if Brand is provided and ChainHub doesn't contain Brand:Denom - * mapping - */ -export const coerceDenom = (chainHub, denomArg) => { - if (typeof denomArg === 'string') { - return denomArg; - } - const denom = chainHub.getDenom(denomArg); - if (!denom) { - throw makeError(`No denom for brand ${denomArg}`); - } - return denom; -}; - -/** - * @param {ChainHub} chainHub - * @param {DenomAmount | Amount<'nat'>} amount - * @returns {DenomAmount} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceDenomAmount = (chainHub, amount) => { - if ('denom' in amount) { - return amount; - } - const denom = coerceDenom(chainHub, amount.brand); - return harden({ - denom, - value: amount.value, - }); -}; - -/** - * @param {ChainHub} chainHub - * @param {AmountArg} amount - * @returns {Coin} - * @throws {Error} if ERTP Amount is provided and ChainHub doesn't contain - * Brand:Denom mapping - */ -export const coerceCoin = (chainHub, amount) => { - const denom = - 'denom' in amount ? amount.denom : coerceDenom(chainHub, amount.brand); - return harden({ - denom, - amount: String(amount.value), - }); -}; diff --git a/contract/utils/cosmos.js b/contract/utils/cosmos.js deleted file mode 100644 index 5082a1c5..00000000 --- a/contract/utils/cosmos.js +++ /dev/null @@ -1,82 +0,0 @@ -import { makeError } from '@endo/errors'; -import { decodeBase64 } from '@endo/base64'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; - -/** - * @import {CosmosDelegationResponse, CosmosValidatorAddress, DenomAmount} from '../types.js'; - * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js' - * @import {DelegationResponse} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; - */ - -/** maximum clock skew, in seconds, for unbonding time reported from other chain */ -export const maxClockSkew = 10n * 60n; - -/** - * @template T - * @param {string} ackStr - * @param {(p: { typeUrl: string; value: Uint8Array }) => T} fromProtoMsg - */ -export const tryDecodeResponse = (ackStr, fromProtoMsg) => { - try { - const any = Any.decode(decodeBase64(ackStr)); - const protoMsg = Any.decode(any.value); - - const msg = fromProtoMsg(protoMsg); - return msg; - } catch (cause) { - throw makeError(`bad response: ${ackStr}`, undefined, { cause }); - } -}; - -/** - * Transform a cosmos-sdk {@link Coin} object into a {@link DenomAmount} - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - * @see {@link toTruncatedDenomAmount} for DecCoin - */ -export const toDenomAmount = c => ({ denom: c.denom, value: BigInt(c.amount) }); - -/** - * Transform a cosmos-sdk {@link DecCoin} object into a {@link DenomAmount}, by - * truncating the fractional portion. - * - * @type {(c: { denom: string; amount: string }) => DenomAmount} - */ -export const toTruncatedDenomAmount = c => ({ - denom: c.denom, - value: BigInt(c.amount.split('.')[0]), -}); - -/** - * Transform a cosmos-sdk `{validatorAddress}` object into an Orchestration - * {@link CosmosValidatorAddress} - * - * @type {( - * r: { validatorAddress: string }, - * chainId: string, - * ) => CosmosValidatorAddress} - */ -export const toCosmosValidatorAddress = (r, chainId) => ({ - encoding: 'bech32', - value: /** @type {CosmosValidatorAddress['value']} */ (r.validatorAddress), - chainId, -}); - -/** - * Transform a cosmos-sdk {@link DelegationResponse} object into an Orchestration - * {@link CosmosDelegationResponse} - * - * @type {( - * chainInfo: { chainId: string }, - * r: DelegationResponse, - * ) => CosmosDelegationResponse} - */ -export const toCosmosDelegationResponse = ({ chainId }, r) => ({ - delegator: { - chainId, - encoding: 'bech32', - value: r.delegation.delegatorAddress, - }, - validator: toCosmosValidatorAddress(r.delegation, chainId), - amount: toDenomAmount(r.balance), -}); diff --git a/contract/utils/denomHash.js b/contract/utils/denomHash.js deleted file mode 100644 index 561ee4b5..00000000 --- a/contract/utils/denomHash.js +++ /dev/null @@ -1,22 +0,0 @@ -// @ts-check -import { sha256 } from '@noble/hashes/sha256'; -import { bytesToHex } from '@noble/hashes/utils'; - -/** - * cf. https://tutorials.cosmos.network/tutorials/6-ibc-dev/ - * - * @param {object} opts - * @param {string} [opts.portId] - * @param {string} [opts.channelId] required unless `path` is supplied - * @param {string} [opts.path] alternative to portId, channelId - * @param {string} opts.denom base denom - */ -export const denomHash = ({ - portId = 'transfer', - channelId = /** @type {string | undefined} */ (undefined), - path = `${portId}/${channelId}`, - denom, -}) => { - const h = sha256.create().update(`${path}/${denom}`).digest(); - return bytesToHex(h).toUpperCase(); -}; diff --git a/contract/utils/orc.js b/contract/utils/orc.js deleted file mode 100644 index 47a0d260..00000000 --- a/contract/utils/orc.js +++ /dev/null @@ -1,38 +0,0 @@ -/** @import {AfterAction, SwapExact, SwapMaxSlippage, TransferMsg} from '../types.js' */ - -export const orcUtils = { - /** - * unwinds denom with PFM, if necessary - * - * @param {Omit} _args - * @returns {TransferMsg} - */ - makeTransferMsg: _args => { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, - /** - * SwapExact or SwapMaxSlippage, with optional AfterAction - * - * @param {(SwapExact | SwapMaxSlippage) & - * (AfterAction | Record)} _args - * - * @returns {TransferMsg} - */ - makeOsmosisSwap(_args) { - // FIXME mocked, so typescript is happy - return { - toAccount: { - chainId: 'osmosis-test', - value: 'osmo1234', - encoding: 'bech32', - }, - }; - }, -}; diff --git a/contract/utils/orchestrationAccount.js b/contract/utils/orchestrationAccount.js deleted file mode 100644 index 2290af54..00000000 --- a/contract/utils/orchestrationAccount.js +++ /dev/null @@ -1,40 +0,0 @@ -import { BrandShape } from '@agoric/ertp'; -import { Shape as NetworkShape } from '@agoric/network'; -import { VowShape } from '@agoric/vow'; -import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { M } from '@endo/patterns'; -import { - AmountArgShape, - ChainAddressShape, - DenomAmountShape, - IBCTransferOptionsShape, -} from '../src/typeGuards.js'; - -/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ - -const { Vow$ } = NetworkShape; // TODO #9611 - -/** @see {OrchestrationAccountI} */ -export const orchestrationAccountMethods = { - getAddress: M.call().returns(ChainAddressShape), - getBalance: M.call(M.or(BrandShape, M.string())).returns( - Vow$(DenomAmountShape), - ), - getBalances: M.call().returns(Vow$(M.arrayOf(DenomAmountShape))), - send: M.call(ChainAddressShape, AmountArgShape).returns(VowShape), - sendAll: M.call(ChainAddressShape, M.arrayOf(AmountArgShape)).returns( - VowShape, - ), - transfer: M.call(ChainAddressShape, AmountArgShape) - .optional(IBCTransferOptionsShape) - .returns(VowShape), - transferSteps: M.call(AmountArgShape, M.any()).returns(VowShape), - asContinuingOffer: M.call().returns( - Vow$({ - publicSubscribers: TopicsRecordShape, - invitationMakers: M.any(), - holder: M.remotable(), - }), - ), - getPublicTopics: M.call().returns(Vow$(TopicsRecordShape)), -}; diff --git a/contract/utils/packet.js b/contract/utils/packet.js deleted file mode 100644 index 70564cff..00000000 --- a/contract/utils/packet.js +++ /dev/null @@ -1,112 +0,0 @@ -import { Fail } from '@endo/errors'; -import { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; -import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; -import { - RequestQuery, - ResponseQuery, -} from '@agoric/cosmic-proto/tendermint/abci/types.js'; -import { atob, decodeBase64, encodeBase64 } from '@endo/base64'; -import { - CosmosQuery, - CosmosResponse, -} from '@agoric/cosmic-proto/icq/v1/packet.js'; -import { Type as PacketType } from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - -/** - * @import {AnyJson, JsonSafe} from '@agoric/cosmic-proto'; - * @import {InterchainAccountPacketData} from '@agoric/cosmic-proto/ibc/applications/interchain_accounts/v1/packet.js'; - * @import {InterchainQueryPacketData} from '@agoric/cosmic-proto/icq/v1/packet.js'; - */ - -/** - * Makes an IBC transaction packet from an array of messages. Expects the - * `value` of each message to be base64 encoded bytes. Skips checks for - * malformed messages in favor of interface guards. - * - * @param {AnyJson[]} msgs - * @param {Partial>} [opts] - * @returns {string} stringified InterchainAccountPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeTxPacket(msgs, opts) { - const messages = msgs.map(Any.fromJSON); - const bytes = TxBody.encode( - TxBody.fromPartial({ - messages, - ...opts, - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - type: PacketType.TYPE_EXECUTE_TX, - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeTxPacket); - -/** - * Makes an IBC query packet from an array of query messages. Expects the `data` - * of each message to be base64 encoded bytes. Skips checks for malformed - * messages in favor of interface guards. - * - * @param {JsonSafe[]} msgs - * @returns {string} stringified InterchainQueryPacketData - * @throws {Error} if malformed messages are provided - */ -export function makeQueryPacket(msgs) { - const bytes = CosmosQuery.encode( - CosmosQuery.fromPartial({ - requests: msgs.map(RequestQuery.fromJSON), - }), - ).finish(); - - return JSON.stringify( - /** @type {JsonSafe} */ ({ - data: encodeBase64(bytes), - memo: '', - }), - ); -} -harden(makeQueryPacket); - -/** - * Looks for a result or error key in the response string, and returns a - * Base64Bytes string. This string can be decoded using the corresponding - * Msg*Response object. Error strings seem to be plain text and do not need - * decoding. - * - * @param {string} response - * @returns {string} - base64 encoded bytes string - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseTxPacket(response) { - const { result, error } = JSON.parse(response); - if (result) return result; - else if (error) throw Error(error); - else throw Fail`expected either result or error: ${response}`; -} -harden(parseTxPacket); - -/** - * Looks for a result or error key in the response string. If a result is found, - * `responses` is decoded via `CosmosResponse`. The `key` and `value` fields on - * the resulting entries are base64 encoded for inter-vat communication. These - * can be decoded using the corresponding Query*Response objects. Error strings - * seem to be plain text and do not need decoding. - * - * @param {string} response - * @returns {JsonSafe[]} - * @throws {Error} if error key is detected in response string, or result key is - * not found - */ -export function parseQueryPacket(response) { - const result = parseTxPacket(response); - const { data } = JSON.parse(atob(result)); - const { responses = [] } = CosmosResponse.decode(decodeBase64(data)); - return harden(responses.map(ResponseQuery.toJSON)); -} -harden(parseQueryPacket); diff --git a/contract/utils/registry.js b/contract/utils/registry.js deleted file mode 100644 index 25789864..00000000 --- a/contract/utils/registry.js +++ /dev/null @@ -1,130 +0,0 @@ -import { - State as IBCChannelState, - Order, -} from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js'; -import { State as IBCConnectionState } from '@agoric/cosmic-proto/ibc/core/connection/v1/connection.js'; -import assert from 'node:assert'; - -/** - * @import {IBCChannelID, IBCConnectionID} from '@agoric/vats'; - * @import {Chain, IBCInfo} from '@chain-registry/types'; - * @import {ChainRegistryClient} from '@chain-registry/client'; - * @import {CosmosChainInfo, IBCConnectionInfo} from '../cosmos-api.js'; - */ - -/** - * @param {IBCInfo} ibcInfo - * @param {string} name - * @param {Record} chainInfo - * @returns {[string, IBCConnectionInfo] | []} - */ -function toConnectionEntry(ibcInfo, name, chainInfo) { - // IbcInfo encodes the undirected edge as a tuple of (chain_1, chain_2) in alphabetical order - const fromChain1 = ibcInfo.chain_1.chain_name === name; - const [from, to] = fromChain1 - ? [ibcInfo.chain_1, ibcInfo.chain_2] - : [ibcInfo.chain_2, ibcInfo.chain_1]; - assert.equal(from.chain_name, name); - const transferChannels = ibcInfo.channels.filter( - c => - c.chain_1.port_id === 'transfer' && - // @ts-expect-error tags does not specify keys - c.tags?.preferred, - ); - if (transferChannels.length === 0) { - console.warn( - 'no transfer channel for [', - from.chain_name, - to.chain_name, - ']', - '(skipping)', - ); - return []; - } - if (transferChannels.length > 1) { - console.warn( - 'multiple preferred transfer channels [', - from.chain_name, - to.chain_name, - ']:', - transferChannels, - '(choosing first)', - ); - } - const [channel] = transferChannels; - const [channelFrom, channelTo] = fromChain1 - ? [channel.chain_1, channel.chain_2] - : [channel.chain_2, channel.chain_1]; - const record = { - id: /** @type {IBCConnectionID} */ (from.connection_id), - client_id: from.client_id, - counterparty: { - client_id: to.client_id, - connection_id: /** @type {IBCConnectionID} */ (to.connection_id), - }, - state: IBCConnectionState.STATE_OPEN, // XXX presumably - transferChannel: { - channelId: /** @type {IBCChannelID} */ (channelFrom.channel_id), - portId: channelFrom.port_id, - counterPartyChannelId: /** @type {IBCChannelID} */ (channelTo.channel_id), - counterPartyPortId: channelTo.port_id, - // FIXME mapping, our guard expects a numerical enum - ordering: Order.ORDER_NONE_UNSPECIFIED, - state: IBCChannelState.STATE_OPEN, // XXX presumably - version: channel.version, - }, - }; - const destChainId = chainInfo[to.chain_name].chainId; - return [destChainId, record]; -} - -/** - * Converts the given chain info to our local config format - * - * @param {Pick} registry - */ -export const convertChainInfo = async registry => { - /** @type {Record} */ - const chainInfo = {}; - - for (const chain of registry.chains) { - console.log('processing info', chain.chain_name); - chainInfo[chain.chain_name] = { - bech32Prefix: chain.bech32_prefix, - chainId: chain.chain_id, - stakingTokens: chain.staking?.staking_tokens, - // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 - icqEnabled: chain.chain_name === 'osmosis', - }; - } - - // XXX probably easier to keep ibc separate - const ibcLookup = {}; - for (const ibc of registry.ibcData) { - ibcLookup[ibc.chain_1.chain_name] ||= []; - ibcLookup[ibc.chain_2.chain_name] ||= []; - - ibcLookup[ibc.chain_1.chain_name].push(ibc); - ibcLookup[ibc.chain_2.chain_name].push(ibc); - } - - const chainNames = registry.chains.map(c => c.chain_name).sort(); - - // iterate this after chainInfo is filled out - for (const name of chainNames) { - console.log('processing connections', name); - - const ibcData = ibcLookup[name]; - const connections = Object.fromEntries( - ibcData - .map(datum => toConnectionEntry(datum, name, chainInfo)) - .filter(entry => entry.length > 0) - // sort alphabetically for consistency - .sort(([a], [b]) => a.localeCompare(b)), - ); - chainInfo[name] = { ...chainInfo[name], connections }; - } - - // return object with insertion in alphabetical order of chain name - return Object.fromEntries(chainNames.map(name => [name, chainInfo[name]])); -}; diff --git a/contract/utils/start-helper.js b/contract/utils/start-helper.js deleted file mode 100644 index 8e2a21c6..00000000 --- a/contract/utils/start-helper.js +++ /dev/null @@ -1,214 +0,0 @@ -import { prepareAsyncFlowTools } from '@agoric/async-flow'; -import { prepareVowTools } from '@agoric/vow/vat.js'; -import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; -import { makeDurableZone } from '@agoric/zone/durable.js'; -import { makeChainHub } from '../src/exos/chain-hub.js'; -import { prepareCosmosOrchestrationAccount } from '../src/exos/cosmos-orchestration-account.js'; -import { prepareLocalChainFacade } from '../src/exos/local-chain-facade.js'; -import { prepareLocalOrchestrationAccountKit } from '../src/exos/local-orchestration-account.js'; -import { prepareOrchestrator } from '../src/exos/orchestrator.js'; -import { prepareRemoteChainFacade } from '../src/exos/remote-chain-facade.js'; -import { makeOrchestrationFacade } from '../src/facade.js'; -import { makeZoeTools } from './zoe-tools.js'; -import { makeZcfTools } from './zcf-tools.js'; - -/** - * @import {LocalChain} from '@agoric/vats/src/localchain.js'; - * @import {TimerService, TimerBrand} from '@agoric/time'; - * @import {Baggage} from '@agoric/vat-data'; - * @import {NameHub} from '@agoric/vats'; - * @import {Remote} from '@agoric/vow'; - * @import {Zone} from '@agoric/zone'; - * @import {CosmosInterchainService} from '../exos/exo-interfaces.js'; - */ - -/** - * @typedef {{ - * localchain: Remote; - * orchestrationService: Remote; - * storageNode: Remote; - * timerService: Remote; - * agoricNames: Remote; - * }} OrchestrationPowers - */ - -/** - * Helper that a contract start function can use to set up the objects needed - * for orchestration. - * - * TODO strip problematic operations from ZCF (e.g., getPayouts) - * - * @param {ZCF} zcf - * @param {Baggage} baggage - * @param {OrchestrationPowers} remotePowers - * @param {Marshaller} marshaller - * @internal - */ -export const provideOrchestration = ( - zcf, - baggage, - remotePowers, - marshaller, -) => { - // separate zones - const zones = (() => { - const zone = makeDurableZone(baggage); - return { - /** system names for async flow */ - asyncFlow: zone.subZone('asyncFlow'), - /** system names for orchestration implementation */ - orchestration: zone.subZone('orchestration'), - /** system names for chainHub */ - chainHub: zone.subZone('chainHub'), - /** system names for vows */ - vows: zone.subZone('vows'), - /** contract-provided names, and subzones */ - contract: zone.subZone('contract'), - }; - })(); - - const { agoricNames, timerService, localchain } = remotePowers; - - const vowTools = prepareVowTools(zones.vows); - - const chainHub = makeChainHub(zones.chainHub, agoricNames, vowTools); - - const zoeTools = makeZoeTools(zcf, vowTools); - - const zcfTools = makeZcfTools(zcf, vowTools); - - const { makeRecorderKit } = prepareRecorderKitMakers(baggage, marshaller); - const makeLocalOrchestrationAccountKit = prepareLocalOrchestrationAccountKit( - zones.orchestration, - { - makeRecorderKit, - zcf, - timerService, - vowTools, - chainHub, - localchain, - zoeTools, - }, - ); - - const asyncFlowTools = prepareAsyncFlowTools(zones.asyncFlow, { - vowTools, - }); - - const makeCosmosOrchestrationAccount = prepareCosmosOrchestrationAccount( - zones.orchestration, - { - chainHub, - makeRecorderKit, - timerService, - vowTools, - zcf, - }, - ); - - const makeRemoteChainFacade = prepareRemoteChainFacade(zones.orchestration, { - makeCosmosOrchestrationAccount, - orchestration: remotePowers.orchestrationService, - storageNode: remotePowers.storageNode, - timer: remotePowers.timerService, - vowTools, - }); - - const makeLocalChainFacade = prepareLocalChainFacade(zones.orchestration, { - makeLocalOrchestrationAccountKit, - localchain: remotePowers.localchain, - // FIXME what path? - storageNode: remotePowers.storageNode, - agoricNames, - orchestration: remotePowers.orchestrationService, - timer: remotePowers.timerService, - vowTools, - }); - - const makeOrchestrator = prepareOrchestrator(zones.orchestration, { - chainHub, - makeLocalChainFacade, - makeRemoteChainFacade, - vowTools, - }); - - /** - * Create orchestrate functions in a specific zone, instead of the default - * `contract.orchestration` zone. This is used for modules that add their own - * orchestration functions (e.g., a Portfolio with orchestration flows for - * continuing offers) - * - * @param {Zone} zone - */ - const makeOrchestrateKit = zone => - makeOrchestrationFacade({ - zone, - zcf, - makeRecorderKit, - makeOrchestrator, - asyncFlowTools, - vowTools, - ...remotePowers, - }); - - // Create orchestrate functions for the default `contract.orchestration` zone - const defaultOrchestrateKit = makeOrchestrateKit( - zones.contract.subZone('orchestration'), - ); - - zcf.setTestJig(() => ({ - baggage, - chainHub, - })); - - return { - ...defaultOrchestrateKit, - makeOrchestrateKit, - chainHub, - vowTools, - asyncFlowTools, - zcfTools, - zoeTools, - zone: zones.contract, - }; -}; -harden(provideOrchestration); - -/** @typedef {Omit, 'zone'>} OrchestrationTools */ - -/** - * Simplifies contract functions for Orchestration by wrapping a simpler - * function with all the tools it needs in order to use Orchestration. - * - * @example - * - * ```js - * const contract = (zcf, privateArgs, zone, tools) => { ... }; - * export const start = withOrchestration(contract); - * ``` - * - * @template {Record} CT - * @template {OrchestrationPowers & { - * marshaller: Marshaller; - * }} PA - * @template R - * @param {( - * zcf: ZCF, - * privateArgs: PA, - * zone: Zone, - * tools: OrchestrationTools, - * ) => Promise} contractFn - * @returns {(zcf: ZCF, privateArgs: PA, baggage: Baggage) => Promise} a - * Zoe start function - */ -export const withOrchestration = - contractFn => async (zcf, privateArgs, baggage) => { - const { zone, ...tools } = provideOrchestration( - zcf, - baggage, - privateArgs, - privateArgs.marshaller, - ); - return contractFn(zcf, privateArgs, zone, tools); - }; -harden(withOrchestration); diff --git a/contract/utils/time.js b/contract/utils/time.js deleted file mode 100644 index 06f995ab..00000000 --- a/contract/utils/time.js +++ /dev/null @@ -1,48 +0,0 @@ -import { E } from '@endo/far'; -import { TimeMath } from '@agoric/time'; - -/** - * @import {RelativeTimeRecord, TimerBrand, TimerService} from '@agoric/time'; - * @import {Remote} from '@agoric/internal'; - */ - -export const SECONDS_PER_MINUTE = 60n; -export const MILLISECONDS_PER_SECOND = 1000n; -export const NANOSECONDS_PER_MILLISECOND = 1_000_000n; -export const NANOSECONDS_PER_SECOND = 1_000_000_000n; - -/** - * XXX should this be durable? resumable? - * - * @param {Remote} timer - */ -export function makeTimestampHelper(timer) { - return harden({ - /** - * XXX do this need to be resumable / use Vows? - * - * Takes the current time from ChainTimerService and adds a relative time to - * determine a timeout timestamp in nanoseconds. Useful for - * {@link MsgTransfer.timeoutTimestamp}. - * - * @param {RelativeTimeRecord} [relativeTime] defaults to 5 minutes - * @returns {Promise} Timeout timestamp in absolute nanoseconds - * since unix epoch - */ - async getTimeoutTimestampNS(relativeTime) { - const currentTime = await E(timer).getCurrentTimestamp(); - const timeout = - relativeTime || - TimeMath.coerceRelativeTimeRecord( - SECONDS_PER_MINUTE * 5n, - currentTime.timerBrand, - ); - return ( - TimeMath.addAbsRel(currentTime, timeout).absValue * - NANOSECONDS_PER_SECOND - ); - }, - }); -} - -/** @typedef {Awaited>} TimestampHelper */ diff --git a/contract/utils/zcf-tools.js b/contract/utils/zcf-tools.js deleted file mode 100644 index bc8027e6..00000000 --- a/contract/utils/zcf-tools.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @import {HostInterface} from '@agoric/async-flow'; - * @import {VowTools} from '@agoric/vow'; - * @import {ZcfTools} from '../src/types.js'; - */ - -import { M, mustMatch } from '@endo/patterns'; - -const HandlerShape = M.remotable('OfferHandler'); - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - * @returns {HostInterface} - */ -export const makeZcfTools = (zcf, vowTools) => - harden({ - makeInvitation(offerHandler, description, customDetails, proposalShape) { - mustMatch(offerHandler, HandlerShape); - return vowTools.watch( - zcf.makeInvitation( - offerHandler, - description, - customDetails, - proposalShape, - ), - ); - }, - atomicRearrange(transfers) { - zcf.atomicRearrange(transfers); - }, - assertUniqueKeyword(keyword) { - zcf.assertUniqueKeyword(keyword); - }, - }); diff --git a/contract/utils/zoe-tools.js b/contract/utils/zoe-tools.js deleted file mode 100644 index a5cbbe38..00000000 --- a/contract/utils/zoe-tools.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file Helper functions for transferring payments between a LocalChainAccount - * and a ZCFSeat. - * - * Maintainers: This exists as an endowment for orchestrated async-flows so we - * can make use of E and promises. The logic for recovering partial failures - * is also an added convenience for developers. - * - * Functions are written using `asVow` and non-resumable promises as we expect - * each invocation to resolve promptly - there are no timers or interchain - * network calls. - * - * A promise resolved promptly is currently safe from being severed by an - * upgrade because we only trigger vat upgrades as the result of network - * input. - */ - -import { makeError, q, Fail } from '@endo/errors'; -import { depositToSeat } from '@agoric/zoe/src/contractSupport/index.js'; -import { E } from '@endo/far'; - -const { assign, keys, values } = Object; - -/** - * @import {HostOf} from '@agoric/async-flow'; - * @import {InvitationMakers} from '@agoric/smart-wallet/src/types.js'; - * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; - * @import {VowTools} from '@agoric/vow'; - * @import {LocalAccountMethods} from '../types.js'; - */ - -/** - * @typedef {{ - * invitationMakers: InvitationMakers; - * publicSubscribers: Record>; - * }} ResolvedContinuingOfferResult - * - * @see {ContinuingOfferResult} - */ - -/** - * @typedef {( - * srcSeat: ZCFSeat, - * localAccount: LocalAccountMethods, - * amounts: AmountKeywordRecord, - * ) => Promise} LocalTransfer - */ - -/** - * @typedef {( - * localAccount: LocalAccountMethods, - * destSeat: ZCFSeat, - * amounts: AmountKeywordRecord, - * ) => Promise} WithdrawToSeat - */ - -/** - * @param {ZCF} zcf - * @param {VowTools} vowTools - */ -export const makeZoeTools = (zcf, { when, allVows, allSettled, asVow }) => { - /** - * Transfer the `amounts` from `srcSeat` to `localAccount`. If any of the - * deposits fail, everything will be rolled back to the `srcSeat`. Supports - * multiple items in the `amounts` {@link AmountKeywordRecord}. - * - * @type {HostOf} - */ - const localTransfer = (srcSeat, localAccount, amounts) => - asVow(async () => { - !srcSeat.hasExited() || Fail`The seat cannot have exited.`; - const { zcfSeat: tempSeat, userSeat: userSeatP } = zcf.makeEmptySeatKit(); - const userSeat = await userSeatP; - zcf.atomicRearrange(harden([[srcSeat, tempSeat, amounts]])); - tempSeat.exit(); - // TODO (#9541) get the userSeat into baggage so it's at least recoverable - // const userSeat = await subzone.makeOnce( - // 'localTransferHelper', - // async () => { - // const { zcfSeat: tempSeat, userSeat: userSeatP } = - // zcf.makeEmptySeatKit(); - // const uSeat = await userSeatP; - // // TODO how do I store in the place for this retryable? - // atomicTransfer(zcf, srcSeat, tempSeat, amounts); - // tempSeat.exit(); - // return uSeat; - // }, - // ); - - // Now all the `amounts` are accessible, so we can move them to the localAccount - const payments = await Promise.all( - keys(amounts).map(kw => E(userSeat).getPayout(kw)), - ); - const settleDeposits = await when( - allSettled(payments.map(pmt => E(localAccount).deposit(pmt))), - ); - // if any of the deposits to localAccount failed, unwind all of the allocations - if (settleDeposits.find(x => x.status === 'rejected')) { - const amts = values(amounts); - const errors = []; - // withdraw the successfully deposited payments - const paymentsOrWithdrawVs = settleDeposits.map((x, i) => { - if (x.status === 'rejected') { - errors.push(x.reason); - return payments[i]; - } - return E(localAccount).withdraw(amts[i]); - }); - - // return all payments to the srcSeat - const paymentsToReturn = await when(allVows(paymentsOrWithdrawVs)); - const paymentKwr = harden( - keys(amounts).reduce( - (kwr, kw, i) => assign(kwr, { [kw]: paymentsToReturn[i] }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - srcSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - throw makeError(`One or more deposits failed ${q(errors)}`); - } - // TODO #9541 remove userSeat from baggage - }); - - /** - * Transfer the `amounts` from a `localAccount` to the `recipientSeat`. If any - * of the withdrawals fail, everything will be rolled back to the - * `srcLocalAccount`. Supports multiple items in the `amounts` - * {@link PaymentKeywordRecord} - * - * @type {HostOf} - */ - const withdrawToSeat = (localAccount, destSeat, amounts) => - asVow(async () => { - !destSeat.hasExited() || Fail`The seat cannot have exited.`; - - const settledWithdrawals = await when( - allSettled(values(amounts).map(amt => E(localAccount).withdraw(amt))), - ); - - // if any of the withdrawals were rejected, unwind the successful ones - if (settledWithdrawals.find(x => x.status === 'rejected')) { - const returnPaymentVs = []; - const errors = []; - for (const result of settledWithdrawals) { - if (result.status === 'fulfilled') { - returnPaymentVs.push(E(localAccount).deposit(result.value)); - } else { - errors.push(result.reason); - } - } - await when(allVows(returnPaymentVs)); - throw makeError(`One or more withdrawals failed ${q(errors)}`); - } - // successfully withdrew payments from srcLocalAccount, deposit to recipientSeat - const paymentKwr = harden( - keys(amounts).reduce( - (acc, kw, i) => - assign(acc, { - [kw]: /** @type {{ value: Amount }[]} */ (settledWithdrawals)[i] - .value, - }), - {}, - ), - ); - const depositResponse = await depositToSeat( - zcf, - destSeat, - amounts, - paymentKwr, - ); - console.debug(depositResponse); - }); - - return harden({ - localTransfer, - withdrawToSeat, - }); -}; - -/** @typedef {ReturnType} ZoeTools */ diff --git a/yarn.lock b/yarn.lock index b59e68ee..b7e4a8f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,25 +58,6 @@ __metadata: languageName: node linkType: hard -"@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.1.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/async-flow@npm:0.1.1-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/cb1af5786225ee908213797d1a80dcfaf8c5cc5e0e210e14a49680d2485ecec14dd3d73f6b71daa4f1029b0814e06232153ebde3a4d95587856ca98ce470177c - languageName: node - linkType: hard - "@agoric/async-flow@npm:^0.1.1-u17.1": version: 0.1.1-upgrade-18-dev-ef001c0.0 resolution: "@agoric/async-flow@npm:0.1.1-upgrade-18-dev-ef001c0.0" @@ -96,6 +77,25 @@ __metadata: languageName: node linkType: hard +"@agoric/async-flow@npm:^0.2.0-u18.0": + version: 0.2.0-upgrade-18-dev-bf39b10.0 + resolution: "@agoric/async-flow@npm:0.2.0-upgrade-18-dev-bf39b10.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" + "@agoric/vow": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "npm:^1.2.7" + "@endo/eventual-send": "npm:^1.2.7" + "@endo/marshal": "npm:^1.6.1" + "@endo/pass-style": "npm:^1.4.6" + "@endo/patterns": "npm:^1.4.6" + "@endo/promise-kit": "npm:^1.1.7" + checksum: 10c0/6db3a772f38a0c511efea75f4e5f3b1c10ff26f6b11585a9688ff198936c56ef6088c36f988e0f355883ed633b4650c6500958b172e145f576e3de6d087b62ea + languageName: node + linkType: hard + "@agoric/babel-generator@npm:^7.17.4, @agoric/babel-generator@npm:^7.17.6": version: 7.17.6 resolution: "@agoric/babel-generator@npm:7.17.6" @@ -122,21 +122,6 @@ __metadata: languageName: node linkType: hard -"@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.1.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/base-zone@npm:0.1.1-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/b30362368bd2d29b12e19f4809023844a44ed512369cba37a27107b41f66c782d68cc58fde749089465d872bf435b73991792dbcf439c9e85591e2e187c4066f - languageName: node - linkType: hard - "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.1.1-upgrade-18-dev-bf39b10.0 resolution: "@agoric/base-zone@npm:0.1.1-upgrade-18-dev-bf39b10.0" @@ -278,17 +263,7 @@ __metadata: languageName: node linkType: hard -"@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.5.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@endo/base64": "npm:^1.0.7" - "@endo/init": "npm:^1.1.4" - checksum: 10c0/7b13087e41fffd9d41f3451a2efe984fe5a0ead1b04a8e8aecd3e10c11ee19bedbb3598963c5ea0232b4c7cce73b390aecce7cb9863542e448d619b2e55a74e5 - languageName: node - linkType: hard - -"@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/cosmic-proto@npm:^0.5.0-u18.1": version: 0.5.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/cosmic-proto@npm:0.5.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -331,25 +306,6 @@ __metadata: languageName: node linkType: hard -"@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.16.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/ertp@npm:0.16.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/7d3a80c64a1babde365f9d25ade71101dfa108392903d2a895777fd58f1f013615e22db4fc3aac0f50849d15d93a694515945a8a9abc4b595ce1db8f98a084be - languageName: node - linkType: hard - "@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.16.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-bf39b10.0" @@ -369,7 +325,7 @@ __metadata: languageName: node linkType: hard -"@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1": +"@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/ertp@npm:^0.16.3-dev-e2e36cc.0, @agoric/ertp@npm:^0.16.3-u17.1, @agoric/ertp@npm:^0.16.3-u18.0": version: 0.16.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/ertp@npm:0.16.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -426,30 +382,6 @@ __metadata: languageName: node linkType: hard -"@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.10.4-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/governance@npm:0.10.4-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/promise-kit": "npm:^1.1.5" - import-meta-resolve: "npm:^2.2.1" - checksum: 10c0/617f0729472471948dc63430b8b3ce10abde44bc535246c7faa4c0328b196733e429652ec22eedffdf5b554b277a988ae089ee92390acbf69d15bd78ace6deec - languageName: node - linkType: hard - "@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.10.4-upgrade-18-dev-bf39b10.0 resolution: "@agoric/governance@npm:0.10.4-upgrade-18-dev-bf39b10.0" @@ -619,27 +551,7 @@ __metadata: languageName: node linkType: hard -"@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.4.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/internal@npm:0.4.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/stream": "npm:^1.2.5" - anylogger: "npm:^0.21.0" - jessie.js: "npm:^0.3.4" - checksum: 10c0/141817835928f890d874aeebbddb59e0f88a8683f15691687a6888bcc44885eb678a931bfee10af5e913f77ae9c7078216eab4252dd14a0ef101c8211e7416ce - languageName: node - linkType: hard - -"@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/internal@npm:^0.4.0-u17.1": +"@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/internal@npm:^0.4.0-u17.1, @agoric/internal@npm:^0.4.0-u18.0": version: 0.4.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/internal@npm:0.4.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -675,17 +587,6 @@ __metadata: languageName: node linkType: hard -"@agoric/kmarshal@npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.1.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-17-dev-ec448b0.0" - dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - checksum: 10c0/7ba05a4944d7eac6138a80b37aa07b8b08ad76b562fe49958eb9a3851313c9b98bd167865c91c42fb6749d09e0ec95a3d996f9265a59f52c91b5b137a4669cab - languageName: node - linkType: hard - "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.1.1-upgrade-18-dev-bf39b10.0 resolution: "@agoric/kmarshal@npm:0.1.1-upgrade-18-dev-bf39b10.0" @@ -742,24 +643,7 @@ __metadata: languageName: node linkType: hard -"@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/network@npm:0.2.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/a8a0a1af170e99616ec9dd890cabcca0f2e6680e401d38eca631b50e877d9183edd8d5ec8bb557a8ffa09f3a9b3beea635eb52a0f042f4955019fd24cdf89817 - languageName: node - linkType: hard - -"@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/network@npm:^0.2.0-u18.0": version: 0.2.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/network@npm:0.2.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -791,22 +675,7 @@ __metadata: languageName: node linkType: hard -"@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.7.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/notifier@npm:0.7.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/af93e56e082342facdd87d5265dc7988d641f2d011da03b9c63563c99a9065676dd4d9f869d0a4d83d90bdc6e2c91ce7039aa036c887b8cdd4b454ac17393905 - languageName: node - linkType: hard - -"@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/notifier@npm:^0.7.0-u18.0": version: 0.7.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/notifier@npm:0.7.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -838,57 +707,30 @@ __metadata: languageName: node linkType: hard -"@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/orchestration@npm:0.2.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/async-flow": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" - "@noble/hashes": "npm:^1.5.0" - checksum: 10c0/0598541cb70b67490cded3972cec426ea99f86a670dad5c538edec7c46361163c03e64af5f18c700c489ced8c09e20c14750a02b7e3894216b68eaa5e471be15 - languageName: node - linkType: hard - -"@agoric/orchestration@patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/orchestration@patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch::version=0.2.0-upgrade-17-dev-ec448b0.0&hash=f122bf" - dependencies: - "@agoric/async-flow": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vats": "npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" +"@agoric/orchestration@npm:0.2.0-u18.1": + version: 0.2.0-u18.1 + resolution: "@agoric/orchestration@npm:0.2.0-u18.1" + dependencies: + "@agoric/async-flow": "npm:^0.2.0-u18.0" + "@agoric/cosmic-proto": "npm:^0.5.0-u18.1" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/network": "npm:^0.2.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.1" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/base64": "npm:^1.0.8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + "@endo/patterns": "npm:^1.4.6" "@noble/hashes": "npm:^1.5.0" - checksum: 10c0/b3bc83a0bf2c172b1639af82dc4cf0c60cf4a3e5fd66d46cf02d293d3b7079502161b9cc9dd4df56bd684f2e9e7fb22692d991f23072dd67c752ddd139187f20 + checksum: 10c0/6791e888aabc778c63ea3c6c49d102d0dd772c749ffacf81b00b18ad357369803b61a9f70140f9fc0a07a885ae762f8e78883eda0912f80d85ae46b7acaae7bd languageName: node linkType: hard @@ -1035,19 +877,6 @@ __metadata: languageName: node linkType: hard -"@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.9.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/store@npm:0.9.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@endo/errors": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/marshal": "npm:^1.5.3" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/1ef22b1508979b5cdbed7a705fc84cb3f5d9d1a53afa34446d48c4b633d42a17881e7b8281e7c8458457d34889e9bab6e75acc5878bc4664390cd776dd8364a6 - languageName: node - linkType: hard - "@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.9.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-bf39b10.0" @@ -1061,7 +890,7 @@ __metadata: languageName: node linkType: hard -"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u17.1": +"@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/store@npm:^0.9.3-u17.1, @agoric/store@npm:^0.9.3-u18.0": version: 0.9.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/store@npm:0.9.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -1107,21 +936,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.9.2-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swing-store@npm:0.9.2-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/check-bundle": "npm:^1.0.9" - "@endo/errors": "npm:^1.2.5" - "@endo/nat": "npm:^5.0.10" - better-sqlite3: "npm:^9.1.1" - checksum: 10c0/2896d1ea54a11e0064bcc7fd6e0451fcfee86c34498e1b8d4d6f0d1c430e22cf95f4e875c920dae7c5f13f1ea12b77d017055629d3a4946900201e06e85a9906 - languageName: node - linkType: hard - "@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0+ef001c0": version: 0.9.2-upgrade-18-dev-ef001c0.0 resolution: "@agoric/swing-store@npm:0.9.2-upgrade-18-dev-ef001c0.0" @@ -1173,27 +987,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.10.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/6ac445b9729f737f4a2a3f43f25b255df293e0e6df710920a3879d693da4240e968580cd70b1c2e7a92e38090afc47d2c5d990ed2f2535002734de1e84c63dab - languageName: node - linkType: hard - "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.10.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/swingset-liveslots@npm:0.10.3-upgrade-18-dev-bf39b10.0" @@ -1308,54 +1101,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.33.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/kmarshal": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swing-store": "npm:0.9.2-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/xsnap": "npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/base64": "npm:^1.0.7" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/check-bundle": "npm:^1.0.9" - "@endo/compartment-mapper": "npm:^1.2.2" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/import-bundle": "npm:^1.2.2" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/ses-ava": "npm:^1.2.5" - "@endo/stream": "npm:^1.2.5" - "@endo/zip": "npm:^1.0.7" - ansi-styles: "npm:^6.2.1" - anylogger: "npm:^0.21.0" - better-sqlite3: "npm:^9.1.1" - import-meta-resolve: "npm:^2.2.1" - microtime: "npm:^3.1.0" - semver: "npm:^6.3.0" - tmp: "npm:^0.2.1" - yargs-parser: "npm:^21.1.1" - peerDependencies: - ava: ^5.3.0 - bin: - vat: bin/vat - checksum: 10c0/faa84e846fa4305b451ff42a835c5526e5ebbbd260ecc939857c4f8784b6d38ee47210bd8a684ef46b7dba3cdae11202668071b20f91a86905563060be6705f4 - languageName: node - linkType: hard - "@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.33.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/swingset-vat@npm:0.33.0-upgrade-18-dev-bf39b10.0" @@ -1446,13 +1191,6 @@ __metadata: languageName: node linkType: hard -"@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.10.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-17-dev-ec448b0.0" - checksum: 10c0/0b07fb3a628f96a5e32e26db4d50fb27897340b8759405f0315e15ca60a31c484edee84853fe9d8cdcf51b2f29ab79dfe5f86eeda0358e8462cedb12c099534f - languageName: node - linkType: hard - "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.10.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-upgrade-18-dev-bf39b10.0" @@ -1474,18 +1212,6 @@ __metadata: languageName: node linkType: hard -"@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/time@npm:0.3.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/nat": "npm:^5.0.10" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/f010169a36f1ff1bf1663378577e7a9792c58083ea491ddf0bd4225f3a59e3beefe858d81f2c8f8bc6849eaf5a8800f2b818f47345aab619b48de979bd521b8d - languageName: node - linkType: hard - "@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.3.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-bf39b10.0" @@ -1498,7 +1224,7 @@ __metadata: languageName: node linkType: hard -"@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/time@npm:^0.3.3-u17.1": +"@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/time@npm:^0.3.3-u17.1, @agoric/time@npm:^0.3.3-u18.0": version: 0.3.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/time@npm:0.3.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -1535,20 +1261,6 @@ __metadata: languageName: node linkType: hard -"@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.5.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/vat-data@npm:0.5.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/patterns": "npm:^1.4.3" - checksum: 10c0/6b7cf74253187971da6a79ff7e90e0256390233f79f1645f30c9267ab46095e93251bc012b8abde8161ef866904b22ce77aaf67c11976f2d7ce1ab5e0fd13c8e - languageName: node - linkType: hard - "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.5.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/vat-data@npm:0.5.3-upgrade-18-dev-bf39b10.0" @@ -1619,38 +1331,7 @@ __metadata: languageName: node linkType: hard -"@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.16.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/vats@npm:0.16.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/governance": "npm:0.10.4-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/network": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zoe": "npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/import-bundle": "npm:^1.2.2" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - import-meta-resolve: "npm:^2.2.1" - jessie.js: "npm:^0.3.4" - checksum: 10c0/8137baa3f735050bcfe012439dcb3f261c5ae63073ddde740c10c04f7ea009a8aa37de6a6bd1e89c0147b056b3f219d9644e4c794c5d58ce00f2478bba17eee1 - languageName: node - linkType: hard - -"@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vats@npm:^0.16.0-u17.1": +"@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vats@npm:^0.16.0-u17.1, @agoric/vats@npm:^0.16.0-u18.1": version: 0.16.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/vats@npm:0.16.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -1725,23 +1406,7 @@ __metadata: languageName: node linkType: hard -"@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.2.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/vow@npm:0.2.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/env-options": "npm:^1.1.6" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - checksum: 10c0/709c949b185aa583eebee07c24c1a7ab7e19a8e1323322f2d96ee5b9d4175fa13ec8aa4a6e35a8fe72cc307a422c84865037e562e5c78e9f28eee7577971c1f3 - languageName: node - linkType: hard - -"@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vow@npm:^0.2.0-u17.1": +"@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/vow@npm:^0.2.0-u17.1, @agoric/vow@npm:^0.2.0-u18.0": version: 0.2.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/vow@npm:0.2.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -1775,13 +1440,6 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.14.1-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-17-dev-ec448b0.0" - checksum: 10c0/78c3bab502052987c88e3e3fffe87aa599a4c47a0f87ba32e5f5722d7a45be6c519eb6305f323ff877e2a911d273a03a9eebd3c9c57b7815b9510bd65ea9cb81 - languageName: node - linkType: hard - "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.14.1-upgrade-18-dev-bf39b10.0 resolution: "@agoric/xsnap-lockdown@npm:0.14.1-upgrade-18-dev-bf39b10.0" @@ -1803,29 +1461,6 @@ __metadata: languageName: node linkType: hard -"@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.14.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/xsnap@npm:0.14.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/xsnap-lockdown": "npm:0.14.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/init": "npm:^1.1.4" - "@endo/netstring": "npm:^1.0.10" - "@endo/promise-kit": "npm:^1.1.5" - "@endo/stream": "npm:^1.2.5" - "@endo/stream-node": "npm:^1.1.5" - glob: "npm:^7.1.6" - tmp: "npm:^0.2.1" - bin: - ava-xs: src/ava-xs.js - xsrepl: src/xsrepl - checksum: 10c0/68c6896dcd493748a2b610b7dafb5fcd9ae4108eab659f7415cdeee3748af5d22af668e378467d2ef778a378f41e6198a8a4a1c7e77d6b63afdce79acb3ff387 - languageName: node - linkType: hard - "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.14.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/xsnap@npm:0.14.3-upgrade-18-dev-bf39b10.0" @@ -1895,39 +1530,6 @@ __metadata: languageName: node linkType: hard -"@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.26.3-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/zoe@npm:0.26.3-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/ertp": "npm:0.16.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/internal": "npm:0.4.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/notifier": "npm:0.7.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/store": "npm:0.9.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-liveslots": "npm:0.10.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/time": "npm:0.3.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vow": "npm:0.2.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/zone": "npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/bundle-source": "npm:^3.4.0" - "@endo/captp": "npm:^4.3.0" - "@endo/common": "npm:^1.2.5" - "@endo/errors": "npm:^1.2.5" - "@endo/eventual-send": "npm:^1.2.5" - "@endo/exo": "npm:^1.5.3" - "@endo/far": "npm:^1.1.5" - "@endo/import-bundle": "npm:^1.2.2" - "@endo/marshal": "npm:^1.5.3" - "@endo/nat": "npm:^5.0.10" - "@endo/pass-style": "npm:^1.4.3" - "@endo/patterns": "npm:^1.4.3" - "@endo/promise-kit": "npm:^1.1.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/8d3fa51faeedc72f843c80a7bd8c07006c5e74277d0e590d5f92bfd62c1cc4661fd0767d703031cc2995e013419380614d956deca6d33ee239cde593078b2c7e - languageName: node - linkType: hard - "@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10": version: 0.26.3-upgrade-18-dev-bf39b10.0 resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-bf39b10.0" @@ -1961,7 +1563,7 @@ __metadata: languageName: node linkType: hard -"@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/zoe@npm:^0.26.3-u17.1": +"@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0+ef001c0, @agoric/zoe@npm:^0.26.3-u17.1, @agoric/zoe@npm:^0.26.3-u18.0": version: 0.26.3-upgrade-18-dev-ef001c0.0 resolution: "@agoric/zoe@npm:0.26.3-upgrade-18-dev-ef001c0.0" dependencies: @@ -2032,20 +1634,7 @@ __metadata: languageName: node linkType: hard -"@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0+ec448b0": - version: 0.3.0-upgrade-17-dev-ec448b0.0 - resolution: "@agoric/zone@npm:0.3.0-upgrade-17-dev-ec448b0.0" - dependencies: - "@agoric/base-zone": "npm:0.1.1-upgrade-17-dev-ec448b0.0+ec448b0" - "@agoric/vat-data": "npm:0.5.3-upgrade-17-dev-ec448b0.0+ec448b0" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/pass-style": "npm:^1.4.3" - checksum: 10c0/0275010c155aa3e860ffb9d4de18d56db87f06552bbb9f2a81d4c678f9c503ac19c93eebe95fc727221209d889d5dc7853eaa70dc915edadb2943c3af87637d6 - languageName: node - linkType: hard - -"@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10": +"@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10, @agoric/zone@npm:^0.3.0-u18.0": version: 0.3.0-upgrade-18-dev-bf39b10.0 resolution: "@agoric/zone@npm:0.3.0-upgrade-18-dev-bf39b10.0" dependencies: @@ -3789,7 +3378,7 @@ __metadata: languageName: node linkType: hard -"@endo/base64@npm:^1.0.7, @endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9, @endo/base64@npm:latest": +"@endo/base64@npm:^1.0.8, @endo/base64@npm:^1.0.9, @endo/base64@npm:latest": version: 1.0.9 resolution: "@endo/base64@npm:1.0.9" checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 @@ -3820,7 +3409,7 @@ __metadata: languageName: node linkType: hard -"@endo/bundle-source@npm:^3.4.0, @endo/bundle-source@npm:^3.4.2, @endo/bundle-source@npm:^3.5.0": +"@endo/bundle-source@npm:^3.4.2, @endo/bundle-source@npm:^3.5.0": version: 3.5.0 resolution: "@endo/bundle-source@npm:3.5.0" dependencies: @@ -3854,7 +3443,7 @@ __metadata: languageName: node linkType: hard -"@endo/captp@npm:^4.3.0, @endo/captp@npm:^4.4.2": +"@endo/captp@npm:^4.4.2": version: 4.4.3 resolution: "@endo/captp@npm:4.4.3" dependencies: @@ -3877,7 +3466,7 @@ __metadata: languageName: node linkType: hard -"@endo/check-bundle@npm:^1.0.11, @endo/check-bundle@npm:^1.0.9": +"@endo/check-bundle@npm:^1.0.11": version: 1.0.12 resolution: "@endo/check-bundle@npm:1.0.12" dependencies: @@ -3902,7 +3491,7 @@ __metadata: languageName: node linkType: hard -"@endo/common@npm:^1.2.5, @endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": +"@endo/common@npm:^1.2.7, @endo/common@npm:^1.2.8": version: 1.2.8 resolution: "@endo/common@npm:1.2.8" dependencies: @@ -3937,7 +3526,7 @@ __metadata: languageName: node linkType: hard -"@endo/compartment-mapper@npm:^1.2.2, @endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": +"@endo/compartment-mapper@npm:^1.3.1, @endo/compartment-mapper@npm:^1.4.0": version: 1.4.0 resolution: "@endo/compartment-mapper@npm:1.4.0" dependencies: @@ -3957,14 +3546,14 @@ __metadata: languageName: node linkType: hard -"@endo/env-options@npm:^1.1.6, @endo/env-options@npm:^1.1.7, @endo/env-options@npm:^1.1.8": +"@endo/env-options@npm:^1.1.7, @endo/env-options@npm:^1.1.8": version: 1.1.8 resolution: "@endo/env-options@npm:1.1.8" checksum: 10c0/2f519f48a5b966dbd9e66134d4abc89ff02b9791d21146b49031ceb694584f3f41c6119125b6bb4eb0d347f5bcd846473b5f3c4ae6bae3dac19402fcaf522520 languageName: node linkType: hard -"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.5, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": +"@endo/errors@npm:^1.2.4, @endo/errors@npm:^1.2.7, @endo/errors@npm:^1.2.8": version: 1.2.8 resolution: "@endo/errors@npm:1.2.8" dependencies: @@ -4006,7 +3595,7 @@ __metadata: languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.5, @endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": +"@endo/eventual-send@npm:^1.2.7, @endo/eventual-send@npm:^1.2.8": version: 1.2.8 resolution: "@endo/eventual-send@npm:1.2.8" dependencies: @@ -4027,7 +3616,7 @@ __metadata: languageName: node linkType: hard -"@endo/exo@npm:^1.5.3, @endo/exo@npm:^1.5.6": +"@endo/exo@npm:^1.5.6": version: 1.5.7 resolution: "@endo/exo@npm:1.5.7" dependencies: @@ -4052,7 +3641,7 @@ __metadata: languageName: node linkType: hard -"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.5, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.4, @endo/far@npm:^1.1.8, @endo/far@npm:^1.1.9": version: 1.1.9 resolution: "@endo/far@npm:1.1.9" dependencies: @@ -4073,7 +3662,7 @@ __metadata: languageName: node linkType: hard -"@endo/import-bundle@npm:^1.2.2, @endo/import-bundle@npm:^1.3.1": +"@endo/import-bundle@npm:^1.3.1": version: 1.3.2 resolution: "@endo/import-bundle@npm:1.3.2" dependencies: @@ -4098,7 +3687,7 @@ __metadata: languageName: node linkType: hard -"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.4, @endo/init@npm:^1.1.6, @endo/init@npm:^1.1.7": +"@endo/init@npm:^1.1.3, @endo/init@npm:^1.1.6, @endo/init@npm:^1.1.7": version: 1.1.7 resolution: "@endo/init@npm:1.1.7" dependencies: @@ -4140,7 +3729,7 @@ __metadata: languageName: node linkType: hard -"@endo/marshal@npm:^1.5.3, @endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": +"@endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": version: 1.6.2 resolution: "@endo/marshal@npm:1.6.2" dependencies: @@ -4174,7 +3763,7 @@ __metadata: languageName: node linkType: hard -"@endo/nat@npm:^5.0.10, @endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13, @endo/nat@npm:^5.0.9": +"@endo/nat@npm:^5.0.12, @endo/nat@npm:^5.0.13, @endo/nat@npm:^5.0.9": version: 5.0.13 resolution: "@endo/nat@npm:5.0.13" checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 @@ -4192,7 +3781,7 @@ __metadata: languageName: node linkType: hard -"@endo/netstring@npm:^1.0.10, @endo/netstring@npm:^1.0.12": +"@endo/netstring@npm:^1.0.12": version: 1.0.13 resolution: "@endo/netstring@npm:1.0.13" dependencies: @@ -4214,7 +3803,7 @@ __metadata: languageName: node linkType: hard -"@endo/pass-style@npm:^1.4.3, @endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": +"@endo/pass-style@npm:^1.4.6, @endo/pass-style@npm:^1.4.7": version: 1.4.7 resolution: "@endo/pass-style@npm:1.4.7" dependencies: @@ -4238,7 +3827,7 @@ __metadata: languageName: node linkType: hard -"@endo/patterns@npm:^1.4.3, @endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": +"@endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": version: 1.4.7 resolution: "@endo/patterns@npm:1.4.7" dependencies: @@ -4260,7 +3849,7 @@ __metadata: languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.5, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": +"@endo/promise-kit@npm:^1.1.4, @endo/promise-kit@npm:^1.1.7, @endo/promise-kit@npm:^1.1.8": version: 1.1.8 resolution: "@endo/promise-kit@npm:1.1.8" dependencies: @@ -4269,7 +3858,7 @@ __metadata: languageName: node linkType: hard -"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.5, @endo/ses-ava@npm:^1.2.7": +"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.7": version: 1.2.8 resolution: "@endo/ses-ava@npm:1.2.8" dependencies: @@ -4319,7 +3908,7 @@ __metadata: languageName: node linkType: hard -"@endo/stream-node@npm:^1.1.5, @endo/stream-node@npm:^1.1.7": +"@endo/stream-node@npm:^1.1.7": version: 1.1.8 resolution: "@endo/stream-node@npm:1.1.8" dependencies: @@ -4342,7 +3931,7 @@ __metadata: languageName: node linkType: hard -"@endo/stream@npm:^1.2.5, @endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": +"@endo/stream@npm:^1.2.7, @endo/stream@npm:^1.2.8": version: 1.2.8 resolution: "@endo/stream@npm:1.2.8" dependencies: @@ -4381,7 +3970,7 @@ __metadata: languageName: node linkType: hard -"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.8, @endo/zip@npm:^1.0.9": +"@endo/zip@npm:^1.0.8, @endo/zip@npm:^1.0.9": version: 1.0.9 resolution: "@endo/zip@npm:1.0.9" checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc @@ -11871,7 +11460,7 @@ __metadata: "@agoric/inter-protocol": "npm:^0.17.0-u17.1" "@agoric/internal": "npm:^0.4.0-u17.1" "@agoric/network": "npm:0.1.1-dev-d1562a1.0" - "@agoric/orchestration": "patch:@agoric/orchestration@npm%3A0.2.0-upgrade-17-dev-ec448b0.0#~/.yarn/patches/@agoric-orchestration-npm-0.2.0-upgrade-17-dev-ec448b0.0-f94046c01d.patch" + "@agoric/orchestration": "npm:0.2.0-u18.1" "@agoric/smart-wallet": "npm:^0.5.4-u17.1" "@agoric/store": "npm:^0.9.3-u17.1" "@agoric/time": "npm:^0.3.3-u17.1" From d7cb2d9756d4d4cb306d3af571b59fd530753658 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 20 Nov 2024 18:52:03 +0500 Subject: [PATCH 27/31] fixup! format --- contract/tools/ibc-mocks.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contract/tools/ibc-mocks.ts b/contract/tools/ibc-mocks.ts index 757c4c2b..273f0fec 100644 --- a/contract/tools/ibc-mocks.ts +++ b/contract/tools/ibc-mocks.ts @@ -22,7 +22,10 @@ import type { import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js'; import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64'; import type { ChainAddress } from '@agoric/orchestration/src/orchestration-api.js'; -import { makeQueryPacket, makeTxPacket } from '@agoric/orchestration/src/utils/packet.js'; +import { + makeQueryPacket, + makeTxPacket, +} from '@agoric/orchestration/src/utils/packet.js'; interface EncoderI { encode: (message: T) => { From 86d41c2a95a56b02d921961a0862fcefdcaba43c Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Fri, 6 Dec 2024 07:51:50 +0500 Subject: [PATCH 28/31] chore: adding proposal and init files for auto-stake-it --- contract/scripts/init-auto-stake-it.js | 128 +++++++++++++++++ contract/src/auto-stake-it.proposal.js | 188 +++++++++++++++++++++++++ 2 files changed, 316 insertions(+) create mode 100644 contract/scripts/init-auto-stake-it.js create mode 100644 contract/src/auto-stake-it.proposal.js diff --git a/contract/scripts/init-auto-stake-it.js b/contract/scripts/init-auto-stake-it.js new file mode 100644 index 00000000..953d71ba --- /dev/null +++ b/contract/scripts/init-auto-stake-it.js @@ -0,0 +1,128 @@ +/** + * @file build core eval script to deploy auto-stake-it contract + * + * Usage: + * agoric run init-auto-stake-it.js + * or + * agoric run init-auto-stake-it.js --net emerynet \ + * --peer osmosis:connection-128:channel-115:uosmo + */ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { + CosmosChainInfoShape, + IBCConnectionInfoShape, +} from '@agoric/orchestration/src/typeGuards.js'; +import { M, mustMatch } from '@endo/patterns'; +import { execFileSync } from 'node:child_process'; +import { parseArgs } from 'node:util'; +import { + getManifestForAutoStakeIt, + startAutoStakeItContract, +} from '../../src/auto-stake-it.proposal.js'; +import { makeAgd } from '../../tools/agd-lib.js'; + +const options = { + net: { type: 'string' }, + peer: { type: 'string', multiple: true }, +}; + +export const defaultProposalBuilder = async ( + { publishRef, install }, + { chainDetails }, +) => { + return harden({ + sourceSpec: '../../src/auto-stake-it.proposal.js', + getManifestCall: [ + getManifestForAutoStakeIt.name, + { + installKeys: { + autoStakeIt: publishRef(install('../../src/auto-stake-it.contract.js')), + }, + chainDetails, + }, + ], + }); +}; + +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + const { scriptArgs } = endowments; + const { values: flags } = parseArgs({ args: scriptArgs, options }); + + const getNetConfig = net => + fetch(`https://${net}.agoric.net/network-config`) + .then(res => res.text()) + .then(s => JSON.parse(s)); + + const parsePeers = strs => { + const peerParts = strs.map(s => s.split(':')); + const badPeers = peerParts.filter(d => d.length !== 4); + if (badPeers.length) { + throw Error( + `peers must be name:connection-X:channel-Y:denom, not ${badPeers.join(', ')}`, + ); + } + return peerParts; + }; + + const chainDetails = {}; + + if (flags.net) { + if (!flags.peer) throw Error('--peer required'); + const connections = {}; + const portId = 'transfer'; + + const { chainName: chainId, rpcAddrs } = await getNetConfig(flags.net); + const agd = makeAgd({ execFileSync }).withOpts({ rpcAddrs }); + + for (const [peerName, myConn, myChan, denom] of parsePeers(flags.peer)) { + console.debug(peerName, { denom }); + const connInfo = await agd + .query(['ibc', 'connection', 'end', myConn]) + .then(x => x.connection); + const { client_id } = connInfo; + const clientState = await agd + .query(['ibc', 'client', 'state', client_id]) + .then(x => x.client_state); + const { chain_id: peerId } = clientState; + + chainDetails[peerName] = { chainId: peerId, stakingTokens: [{ denom }] }; + + const chan = await agd + .query(['ibc', 'channel', 'end', portId, myChan]) + .then(r => r.channel); + + const info = harden({ + client_id, + counterparty: { + client_id: connInfo.counterparty.client_id, + connection_id: connInfo.counterparty.connection_id, + prefix: { key_prefix: 'arbitrary - not used?' }, + }, + id: myConn, + state: connInfo.state, + transferChannel: { + channelId: myChan, + counterPartyChannelId: chan.counterparty.channel_id, + counterPartyPortId: chan.counterparty.port_id, + ordering: chan.ordering, + portId, + state: chan.state, + version: chan.version, + }, + }); + mustMatch(info, IBCConnectionInfoShape); + connections[peerId] = info; + } + + chainDetails['agoric'] = { + chainId, + stakingTokens: [{ denom: 'ubld' }], + connections, + }; + } + mustMatch(harden(chainDetails), M.recordOf(M.string(), CosmosChainInfoShape)); + await writeCoreEval(startAutoStakeItContract.name, opts => + defaultProposalBuilder(opts, { chainDetails }), + ); +}; diff --git a/contract/src/auto-stake-it.proposal.js b/contract/src/auto-stake-it.proposal.js new file mode 100644 index 00000000..d3ee3fd4 --- /dev/null +++ b/contract/src/auto-stake-it.proposal.js @@ -0,0 +1,188 @@ +// auto-stake-it.proposal.js +import { E } from '@endo/far'; +import { makeTracer } from './tools/debug.js'; + +/// +/// + +/** + * @import {ERef} from '@endo/far'; + * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; + * @import {ChainInfo, IBCConnectionInfo} from '@agoric/orchestration'; + * @import {AutoStakeItSF} from './auto-stake-it.contract.js'; + * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; + */ + +const trace = makeTracer('ASI'); +const { entries, fromEntries } = Object; + +trace('start proposal module evaluating'); + +const contractName = 'auto-stake-it'; + +/** @type {IBCConnectionInfo} */ +const c1 = harden({ + id: 'connection-0', + client_id: 'client-0', + state: 3, + counterparty: harden({ + client_id: 'client-0', + connection_id: 'connection-0', + prefix: { + key_prefix: 'key-prefix-0', + }, + }), + transferChannel: harden({ + portId: 'transfer', + channelId: 'channel-0', + counterPartyPortId: 'transfer', + counterPartyChannelId: 'channel-1', + ordering: 2, + version: '1', + state: 3, + }), +}); + +/** @type {Record} */ +export const chainDetails = harden({ + agoric: { + chainId: 'agoriclocal', + stakingTokens: [{ denom: 'ubld' }], + connections: { osmosislocal: c1 }, + }, + osmosis: { + chainId: 'osmosislocal', + stakingTokens: [{ denom: 'uosmo' }], + }, +}); + +/** + * @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } + */ +export const allValues = async obj => { + const es = await Promise.all( + entries(obj).map(([k, vp]) => E.when(vp, v => [k, v])), + ); + return fromEntries(es); +}; + +/** + * @param {BootstrapPowers & {installation: {consume: {autoStakeIt: Installation}}}} permittedPowers + * @param {{options: {[contractName]: { + * bundleID: string; + * chainDetails: Record, + * }}}} config + */ +export const startAutoStakeItContract = async (permittedPowers, config) => { + trace('startAutoStakeItContract()...', config); + + const { + consume: { + agoricNames, + board, + chainTimerService, + localchain, + chainStorage, + cosmosInterchainService, + startUpgradable, + }, + installation: { + consume: { autoStakeIt: autoStakeItInstallation }, + }, + instance: { + produce: { autoStakeIt: produceInstance }, + }, + } = permittedPowers; + + const installation = await autoStakeItInstallation; + + const storageNode = await E(chainStorage).makeChildNode('auto-stake-it'); + const marshaller = await E(board).getPublishingMarshaller(); + + const { chainDetails: nameToInfo = chainDetails } = + config.options[contractName]; + + /** @type {StartUpgradableOpts} **/ + const startOpts = { + label: 'auto-stake-it', + installation, + terms: { chainDetails: nameToInfo }, + privateArgs: { + localchain: await localchain, + orchestrationService: await cosmosInterchainService, + storageNode, + timerService: await chainTimerService, + agoricNames: await agoricNames, + marshaller, + }, + }; + + trace('startOpts', startOpts); + const { instance } = await E(startUpgradable)(startOpts); + + trace(contractName, '(re)started WITH RESET'); + produceInstance.reset(); + produceInstance.resolve(instance); +}; + +/** @type {BootstrapManifest} */ +const autoStakeItManifest = { + [startAutoStakeItContract.name]: { + consume: { + agoricNames: true, + board: true, + chainStorage: true, + startUpgradable: true, + zoe: true, + localchain: true, + chainTimerService: true, + cosmosInterchainService: true, + }, + installation: { + produce: { autoStakeIt: true }, + consume: { autoStakeIt: true }, + }, + instance: { + produce: { autoStakeIt: true }, + }, + }, +}; +harden(autoStakeItManifest); + +export const getManifestForAutoStakeIt = ( + { restoreRef }, + { installKeys, chainDetails }, +) => { + trace('getManifestForAutoStakeIt', installKeys); + return harden({ + manifest: autoStakeItManifest, + installations: { + [contractName]: restoreRef(installKeys[contractName]), + }, + options: { + [contractName]: { chainDetails }, + }, + }); +}; + +export const permit = harden({ + consume: { + agoricNames: true, + board: true, + chainStorage: true, + startUpgradable: true, + zoe: true, + localchain: true, + chainTimerService: true, + cosmosInterchainService: true, + }, + installation: { + consume: { autoStakeIt: true }, + produce: { autoStakeIt: true }, + }, + instance: { produce: { autoStakeIt: true } }, + brand: { consume: { BLD: true, IST: true }, produce: {} }, + issuer: { consume: { BLD: true, IST: true }, produce: {} }, +}); + +export const main = startAutoStakeItContract; \ No newline at end of file From 0e1a3bec8a64d8140a788072be963957a453ed2d Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Mon, 9 Dec 2024 17:22:31 +0500 Subject: [PATCH 29/31] chore: autoStakeIt is deployable --- contract/Makefile | 7 +- contract/rollup.config.mjs | 7 +- ...t-auto-stake-it.js => init-autostakeit.js} | 16 +- ...e-it-tap-kit.js => autoStakeIt-tap-kit.js} | 0 ...it.contract.js => autoStakeIt.contract.js} | 10 +- ...stake-it.flows.js => autoStakeIt.flows.js} | 2 +- ...it.proposal.js => autoStakeIt.proposal.js} | 21 +- contract/startAutoStakeItContract-permit.json | 33 +++ contract/startAutoStakeItContract-plan.json | 17 ++ contract/startAutoStakeItContract.js | 188 ++++++++++++++++++ contract/test/auto-stake-it.contract.test.ts | 4 +- contract/tools/e2e-tools.js | 9 +- yarn.lock | 2 +- 13 files changed, 280 insertions(+), 36 deletions(-) rename contract/scripts/{init-auto-stake-it.js => init-autostakeit.js} (89%) rename contract/src/{auto-stake-it-tap-kit.js => autoStakeIt-tap-kit.js} (100%) rename contract/src/{auto-stake-it.contract.js => autoStakeIt.contract.js} (88%) rename contract/src/{auto-stake-it.flows.js => autoStakeIt.flows.js} (98%) rename contract/src/{auto-stake-it.proposal.js => autoStakeIt.proposal.js} (90%) create mode 100644 contract/startAutoStakeItContract-permit.json create mode 100644 contract/startAutoStakeItContract-plan.json create mode 100644 contract/startAutoStakeItContract.js diff --git a/contract/Makefile b/contract/Makefile index 309be3b8..37f7b596 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -28,8 +28,8 @@ PROVISION_POOL_ADDR=agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346 # `CLIENTADDR` is your address from your browser wallet that you will use to interact with the orchestration dapp. #`CLIENT_OSMO_ADDR` is the same, but your osmosis account. -CLIENTADDR=agoric12j5kzvrwunqvrga5vm4zpy3mkeh3lvyld0amz5 -CLIENT_OSMO_ADDR=osmo1rhvgsqq96n3qyv3u0zlwleyaunpmal6uhnam4z +CLIENTADDR=agoric1rwwley550k9mmk6uq6mm6z4udrg8kyuyvfszjk +CLIENT_OSMO_ADDR=osmo1n4j0cy98dac5q6d9y5nhlmk5d6e4wzve0sytdj DEPLOY=npx --no-install tsx scripts/deploy-cli.ts @@ -63,4 +63,5 @@ provision-smart-wallet: $(EXEC_AGD) tx swingset provision-one wallet $(ADDR) SMART_WALLET --from ${ADDR} -y -b block e2e: - $(DEPLOY) scripts/init-orca.js +# $(DEPLOY) scripts/init-orca.js + $(DEPLOY) scripts/init-autoStakeIt.js diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index 7c5f8836..a78e45ea 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -20,7 +20,8 @@ import { } from './tools/rollup-plugin-core-eval.js'; // import { permit as daoPermit } from './src/privacy-coin.proposal.js'; -import { permit as orcaPermit } from './src/orca.proposal.js'; +// import { permit as orcaPermit } from './src/orca.proposal.js'; +import { permit as asiPermit } from './src/autoStakeIt.proposal.js'; import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js'; @@ -98,8 +99,8 @@ const config = [ // contractEntry: null, // }), config1({ - name: 'orca', - permit: orcaPermit, + name: 'autoStakeIt', + permit: asiPermit, }), ]; export default config; diff --git a/contract/scripts/init-auto-stake-it.js b/contract/scripts/init-autostakeit.js similarity index 89% rename from contract/scripts/init-auto-stake-it.js rename to contract/scripts/init-autostakeit.js index 953d71ba..c56b543d 100644 --- a/contract/scripts/init-auto-stake-it.js +++ b/contract/scripts/init-autostakeit.js @@ -1,10 +1,10 @@ /** - * @file build core eval script to deploy auto-stake-it contract + * @file build core eval script to deploy autoStakeIt contract * * Usage: - * agoric run init-auto-stake-it.js + * agoric run init-autoStakeIt.js * or - * agoric run init-auto-stake-it.js --net emerynet \ + * agoric run init-autoStakeIt.js --net emerynet \ * --peer osmosis:connection-128:channel-115:uosmo */ import { makeHelpers } from '@agoric/deploy-script-support'; @@ -18,8 +18,8 @@ import { parseArgs } from 'node:util'; import { getManifestForAutoStakeIt, startAutoStakeItContract, -} from '../../src/auto-stake-it.proposal.js'; -import { makeAgd } from '../../tools/agd-lib.js'; +} from '../src/autoStakeIt.proposal.js'; +import { makeAgd } from '../tools/agd-lib.js'; const options = { net: { type: 'string' }, @@ -31,12 +31,12 @@ export const defaultProposalBuilder = async ( { chainDetails }, ) => { return harden({ - sourceSpec: '../../src/auto-stake-it.proposal.js', + sourceSpec: '../src/autoStakeIt.proposal.js', getManifestCall: [ getManifestForAutoStakeIt.name, { installKeys: { - autoStakeIt: publishRef(install('../../src/auto-stake-it.contract.js')), + autoStakeIt: publishRef(install('../src/autoStakeIt.contract.js')), }, chainDetails, }, @@ -85,7 +85,7 @@ export default async (homeP, endowments) => { .query(['ibc', 'client', 'state', client_id]) .then(x => x.client_state); const { chain_id: peerId } = clientState; - + chainDetails[peerName] = { chainId: peerId, stakingTokens: [{ denom }] }; const chan = await agd diff --git a/contract/src/auto-stake-it-tap-kit.js b/contract/src/autoStakeIt-tap-kit.js similarity index 100% rename from contract/src/auto-stake-it-tap-kit.js rename to contract/src/autoStakeIt-tap-kit.js diff --git a/contract/src/auto-stake-it.contract.js b/contract/src/autoStakeIt.contract.js similarity index 88% rename from contract/src/auto-stake-it.contract.js rename to contract/src/autoStakeIt.contract.js index c593c42e..8e9092f5 100644 --- a/contract/src/auto-stake-it.contract.js +++ b/contract/src/autoStakeIt.contract.js @@ -7,8 +7,8 @@ import { prepareChainHubAdmin } from '@agoric/orchestration/src/exos/chain-hub-a import { preparePortfolioHolder } from '@agoric/orchestration/src/exos/portfolio-holder-kit.js'; // import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; import { withOrchestration } from '@agoric/orchestration/src/utils/start-helper.js'; -import { prepareStakingTap } from './auto-stake-it-tap-kit.js'; -import * as flows from './auto-stake-it.flows.js'; +import { prepareStakingTap } from './autoStakeIt-tap-kit.js'; +import * as flows from './autoStakeIt.flows.js'; /** * @import {Zone} from '@agoric/zone'; @@ -17,7 +17,7 @@ import * as flows from './auto-stake-it.flows.js'; */ /** - * AutoStakeIt allows users to to create an auto-forwarding address that + * autoStakeIt allows users to to create an auto-forwarding address that * transfers and stakes tokens on a remote chain when received. * * To be wrapped with `withOrchestration`. @@ -51,8 +51,8 @@ const contract = async ( }); const publicFacet = zone.exo( - 'AutoStakeIt Public Facet', - M.interface('AutoStakeIt Public Facet', { + 'autoStakeIt Public Facet', + M.interface('autoStakeIt Public Facet', { makeAccountsInvitation: M.callWhen().returns(InvitationShape), }), { diff --git a/contract/src/auto-stake-it.flows.js b/contract/src/autoStakeIt.flows.js similarity index 98% rename from contract/src/auto-stake-it.flows.js rename to contract/src/autoStakeIt.flows.js index fa180e89..396cc2aa 100644 --- a/contract/src/auto-stake-it.flows.js +++ b/contract/src/autoStakeIt.flows.js @@ -6,7 +6,7 @@ import { denomHash } from '@agoric/orchestration/src/utils/denomHash.js'; * @import {ResolvedPublicTopic} from '@agoric/zoe/src/contractSupport/topics.js'; * @import {GuestInterface} from '@agoric/async-flow'; * @import {CosmosValidatorAddress, Orchestrator, CosmosInterchainService, Denom, OrchestrationAccount, StakingAccountActions, OrchestrationFlow} from '@agoric/orchestration'; - * @import {MakeStakingTap} from './auto-stake-it-tap-kit.js'; + * @import {MakeStakingTap} from './autoStakeIt-tap-kit.js'; * @import {MakePortfolioHolder} from './exos/portfolio-holder-kit.js'; * @import {ChainHub} from './exos/chain-hub.js'; */ diff --git a/contract/src/auto-stake-it.proposal.js b/contract/src/autoStakeIt.proposal.js similarity index 90% rename from contract/src/auto-stake-it.proposal.js rename to contract/src/autoStakeIt.proposal.js index d3ee3fd4..05bf2cdc 100644 --- a/contract/src/auto-stake-it.proposal.js +++ b/contract/src/autoStakeIt.proposal.js @@ -1,6 +1,6 @@ -// auto-stake-it.proposal.js +// autoStakeIt.proposal.js import { E } from '@endo/far'; -import { makeTracer } from './tools/debug.js'; +import { makeTracer } from './debug.js'; /// /// @@ -9,7 +9,7 @@ import { makeTracer } from './tools/debug.js'; * @import {ERef} from '@endo/far'; * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'; * @import {ChainInfo, IBCConnectionInfo} from '@agoric/orchestration'; - * @import {AutoStakeItSF} from './auto-stake-it.contract.js'; + * @import {AutoStakeItSF} from './autoStakeIt.contract.js'; * @import {ContractStartFunction} from '@agoric/zoe/src/zoeService/utils.js'; */ @@ -18,7 +18,7 @@ const { entries, fromEntries } = Object; trace('start proposal module evaluating'); -const contractName = 'auto-stake-it'; +const contractName = 'autoStakeIt'; /** @type {IBCConnectionInfo} */ const c1 = harden({ @@ -38,7 +38,7 @@ const c1 = harden({ counterPartyPortId: 'transfer', counterPartyChannelId: 'channel-1', ordering: 2, - version: '1', + version: '1', state: 3, }), }); @@ -51,7 +51,7 @@ export const chainDetails = harden({ connections: { osmosislocal: c1 }, }, osmosis: { - chainId: 'osmosislocal', + chainId: 'osmosislocal', stakingTokens: [{ denom: 'uosmo' }], }, }); @@ -90,21 +90,22 @@ export const startAutoStakeItContract = async (permittedPowers, config) => { consume: { autoStakeIt: autoStakeItInstallation }, }, instance: { + // @ts-expect-error not a WellKnownName produce: { autoStakeIt: produceInstance }, }, } = permittedPowers; const installation = await autoStakeItInstallation; - const storageNode = await E(chainStorage).makeChildNode('auto-stake-it'); + const storageNode = await E(chainStorage).makeChildNode('autoStakeIt'); const marshaller = await E(board).getPublishingMarshaller(); - const { chainDetails: nameToInfo = chainDetails } = + const { chainDetails: nameToInfo = chainDetails } = config.options[contractName]; /** @type {StartUpgradableOpts} **/ const startOpts = { - label: 'auto-stake-it', + label: 'autoStakeIt', installation, terms: { chainDetails: nameToInfo }, privateArgs: { @@ -185,4 +186,4 @@ export const permit = harden({ issuer: { consume: { BLD: true, IST: true }, produce: {} }, }); -export const main = startAutoStakeItContract; \ No newline at end of file +export const main = startAutoStakeItContract; diff --git a/contract/startAutoStakeItContract-permit.json b/contract/startAutoStakeItContract-permit.json new file mode 100644 index 00000000..a66ee028 --- /dev/null +++ b/contract/startAutoStakeItContract-permit.json @@ -0,0 +1,33 @@ +{ + "consume": { + "agoricNames": true, + "board": true, + "chainStorage": true, + "startUpgradable": true, + "zoe": "makeCoreProposalBehavior", + "localchain": true, + "chainTimerService": true, + "cosmosInterchainService": true, + "agoricNamesAdmin": "makeCoreProposalBehavior", + "vatAdminSvc": "makeCoreProposalBehavior" + }, + "installation": { + "produce": { + "autoStakeIt": true + }, + "consume": { + "autoStakeIt": true + } + }, + "instance": { + "produce": { + "autoStakeIt": true + } + }, + "evaluateBundleCap": "makeCoreProposalBehavior", + "modules": { + "utils": { + "runModuleBehaviors": "makeCoreProposalBehavior" + } + } +} \ No newline at end of file diff --git a/contract/startAutoStakeItContract-plan.json b/contract/startAutoStakeItContract-plan.json new file mode 100644 index 00000000..9e90b3ed --- /dev/null +++ b/contract/startAutoStakeItContract-plan.json @@ -0,0 +1,17 @@ +{ + "name": "startAutoStakeItContract", + "script": "startAutoStakeItContract.js", + "permit": "startAutoStakeItContract-permit.json", + "bundles": [ + { + "entrypoint": "../src/autoStakeIt.contract.js", + "bundleID": "b1-464ba07b916df1cbbad93d99036594326aaa6c37f959ca984fc7075a35b6120003ed11d6d1e43bafac1537c7a43f708c3820e74750355bef541d209e3582862f", + "fileName": "/Users/lupin/.agoric/cache/b1-464ba07b916df1cbbad93d99036594326aaa6c37f959ca984fc7075a35b6120003ed11d6d1e43bafac1537c7a43f708c3820e74750355bef541d209e3582862f.json" + }, + { + "entrypoint": "../src/autoStakeIt.proposal.js", + "bundleID": "b1-6241044c01892c17d65b82f3e2916e83804bf37da63982e7cd414e284a735e64f1b4a66081fc77183cf0098276c9039f673958ade0a5ffab107611fa3e7b393b", + "fileName": "/Users/lupin/.agoric/cache/b1-6241044c01892c17d65b82f3e2916e83804bf37da63982e7cd414e284a735e64f1b4a66081fc77183cf0098276c9039f673958ade0a5ffab107611fa3e7b393b.json" + } + ] +} diff --git a/contract/startAutoStakeItContract.js b/contract/startAutoStakeItContract.js new file mode 100644 index 00000000..a98397c5 --- /dev/null +++ b/contract/startAutoStakeItContract.js @@ -0,0 +1,188 @@ +// This is generated by writeCoreEval; please edit! +/* eslint-disable */ + +const manifestBundleRef = {bundleID:"b1-6241044c01892c17d65b82f3e2916e83804bf37da63982e7cd414e284a735e64f1b4a66081fc77183cf0098276c9039f673958ade0a5ffab107611fa3e7b393b"}; +const getManifestCall = harden([ + "getManifestForAutoStakeIt", + { + chainDetails: {}, + installKeys: { + autoStakeIt: { + bundleID: "b1-464ba07b916df1cbbad93d99036594326aaa6c37f959ca984fc7075a35b6120003ed11d6d1e43bafac1537c7a43f708c3820e74750355bef541d209e3582862f", + }, + }, + }, +]); +const customManifest = { + startAutoStakeItContract: { + consume: { + agoricNames: true, + board: true, + chainStorage: true, + chainTimerService: true, + cosmosInterchainService: true, + localchain: true, + startUpgradable: true, + zoe: true, + }, + installation: { + consume: { + autoStakeIt: true, + }, + produce: { + autoStakeIt: true, + }, + }, + instance: { + produce: { + autoStakeIt: true, + }, + }, + }, +}; + +// Make a behavior function and "export" it by way of script completion value. +// It is constructed by an anonymous invocation to ensure the absence of a global binding +// for makeCoreProposalBehavior, which may not be necessary but preserves behavior pre-dating +// https://github.com/Agoric/agoric-sdk/pull/8712 . +const behavior = (({ + manifestBundleRef, + getManifestCall: [manifestGetterName, ...manifestGetterArgs], + customManifest, + E, + log = console.info, + customRestoreRef, +}) => { + const { entries, fromEntries } = Object; + + /** + * Given an object whose properties may be promise-valued, return a promise + * for an analogous object in which each such value has been replaced with its + * fulfillment. + * This is a non-recursive form of endo `deeplyFulfilled`. + * + * @template T + * @param {{[K in keyof T]: (T[K] | Promise)}} obj + * @returns {Promise} + */ + const shallowlyFulfilled = async obj => { + if (!obj) { + return obj; + } + const awaitedEntries = await Promise.all( + entries(obj).map(async ([key, valueP]) => { + const value = await valueP; + return [key, value]; + }), + ); + return fromEntries(awaitedEntries); + }; + + const makeRestoreRef = (vatAdminSvc, zoe) => { + /** @type {(ref: import\('./externalTypes.js').ManifestBundleRef) => Promise>} */ + const defaultRestoreRef = async bundleRef => { + // extract-proposal.js creates these records, and bundleName is + // the optional name under which the bundle was installed into + // config.bundles + const bundleIdP = + 'bundleName' in bundleRef + ? E(vatAdminSvc).getBundleIDByName(bundleRef.bundleName) + : bundleRef.bundleID; + const bundleID = await bundleIdP; + const label = bundleID.slice(0, 8); + return E(zoe).installBundleID(bundleID, label); + }; + return defaultRestoreRef; + }; + + /** @param {ChainBootstrapSpace & BootstrapPowers & { evaluateBundleCap: any }} powers */ + const coreProposalBehavior = async powers => { + // NOTE: `powers` is expected to match or be a superset of the above `permits` export, + // which should therefore be kept in sync with this deconstruction code. + // HOWEVER, do note that this function is invoked with at least the *union* of powers + // required by individual moduleBehaviors declared by the manifest getter, which is + // necessary so it can use `runModuleBehaviors` to provide the appropriate subset to + // each one (see ./writeCoreEvalParts.js). + // Handle `powers` with the requisite care. + const { + consume: { vatAdminSvc, zoe, agoricNamesAdmin }, + evaluateBundleCap, + installation: { produce: produceInstallations }, + modules: { + utils: { runModuleBehaviors }, + }, + } = powers; + + // Get the on-chain installation containing the manifest and behaviors. + log('evaluateBundleCap', { + manifestBundleRef, + manifestGetterName, + vatAdminSvc, + }); + let bcapP; + if ('bundleName' in manifestBundleRef) { + bcapP = E(vatAdminSvc).getNamedBundleCap(manifestBundleRef.bundleName); + } else if ('bundleID' in manifestBundleRef) { + bcapP = E(vatAdminSvc).getBundleCap(manifestBundleRef.bundleID); + } else { + const keys = Reflect.ownKeys(manifestBundleRef).map(key => + typeof key === 'string' ? JSON.stringify(key) : String(key), + ); + const keysStr = `[${keys.join(', ')}]`; + throw Error( + `bundleRef must have own bundleName or bundleID, missing in ${keysStr}`, + ); + } + const bundleCap = await bcapP; + + const proposalNS = await evaluateBundleCap(bundleCap); + + // Get the manifest and its metadata. + log('execute', { + manifestGetterName, + bundleExports: Object.keys(proposalNS), + }); + const restoreRef = customRestoreRef || makeRestoreRef(vatAdminSvc, zoe); + const { + manifest, + options: rawOptions, + installations: rawInstallations, + } = await proposalNS[manifestGetterName]( + harden({ restoreRef }), + ...manifestGetterArgs, + ); + + // Await promises in the returned options and installations records. + const [options, installations] = await Promise.all( + [rawOptions, rawInstallations].map(shallowlyFulfilled), + ); + + // Publish the installations for our dependencies. + const installationEntries = entries(installations || {}); + if (installationEntries.length > 0) { + const installAdmin = E(agoricNamesAdmin).lookupAdmin('installation'); + await Promise.all( + installationEntries.map(([key, value]) => { + produceInstallations[key].reset(); + produceInstallations[key].resolve(value); + return E(installAdmin).update(key, value); + }), + ); + } + + // Evaluate the manifest. + return runModuleBehaviors({ + // Remember that `powers` may be arbitrarily broad. + allPowers: powers, + behaviors: proposalNS, + manifest: customManifest || manifest, + makeConfig: (name, _permit) => { + log('coreProposal:', name); + return { options }; + }, + }); + }; + + return coreProposalBehavior; +})({ manifestBundleRef, getManifestCall, customManifest, E }); +behavior; diff --git a/contract/test/auto-stake-it.contract.test.ts b/contract/test/auto-stake-it.contract.test.ts index 6804b030..8c6a71d7 100644 --- a/contract/test/auto-stake-it.contract.test.ts +++ b/contract/test/auto-stake-it.contract.test.ts @@ -13,10 +13,10 @@ import { } from '../tools/ibc-mocks.js'; const dirname = path.dirname(new URL(import.meta.url).pathname); -const contractName = 'auto-stake-it'; +const contractName = 'autoStakeIt'; const contractFile = `${dirname}/../src/${contractName}.contract.js`; -type StartFn = typeof import('../src/auto-stake-it.contract.js').start; +type StartFn = typeof import('../src/autoStakeIt.contract.js').start; test('make accounts, register tap, return invitationMakers', async t => { t.log('bootstrap, orchestration core-eval'); diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index 7f4ecd44..d308e231 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -531,8 +531,10 @@ export const makeE2ETools = ( console.log(containerPath); // load bundle - const bundle = await bundleCache.load(fullPath, 'orca'); - const bundle_proposal = await bundleCache.load(proposalPath, 'orca'); + // const bundle = await bundleCache.load(fullPath, 'orca'); + // const bundle_proposal = await bundleCache.load(proposalPath, 'orca'); + const bundle = await bundleCache.load(fullPath, 'autoStakeIt'); + const bundle_proposal = await bundleCache.load(proposalPath, 'autoStakeIt'); console.log('bundle'); console.log(bundle); @@ -571,7 +573,8 @@ export const makeE2ETools = ( // generate plan, etc // const keyring = await makeKeyring(tools); // const deployBuilder = makeDeployBuilder(tools, fse.readJSON, execa); - const contractBuilder = './src/builder/init-orca.js'; + // const contractBuilder = './scripts/init-orca.js'; + const contractBuilder = './scripts/init-autoStakeIt.js'; // await deployBuilder(contractBuilder); const { stdout } = await execa`agoric run ${contractBuilder}`; const match = stdout.match(/ (?[-\w]+)-permit.json/); diff --git a/yarn.lock b/yarn.lock index b7e4a8f3..eb8232da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19225,7 +19225,7 @@ __metadata: "typescript@patch:typescript@npm%3A5.1.6 - 5.6.x#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin, typescript@patch:typescript@npm%3A~5.6.3#optional!builtin": version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver From ae22f12208fa6392b2e9a59c338e78f9cd7752f3 Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Wed, 11 Dec 2024 16:36:26 +0500 Subject: [PATCH 30/31] feat: Basic UI for Autostake --- .gitignore | 2 + ui/package.json | 1 + ui/src/components/AutoStakeIt.tsx | 181 ++++++++++++++++++++++++++++++ ui/src/components/Tabs.tsx | 8 +- yarn.lock | 26 ++++- 5 files changed, 213 insertions(+), 5 deletions(-) create mode 100644 ui/src/components/AutoStakeIt.tsx diff --git a/.gitignore b/.gitignore index 39600f82..e68afc80 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ e2e-testing/revise-chain-info-permit.json e2e-testing/revise-chain-info-plan.json e2e-testing/revise-chain-info.js e2e-testing/starship-chain-info.js +contract/startAutoStakeItContract.js +contract/startAutoStakeItContract-plan.json diff --git a/ui/package.json b/ui/package.json index 41303c51..cce00518 100644 --- a/ui/package.json +++ b/ui/package.json @@ -22,6 +22,7 @@ "react": "^18.3.1", "react-daisyui": "^5.0.0", "react-dom": "^18.2.0", + "react-hot-toast": "^2.4.1", "ses": "^1.8.0" }, "devDependencies": { diff --git a/ui/src/components/AutoStakeIt.tsx b/ui/src/components/AutoStakeIt.tsx new file mode 100644 index 00000000..13ba6721 --- /dev/null +++ b/ui/src/components/AutoStakeIt.tsx @@ -0,0 +1,181 @@ +import React, { useEffect, useState } from 'react'; +import { + makeAgoricChainStorageWatcher, + AgoricChainStoragePathKind as Kind, +} from '@agoric/rpc'; +import { create } from 'zustand'; +import { + makeAgoricWalletConnection +} from '@agoric/web-components'; +import { Toaster, toast } from 'react-hot-toast'; + +const ENDPOINTS = { + RPC: 'http://localhost:26657', + API: 'http://localhost:1317', +}; + +const watcher = makeAgoricChainStorageWatcher(ENDPOINTS.API, 'agoriclocal'); + +interface AppState { + wallet?: any; + autoStakeContractInstance?: unknown; + brands?: Record; +} + +const useAppStore = create(() => ({})); + +const setup = async () => { + watcher.watchLatest>( + [Kind.Data, 'published.agoricNames.instance'], + instances => { + useAppStore.setState({ + autoStakeContractInstance: instances + .find(([name]) => name === 'autoStakeIt')! + .at(1), + }); + }, + ); + const wallet = await makeAgoricWalletConnection(watcher, ENDPOINTS.RPC); + useAppStore.setState({ wallet }); + + watcher.watchLatest>( + [Kind.Data, 'published.agoricNames.brand'], + brands => { + useAppStore.setState({ + brands: Object.fromEntries(brands), + }); + }, + ); +}; + +const AutoStakeIt: React.FC = () => { + const [chainName, setChainName] = useState('cosmoshub'); + const [chainId, setChainId] = useState('cosmoshub-4'); + const [validatorValue, setValidatorValue] = useState('cosmosvaloper1test'); + const [validatorEncoding, setValidatorEncoding] = useState('bech32'); + + useEffect(() => { + setup(); + }, []); + + const handleSubmit = (event: React.FormEvent) => { + event.preventDefault(); + + const { wallet, autoStakeContractInstance } = useAppStore.getState(); + if (!autoStakeContractInstance) { + toast.error('No instance of Smart Contract found on chain!', { + duration: 10000, + position: 'bottom-right', + }); + return; + } + + const data = { + chainName, + validator: { + chainId, + value: validatorValue, + encoding: validatorEncoding, + }, + }; + + wallet?.makeOffer( + { + source: 'contract', + instance: autoStakeContractInstance, + publicInvitationMaker: 'makeAccountsInvitation', + fee: { + gas: '400000', + amount: [ + { + amount: '0', + denom: 'uist', + }, + ], + }, + }, + {}, // No assets being exchanged + { + stakeData: data, + }, + (update: { status: string; data?: unknown }) => { + if (update.status === 'error') { + toast.error(`Error: ${update.data}`, { + duration: 10000, + position: 'bottom-right', + }); + } + if (update.status === 'accepted') { + toast.success('Stake submitted successfully', { + duration: 10000, + position: 'bottom-right', + }); + } + if (update.status === 'refunded') { + toast.error('Stake submission rejected', { + duration: 10000, + position: 'bottom-right', + }); + } + }, + ); + }; + + return ( +
+

Auto Stake It

+
+
+ + setChainName(e.target.value)} + style={{ width: '100%', padding: '8px', marginTop: '8px' }} + /> +
+
+ + setChainId(e.target.value)} + style={{ width: '100%', padding: '8px', marginTop: '8px' }} + /> +
+
+ + setValidatorValue(e.target.value)} + style={{ width: '100%', padding: '8px', marginTop: '8px' }} + /> +
+
+ + setValidatorEncoding(e.target.value)} + style={{ width: '100%', padding: '8px', marginTop: '8px' }} + /> +
+ +
+ +
+ ); +}; + +export default AutoStakeIt; diff --git a/ui/src/components/Tabs.tsx b/ui/src/components/Tabs.tsx index 3cf84f8c..6027d411 100644 --- a/ui/src/components/Tabs.tsx +++ b/ui/src/components/Tabs.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import { NotificationContext } from '../context/NotificationContext'; import { Notifications } from './Notifications'; import Orchestration from './Orchestration'; +import AutoStakeIt from './AutoStakeIt'; import { TabWrapper } from './TabWrapper'; // notification related types @@ -60,13 +61,14 @@ const Tabs = () => { > */} {/* */} {/* */} - {/* - + + {/* =16" + react-dom: ">=16" + checksum: 10c0/591ecec3c6adc1cdb70f00165a57baa3d7f75d0d30fa767213c36496bdcc6be2b2e6a3edbf7c04f7d726a1b17dcfb5e7feb2136b04b17c9ccb769894b970f365 + languageName: node + linkType: hard + "react-icons@npm:4.4.0": version: 4.4.0 resolution: "react-icons@npm:4.4.0" @@ -19360,7 +19382,7 @@ __metadata: "typescript@patch:typescript@npm%3A5.1.6 - 5.7.x#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": version: 5.7.2 - resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=74658d" + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver @@ -19370,7 +19392,7 @@ __metadata: "typescript@patch:typescript@npm%3A~5.6.3#optional!builtin": version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver From f07566272a75104d67d0a7d408eabe6682bcdb2c Mon Sep 17 00:00:00 2001 From: Mudassir Shabbir Date: Mon, 30 Dec 2024 19:43:50 +0500 Subject: [PATCH 31/31] chore: Updates to UI --- ui/package.json | 6 +- ui/src/components/AutoStakeIt.tsx | 267 ++- ui/src/components/Tabs.tsx | 3 +- yarn.lock | 3197 ++++++++++++++--------------- 4 files changed, 1684 insertions(+), 1789 deletions(-) diff --git a/ui/package.json b/ui/package.json index cce00518..a910a952 100644 --- a/ui/package.json +++ b/ui/package.json @@ -33,12 +33,12 @@ "@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/parser": "^7.15.0", "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.17", + "autoprefixer": "^10.4.20", "eslint": "^8.56.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", - "postcss": "^8.4.35", - "tailwindcss": "^3.4.1", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", "typescript": "^5.2.2", "vite": "^5.1.4" } diff --git a/ui/src/components/AutoStakeIt.tsx b/ui/src/components/AutoStakeIt.tsx index 13ba6721..15591303 100644 --- a/ui/src/components/AutoStakeIt.tsx +++ b/ui/src/components/AutoStakeIt.tsx @@ -1,19 +1,86 @@ import React, { useEffect, useState } from 'react'; -import { - makeAgoricChainStorageWatcher, - AgoricChainStoragePathKind as Kind, -} from '@agoric/rpc'; +import { makeAgoricChainStorageWatcher, AgoricChainStoragePathKind as Kind } from '@agoric/rpc'; import { create } from 'zustand'; -import { - makeAgoricWalletConnection -} from '@agoric/web-components'; -import { Toaster, toast } from 'react-hot-toast'; +import { makeAgoricWalletConnection } from '@agoric/web-components'; +import { Toaster } from 'react-hot-toast'; const ENDPOINTS = { RPC: 'http://localhost:26657', API: 'http://localhost:1317', }; +const styles = { + container: { + minHeight: '100vh', + padding: '2rem', + }, + card: { + maxWidth: '600px', + margin: '0 auto', + backgroundColor: '#e8eaec', + borderRadius: '12px', + padding: '2rem', + boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)', + }, + header: { + marginBottom: '2rem', + }, + title: { + fontSize: '1.5rem', + fontWeight: 'bold', + color: '#1e293b', + marginBottom: '0.5rem', + }, + description: { + color: '#64748b', + fontSize: '1.0rem', + }, + form: { + display: 'flex', + flexDirection: 'column' as const, + gap: '1.5rem', + }, + formGroup: { + display: 'flex', + flexDirection: 'column' as const, + gap: '0.5rem', + }, + label: { + fontWeight: '500', + color: '#334155', + fontSize: '1.0rem', + }, + input: { + width: '100%', + padding: '0.75rem', + borderRadius: '6px', + border: '1px solid #e2e8f0', + fontSize: '1.0rem', + transition: 'all 0.2s', + outline: 'none', + backgroundColor: '#334155', + color: 'white', + }, + button: { + backgroundColor: '#2563eb', + color: 'white', + padding: '0.75rem', + borderRadius: '6px', + border: 'none', + fontSize: '0.875rem', + fontWeight: '500', + cursor: 'pointer', + transition: 'background-color 0.2s', + }, + buttonHover: { + backgroundColor: '#1d4ed8', + }, + buttonDisabled: { + backgroundColor: '#93c5fd', + cursor: 'not-allowed', + }, +}; + const watcher = makeAgoricChainStorageWatcher(ENDPOINTS.API, 'agoriclocal'); interface AppState { @@ -27,11 +94,9 @@ const useAppStore = create(() => ({})); const setup = async () => { watcher.watchLatest>( [Kind.Data, 'published.agoricNames.instance'], - instances => { + (instances) => { useAppStore.setState({ - autoStakeContractInstance: instances - .find(([name]) => name === 'autoStakeIt')! - .at(1), + autoStakeContractInstance: instances.find(([name]) => name === 'autoStakeIt')?.[1], }); }, ); @@ -40,7 +105,7 @@ const setup = async () => { watcher.watchLatest>( [Kind.Data, 'published.agoricNames.brand'], - brands => { + (brands) => { useAppStore.setState({ brands: Object.fromEntries(brands), }); @@ -53,20 +118,21 @@ const AutoStakeIt: React.FC = () => { const [chainId, setChainId] = useState('cosmoshub-4'); const [validatorValue, setValidatorValue] = useState('cosmosvaloper1test'); const [validatorEncoding, setValidatorEncoding] = useState('bech32'); + const [isLoading, setIsLoading] = useState(false); + const [isHovered, setIsHovered] = useState(false); useEffect(() => { setup(); }, []); - const handleSubmit = (event: React.FormEvent) => { + const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); + setIsLoading(true); const { wallet, autoStakeContractInstance } = useAppStore.getState(); if (!autoStakeContractInstance) { - toast.error('No instance of Smart Contract found on chain!', { - duration: 10000, - position: 'bottom-right', - }); + toast.error('No instance of Smart Contract found on chain!'); + setIsLoading(false); return; } @@ -86,93 +152,114 @@ const AutoStakeIt: React.FC = () => { publicInvitationMaker: 'makeAccountsInvitation', fee: { gas: '400000', - amount: [ - { - amount: '0', - denom: 'uist', - }, - ], + amount: [{ amount: '0', denom: 'uist' }], }, }, - {}, // No assets being exchanged - { - stakeData: data, - }, + {}, + { stakeData: data }, (update: { status: string; data?: unknown }) => { + setIsLoading(false); if (update.status === 'error') { - toast.error(`Error: ${update.data}`, { - duration: 10000, - position: 'bottom-right', - }); + toast.error(`Error: ${update.data}`); } if (update.status === 'accepted') { - toast.success('Stake submitted successfully', { - duration: 10000, - position: 'bottom-right', - }); + toast.success('Stake submitted successfully'); } if (update.status === 'refunded') { - toast.error('Stake submission rejected', { - duration: 10000, - position: 'bottom-right', - }); + toast.error('Stake submission rejected'); } }, ); }; return ( -
-

Auto Stake It

-
-
- - setChainName(e.target.value)} - style={{ width: '100%', padding: '8px', marginTop: '8px' }} - /> -
-
- - setChainId(e.target.value)} - style={{ width: '100%', padding: '8px', marginTop: '8px' }} - /> -
-
- - setValidatorValue(e.target.value)} - style={{ width: '100%', padding: '8px', marginTop: '8px' }} - /> +
+
+
+

Auto Stake It

+

Configure your automatic staking parameters

-
- - setValidatorEncoding(e.target.value)} - style={{ width: '100%', padding: '8px', marginTop: '8px' }} - /> -
- - + +
+
+
+ + +
+ +
+ + setChainId(e.target.value)} + style={{ ...styles.input, width: '188%' }} + placeholder="Enter chain ID" + /> +
+
+ +
+ + setValidatorValue(e.target.value)} + style={styles.input} + placeholder="Enter validator value" + /> +
+ +
+ + +
+ + +
+
); diff --git a/ui/src/components/Tabs.tsx b/ui/src/components/Tabs.tsx index 6027d411..28dc2ec7 100644 --- a/ui/src/components/Tabs.tsx +++ b/ui/src/components/Tabs.tsx @@ -34,6 +34,7 @@ const Tabs = () => { }; return ( +
{ >
=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/c5e56f759539bc3b3f9026ed328396fdd53d43e93878c7fe9e14bf2a04041ebf46f0a7183b38fe24079963f94a70d5ab0f74b38b814aabacab189f2350b6af41 + checksum: 10c0/05558555f75a6e24e293259cc0ba6d67d9d6ee9a1e573ae81b59dd6e3bb8d73b4e8d66090a98a092eccc03cd72a93874b5f47ffde6a0ebb2b2f6302ca524684b languageName: node linkType: hard -"@cosmos-kit/cdcwallet@npm:^2.15.1": - version: 2.15.1 - resolution: "@cosmos-kit/cdcwallet@npm:2.15.1" +"@cosmos-kit/cdcwallet@npm:^2.15.2": + version: 2.15.2 + resolution: "@cosmos-kit/cdcwallet@npm:2.15.2" dependencies: - "@cosmos-kit/cdcwallet-extension": "npm:^2.15.1" - checksum: 10c0/5793f05bb2dbdd5c4c20f0666be67de916f1449b110c23dd278ffbc04b234f1d0d692c9aaef9f24efe13cb7b812990a30bbc8c7a2aa4b87005d39a9b6c595026 + "@cosmos-kit/cdcwallet-extension": "npm:^2.15.2" + checksum: 10c0/a37b89dd48273975d0866e01e18805f7317c7345f324c2651de5a7cb498b7b3ec607d3503d24aa6bbec90b343a61734d4d4753cb8c19f97ce4924b414bc0af75 languageName: node linkType: hard -"@cosmos-kit/coin98-extension@npm:^2.14.1": - version: 2.14.1 - resolution: "@cosmos-kit/coin98-extension@npm:2.14.1" +"@cosmos-kit/coin98-extension@npm:^2.14.2": + version: 2.14.2 + resolution: "@cosmos-kit/coin98-extension@npm:2.14.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" @@ -2700,38 +2721,38 @@ __metadata: peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/44b81ced4985cd2c3e9e94bac72570136bd0ac414a5cbb8b186efdcefcdd71a710bd9a68771da95dcf5820de96a58d57ce8416b004d61924e5f5e4f826d54a10 + checksum: 10c0/d13bd59eac841ff4c463a3ca9051bd453b28f7fca26a9f95644d48ed26d58a3c8c40fed37d563c3b1295cac23f485ef90839fe98474fe29875cb53f13fd111d7 languageName: node linkType: hard -"@cosmos-kit/coin98@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/coin98@npm:2.13.1" +"@cosmos-kit/coin98@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/coin98@npm:2.13.2" dependencies: - "@cosmos-kit/coin98-extension": "npm:^2.14.1" - checksum: 10c0/aabe8cb290cb3f9f765f4f768c1607e1fcfe147f354a6da6e6595a487668fd499a730f199893eddb1703e40c6bab4ebf0c06e73350c74cdbfba6d7c69a18737f + "@cosmos-kit/coin98-extension": "npm:^2.14.2" + checksum: 10c0/41b1dd8bebd95495a822aa94d4a5e4ca82465f5619c0119c4b00d164c0955378a2de56256536efaccd777ea676a4aef08738bc374b56c5ff2e217811cf314b76 languageName: node linkType: hard -"@cosmos-kit/compass-extension@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/compass-extension@npm:2.13.1" +"@cosmos-kit/compass-extension@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/compass-extension@npm:2.13.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/12638b14627a75af9b2f81a46a690ce12247cd6698a00ef3a2b0248db4f52885455fc81aa11c2a0eba8d5ed60c190a3932e57ea6f18a744a01a474544d3f7ff1 + checksum: 10c0/06b424fc517fb771d34b4c4dddd6c656b4afe7ce4b496c030c875d1d29edbcfb3369e65d69c7e2cdadec3beb43f031f3e908180c122a3687dd60a3ac9cc7e0e8 languageName: node linkType: hard -"@cosmos-kit/compass@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/compass@npm:2.13.1" +"@cosmos-kit/compass@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/compass@npm:2.13.2" dependencies: - "@cosmos-kit/compass-extension": "npm:^2.13.1" - checksum: 10c0/dcaec805c224efd83966ad9315bba1b5d812885fa3c82620945b3d5305378916d7a21ede0d89fb298b502f9c106b48b709d293c284ac22d2bea44ac505ede958 + "@cosmos-kit/compass-extension": "npm:^2.13.2" + checksum: 10c0/076fc3d8d569940429e853dd803d69a289f7246088e239cbb151fde526dcbab49458d5c9372e0f2ddac316680d54273e0f0da927fa7f32207d8e2b56ec5e7c05 languageName: node linkType: hard @@ -2754,7 +2775,7 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/core@npm:^2.15.0, @cosmos-kit/core@npm:^2.8.9": +"@cosmos-kit/core@npm:^2.13.1, @cosmos-kit/core@npm:^2.15.0, @cosmos-kit/core@npm:^2.8.9": version: 2.15.0 resolution: "@cosmos-kit/core@npm:2.15.0" dependencies: @@ -2776,9 +2797,9 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/cosmostation-extension@npm:^2.15.0": - version: 2.15.0 - resolution: "@cosmos-kit/cosmostation-extension@npm:2.15.0" +"@cosmos-kit/cosmostation-extension@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/cosmostation-extension@npm:2.15.1" dependencies: "@chain-registry/cosmostation": "npm:^1.67.13" "@cosmos-kit/core": "npm:^2.15.0" @@ -2786,99 +2807,120 @@ __metadata: peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/efc951a5fd0a73c9d842153e86304b8073c7908fb51d8288cb5e5bac82aaff4f3f3cf108b52cedae2d53c95b9bbd39218ad821f0c61ae77c3c500ed051b97b0c + checksum: 10c0/8c6cb9afa93a451dea771f9cdd62cb64f083bf59832cd628a9e3de2f3c3e042e499791d7da7b6ec0b99283e25dc4049b10f027dc4cbcb903f16fca01133d855c languageName: node linkType: hard -"@cosmos-kit/cosmostation-mobile@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/cosmostation-mobile@npm:2.13.0" +"@cosmos-kit/cosmostation-mobile@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/cosmostation-mobile@npm:2.13.1" dependencies: "@chain-registry/cosmostation": "npm:1.67.13" "@cosmos-kit/core": "npm:^2.15.0" "@cosmos-kit/walletconnect": "npm:^2.12.0" - checksum: 10c0/ff816262bab05455ad547de8da06bba525519b64e3f6a957027d381f4936e045715c2a777bd6c51077cd9954a50b8567e5a041d20a9553ae893ad07744a872a9 + checksum: 10c0/a9471c456e68a8e6fe376d0be7b671bd9422ffa2aa0634c37eb1a20029f3a7757bfb1cff6e99aa125c833515b77bec5bb3d1db4a20b90fe6c592c14e4b320f3e languageName: node linkType: hard -"@cosmos-kit/cosmostation@npm:^2.14.0": - version: 2.14.0 - resolution: "@cosmos-kit/cosmostation@npm:2.14.0" +"@cosmos-kit/cosmostation@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/cosmostation@npm:2.14.1" dependencies: - "@cosmos-kit/cosmostation-extension": "npm:^2.15.0" - "@cosmos-kit/cosmostation-mobile": "npm:^2.13.0" - checksum: 10c0/d029149858baef6bdad0132b8dac0c0fc247e199f0e7654e1456cd0e8bd803ddc397230c58d1d3e2a77b2ef572a4edd12f42315e7cf80fd7c3017e72c2695934 + "@cosmos-kit/cosmostation-extension": "npm:^2.15.1" + "@cosmos-kit/cosmostation-mobile": "npm:^2.13.1" + checksum: 10c0/c0525c5ed889c83e224697cb30a4fc1b949ec3734942dd698311d1e4e1d53dc6f85b3338f83a1402d0fd82ee4177f481575d90efeba9fb32a178b2639abc979f languageName: node linkType: hard -"@cosmos-kit/exodus-extension@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/exodus-extension@npm:2.12.0" +"@cosmos-kit/ctrl-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/ctrl-extension@npm:2.14.1" + dependencies: + "@cosmos-kit/core": "npm:^2.15.0" + peerDependencies: + "@cosmjs/amino": ">=0.32.3" + "@cosmjs/proto-signing": ">=0.32.3" + checksum: 10c0/73b3cfe0b5e50339ec1c724d2608aad70193e763ae88396dbdee61507584845e9fe1894fa56a1ba6a1c410b33a1f674cd2fbf99bddb460756fe3249cdd327266 + languageName: node + linkType: hard + +"@cosmos-kit/ctrl@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/ctrl@npm:2.13.1" + dependencies: + "@cosmos-kit/ctrl-extension": "npm:^2.14.1" + checksum: 10c0/14b2ef368928cb15bdd1bf0bdf3570cd8c6d06aed2fc7334d8b0f3ee947cf56152f5da24ef74a9d627058e9e16f2dd23ff18348248c8737a9add35c69ea23078 + languageName: node + linkType: hard + +"@cosmos-kit/exodus-extension@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/exodus-extension@npm:2.12.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" react-icons: "npm:4.4.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/c613f9c3ddea0cfcc0f5922aa77a59255f93d1ba76ad0c9191052c355c6c3335c94d1f89ea990c5db000c440f00ac64d25087fb3a8d4447f5004e5ef8ad83ef8 + checksum: 10c0/46bb5d8f43af2df2d249d839ef4f4ad237d1f7a7083d3e4d180fa730ce63d64926e0a08f8a877456aabce34755e99e4c562f3115c46a1ce05a880792cea8bfc1 languageName: node linkType: hard -"@cosmos-kit/exodus@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/exodus@npm:2.12.0" +"@cosmos-kit/exodus@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/exodus@npm:2.12.1" dependencies: - "@cosmos-kit/exodus-extension": "npm:^2.12.0" - checksum: 10c0/0cae2118f444984d614d79af4bcc9017ad2da739ae0caafbe789f085d121d607488e9f974bcce9e862ec6fbcfc70be2741e8037dc2f0cd2c19911e73f29140c2 + "@cosmos-kit/exodus-extension": "npm:^2.12.1" + checksum: 10c0/626a36a7e4bd9418b5fdab8103ff0d9e7c069a9869c416d8b1e4499ffe14de2ae73b9304cc68dda6c5ef282c06bfb1975ea62511ef350673d59440da14e64c77 languageName: node linkType: hard -"@cosmos-kit/fin-extension@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/fin-extension@npm:2.13.1" +"@cosmos-kit/fin-extension@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/fin-extension@npm:2.13.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/daf29837efc81ad552665f59aade1b553c268e42d3766e08e5bd91a84bc994498281e5de45d372e90bb2dc807d443526f924a82188246a63698b29771695fc20 + checksum: 10c0/c049c2be17fe0fa51ec8077abcf679be9068a09bc877ce815d055a2cdd92ebbebe70cd6430a81ef4c9c729153bc4961d3dad3fa4da5b7ae5d5737c38317c7ae7 languageName: node linkType: hard -"@cosmos-kit/fin@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/fin@npm:2.13.1" +"@cosmos-kit/fin@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/fin@npm:2.13.2" dependencies: - "@cosmos-kit/fin-extension": "npm:^2.13.1" - checksum: 10c0/32b1ef95ef91e8873f37dfacbba00e58869f994be661da25e9693f0ec5c9b501603e1f000dad5403df7c5130b85cc6163af3a939b91ca289dc0342670b6a42fb + "@cosmos-kit/fin-extension": "npm:^2.13.2" + checksum: 10c0/ffa553411c9f094de1f7fe8a36e79ed3fe08b50e618fecbf670c5f1f4990ad2c9cd2cf429f11d4994a6429e8ec5dd78ab4b12640be8edcd14eb66fa41dea01e3 languageName: node linkType: hard -"@cosmos-kit/frontier-extension@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/frontier-extension@npm:2.12.0" +"@cosmos-kit/frontier-extension@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/frontier-extension@npm:2.12.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/cba46d7b502185da8f240f62c03916eff00a069e9fe946a3b5d9d45b89b4141267ad3cfc1d0fa32a8c7f66119b25d25483eb250c18b2ce471f7de3e4b75e9855 + checksum: 10c0/2d3791e593be54966981f0d3844b3687b7091cf9bfbb9b481e6adc5d516a4f7f2e23ca84c7b51b8afa01287d53f82700b933e185608b1ea525923e243fe8c0a3 languageName: node linkType: hard -"@cosmos-kit/frontier@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/frontier@npm:2.12.0" +"@cosmos-kit/frontier@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/frontier@npm:2.12.1" dependencies: - "@cosmos-kit/frontier-extension": "npm:^2.12.0" - checksum: 10c0/2f8a7ef4f994fc007cb2b88b4a44dc99e2fc1d1dd8830ef7e201d7b57a38d1794829ee9cb8964417680811ff646f3af0556551b3848aff18a007e5bb51c549b2 + "@cosmos-kit/frontier-extension": "npm:^2.12.1" + checksum: 10c0/85620cb6722f0972bd5f24a3c722840fe2f06603b2fead7e054a68e98d5ed16ccc870d1bf344fd5355e4fe8e935f7fba7ae0fd81ebac5d602894252453cd8451 languageName: node linkType: hard -"@cosmos-kit/galaxy-station-extension@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/galaxy-station-extension@npm:2.13.0" +"@cosmos-kit/galaxy-station-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/galaxy-station-extension@npm:2.13.1" dependencies: "@chain-registry/types": "npm:0.46.11" "@cosmos-kit/core": "npm:^2.15.0" @@ -2887,22 +2929,22 @@ __metadata: peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/3931e875aef0527b695c9b39d18e91d02120cd1ac90fe0f7066ded8aba587b6f315baf5d5d4efcd6171975224ffdf8ad41a49c3c8480597c3fc73ac47f1e57d2 + checksum: 10c0/535729082d7b70fe489b3a53a9605971731c6fb8cd9f3decca253f623eae1f2b70ff5638504573645c0273fe6526919ca939e0fdf8e3724f81ae68725a4606d8 languageName: node linkType: hard -"@cosmos-kit/galaxy-station@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/galaxy-station@npm:2.12.0" +"@cosmos-kit/galaxy-station@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/galaxy-station@npm:2.12.1" dependencies: - "@cosmos-kit/galaxy-station-extension": "npm:^2.13.0" - checksum: 10c0/655f76ad80b0ca1bf9d7f36b26ea6847404372be8dfc6604eb7033dfae91462fed433064ea204b6b2f4b40fb34b68bc267e5539bbedc0b2a9294bd308737cbe9 + "@cosmos-kit/galaxy-station-extension": "npm:^2.13.1" + checksum: 10c0/ccb1fca599fbaeedab1bbd9d7c342b6a5d7848badfa1c51eac2830d9278ea17542203572f983bf2c0a51a432a02d35fd594dc4fb8bc3124d23d711ce832885f6 languageName: node linkType: hard -"@cosmos-kit/keplr-extension@npm:^2.14.0": - version: 2.14.0 - resolution: "@cosmos-kit/keplr-extension@npm:2.14.0" +"@cosmos-kit/keplr-extension@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/keplr-extension@npm:2.14.1" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" @@ -2911,53 +2953,53 @@ __metadata: peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/9ecd7d5e5f49d31122b2f604667b1e25c0bf4807b6db97fbf3cebd8b8bf4d2d7e884ef9d76c6619602b6f514aa2197beed00a55803d442643fd50ec15871f258 + checksum: 10c0/e6fff1d1c09bf9d536ffd296394875e09ab2215d068fc947c4897f659a9893c05fc97506d35e36a35472f65b810d007916a2dbaaa1d3220ef9d7a1c5f2257c06 languageName: node linkType: hard -"@cosmos-kit/keplr-mobile@npm:^2.14.1": - version: 2.14.1 - resolution: "@cosmos-kit/keplr-mobile@npm:2.14.1" +"@cosmos-kit/keplr-mobile@npm:^2.14.2": + version: 2.14.2 + resolution: "@cosmos-kit/keplr-mobile@npm:2.14.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" - "@cosmos-kit/keplr-extension": "npm:^2.14.0" + "@cosmos-kit/keplr-extension": "npm:^2.14.1" "@cosmos-kit/walletconnect": "npm:^2.12.0" "@keplr-wallet/provider-extension": "npm:^0.12.95" "@keplr-wallet/wc-client": "npm:^0.12.95" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/66d20fb38347caa2b8b76d2eafbe6a2757401eaaa65bc26388abf3493848f820a0031f2d60c900b152db01127b5d40288fb91154ddec56ce3c5eedf99de1ed59 + checksum: 10c0/26aab4497a80683498d4853a9b8d3f549484eed0f0b12933d62812c795e676a803bc63cfc5f0cd6eae461967c5a41302debb50b6d0edbdb1cffcf95d04ff1a42 languageName: node linkType: hard -"@cosmos-kit/keplr@npm:^2.14.1": - version: 2.14.1 - resolution: "@cosmos-kit/keplr@npm:2.14.1" +"@cosmos-kit/keplr@npm:^2.14.2": + version: 2.14.2 + resolution: "@cosmos-kit/keplr@npm:2.14.2" dependencies: - "@cosmos-kit/keplr-extension": "npm:^2.14.0" - "@cosmos-kit/keplr-mobile": "npm:^2.14.1" - checksum: 10c0/a0d695fb4daaf4667a42a6d121a7b2d4420b3a95c7220102171263b2365aa1d48b8357bd5c5cbda8329b3cfb63a1e6a46273b18cff1a96b2115eb257b4583aa0 + "@cosmos-kit/keplr-extension": "npm:^2.14.1" + "@cosmos-kit/keplr-mobile": "npm:^2.14.2" + checksum: 10c0/e340fe5e59f56dd4b2a9ab860bd316a7414ea65748e9495af6b2cf4ab5f0db35f5672535064cc5a8a7913391d9b3e2504f7d299a224ac666434e1c3be2ac4368 languageName: node linkType: hard -"@cosmos-kit/leap-extension@npm:^2.14.1": - version: 2.14.1 - resolution: "@cosmos-kit/leap-extension@npm:2.14.1" +"@cosmos-kit/leap-extension@npm:^2.14.2": + version: 2.14.2 + resolution: "@cosmos-kit/leap-extension@npm:2.14.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/bbf0cb9c5468be17be52848bbe14b6bf7bf0ddc12fe7ec9522180b921b0949006b0b7718de31c4b0cecd361e932e494305be3f011605e3453762e3163f89cc66 + checksum: 10c0/4886bf8ddfdd70054beb705d808b7d84da1c3bace8e9cf296875c77bacf1ab450647edae6e1628de2f50d008e265f064d00aadb2213a60eb31c0ad98337a8f81 languageName: node linkType: hard -"@cosmos-kit/leap-metamask-cosmos-snap@npm:^0.14.1": - version: 0.14.1 - resolution: "@cosmos-kit/leap-metamask-cosmos-snap@npm:0.14.1" +"@cosmos-kit/leap-metamask-cosmos-snap@npm:^0.14.2": + version: 0.14.2 + resolution: "@cosmos-kit/leap-metamask-cosmos-snap@npm:0.14.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" @@ -2967,35 +3009,35 @@ __metadata: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" cosmjs-types: ">=0.9.0" - checksum: 10c0/69e2a7c2ed8423fcc0b8101dcc2fb05e25c7f2813b73b18a8457cb4ad4fc6d8a381cfe692f16523c7347a042be6d45460ec78fa0437dcfba4c9f32e510a048d3 + checksum: 10c0/9c71d25f377aab42fba609d70b94b9a3958750016ef854711c6763ae5c19b2b174754092e38cbd6c9b9d7a7350dd3d47de2f7ba8a38cbcb9baec46ce93bf15ff languageName: node linkType: hard -"@cosmos-kit/leap-mobile@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/leap-mobile@npm:2.13.1" +"@cosmos-kit/leap-mobile@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/leap-mobile@npm:2.13.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" "@cosmos-kit/walletconnect": "npm:^2.12.0" - checksum: 10c0/195b6e084a5ce77146d1cde73d730e9cca75f174b8abc2fde71975a99c4eba6d689ba360c35e7b4826901172e82e713cb1f92d3e9daea48df6176ee0b79b79f7 + checksum: 10c0/c0badd12f73b96fcf4405f33880cc2a3b916d195a69cdc81539aa0856cc1994ab0a8300ab10f0a6e2c3e51d48ba6d5428a61a87cc73d86faa459a9258143d891 languageName: node linkType: hard -"@cosmos-kit/leap@npm:^2.14.1": - version: 2.14.1 - resolution: "@cosmos-kit/leap@npm:2.14.1" +"@cosmos-kit/leap@npm:^2.14.2": + version: 2.14.2 + resolution: "@cosmos-kit/leap@npm:2.14.2" dependencies: - "@cosmos-kit/leap-extension": "npm:^2.14.1" - "@cosmos-kit/leap-metamask-cosmos-snap": "npm:^0.14.1" - "@cosmos-kit/leap-mobile": "npm:^2.13.1" - checksum: 10c0/3e269494ae903fa5337cfdceed844abdd78888986051046cb008fd93c5c1bb624630133d0bed004fcb81499faf36431b6974a951b67c41f2cb0ef9224229a754 + "@cosmos-kit/leap-extension": "npm:^2.14.2" + "@cosmos-kit/leap-metamask-cosmos-snap": "npm:^0.14.2" + "@cosmos-kit/leap-mobile": "npm:^2.13.2" + checksum: 10c0/6066b96f5f83ac56d8687dabaa027dd30cef136614d1e282162adf8f63be151c3b08731795d0af580833a80a243555e6c4f242ece9990cf455c36198945ee245 languageName: node linkType: hard -"@cosmos-kit/ledger@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/ledger@npm:2.13.0" +"@cosmos-kit/ledger@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/ledger@npm:2.13.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" "@ledgerhq/hw-app-cosmos": "npm:^6.28.1" @@ -3004,7 +3046,7 @@ __metadata: peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/05f7dd48b6e33cd0f4fd8958f89dc98253ec72f5ba7c5b8570f1a6578069b4ce9cd40ba0f1ab6f5643796a9b4b0dd646a8771be479a320c5516439ba8eb9b815 + checksum: 10c0/0fe9471964b0b6da4557b87686acfa3ffd017dcecc4243f4663ecf8597bb5224d58a91eddb504a36bf732ebda2edf32155bb9b1994175e6c6c3554d1a736b96e languageName: node linkType: hard @@ -3020,31 +3062,31 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/omni-mobile@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/omni-mobile@npm:2.12.0" +"@cosmos-kit/omni-mobile@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/omni-mobile@npm:2.12.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" "@cosmos-kit/walletconnect": "npm:^2.12.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/06a81c803ae3a189152bd93c248b1c886214c3d65f6be8883dae82424ebe1d985398d2a6e587c8ca54b8050157a7b07d6359dcccf0ca85f5c669e033d50f10e9 + checksum: 10c0/aa66766409d0f9967ac7436f3e3a5c1185a354ffa99dda019b72f56c7a8f57fc0a13a31e81b4e84857221cc8e88dfc23e887cc7b411dd52f1ed6c7d9f90a50a9 languageName: node linkType: hard -"@cosmos-kit/omni@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/omni@npm:2.12.0" +"@cosmos-kit/omni@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/omni@npm:2.12.1" dependencies: - "@cosmos-kit/omni-mobile": "npm:^2.12.0" - checksum: 10c0/44bdc747d54327062fa9f3573dadbf4834a7f3b9185ef7c61c9b60762cc1e835ed9d9d46a8dd667ae2a4d701b36d5f7656abdd727fdfa9a91669a2eaf18da662 + "@cosmos-kit/omni-mobile": "npm:^2.12.1" + checksum: 10c0/fd3bde9bd035bb2f2e56b21bd53c340903723dc572ccf6986246bdd7051adf6434a636843e9783ecc91fc05d29ae44fc309f60105741648c344df54cced770f9 languageName: node linkType: hard -"@cosmos-kit/owallet-extension@npm:^2.14.1": - version: 2.14.1 - resolution: "@cosmos-kit/owallet-extension@npm:2.14.1" +"@cosmos-kit/owallet-extension@npm:^2.14.2": + version: 2.14.2 + resolution: "@cosmos-kit/owallet-extension@npm:2.14.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" @@ -3052,22 +3094,34 @@ __metadata: peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/1a56ee0f2c30e52eda14412130d9d7f40dcbaffe8cada568c03e2e946f41806853415ca30d7061cff2479187e95fcf1aa9d99a793129cde68c04ef41798a52e7 + checksum: 10c0/3fe4d453de0af5fc25cb554cdc8fbb432eb041b57991df29437197cc680b4279df478ee8e3530ce62bd403171cc86368147ca70691dd8a1542ffb585d0e607d1 languageName: node linkType: hard -"@cosmos-kit/owallet@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/owallet@npm:2.13.1" +"@cosmos-kit/owallet-mobile@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/owallet-mobile@npm:2.15.1" + dependencies: + "@chain-registry/keplr": "npm:1.68.2" + "@cosmos-kit/core": "npm:^2.13.1" + "@cosmos-kit/walletconnect": "npm:^2.10.1" + checksum: 10c0/8b8f99f6c9e966e3777d4ab7559107eb0462740e7ee03c4e4409082b2a1044172b0f12eaf1f58613def832bbe88049eafbe1c4ad0346942238b79db2534c0d77 + languageName: node + linkType: hard + +"@cosmos-kit/owallet@npm:^2.14.1": + version: 2.14.1 + resolution: "@cosmos-kit/owallet@npm:2.14.1" dependencies: - "@cosmos-kit/owallet-extension": "npm:^2.14.1" - checksum: 10c0/a041da49fddb45419b8f77aec83432f31a936780cfb21d4d52ec9d1b2f7780d47f9af835fef96cbea6075d5558f8446c08aeadc42c89e068cdd6a3c41a520a45 + "@cosmos-kit/owallet-extension": "npm:^2.14.2" + "@cosmos-kit/owallet-mobile": "npm:^2.15.1" + checksum: 10c0/bb49f923a497cee99b33722d1358a63c454ad4bd0dd9c483d3204b49b6a0ed616b9b949a9779119753d242d283915f457ea27a6509e96e1bc76a13dc3c43fa13 languageName: node linkType: hard "@cosmos-kit/react-lite@npm:^2.6.9": - version: 2.15.1 - resolution: "@cosmos-kit/react-lite@npm:2.15.1" + version: 2.15.2 + resolution: "@cosmos-kit/react-lite@npm:2.15.2" dependencies: "@chain-registry/types": "npm:^0.46.11" "@cosmos-kit/core": "npm:^2.15.0" @@ -3077,7 +3131,7 @@ __metadata: "@types/react-dom": ">= 17" react: ^18 react-dom: ^18 - checksum: 10c0/f7dd5370579e01fbf73737091f66400128bb01a989fb0fb1d2d19bc7a8d7259b18e9becb943283e481b8c46f145731e9b445e64ce7875a19e981be8acaf71f4f + checksum: 10c0/77b85e57674a72212ca87884d9a76c8d9d0e945c8b9c3f43f2080bbd18c1e50e91b527974f266f46de7a8a426565c427609bfeaf95d758916156cd8f126a0db5 languageName: node linkType: hard @@ -3097,31 +3151,31 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/shell-extension@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/shell-extension@npm:2.13.1" +"@cosmos-kit/shell-extension@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/shell-extension@npm:2.13.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/141f3277d9ac1dd660b61c914d90dbd8325987197a34cb8bf2c36df6587aa0d16d7493e855694751b9e08d4533885b9f2ea012e596da0c15d84b95c5819a3bd4 + checksum: 10c0/e301919400fc58f3c262a98e28fed446dac3b3f5bab13c583d067cc37550b0b416c1459e16f52e6031e6e31984b36179d3f639a8657b70e9a8014bfa432e87b6 languageName: node linkType: hard -"@cosmos-kit/shell@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/shell@npm:2.13.1" +"@cosmos-kit/shell@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/shell@npm:2.13.2" dependencies: - "@cosmos-kit/shell-extension": "npm:^2.13.1" - checksum: 10c0/b381de609a4ec49e4b34c4f09807c8ed32c7bd02be7e280123ab7d534c5c2dd6a0978ab1f8605719ceec172239e6f64f79857eb83fadb4159072cf9641212526 + "@cosmos-kit/shell-extension": "npm:^2.13.2" + checksum: 10c0/73bef841f8056319e1681785a6e4fbd3f66965bbac317641842dff93c056a20b66302109147dac9d75637a4fe424f6ac0f1acc8cc2595f6a91dd57244603afe7 languageName: node linkType: hard -"@cosmos-kit/station-extension@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/station-extension@npm:2.13.0" +"@cosmos-kit/station-extension@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/station-extension@npm:2.13.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" "@terra-money/feather.js": "npm:^1.0.8" @@ -3131,95 +3185,95 @@ __metadata: "@chain-registry/types": ">= 0.17" "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/9c868508c6fd0e5b1c87b9fb18e65ab1e905f262b8f3681af5f60455083f9824b8c6c7cbb8fb84ca853e9b11c9c1f3fb1aa033be112e5c7893936eaa9e687435 + checksum: 10c0/c555849e9727694a2ec70b4fd2392df026d41eb8dccd73dc14e2bfdb4bf5e99a8e981a9705b123cd5921b0c7bfe2c99e7f5e7fa5206baad0b85b56c75fc7ec30 languageName: node linkType: hard -"@cosmos-kit/station@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/station@npm:2.12.0" +"@cosmos-kit/station@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/station@npm:2.12.1" dependencies: - "@cosmos-kit/station-extension": "npm:^2.13.0" - checksum: 10c0/055c326d33acf642dd7a58e90243718300ceeb6913768da03e501924ba780571b396cdbdb89f14c639cccad51baa24bb1cd54c47c8dfeda5269098fc7c23d065 + "@cosmos-kit/station-extension": "npm:^2.13.1" + checksum: 10c0/511566145261b07a12127bfca3a77f692be9ddc6c572e69e3aad1796a40bca7d748cdfff95364fb7d0463a2efa6927b29d6ccd272bda5fe0b5a10b3b76d4ef9b languageName: node linkType: hard -"@cosmos-kit/tailwind-extension@npm:^1.7.0": - version: 1.7.0 - resolution: "@cosmos-kit/tailwind-extension@npm:1.7.0" +"@cosmos-kit/tailwind-extension@npm:^1.7.1": + version: 1.7.1 + resolution: "@cosmos-kit/tailwind-extension@npm:1.7.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" - checksum: 10c0/f146cceca975b6ddadaeb6ece7e30fae2a3f65f04b48fd3c7d397fd52dcd6663405efff5297f09950bb87e2375dba578700c5ba3183a28708d78734ed260ba22 + checksum: 10c0/758426407a77de3d92d75e53de8b27c1e70b984940668ef15451134b9456c9619d26261ea72e0f3c2cf9fd7a6f2738d3dcaeec03dceffb0209a35cd4c7082924 languageName: node linkType: hard -"@cosmos-kit/tailwind@npm:^1.7.0": - version: 1.7.0 - resolution: "@cosmos-kit/tailwind@npm:1.7.0" +"@cosmos-kit/tailwind@npm:^1.7.1": + version: 1.7.1 + resolution: "@cosmos-kit/tailwind@npm:1.7.1" dependencies: - "@cosmos-kit/tailwind-extension": "npm:^1.7.0" - checksum: 10c0/f18d5f3266aa23d3bd49af9de5651849ab317920eecd0a7e8015bafa210f52c8a6eeb47ec9b8c4459fb174e390354dfb808358ac861ec0cf2755a24cabd40768 + "@cosmos-kit/tailwind-extension": "npm:^1.7.1" + checksum: 10c0/7169ed91a362c8df90b29b249d9d5234f3f8524e3cc1c4520c67d07f506e9568e2afcbc67720b3dd17ebe6793aafc5dfbe90f5a283dee8efaa2dab3a0f5e2a43 languageName: node linkType: hard -"@cosmos-kit/trust-extension@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/trust-extension@npm:2.12.0" +"@cosmos-kit/trust-extension@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/trust-extension@npm:2.12.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/bbc3ebe2e7bc43c4a41736ea8e2ac3bc41d8eb30ef52b935eb4da9f97a662fb2e211836443d41c2fc3a1f59281496cfd03f4e13af04ea68767bfdd2e587af22a + checksum: 10c0/81b5e2544ef794b88503aab966228f98745c604dd9b7585beb0398604f12aa709d3bb1d9d6cd1a93abbc3211c82bf23cb0b196b1c683dd7187a2a005126ac20d languageName: node linkType: hard -"@cosmos-kit/trust-mobile@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/trust-mobile@npm:2.12.0" +"@cosmos-kit/trust-mobile@npm:^2.12.1": + version: 2.12.1 + resolution: "@cosmos-kit/trust-mobile@npm:2.12.1" dependencies: "@cosmos-kit/core": "npm:^2.15.0" "@cosmos-kit/walletconnect": "npm:^2.12.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/e542a881a71ee5c879a63cba657be12f35e027f8999a7bf7b895d827659e78bc5ec9d1fc09a785ebc9df7be7b58a12e3ae76c52f7c613f1035e1f07ef4cae419 + checksum: 10c0/9781f378922af3c858a98aca31affaac2be7d584900082dab3b23660069e5ff636e0254ffa780e1ed8e680d621f338d8e3eb9399ab34117f16fe8c83657627f5 languageName: node linkType: hard -"@cosmos-kit/trust@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/trust@npm:2.13.0" +"@cosmos-kit/trust@npm:^2.13.1": + version: 2.13.1 + resolution: "@cosmos-kit/trust@npm:2.13.1" dependencies: - "@cosmos-kit/trust-extension": "npm:^2.12.0" - "@cosmos-kit/trust-mobile": "npm:^2.12.0" - checksum: 10c0/ee65807edf6ba32ed9cee964e9c25c8a05e95364c0f70782a18875fd429ebef195ae49925fd25b42c01f013185dd1378692d2c3f9fee506060efc91faa32f096 + "@cosmos-kit/trust-extension": "npm:^2.12.1" + "@cosmos-kit/trust-mobile": "npm:^2.12.1" + checksum: 10c0/6e894aac29f439e61da006a3207ca415d4669c9fd26b763a0cc793e05479220eb75f3d6d21ff20c948a0b2f8ec2d3bf9bfac8a2c07fd14c7c5ff2d702597f9f2 languageName: node linkType: hard -"@cosmos-kit/vectis-extension@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/vectis-extension@npm:2.13.1" +"@cosmos-kit/vectis-extension@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/vectis-extension@npm:2.13.2" dependencies: "@chain-registry/keplr": "npm:^1.69.13" "@cosmos-kit/core": "npm:^2.15.0" peerDependencies: "@cosmjs/amino": ">=0.32.3" "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/4dfc0395a3881b0348da53d6a74fcc22e4c5a5095dd755d40940b55de53360dcee47e8ef08bee539b8d57c76839ddcbe85d822d7f6a5c3776a55d0eeaabb59c3 + checksum: 10c0/a8f8be060ac6ae9ac5a6b62e573ac8b72f13a221b5a42e4d383bd31e8c5e0d9b809caa14ee4fe02a5f5b8ee985e4c1391c3bbd302d7526298ef7251785e46e60 languageName: node linkType: hard -"@cosmos-kit/vectis@npm:^2.13.1": - version: 2.13.1 - resolution: "@cosmos-kit/vectis@npm:2.13.1" +"@cosmos-kit/vectis@npm:^2.13.2": + version: 2.13.2 + resolution: "@cosmos-kit/vectis@npm:2.13.2" dependencies: - "@cosmos-kit/vectis-extension": "npm:^2.13.1" - checksum: 10c0/6ac2dd7e2acc4f81dfd8f2ad283b334bd789edd3c5a76d43622ce5f4fc386b4dc05b8b6954c48470703d2aff10589a790d3a34e3e286230a600b0375c0eb668a + "@cosmos-kit/vectis-extension": "npm:^2.13.2" + checksum: 10c0/2ae065d9c6ee45d13a7770c97e9678ba1705aa25237e190c3f675608372206b77146b1a86815725d4b5a9a26dd0e21c046b013132319d2badfe74f5b40f03b52 languageName: node linkType: hard -"@cosmos-kit/walletconnect@npm:^2.12.0": +"@cosmos-kit/walletconnect@npm:^2.10.1, @cosmos-kit/walletconnect@npm:^2.12.0": version: 2.12.0 resolution: "@cosmos-kit/walletconnect@npm:2.12.0" dependencies: @@ -3235,27 +3289,6 @@ __metadata: languageName: node linkType: hard -"@cosmos-kit/xdefi-extension@npm:^2.13.0": - version: 2.13.0 - resolution: "@cosmos-kit/xdefi-extension@npm:2.13.0" - dependencies: - "@cosmos-kit/core": "npm:^2.15.0" - peerDependencies: - "@cosmjs/amino": ">=0.32.3" - "@cosmjs/proto-signing": ">=0.32.3" - checksum: 10c0/37193ca50144f8db952ef46faae2ce9e5129ddc45211ce85b4a0318e3b40312660f9d48c4c9f5ef1c33da41c83c622b2933acd2d071c4afddec6315d0cccc883 - languageName: node - linkType: hard - -"@cosmos-kit/xdefi@npm:^2.12.0": - version: 2.12.0 - resolution: "@cosmos-kit/xdefi@npm:2.12.0" - dependencies: - "@cosmos-kit/xdefi-extension": "npm:^2.13.0" - checksum: 10c0/310ee781d1658e287cd4fa7635938642c1b113cb406f23beb94419d08cf5979968e0fce0e1f12899899bea5057be2dc08c0024c798da6c4bbac8678beb9b416d - languageName: node - linkType: hard - "@cosmostation/extension-client@npm:0.1.15": version: 0.1.15 resolution: "@cosmostation/extension-client@npm:0.1.15" @@ -3443,7 +3476,7 @@ __metadata: languageName: node linkType: hard -"@endo/captp@npm:^4.4.2": +"@endo/captp@npm:^4.4.2, @endo/captp@npm:^4.4.3": version: 4.4.3 resolution: "@endo/captp@npm:4.4.3" dependencies: @@ -3466,7 +3499,7 @@ __metadata: languageName: node linkType: hard -"@endo/check-bundle@npm:^1.0.11": +"@endo/check-bundle@npm:^1.0.11, @endo/check-bundle@npm:^1.0.12": version: 1.0.12 resolution: "@endo/check-bundle@npm:1.0.12" dependencies: @@ -3616,7 +3649,7 @@ __metadata: languageName: node linkType: hard -"@endo/exo@npm:^1.5.6": +"@endo/exo@npm:^1.5.6, @endo/exo@npm:^1.5.7": version: 1.5.7 resolution: "@endo/exo@npm:1.5.7" dependencies: @@ -3662,7 +3695,7 @@ __metadata: languageName: node linkType: hard -"@endo/import-bundle@npm:^1.3.1": +"@endo/import-bundle@npm:^1.3.1, @endo/import-bundle@npm:^1.3.2": version: 1.3.2 resolution: "@endo/import-bundle@npm:1.3.2" dependencies: @@ -3858,7 +3891,7 @@ __metadata: languageName: node linkType: hard -"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.7": +"@endo/ses-ava@npm:^1.2.2, @endo/ses-ava@npm:^1.2.7, @endo/ses-ava@npm:^1.2.8": version: 1.2.8 resolution: "@endo/ses-ava@npm:1.2.8" dependencies: @@ -5303,13 +5336,13 @@ __metadata: linkType: hard "@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: "@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a languageName: node linkType: hard @@ -5413,37 +5446,37 @@ __metadata: linkType: hard "@keplr-wallet/provider-extension@npm:^0.12.95": - version: 0.12.160 - resolution: "@keplr-wallet/provider-extension@npm:0.12.160" + version: 0.12.169 + resolution: "@keplr-wallet/provider-extension@npm:0.12.169" dependencies: - "@keplr-wallet/types": "npm:0.12.160" + "@keplr-wallet/types": "npm:0.12.169" deepmerge: "npm:^4.2.2" long: "npm:^4.0.0" peerDependencies: starknet: ^6 - checksum: 10c0/6d2624fb8f942fd47f43def6cd7d9730ae11f2fdc52cdbcbc8b0b4c6118277bfbdcc479b07de9c72f0da89319f7266794f73f9dda0f8ca7ac8d2b46ff03e856a + checksum: 10c0/77af68c1c0709d986bb3391b22bfa35c3979c16171804b445bdeb6f025b30f711745e395ef888685da2cd0e1b9f604779045ccc192db33777effc528d12d38b8 languageName: node linkType: hard -"@keplr-wallet/provider@npm:0.12.160": - version: 0.12.160 - resolution: "@keplr-wallet/provider@npm:0.12.160" +"@keplr-wallet/provider@npm:0.12.169": + version: 0.12.169 + resolution: "@keplr-wallet/provider@npm:0.12.169" dependencies: - "@keplr-wallet/router": "npm:0.12.160" - "@keplr-wallet/types": "npm:0.12.160" + "@keplr-wallet/router": "npm:0.12.169" + "@keplr-wallet/types": "npm:0.12.169" buffer: "npm:^6.0.3" deepmerge: "npm:^4.2.2" long: "npm:^4.0.0" peerDependencies: starknet: ^6 - checksum: 10c0/0a2e2926c4298f25ecd5cc190c69e1491439e27b831dd96668358187d85ea868e3fde47246459a9bb83ccdd2c3607a372828afb7052b36380faa1f82cebc1e1a + checksum: 10c0/395a3a1fa78b84c11889284643566d47c2e1ab5ff1b85677a7309570fbd14ae5480ccd0b16b4cf8a16e17c950860e9eaa86780f80ad2ab52fa5c11896e6a01a3 languageName: node linkType: hard -"@keplr-wallet/router@npm:0.12.160": - version: 0.12.160 - resolution: "@keplr-wallet/router@npm:0.12.160" - checksum: 10c0/4b200bb2ae613bed185bb3424ef929c8c055a5238c9476657b505be749aeb6141a850e78203a28d38f6d37514171a8a856465819c014a1fd0d9287fad262bda0 +"@keplr-wallet/router@npm:0.12.169": + version: 0.12.169 + resolution: "@keplr-wallet/router@npm:0.12.169" + checksum: 10c0/4a4a798599a143b3eb3159984814ae2f3666d28c89a3d089c6e0b442da40886064b18ae8795ece491608f4d991d809476350ea085db40ca8c9f4f22d1c80e3f8 languageName: node linkType: hard @@ -5454,14 +5487,14 @@ __metadata: languageName: node linkType: hard -"@keplr-wallet/types@npm:0.12.160, @keplr-wallet/types@npm:^0.12.121, @keplr-wallet/types@npm:^0.12.90, @keplr-wallet/types@npm:^0.12.95": - version: 0.12.160 - resolution: "@keplr-wallet/types@npm:0.12.160" +"@keplr-wallet/types@npm:0.12.169, @keplr-wallet/types@npm:^0.12.121, @keplr-wallet/types@npm:^0.12.90, @keplr-wallet/types@npm:^0.12.95": + version: 0.12.169 + resolution: "@keplr-wallet/types@npm:0.12.169" dependencies: long: "npm:^4.0.0" peerDependencies: starknet: ^6 - checksum: 10c0/56eb678263f7f6b4004ef7c3891c796c66bb7783498b9d483ff4393b4b37879709aeef8a716179de86cc0d50b9e2a91ca25b36b51e978cd31f2ea0266c2853ca + checksum: 10c0/59cd6182d81944ddf31a244cdafcff040079018bd729403282b2d868d1e7324f6cf5db9dd5df6419ad0cbc40359d7ca018337754bd61698937648e04adeac8f3 languageName: node linkType: hard @@ -5486,11 +5519,11 @@ __metadata: linkType: hard "@keplr-wallet/wc-client@npm:^0.12.95": - version: 0.12.160 - resolution: "@keplr-wallet/wc-client@npm:0.12.160" + version: 0.12.169 + resolution: "@keplr-wallet/wc-client@npm:0.12.169" dependencies: - "@keplr-wallet/provider": "npm:0.12.160" - "@keplr-wallet/types": "npm:0.12.160" + "@keplr-wallet/provider": "npm:0.12.169" + "@keplr-wallet/types": "npm:0.12.169" buffer: "npm:^6.0.3" deepmerge: "npm:^4.2.2" long: "npm:^3 || ^4 || ^5" @@ -5498,7 +5531,7 @@ __metadata: "@walletconnect/sign-client": ^2 "@walletconnect/types": ^2 starknet: ^6 - checksum: 10c0/6b1b6660f31274a6d94f397f51528438e64f2566b2bee33ad276aa792957a076ba712d508f21a1a4d4030c377e3c9e92ce51cc72ad6183c6c31419db57570b55 + checksum: 10c0/49addd5c3797458974173c7b1388ac726611635de9e52c7c307903a510a26a907771e46628132af8641ed351871bf5b68337583c1494225b0a9838c153284184 languageName: node linkType: hard @@ -5618,7 +5651,7 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^8.4.4": +"@ledgerhq/devices@npm:8.4.4, @ledgerhq/devices@npm:^8.4.4": version: 8.4.4 resolution: "@ledgerhq/devices@npm:8.4.4" dependencies: @@ -5649,14 +5682,14 @@ __metadata: linkType: hard "@ledgerhq/hw-transport-webhid@npm:^6.27.15": - version: 6.29.4 - resolution: "@ledgerhq/hw-transport-webhid@npm:6.29.4" + version: 6.30.0 + resolution: "@ledgerhq/hw-transport-webhid@npm:6.30.0" dependencies: - "@ledgerhq/devices": "npm:^8.4.4" + "@ledgerhq/devices": "npm:8.4.4" "@ledgerhq/errors": "npm:^6.19.1" "@ledgerhq/hw-transport": "npm:^6.31.4" "@ledgerhq/logs": "npm:^6.12.0" - checksum: 10c0/85db88aa9c9ca4911645b9421e1a1ce828c48c32b03b7ed15caed8f8e24749dc31007540ec4f0088603d1a315274dbc06d30e4cb71c86b57160b721a664fc8dd + checksum: 10c0/1cb6ddb50127d6cb73d80259e10da687a2b7aa87ebbac8cc3e770ac5b95a3ef0001bdaf77109da0eb62509cb8668a9642858b59cb0ff355c1adb0fe2114c532c languageName: node linkType: hard @@ -5992,196 +6025,41 @@ __metadata: https-proxy-agent: "npm:^7.0.1" lru-cache: "npm:^10.0.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 - languageName: node - linkType: hard - -"@opentelemetry/api@npm:^1.0.0": - version: 1.9.0 - resolution: "@opentelemetry/api@npm:1.9.0" - checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add - languageName: node - linkType: hard - -"@opentelemetry/core@npm:^1.14.0": - version: 1.29.0 - resolution: "@opentelemetry/core@npm:1.29.0" - dependencies: - "@opentelemetry/semantic-conventions": "npm:1.28.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10c0/393fa276262ecc0e7bd7db5f507a2118df0725afab0cea1cb071b8d0ec879c08d9d163a83bb13f77a6bd0ad0cb66094856eb19caf225da32d3b1767156105d26 - languageName: node - linkType: hard - -"@opentelemetry/semantic-conventions@npm:1.28.0": - version: 1.28.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" - checksum: 10c0/deb8a0f744198071e70fea27143cf7c9f7ecb7e4d7b619488c917834ea09b31543c1c2bcea4ec5f3cf68797f0ef3549609c14e859013d9376400ac1499c2b9cb - languageName: node - linkType: hard - -"@parcel/watcher-android-arm64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-android-arm64@npm:2.5.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@parcel/watcher-darwin-arm64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@parcel/watcher-darwin-x64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@parcel/watcher-freebsd-x64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm-glibc@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm-musl@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm64-musl@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@parcel/watcher-linux-x64-glibc@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@parcel/watcher-linux-x64-musl@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@parcel/watcher-wasm@npm:^2.4.1": - version: 2.5.0 - resolution: "@parcel/watcher-wasm@npm:2.5.0" - dependencies: - is-glob: "npm:^4.0.3" - micromatch: "npm:^4.0.5" - napi-wasm: "npm:^1.1.0" - checksum: 10c0/8aad14aa21d460d7f8d407a9d8859b8372317e03bc53a154aefb9394ae51ab0fac27fdf546ec4da27307ad8219945128a19646f8e637a0200b0c6b39fbccd3d8 + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" - conditions: os=win32 & cpu=arm64 +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" - conditions: os=win32 & cpu=ia32 +"@opentelemetry/api@npm:^1.0.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-win32-x64@npm:2.5.0" - conditions: os=win32 & cpu=x64 +"@opentelemetry/core@npm:^1.14.0": + version: 1.30.0 + resolution: "@opentelemetry/core@npm:1.30.0" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/52d17b5ddb06ab4241b977ff89b81f69f140edb5c2a78b2188d95fa7bdfdd1aa2dcafb1e2830ab77d557876682ab8f08727ba8f165ea3c39fbb6bf3b86ef33c8 languageName: node linkType: hard -"@parcel/watcher@npm:^2.4.1": - version: 2.5.0 - resolution: "@parcel/watcher@npm:2.5.0" - dependencies: - "@parcel/watcher-android-arm64": "npm:2.5.0" - "@parcel/watcher-darwin-arm64": "npm:2.5.0" - "@parcel/watcher-darwin-x64": "npm:2.5.0" - "@parcel/watcher-freebsd-x64": "npm:2.5.0" - "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" - "@parcel/watcher-linux-arm-musl": "npm:2.5.0" - "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" - "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" - "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" - "@parcel/watcher-linux-x64-musl": "npm:2.5.0" - "@parcel/watcher-win32-arm64": "npm:2.5.0" - "@parcel/watcher-win32-ia32": "npm:2.5.0" - "@parcel/watcher-win32-x64": "npm:2.5.0" - detect-libc: "npm:^1.0.3" - is-glob: "npm:^4.0.3" - micromatch: "npm:^4.0.5" - node-addon-api: "npm:^7.0.0" - node-gyp: "npm:latest" - dependenciesMeta: - "@parcel/watcher-android-arm64": - optional: true - "@parcel/watcher-darwin-arm64": - optional: true - "@parcel/watcher-darwin-x64": - optional: true - "@parcel/watcher-freebsd-x64": - optional: true - "@parcel/watcher-linux-arm-glibc": - optional: true - "@parcel/watcher-linux-arm-musl": - optional: true - "@parcel/watcher-linux-arm64-glibc": - optional: true - "@parcel/watcher-linux-arm64-musl": - optional: true - "@parcel/watcher-linux-x64-glibc": - optional: true - "@parcel/watcher-linux-x64-musl": - optional: true - "@parcel/watcher-win32-arm64": - optional: true - "@parcel/watcher-win32-ia32": - optional: true - "@parcel/watcher-win32-x64": - optional: true - checksum: 10c0/9bad727d8b11e5d150ec47459254544c583adaa47d047b8ef65e1c74aede1a0767dc7fc6b8997649dae07318d6ef39caba6a1c405d306398d5bcd47074ec5d29 +"@opentelemetry/semantic-conventions@npm:1.28.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 10c0/deb8a0f744198071e70fea27143cf7c9f7ecb7e4d7b619488c917834ea09b31543c1c2bcea4ec5f3cf68797f0ef3549609c14e859013d9376400ac1499c2b9cb languageName: node linkType: hard @@ -7855,8 +7733,8 @@ __metadata: linkType: hard "@rollup/plugin-node-resolve@npm:^15.2.3": - version: 15.3.0 - resolution: "@rollup/plugin-node-resolve@npm:15.3.0" + version: 15.3.1 + resolution: "@rollup/plugin-node-resolve@npm:15.3.1" dependencies: "@rollup/pluginutils": "npm:^5.0.1" "@types/resolve": "npm:1.20.2" @@ -7868,7 +7746,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 10c0/5f3b11f9f6d00fe9fd3fe1977cc71f6a99c2b13d0ee82ad6822c4c4ecfc98854791c5a505798762f7e2332d9d67568a561e89aa8268ed3b1668563be1845109e + checksum: 10c0/ecf3abe890fc98ad665fdbfb1ea245253e0d1f2bc6d9f4e8f496f212c76a2ce7cd4b9bc0abd21e6bcaa16f72d1c67cc6b322ea12a6ec68e8a8834df8242a5ecd languageName: node linkType: hard @@ -7920,8 +7798,8 @@ __metadata: linkType: hard "@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": - version: 5.1.3 - resolution: "@rollup/pluginutils@npm:5.1.3" + version: 5.1.4 + resolution: "@rollup/pluginutils@npm:5.1.4" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" @@ -7931,139 +7809,139 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + checksum: 10c0/6d58fbc6f1024eb4b087bc9bf59a1d655a8056a60c0b4021d3beaeec3f0743503f52467fd89d2cf0e7eccf2831feb40a05ad541a17637ea21ba10b21c2004deb languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.28.1" +"@rollup/rollup-android-arm-eabi@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.29.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-android-arm64@npm:4.28.1" +"@rollup/rollup-android-arm64@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-android-arm64@npm:4.29.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.28.1" +"@rollup/rollup-darwin-arm64@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.29.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.28.1" +"@rollup/rollup-darwin-x64@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.29.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.28.1" +"@rollup/rollup-freebsd-arm64@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.29.1" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-freebsd-x64@npm:4.28.1" +"@rollup/rollup-freebsd-x64@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.29.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.29.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.28.1" +"@rollup/rollup-linux-arm-musleabihf@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.29.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.28.1" +"@rollup/rollup-linux-arm64-gnu@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.29.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.28.1" +"@rollup/rollup-linux-arm64-musl@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.29.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.29.1" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.29.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.28.1" +"@rollup/rollup-linux-riscv64-gnu@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.29.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.28.1" +"@rollup/rollup-linux-s390x-gnu@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.29.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.28.1" +"@rollup/rollup-linux-x64-gnu@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.29.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.28.1" +"@rollup/rollup-linux-x64-musl@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.29.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.28.1" +"@rollup/rollup-win32-arm64-msvc@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.29.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.28.1" +"@rollup/rollup-win32-ia32-msvc@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.29.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.28.1": - version: 4.28.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.28.1" +"@rollup/rollup-win32-x64-msvc@npm:4.29.1": + version: 4.29.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.29.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -8438,21 +8316,21 @@ __metadata: linkType: hard "@tanstack/react-virtual@npm:^3.0.0-beta.60": - version: 3.11.0 - resolution: "@tanstack/react-virtual@npm:3.11.0" + version: 3.11.2 + resolution: "@tanstack/react-virtual@npm:3.11.2" dependencies: - "@tanstack/virtual-core": "npm:3.10.9" + "@tanstack/virtual-core": "npm:3.11.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/8ee14e46ad58af9f628ad89ae24fa47511c0d83d56b01b0339e1b2952a7169b40a6a65c1534003023cefd28cf5ae819070c3c78ceeedb6a18d16f8f5b7d8f675 + checksum: 10c0/de446ce517d0855b3d58e79b6a75a37be40b4529baf0a5c3ffa2662dea80aba03409e06545aea27aa9e3a36fc2a2e3005ecbfce16a4659991d66930ea3bd62d4 languageName: node linkType: hard -"@tanstack/virtual-core@npm:3.10.9": - version: 3.10.9 - resolution: "@tanstack/virtual-core@npm:3.10.9" - checksum: 10c0/960cde330235daff5403e0da23837ac30a0f95a02c8866692f8382d03b675d6802e129436b0b3e7e737d8a5347ef2cadec448ba4c0878462228c094440d0207b +"@tanstack/virtual-core@npm:3.11.2": + version: 3.11.2 + resolution: "@tanstack/virtual-core@npm:3.11.2" + checksum: 10c0/38f1047127c6b1d07fe95becb7a12e66fb7c59d37ec0359e4ab339f837c6b906e1adff026ebd12849ba851d3f118d491014205c6b3c6ed8568cc232a798aeaaf languageName: node linkType: hard @@ -8683,11 +8561,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=13.7.0, @types/node@npm:^22.9.0": - version: 22.10.1 - resolution: "@types/node@npm:22.10.1" + version: 22.10.2 + resolution: "@types/node@npm:22.10.2" dependencies: undici-types: "npm:~6.20.0" - checksum: 10c0/0fbb6d29fa35d807f0223a4db709c598ac08d66820240a2cd6a8a69b8f0bc921d65b339d850a666b43b4e779f967e6ed6cf6f0fca3575e08241e6b900364c234 + checksum: 10c0/2c7b71a040f1ef5320938eca8ebc946e6905caa9bbf3d5665d9b3774a8d15ea9fab1582b849a6d28c7fc80756a62c5666bc66b69f42f4d5dafd1ccb193cdb4ac languageName: node linkType: hard @@ -8715,21 +8593,21 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.2.19": - version: 18.3.2 - resolution: "@types/react-dom@npm:18.3.2" - dependencies: - "@types/react": "npm:^18" - checksum: 10c0/22510231af67044a9542633b5b52ec16a8d71fa1da177f82428b8120d36619fd874c3b975b2eda6895baa53667f9fe8cba3acea1232a0244dffe8b11f6b32284 + version: 18.3.5 + resolution: "@types/react-dom@npm:18.3.5" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/b163d35a6b32a79f5782574a7aeb12a31a647e248792bf437e6d596e2676961c394c5e3c6e91d1ce44ae90441dbaf93158efb4f051c0d61e2612f1cb04ce4faa languageName: node linkType: hard -"@types/react@npm:^18, @types/react@npm:^18.2.56": - version: 18.3.14 - resolution: "@types/react@npm:18.3.14" +"@types/react@npm:^18.2.56": + version: 18.3.18 + resolution: "@types/react@npm:18.3.18" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/d925fbfcf084238b93d1a0b5406d4cf9aeb37c4a1191559aa4ee107c2e55cc15327989140f03eddda4d471f5b935d4673fd74a86f451860edea18eae48ca44f8 + checksum: 10c0/8fb2b00672072135d0858dc9db07873ea107cc238b6228aaa2a9afd1ef7a64a7074078250db38afbeb19064be8ea6af5eac32d404efdd5f45e093cc4829d87f8 languageName: node linkType: hard @@ -8934,8 +8812,8 @@ __metadata: linkType: hard "@vanilla-extract/css@npm:^1.14.1": - version: 1.16.1 - resolution: "@vanilla-extract/css@npm:1.16.1" + version: 1.17.0 + resolution: "@vanilla-extract/css@npm:1.17.0" dependencies: "@emotion/hash": "npm:^0.9.0" "@vanilla-extract/private": "npm:^1.0.6" @@ -8949,7 +8827,7 @@ __metadata: media-query-parser: "npm:^2.0.2" modern-ahocorasick: "npm:^1.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/a26236e1a20fd4bb675b01905ccb489978c3cce39902618ee979a830bf3a44929d9183f2a38762ea4d791dccefc3ee8d8022dfec0f8920a5f3a372bf6aac4e70 + checksum: 10c0/14f3129bd025245515fe8aac2bfff301610ac60b57a3907a5cf2511e4469cfd719c4a3381be343328a49c7994259bd0ef26cfd7868f78500bf7f063e4b886490 languageName: node linkType: hard @@ -9103,28 +8981,28 @@ __metadata: languageName: node linkType: hard -"@walletconnect/core@npm:2.17.2": - version: 2.17.2 - resolution: "@walletconnect/core@npm:2.17.2" +"@walletconnect/core@npm:2.17.3": + version: 2.17.3 + resolution: "@walletconnect/core@npm:2.17.3" dependencies: "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-provider": "npm:1.0.14" "@walletconnect/jsonrpc-types": "npm:1.0.4" "@walletconnect/jsonrpc-utils": "npm:1.0.8" - "@walletconnect/jsonrpc-ws-connection": "npm:1.0.14" + "@walletconnect/jsonrpc-ws-connection": "npm:1.0.16" "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" "@walletconnect/relay-api": "npm:1.0.11" "@walletconnect/relay-auth": "npm:1.0.4" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.17.2" - "@walletconnect/utils": "npm:2.17.2" + "@walletconnect/types": "npm:2.17.3" + "@walletconnect/utils": "npm:2.17.3" "@walletconnect/window-getters": "npm:1.0.1" events: "npm:3.3.0" lodash.isequal: "npm:4.5.0" uint8arrays: "npm:3.1.0" - checksum: 10c0/6124b81892a4e5e9350cfff22a7ce3a23a66c9589221411bd8bfd411fc392b6b343fae1634b32000d4275ba11b1a0f732cf6b7ba5da35b388854c7e7b4f2764d + checksum: 10c0/e6a841a0d5b27922b83fbb7a1dbcb519b825d70489f9bd6a909cf0b3c543ab3a6c209a0775a95c5dc452a875757f04c9ca27d02c6f002c39974d2ce2061e5887 languageName: node linkType: hard @@ -9289,6 +9167,18 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-ws-connection@npm:1.0.16": + version: 1.0.16 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.16" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.2" + events: "npm:^3.3.0" + ws: "npm:^7.5.1" + checksum: 10c0/30a09d24ffb6b4b291e2d1263504c4ea6c6797c992f5e6eb8033e58bd24749c80fd4e5ba6ffaadb28f8ced0c6b131213195b616f8983bb9f56aa7c91e83e6218 + languageName: node + linkType: hard + "@walletconnect/keyvaluestorage@npm:1.1.1, @walletconnect/keyvaluestorage@npm:^1.0.2, @walletconnect/keyvaluestorage@npm:^1.1.1": version: 1.1.1 resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" @@ -9509,19 +9399,19 @@ __metadata: linkType: hard "@walletconnect/sign-client@npm:^2.9.0": - version: 2.17.2 - resolution: "@walletconnect/sign-client@npm:2.17.2" + version: 2.17.3 + resolution: "@walletconnect/sign-client@npm:2.17.3" dependencies: - "@walletconnect/core": "npm:2.17.2" + "@walletconnect/core": "npm:2.17.3" "@walletconnect/events": "npm:1.0.1" "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/logger": "npm:2.1.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.17.2" - "@walletconnect/utils": "npm:2.17.2" + "@walletconnect/types": "npm:2.17.3" + "@walletconnect/utils": "npm:2.17.3" events: "npm:3.3.0" - checksum: 10c0/0acbda4ea34be209b1436134804e72641ca377e2bb6823b7d94177b30e50b8e6de28dfdad6ff64dac61a1305e7b6f281df2357488382c88e440a79b817d377a8 + checksum: 10c0/454afa3c933ec11f651c4cd275af88eef7da65b5d4bcf8987f768f340557492cf436d662ca42baa54ad8136e4b16f5269e0bc3e212580df09e0ee49873718b96 languageName: node linkType: hard @@ -9576,9 +9466,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.17.2": - version: 2.17.2 - resolution: "@walletconnect/types@npm:2.17.2" +"@walletconnect/types@npm:2.17.3": + version: 2.17.3 + resolution: "@walletconnect/types@npm:2.17.3" dependencies: "@walletconnect/events": "npm:1.0.1" "@walletconnect/heartbeat": "npm:1.2.2" @@ -9586,7 +9476,7 @@ __metadata: "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" events: "npm:3.3.0" - checksum: 10c0/95bd3e4f4f2ef181ea69691800a0a06be2c4fa900ae972539851c5817a0f01b4ba9f381161d044df4db004f431bc416548ec6eca0ac523fc1fb06014386accac + checksum: 10c0/6e50f1f3d64f32d0fa697bb61340191b153aa0a77b8a483cacaeb62aefa190524e10f78188260b591eaae877d6bfa5ea9ffab5ed905c286151300577f2e0101f languageName: node linkType: hard @@ -9651,9 +9541,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/utils@npm:2.17.2, @walletconnect/utils@npm:^2.9.0": - version: 2.17.2 - resolution: "@walletconnect/utils@npm:2.17.2" +"@walletconnect/utils@npm:2.17.3, @walletconnect/utils@npm:^2.9.0": + version: 2.17.3 + resolution: "@walletconnect/utils@npm:2.17.3" dependencies: "@ethersproject/hash": "npm:5.7.0" "@ethersproject/transactions": "npm:5.7.0" @@ -9668,14 +9558,14 @@ __metadata: "@walletconnect/relay-auth": "npm:1.0.4" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.17.2" + "@walletconnect/types": "npm:2.17.3" "@walletconnect/window-getters": "npm:1.0.1" "@walletconnect/window-metadata": "npm:1.0.1" detect-browser: "npm:5.3.0" - elliptic: "npm:6.6.0" + elliptic: "npm:6.6.1" query-string: "npm:7.1.3" uint8arrays: "npm:3.1.0" - checksum: 10c0/b44c0025be12301a28715a204c037328eae4fa432f0ee1730da08b3b6583e07aeaf59efd9dcc52209f6a61b50b31c84e555028b97067dfdf9f5efe1211378fc8 + checksum: 10c0/ab08f625786eb55e0ae41075a3ccee9804750b1f20745f2d7a81569a6741d022463b250958124925e6b5f51d3a5b3ec783a23233391d8d937c4bcd76e7a8cc8c languageName: node linkType: hard @@ -9733,7 +9623,7 @@ __metadata: languageName: node linkType: hard -"abitype@npm:1.0.7, abitype@npm:^1.0.6": +"abitype@npm:1.0.7": version: 1.0.7 resolution: "abitype@npm:1.0.7" peerDependencies: @@ -9748,6 +9638,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:^1.0.6": + version: 1.0.8 + resolution: "abitype@npm:1.0.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 10c0/d3393f32898c1f0f6da4eed2561da6830dcd0d5129a160fae9517214236ee6a6c8e5a0380b8b960c5bc1b949320bcbd015ec7f38b5d7444f8f2b854a1b5dd754 + languageName: node + linkType: hard + "acorn-import-attributes@npm:^1.9.5": version: 1.9.5 resolution: "acorn-import-attributes@npm:1.9.5" @@ -9775,7 +9680,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.11.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.14.0 resolution: "acorn@npm:8.14.0" bin: @@ -9867,46 +9772,47 @@ __metadata: linkType: hard "agoric@npm:^0.22.0-u17.1": - version: 0.22.0-upgrade-18-dev-bf39b10.0 - resolution: "agoric@npm:0.22.0-upgrade-18-dev-bf39b10.0" - dependencies: - "@agoric/access-token": "npm:0.4.22-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/cache": "npm:0.3.3-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/casting": "npm:0.4.3-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/cosmic-proto": "npm:0.5.0-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/governance": "npm:0.10.4-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/inter-protocol": "npm:0.17.0-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/internal": "npm:0.4.0-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/network": "npm:0.2.0-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/smart-wallet": "npm:0.5.4-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/store": "npm:0.9.3-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/vats": "npm:0.16.0-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-bf39b10.0+bf39b10" - "@agoric/zone": "npm:0.3.0-upgrade-18-dev-bf39b10.0+bf39b10" + version: 0.22.0-upgrade-18-dev-cc4b6b8.0 + resolution: "agoric@npm:0.22.0-upgrade-18-dev-cc4b6b8.0" + dependencies: + "@agoric/access-token": "npm:0.4.22-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/cache": "npm:0.3.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/casting": "npm:0.4.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/client-utils": "npm:0.1.1-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/cosmic-proto": "npm:0.5.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/ertp": "npm:0.16.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/governance": "npm:0.10.4-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/inter-protocol": "npm:0.17.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/internal": "npm:0.4.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/network": "npm:0.2.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/smart-wallet": "npm:0.5.4-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/store": "npm:0.9.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/swingset-vat": "npm:0.33.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/vats": "npm:0.16.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/zoe": "npm:0.26.3-upgrade-18-dev-cc4b6b8.0+cc4b6b8" + "@agoric/zone": "npm:0.3.0-upgrade-18-dev-cc4b6b8.0+cc4b6b8" "@confio/relayer": "npm:^0.11.3" "@cosmjs/crypto": "npm:^0.32.3" "@cosmjs/encoding": "npm:^0.32.3" "@cosmjs/math": "npm:^0.32.3" "@cosmjs/proto-signing": "npm:^0.32.3" "@cosmjs/stargate": "npm:^0.32.3" - "@endo/bundle-source": "npm:^3.4.2" - "@endo/captp": "npm:^4.4.2" - "@endo/compartment-mapper": "npm:^1.3.1" - "@endo/env-options": "npm:^1.1.7" - "@endo/errors": "npm:^1.2.7" - "@endo/far": "npm:^1.1.8" - "@endo/init": "npm:^1.1.6" - "@endo/marshal": "npm:^1.6.1" - "@endo/nat": "npm:^5.0.12" - "@endo/patterns": "npm:^1.4.6" - "@endo/promise-kit": "npm:^1.1.7" - "@endo/zip": "npm:^1.0.8" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/zip": "npm:^1.0.9" "@iarna/toml": "npm:^2.2.3" anylogger: "npm:^0.21.0" chalk: "npm:^5.2.0" - commander: "npm:^11.1.0" + commander: "npm:^12.1.0" deterministic-json: "npm:^1.0.5" esm: "github:agoric-labs/esm#Agoric-built" inquirer: "npm:^8.2.2" @@ -9916,7 +9822,7 @@ __metadata: bin: agops: src/bin-agops.js agoric: src/entrypoint.js - checksum: 10c0/52e7a996a47d43ca9d529f632b05207f8b9b22a99e41f2c17e2f0fbac905b5a9d6bdf47c4a0a8b8f274be384156f29161bd9fd921f4d0395f99f101b93f3c5a8 + checksum: 10c0/8005e6e2fc3a29cd03b95c2caef7c262bd61545867d8b005b2bed754c05607c5edad6dfed3ce592c5d9dbf85cfff7ba6ccdd8f3f091f69e2a71c846ee9ea0fc0 languageName: node linkType: hard @@ -10068,13 +9974,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d languageName: node linkType: hard @@ -10121,42 +10027,41 @@ __metadata: linkType: hard "array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a languageName: node linkType: hard "array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.3" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" is-array-buffer: "npm:^3.0.4" - is-shared-array-buffer: "npm:^1.0.2" - checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 languageName: node linkType: hard @@ -10242,7 +10147,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.17": +"autoprefixer@npm:^10.4.20": version: 10.4.20 resolution: "autoprefixer@npm:10.4.20" dependencies: @@ -10670,16 +10575,16 @@ __metadata: linkType: hard "browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": - version: 4.24.2 - resolution: "browserslist@npm:4.24.2" + version: 4.24.3 + resolution: "browserslist@npm:4.24.3" dependencies: - caniuse-lite: "npm:^1.0.30001669" - electron-to-chromium: "npm:^1.5.41" - node-releases: "npm:^2.0.18" + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10c0/d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a + checksum: 10c0/bab261ef7b6e1656a719a9fa31240ae7ce4d5ba68e479f6b11e348d819346ab4c0ff6f4821f43adcc9c193a734b186775a83b37979e70a69d182965909fe569a languageName: node linkType: hard @@ -10731,12 +10636,12 @@ __metadata: linkType: hard "bufferutil@npm:^4.0.3": - version: 4.0.8 - resolution: "bufferutil@npm:4.0.8" + version: 4.0.9 + resolution: "bufferutil@npm:4.0.9" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^4.3.0" - checksum: 10c0/36cdc5b53a38d9f61f89fdbe62029a2ebcd020599862253fefebe31566155726df9ff961f41b8c97b02b4c12b391ef97faf94e2383392654cf8f0ed68f76e47c + checksum: 10c0/f8a93279fc9bdcf32b42eba97edc672b39ca0fe5c55a8596099886cffc76ea9dd78e0f6f51ecee3b5ee06d2d564aa587036b5d4ea39b8b5ac797262a363cdf7d languageName: node linkType: hard @@ -10767,7 +10672,7 @@ __metadata: languageName: node linkType: hard -"call-bind-apply-helpers@npm:^1.0.0": +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": version: 1.0.1 resolution: "call-bind-apply-helpers@npm:1.0.1" dependencies: @@ -10777,7 +10682,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" dependencies: @@ -10789,6 +10694,16 @@ __metadata: languageName: node linkType: hard +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": + version: 1.0.3 + resolution: "call-bound@npm:1.0.3" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/45257b8e7621067304b30dbd638e856cac913d31e8e00a80d6cf172911acd057846572d0b256b45e652d515db6601e2974a1b1a040e91b4fc36fb3dd86fa69cf + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -10817,10 +10732,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": - version: 1.0.30001687 - resolution: "caniuse-lite@npm:1.0.30001687" - checksum: 10c0/9ca0f6d33dccaf4692339d0fda50e03e4dd7eb7f25faabd1cb33e2099d9a76b0bc30c37be3315e91c1d990da1b5cc864eee2077494f4d0ba94d68b48fe2ea7f1 +"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001690 + resolution: "caniuse-lite@npm:1.0.30001690" + checksum: 10c0/646bd469032afa90400a84dec30a2b00a6eda62c03ead358117e3f884cda8aacec02ec058a6dbee5eaf9714f83e483b9b0eb4fb42febb8076569f5ca40f1d347 languageName: node linkType: hard @@ -10854,9 +10769,9 @@ __metadata: linkType: hard "chalk@npm:^5.2.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + version: 5.4.1 + resolution: "chalk@npm:5.4.1" + checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef languageName: node linkType: hard @@ -10938,15 +10853,6 @@ __metadata: languageName: node linkType: hard -"citty@npm:^0.1.5, citty@npm:^0.1.6": - version: 0.1.6 - resolution: "citty@npm:0.1.6" - dependencies: - consola: "npm:^3.2.3" - checksum: 10c0/d26ad82a9a4a8858c7e149d90b878a3eceecd4cfd3e2ed3cd5f9a06212e451fb4f8cbe0fa39a3acb1b3e8f18e22db8ee5def5829384bad50e823d4b301609b48 - languageName: node - linkType: hard - "cjs-module-lexer@npm:^1.2.2": version: 1.4.1 resolution: "cjs-module-lexer@npm:1.4.1" @@ -11008,17 +10914,6 @@ __metadata: languageName: node linkType: hard -"clipboardy@npm:^4.0.0": - version: 4.0.0 - resolution: "clipboardy@npm:4.0.0" - dependencies: - execa: "npm:^8.0.1" - is-wsl: "npm:^3.1.0" - is64bit: "npm:^2.0.0" - checksum: 10c0/02bb5f3d0a772bd84ec26a3566c72c2319a9f3b4cb8338370c3bffcf0073c80b834abe1a6945bea4f2cbea28e1627a975aaac577e3f61a868d924ce79138b041 - languageName: node - linkType: hard - "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -11163,10 +11058,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:^11.1.0": - version: 11.1.0 - resolution: "commander@npm:11.1.0" - checksum: 10c0/13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179 +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 languageName: node linkType: hard @@ -11221,13 +11116,6 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.8": - version: 0.1.8 - resolution: "confbox@npm:0.1.8" - checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 - languageName: node - linkType: hard - "confusing-browser-globals@npm:^1.0.10": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" @@ -11236,9 +11124,9 @@ __metadata: linkType: hard "consola@npm:^3.2.3": - version: 3.2.3 - resolution: "consola@npm:3.2.3" - checksum: 10c0/c606220524ec88a05bb1baf557e9e0e04a0c08a9c35d7a08652d99de195c4ddcb6572040a7df57a18ff38bbc13ce9880ad032d56630cef27bef72768ef0ac078 + version: 3.3.3 + resolution: "consola@npm:3.3.3" + checksum: 10c0/9f6f457f3d83fbb339b9f2ff4f5c2776a1a05fad7ce3939d8dc41765431d5f52401b5a632f4b10ed9145b2aadec1e84cea78c30178479d3a2fd4880894592fa5 languageName: node linkType: hard @@ -11307,30 +11195,30 @@ __metadata: linkType: hard "cosmos-kit@npm:^2.19.0": - version: 2.21.1 - resolution: "cosmos-kit@npm:2.21.1" - dependencies: - "@cosmos-kit/cdcwallet": "npm:^2.15.1" - "@cosmos-kit/coin98": "npm:^2.13.1" - "@cosmos-kit/compass": "npm:^2.13.1" - "@cosmos-kit/cosmostation": "npm:^2.14.0" - "@cosmos-kit/exodus": "npm:^2.12.0" - "@cosmos-kit/fin": "npm:^2.13.1" - "@cosmos-kit/frontier": "npm:^2.12.0" - "@cosmos-kit/galaxy-station": "npm:^2.12.0" - "@cosmos-kit/keplr": "npm:^2.14.1" - "@cosmos-kit/leap": "npm:^2.14.1" - "@cosmos-kit/ledger": "npm:^2.13.0" + version: 2.23.1 + resolution: "cosmos-kit@npm:2.23.1" + dependencies: + "@cosmos-kit/cdcwallet": "npm:^2.15.2" + "@cosmos-kit/coin98": "npm:^2.13.2" + "@cosmos-kit/compass": "npm:^2.13.2" + "@cosmos-kit/cosmostation": "npm:^2.14.1" + "@cosmos-kit/ctrl": "npm:^2.13.1" + "@cosmos-kit/exodus": "npm:^2.12.1" + "@cosmos-kit/fin": "npm:^2.13.2" + "@cosmos-kit/frontier": "npm:^2.12.1" + "@cosmos-kit/galaxy-station": "npm:^2.12.1" + "@cosmos-kit/keplr": "npm:^2.14.2" + "@cosmos-kit/leap": "npm:^2.14.2" + "@cosmos-kit/ledger": "npm:^2.13.1" "@cosmos-kit/okxwallet-extension": "npm:^2.13.0" - "@cosmos-kit/omni": "npm:^2.12.0" - "@cosmos-kit/owallet": "npm:^2.13.1" - "@cosmos-kit/shell": "npm:^2.13.1" - "@cosmos-kit/station": "npm:^2.12.0" - "@cosmos-kit/tailwind": "npm:^1.7.0" - "@cosmos-kit/trust": "npm:^2.13.0" - "@cosmos-kit/vectis": "npm:^2.13.1" - "@cosmos-kit/xdefi": "npm:^2.12.0" - checksum: 10c0/21f1acbbca5c1182ef38e1218bc50c76d7c433555e0acdbdc0586a6c3502476f30e11e1ab3df618820dd0e1eec72b2460b1e049aa23cab9de2e4c310f4a3b3cf + "@cosmos-kit/omni": "npm:^2.12.1" + "@cosmos-kit/owallet": "npm:^2.14.1" + "@cosmos-kit/shell": "npm:^2.13.2" + "@cosmos-kit/station": "npm:^2.12.1" + "@cosmos-kit/tailwind": "npm:^1.7.1" + "@cosmos-kit/trust": "npm:^2.13.1" + "@cosmos-kit/vectis": "npm:^2.13.2" + checksum: 10c0/b74ab192ca226a8ad3d4fa795fe0f9a4599f4206d671c840bf49abe87a701be5a155019d06f91d410c22ce8c9abf89280df61da07647e09d64eed7b6a1424ac2 languageName: node linkType: hard @@ -11388,11 +11276,11 @@ __metadata: linkType: hard "cross-fetch@npm:^3.1.4, cross-fetch@npm:^3.1.5": - version: 3.1.8 - resolution: "cross-fetch@npm:3.1.8" + version: 3.2.0 + resolution: "cross-fetch@npm:3.2.0" dependencies: - node-fetch: "npm:^2.6.12" - checksum: 10c0/4c5e022ffe6abdf380faa6e2373c0c4ed7ef75e105c95c972b6f627c3f083170b6886f19fb488a7fa93971f4f69dcc890f122b0d97f0bf5f41ca1d9a8f58c8af + node-fetch: "npm:^2.7.0" + checksum: 10c0/d8596adf0269130098a676f6739a0922f3cc7b71cc89729925411ebe851a87026171c82ea89154c4811c9867c01c44793205a52e618ce2684650218c7fbeeb9f languageName: node linkType: hard @@ -11507,14 +11395,14 @@ __metadata: linkType: hard "daisyui@npm:^4.12.10": - version: 4.12.20 - resolution: "daisyui@npm:4.12.20" + version: 4.12.23 + resolution: "daisyui@npm:4.12.23" dependencies: css-selector-tokenizer: "npm:^0.8" culori: "npm:^3" picocolors: "npm:^1" postcss-js: "npm:^4" - checksum: 10c0/067d89d481a7759e315862802f315e66a0e0a19eec04cd6b98de6993dd8462665d87ca885cc773af8a982f8875c495fca70945d85ed6ee2f39600beb8c194412 + checksum: 10c0/7699d294c6193800fc1a0671d67f1a5ea46059cd36702a4326a82c6b0bb823de8ba485aca20beac970ee2a47949c5411df8ea60a40c3e00989d7ce2214e6c196 languageName: node linkType: hard @@ -11609,7 +11497,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^7.0.2" "@typescript-eslint/parser": "npm:^7.15.0" "@vitejs/plugin-react": "npm:^4.2.1" - autoprefixer: "npm:^10.4.17" + autoprefixer: "npm:^10.4.20" buffer: "npm:^6.0.3" chain-registry: "npm:1.28.0" cosmos-kit: "npm:^2.19.0" @@ -11617,13 +11505,13 @@ __metadata: eslint: "npm:^8.56.0" eslint-plugin-react-hooks: "npm:^4.6.0" eslint-plugin-react-refresh: "npm:^0.4.5" - postcss: "npm:^8.4.35" + postcss: "npm:^8.4.49" react: "npm:^18.3.1" react-daisyui: "npm:^5.0.0" react-dom: "npm:^18.2.0" react-hot-toast: "npm:^2.4.1" ses: "npm:^1.8.0" - tailwindcss: "npm:^3.4.1" + tailwindcss: "npm:^3.4.17" typescript: "npm:^5.2.2" vite: "npm:^5.1.4" languageName: unknown @@ -11643,36 +11531,36 @@ __metadata: languageName: unknown linkType: soft -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.2" es-errors: "npm:^1.3.0" is-data-view: "npm:^1.0.1" - checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 languageName: node linkType: hard @@ -11783,6 +11671,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.4.1": + version: 0.4.1 + resolution: "decode-uri-component@npm:0.4.1" + checksum: 10c0/a180bbdb5398ec8270d236a3ac07cb988bbf6097428481780b85840f088951dc0318a8d8f9d56796e1a322b55b29859cea29982f22f9b03af0bc60974c54e591 + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -11852,7 +11747,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -11922,15 +11817,6 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^1.0.3": - version: 1.0.3 - resolution: "detect-libc@npm:1.0.3" - bin: - detect-libc: ./bin/detect-libc.js - checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d - languageName: node - linkType: hard - "detect-libc@npm:^2.0.0": version: 2.0.3 resolution: "detect-libc@npm:2.0.3" @@ -12036,14 +11922,14 @@ __metadata: languageName: node linkType: hard -"dunder-proto@npm:^1.0.0": - version: 1.0.0 - resolution: "dunder-proto@npm:1.0.0" +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" dependencies: - call-bind-apply-helpers: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.1" es-errors: "npm:^1.3.0" gopd: "npm:^1.2.0" - checksum: 10c0/b321e5cbf64f0a4c786b0b3dc187eb5197a83f6e05a1e11b86db25251b3ae6747c4b805d9e0a4fbf481d22a86a539dc75f82d883daeac7fc2ce4bd72ff5ef5a2 + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 languageName: node linkType: hard @@ -12066,10 +11952,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.41": - version: 1.5.71 - resolution: "electron-to-chromium@npm:1.5.71" - checksum: 10c0/f6fdeec0e1d68634cf92c267bdce3e50af947ce2c8fb1034df3e738c536b3033e311ad0fb9a6c4c35f678f10a299e4f78fdfcedbaa78d8992fedc443a7363d6d +"electron-to-chromium@npm:^1.5.73": + version: 1.5.76 + resolution: "electron-to-chromium@npm:1.5.76" + checksum: 10c0/5a977be9fd5810769a7b4eae0e4b41b6beca65f2b3f3b7442819f6c93366d767d183cfbf408714f944a9bf3aa304f8c9ab9d0cdfd8e878ab8f2cbb61f8b22acd languageName: node linkType: hard @@ -12088,22 +11974,7 @@ __metadata: languageName: node linkType: hard -"elliptic@npm:6.6.0": - version: 6.6.0 - resolution: "elliptic@npm:6.6.0" - dependencies: - bn.js: "npm:^4.11.9" - brorand: "npm:^1.1.0" - hash.js: "npm:^1.0.0" - hmac-drbg: "npm:^1.0.1" - inherits: "npm:^2.0.4" - minimalistic-assert: "npm:^1.0.1" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/42eb3492e218017bf8923a5d14a86f414952f2f771361805b3ae9f380923b5da53e203d0d92be95cb0a248858a78db7db5934a346e268abb757e6fe561d401c9 - languageName: node - linkType: hard - -"elliptic@npm:^6.4.0, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5, elliptic@npm:^6.5.7": +"elliptic@npm:6.6.1, elliptic@npm:^6.4.0, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5, elliptic@npm:^6.5.7": version: 6.6.1 resolution: "elliptic@npm:6.6.1" dependencies: @@ -12194,57 +12065,60 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5": - version: 1.23.5 - resolution: "es-abstract@npm:1.23.5" +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6": + version: 1.23.8 + resolution: "es-abstract@npm:1.23.8" dependencies: - array-buffer-byte-length: "npm:^1.0.1" - arraybuffer.prototype.slice: "npm:^1.0.3" + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" es-set-tostringtag: "npm:^2.0.3" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.4" - get-symbol-description: "npm:^1.0.2" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.6" + get-symbol-description: "npm:^1.1.0" globalthis: "npm:^1.0.4" - gopd: "npm:^1.0.1" + gopd: "npm:^1.2.0" has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" - internal-slot: "npm:^1.0.7" - is-array-buffer: "npm:^3.0.4" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.1" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.3" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.13" - is-weakref: "npm:^1.0.2" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.0" regexp.prototype.flags: "npm:^1.5.3" - safe-array-concat: "npm:^1.1.2" - safe-regex-test: "npm:^1.0.3" - string.prototype.trim: "npm:^1.2.9" - string.prototype.trimend: "npm:^1.0.8" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.2" - typed-array-length: "npm:^1.0.6" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: 10c0/1f6f91da9cf7ee2c81652d57d3046621d598654d1d1b05c1578bafe5c4c2d3d69513901679bdca2de589f620666ec21de337e4935cec108a4ed0871d5ef04a5d + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10c0/5e3afb94ff8ad70801625e3d262a0384cc75e42574b6c2e89b33d255c03e15e1af72ca9fd459511b717ec25b79812520481c3b4d1f9bea6038bae1421225907b languageName: node linkType: hard @@ -12255,7 +12129,7 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 @@ -12282,7 +12156,7 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": +"es-shim-unscopables@npm:^1.0.2": version: 1.0.2 resolution: "es-shim-unscopables@npm:1.0.2" dependencies: @@ -12291,7 +12165,7 @@ __metadata: languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": +"es-to-primitive@npm:^1.3.0": version: 1.3.0 resolution: "es-to-primitive@npm:1.3.0" dependencies: @@ -13213,11 +13087,11 @@ __metadata: linkType: hard "fast-check@npm:^3.0.0": - version: 3.23.1 - resolution: "fast-check@npm:3.23.1" + version: 3.23.2 + resolution: "fast-check@npm:3.23.2" dependencies: pure-rand: "npm:^6.1.0" - checksum: 10c0/d61ee4a7a2e1abc5126bf2f1894413f532f686b3d1fc15c67fefb60dcca66024934b69a6454d3eba92e6568ac1abbb9882080e212d255865c3b3bbe52c5bf702 + checksum: 10c0/16fcff3c80321ee765e23c3aebd0f6427f175c9c6c1753104ec658970162365dc2d56bda046d815e8f2e90634c07ba7d6f0bcfd327fbd576d98c56a18a9765ed languageName: node linkType: hard @@ -13298,11 +13172,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.18.0 + resolution: "fastq@npm:1.18.0" dependencies: reusify: "npm:^1.0.4" - checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + checksum: 10c0/7be87ecc41762adbddf558d24182f50a4b1a3ef3ee807d33b7623da7aee5faecdcc94fce5aa13fe91df93e269f383232bbcdb2dc5338cd1826503d6063221f36 languageName: node linkType: hard @@ -13373,6 +13247,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^5.1.0": + version: 5.1.0 + resolution: "filter-obj@npm:5.1.0" + checksum: 10c0/716e8ad2bc352e206556b3e5695b3cdff8aab80c53ea4b00c96315bbf467b987df3640575100aef8b84e812cf5ea4251db4cd672bbe33b1e78afea88400c67dd + languageName: node + linkType: hard + "find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -13544,15 +13425,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" functions-have-names: "npm:^1.2.3" - checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 languageName: node linkType: hard @@ -13584,19 +13467,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.5 - resolution: "get-intrinsic@npm:1.2.5" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": + version: 1.2.6 + resolution: "get-intrinsic@npm:1.2.6" dependencies: - call-bind-apply-helpers: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.1" dunder-proto: "npm:^1.0.0" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" function-bind: "npm:^1.1.2" gopd: "npm:^1.2.0" has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" - checksum: 10c0/dcaace9fd4b4dd127b6668f580393e1a704bad308b7b88d694145e2599ee6c51b70cbfd49c6c96a5ffdb14a70824a0b3bd9b78bad84953932e5f0c5da4e508fd + math-intrinsics: "npm:^1.0.0" + checksum: 10c0/0f1ea6d807d97d074e8a31ac698213a12757fcfa9a8f4778263d2e4702c40fe83198aadd3dba2e99aabc2e4cf8a38345545dbb0518297d3df8b00b56a156c32a languageName: node linkType: hard @@ -13607,13 +13492,6 @@ __metadata: languageName: node linkType: hard -"get-port-please@npm:^3.1.2": - version: 3.1.2 - resolution: "get-port-please@npm:3.1.2" - checksum: 10c0/61237342fe035967e5ad1b67a2dee347a64de093bf1222b7cd50072568d73c48dad5cc5cd4fa44635b7cfdcd14d6c47554edb9891c2ec70ab33ecb831683e257 - languageName: node - linkType: hard - "get-stream@npm:^8.0.1": version: 8.0.1 resolution: "get-stream@npm:8.0.1" @@ -13631,14 +13509,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.5" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b languageName: node linkType: hard @@ -13811,7 +13689,7 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1, gopd@npm:^1.1.0, gopd@npm:^1.2.0": +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead @@ -13832,7 +13710,7 @@ __metadata: languageName: node linkType: hard -"h3@npm:^1.12.0, h3@npm:^1.13.0": +"h3@npm:^1.13.0": version: 1.13.0 resolution: "h3@npm:1.13.0" dependencies: @@ -13851,9 +13729,9 @@ __metadata: linkType: hard "has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 languageName: node linkType: hard @@ -13873,7 +13751,7 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.3": +"has-proto@npm:^1.2.0": version: 1.2.0 resolution: "has-proto@npm:1.2.0" dependencies: @@ -13973,13 +13851,6 @@ __metadata: languageName: node linkType: hard -"http-shutdown@npm:^1.2.2": - version: 1.2.2 - resolution: "http-shutdown@npm:1.2.2" - checksum: 10c0/1ea04d50d9a84ad6e7d9ee621160ce9515936e32e7f5ba445db48a5d72681858002c934c7f3ae5f474b301c1cd6b418aee3f6a2f109822109e606cc1a6c17c03 - languageName: node - linkType: hard - "https-proxy-agent@npm:^7.0.1": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" @@ -14005,13 +13876,13 @@ __metadata: linkType: hard "i18n-js@npm:^4.3.2": - version: 4.5.0 - resolution: "i18n-js@npm:4.5.0" + version: 4.5.1 + resolution: "i18n-js@npm:4.5.1" dependencies: bignumber.js: "npm:*" lodash: "npm:*" make-plural: "npm:*" - checksum: 10c0/d316b38dc6f8203d9f744cbcf9e627b056fe33e869e4c72de27ee71487b5fe416c9a666b58ec561184e3e8f72552e2565cb7072ecaf0f4f02614dee6079db567 + checksum: 10c0/242d618679e5dd06bd3a5d66c17e07c9fd41141a78885e0a883ee633131da60deb3b3fa760f9071d873aeef2fbfb3186faeccae347eb1e81fba1f12b258ae038 languageName: node linkType: hard @@ -14088,14 +13959,14 @@ __metadata: linkType: hard "import-in-the-middle@npm:^1.7.4": - version: 1.11.3 - resolution: "import-in-the-middle@npm:1.11.3" + version: 1.12.0 + resolution: "import-in-the-middle@npm:1.12.0" dependencies: acorn: "npm:^8.8.2" acorn-import-attributes: "npm:^1.9.5" cjs-module-lexer: "npm:^1.2.2" module-details-from-path: "npm:^1.0.3" - checksum: 10c0/1eac3b485dfa747224fd0542ade60197d2af5e76c1dc2e3628f41066c90ccd3f02cc0f0115a2741e2bd6f12456dcea270853954c54a04626b5bf5fb1cfd035d6 + checksum: 10c0/e0f92bd27b9ef15099494ef0e8ba0b6fa6f0e643a3ff1d41b52530b6e4ff2a502099fff345f3ffb7c75f78cb189903b8d2d92fab5f8123badbc9e790cc19bbe7 languageName: node linkType: hard @@ -14188,14 +14059,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 languageName: node linkType: hard @@ -14211,15 +14082,6 @@ __metadata: languageName: node linkType: hard -"invariant@npm:^2.2.4": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: "npm:^1.0.0" - checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc - languageName: node - linkType: hard - "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -14252,22 +14114,23 @@ __metadata: linkType: hard "is-arguments@npm:^1.0.4": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" + version: 1.2.0 + resolution: "is-arguments@npm:1.2.0" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/6377344b31e9fcb707c6751ee89b11f132f32338e6a782ec2eac9393b0cbd32235dad93052998cda778ee058754860738341d8114910d50ada5615912bb929fc languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d languageName: node linkType: hard @@ -14305,13 +14168,13 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.2.0": - version: 1.2.0 - resolution: "is-boolean-object@npm:1.2.0" +"is-boolean-object@npm:^1.2.1": + version: 1.2.1 + resolution: "is-boolean-object@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.2" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/166319154c7c1fda06d164d3a25e969032d7929a1e3917ae56f6bd8870b831bbfdc608a3070fb5db94d5a2afc606683d484655777c9b62305383a8b87f1b5aa4 + checksum: 10c0/2ef601d255a39fdbde79cfe6be80c27b47430ed6712407f29b17d002e20f64c1e3d6692f1d842ba16bf1e9d8ddf1c4f13cac3ed7d9a4a21290f44879ebb4e8f5 languageName: node linkType: hard @@ -14331,39 +14194,33 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1": - version: 2.15.1 - resolution: "is-core-module@npm:2.15.1" +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: hasown: "npm:^2.0.2" - checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd languageName: node linkType: hard -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" is-typed-array: "npm:^1.1.13" - checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 languageName: node linkType: hard -"is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e - languageName: node - linkType: hard - -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f languageName: node linkType: hard @@ -14382,11 +14239,11 @@ __metadata: linkType: hard "is-finalizationregistry@npm:^1.1.0": - version: 1.1.0 - resolution: "is-finalizationregistry@npm:1.1.0" + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.7" - checksum: 10c0/1cd94236bfb6e060fe2b973c8726a2782727f7d495b3e8e1d51d3e619c5a3345413706f555956eb5b12af15eba0414118f64a1b19d793ec36b5e6767a13836ac + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 languageName: node linkType: hard @@ -14422,17 +14279,6 @@ __metadata: languageName: node linkType: hard -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: "npm:^3.0.0" - bin: - is-inside-container: cli.js - checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd - languageName: node - linkType: hard - "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -14464,20 +14310,13 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e - languageName: node - linkType: hard - -"is-number-object@npm:^1.1.0": - version: 1.1.0 - resolution: "is-number-object@npm:1.1.0" +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/29d575b5c54ff13f824858d8f7da4cf27131c59858744ec94e96be7b7d2de81038971c15a2636b38fa9eece3797c14bf8de898e1b30afc2f5c1df5cea9f06a8e + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 languageName: node linkType: hard @@ -14525,15 +14364,15 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.2.0 - resolution: "is-regex@npm:1.2.0" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.7" - gopd: "npm:^1.1.0" + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" has-tostringtag: "npm:^1.0.2" hasown: "npm:^2.0.2" - checksum: 10c0/a407fefb871ceedebe718c35d2f4ba75dc3360c335e99ff2f8bc4488bdcc7b0b3bb78a208d1aa896cf2745630b97752ffd40b501c10bb7afc31d23c2e0092e8d + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 languageName: node linkType: hard @@ -14551,12 +14390,12 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: "npm:^1.0.7" - checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db languageName: node linkType: hard @@ -14581,33 +14420,33 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.7, is-string@npm:^1.1.0": - version: 1.1.0 - resolution: "is-string@npm:1.1.0" +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/2781bce7bfdb00276d000a7aafccad8038a7b5cb06abbfc638417a705dd41bca259977af78731dc8a87f170783c94c9f684bc086fc4856b623c1fd942c509b6b + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d languageName: node linkType: hard -"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.0": - version: 1.1.0 - resolution: "is-symbol@npm:1.1.0" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.7" - has-symbols: "npm:^1.0.3" - safe-regex-test: "npm:^1.0.3" - checksum: 10c0/57f63c22e00cc4990680e12035b91ed158de1030924175123b13b2188fb2d10c9a80da9a923dd6ff9e9b084afd3d2e8d7d3ad711fe971e7fb74a44644751cd52 + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e languageName: node linkType: hard -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15, is-typed-array@npm:^1.1.3": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: "npm:^1.1.14" - checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 languageName: node linkType: hard @@ -14646,40 +14485,22 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.0 + resolution: "is-weakref@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + call-bound: "npm:^1.0.2" + checksum: 10c0/aa835f62e29cb60132ecb3ec7d11bd0f39ec7322325abe8412b805aef47153ec2daefdb21759b049711c674f49b13202a31d8d126bcdff7d8671c78babd4ae5b languageName: node linkType: hard "is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a - languageName: node - linkType: hard - -"is-wsl@npm:^3.1.0": - version: 3.1.0 - resolution: "is-wsl@npm:3.1.0" - dependencies: - is-inside-container: "npm:^1.0.0" - checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 - languageName: node - linkType: hard - -"is64bit@npm:^2.0.0": - version: 2.0.0 - resolution: "is64bit@npm:2.0.0" + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - system-architecture: "npm:^0.1.0" - checksum: 10c0/9f3741d4b7560e2a30b9ce0c79bb30c7bdcc5df77c897bd59bb68f0fd882ae698015e8da81d48331def66c778d430c1ae3cb8c1fcc34e96c576b66198395faa7 + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 languageName: node linkType: hard @@ -14786,20 +14607,11 @@ __metadata: linkType: hard "jiti@npm:^1.21.6": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" + version: 1.21.7 + resolution: "jiti@npm:1.21.7" bin: jiti: bin/jiti.js - checksum: 10c0/05b9ed58cd30d0c3ccd3c98209339e74f50abd9a17e716f65db46b6a35812103f6bde6e134be7124d01745586bca8cc5dae1d0d952267c3ebe55171949c32e56 - languageName: node - linkType: hard - -"jiti@npm:^2.1.2": - version: 2.4.1 - resolution: "jiti@npm:2.4.1" - bin: - jiti: lib/jiti-cli.mjs - checksum: 10c0/3cf67d1b952a9e8cffbb4f96527880da6cdb58a1eae2a6d2deb4645621dfc8b766d21549f71c6153a2094a40bb635ffafed4cd0dd42f3b3263b187d1ee846225 + checksum: 10c0/77b61989c758ff32407cdae8ddc77f85e18e1a13fc4977110dbd2e05fc761842f5f71bce684d9a01316e1c4263971315a111385759951080bbfe17cbb5de8f7a languageName: node linkType: hard @@ -14879,11 +14691,11 @@ __metadata: linkType: hard "jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 languageName: node linkType: hard @@ -14944,14 +14756,15 @@ __metadata: linkType: hard "json-stable-stringify@npm:^1.0.1": - version: 1.1.1 - resolution: "json-stable-stringify@npm:1.1.1" + version: 1.2.1 + resolution: "json-stable-stringify@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" isarray: "npm:^2.0.5" jsonify: "npm:^0.0.1" object-keys: "npm:^1.1.1" - checksum: 10c0/3801e3eeccbd030afb970f54bea690a079cfea7d9ed206a1b17ca9367f4b7772c764bf77a48f03e56b50e5f7ee7d11c52339fe20d8d7ccead003e4ca69e4cfde + checksum: 10c0/e623e7ce89282f089d56454087edb717357e8572089b552fbc6980fb7814dc3943f7d0e4f1a19429a36ce9f4428b6c8ee6883357974457aaaa98daba5adebeea languageName: node linkType: hard @@ -15146,35 +14959,6 @@ __metadata: languageName: node linkType: hard -"listhen@npm:^1.9.0": - version: 1.9.0 - resolution: "listhen@npm:1.9.0" - dependencies: - "@parcel/watcher": "npm:^2.4.1" - "@parcel/watcher-wasm": "npm:^2.4.1" - citty: "npm:^0.1.6" - clipboardy: "npm:^4.0.0" - consola: "npm:^3.2.3" - crossws: "npm:>=0.2.0 <0.4.0" - defu: "npm:^6.1.4" - get-port-please: "npm:^3.1.2" - h3: "npm:^1.12.0" - http-shutdown: "npm:^1.2.2" - jiti: "npm:^2.1.2" - mlly: "npm:^1.7.1" - node-forge: "npm:^1.3.1" - pathe: "npm:^1.1.2" - std-env: "npm:^3.7.0" - ufo: "npm:^1.5.4" - untun: "npm:^0.1.3" - uqr: "npm:^0.1.2" - bin: - listen: bin/listhen.mjs - listhen: bin/listhen.mjs - checksum: 10c0/b13e732eec48a49017121013853bb0f184c6f40dc9839a8ccad03b57a50a29186a57edafe5807e892cf65b49cb710026ba95d064bdcf294e135b95c6553fe36b - languageName: node - linkType: hard - "lit-element@npm:^3.3.0": version: 3.3.3 resolution: "lit-element@npm:3.3.3" @@ -15341,7 +15125,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": +"loose-envify@npm:^1.1.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -15392,11 +15176,11 @@ __metadata: linkType: hard "magic-string@npm:^0.30.3": - version: 0.30.14 - resolution: "magic-string@npm:0.30.14" + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/c52c2a6e699dfa8a840e13154da35464a40cd8b07049b695a8b282883b0426c0811af1e36ac26860b4267289340b42772c156a5608e87be97b63d510e617e87a + checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 languageName: node linkType: hard @@ -15451,6 +15235,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.0.0, math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + "md5-hex@npm:^3.0.1": version: 3.0.1 resolution: "md5-hex@npm:3.0.1" @@ -15790,7 +15581,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -16019,18 +15810,6 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.7.1, mlly@npm:^1.7.2": - version: 1.7.3 - resolution: "mlly@npm:1.7.3" - dependencies: - acorn: "npm:^8.14.0" - pathe: "npm:^1.1.2" - pkg-types: "npm:^1.2.1" - ufo: "npm:^1.5.4" - checksum: 10c0/b530887fe95a6e3458c1b24e9775dc61c167d402126f2f5f13a13845a3fb77c3db8d79cb32077c98679a392d8ecfdc4e5df3d6925bf650d807dc2dfe8cc35b53 - languageName: node - linkType: hard - "mobx@npm:^6.1.7": version: 6.13.5 resolution: "mobx@npm:6.13.5" @@ -16144,13 +15923,6 @@ __metadata: languageName: node linkType: hard -"napi-wasm@npm:^1.1.0": - version: 1.1.3 - resolution: "napi-wasm@npm:1.1.3" - checksum: 10c0/7c365ab9dc59e6f20d7b7886279ecc03ffc7c3d502ed66d32652e3681c3a56c372f00f29b110aefd9b074a6bab6a997e9b602968c18622e2586818f417e41a5d - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -16219,15 +15991,6 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^7.0.0": - version: 7.1.1 - resolution: "node-addon-api@npm:7.1.1" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 - languageName: node - linkType: hard - "node-fetch-native@npm:^1.6.4": version: 1.6.4 resolution: "node-fetch-native@npm:1.6.4" @@ -16263,13 +16026,6 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1.3.1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 - languageName: node - linkType: hard - "node-gyp-build@npm:<4.0, node-gyp-build@npm:^3.9.0": version: 3.9.0 resolution: "node-gyp-build@npm:3.9.0" @@ -16312,10 +16068,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa languageName: node linkType: hard @@ -16384,7 +16140,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.13.3": +"object-inspect@npm:^1.13.3": version: 1.13.3 resolution: "object-inspect@npm:1.13.3" checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 @@ -16408,15 +16164,17 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc languageName: node linkType: hard @@ -16455,13 +16213,14 @@ __metadata: linkType: hard "object.values@npm:^1.1.6, object.values@npm:^1.2.0": - version: 1.2.0 - resolution: "object.values@npm:1.2.0" + version: 1.2.1 + resolution: "object.values@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" es-object-atoms: "npm:^1.0.0" - checksum: 10c0/15809dc40fd6c5529501324fec5ff08570b7d70fb5ebbe8e2b3901afec35cf2b3dc484d1210c6c642cd3e7e0a5e18dd1d6850115337fef46bdae14ab0cb18ac3 + checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 languageName: node linkType: hard @@ -16587,9 +16346,20 @@ __metadata: languageName: node linkType: hard -"ox@npm:0.1.2": - version: 0.1.2 - resolution: "ox@npm:0.1.2" +"own-keys@npm:^1.0.0": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a + languageName: node + linkType: hard + +"ox@npm:0.4.4": + version: 0.4.4 + resolution: "ox@npm:0.4.4" dependencies: "@adraffy/ens-normalize": "npm:^1.10.1" "@noble/curves": "npm:^1.6.0" @@ -16603,7 +16373,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/9d0615e9a95c316063587fe08dc268476e67429eea897598b2f69cb1509ac66739f888b0b9bc1cfd0b4bd2f1a3fd0af4d3e81d40ba0bf3abd53e36a6f5b21323 + checksum: 10c0/ce1539ec41c97f6d8386ea8f0cdd85d4af025d3b7a6762607aa1a6545f550ca637abba8c9be4b26f6bf2136f16ccd579454e6976ee06ddde7225ac8fcfd4254d languageName: node linkType: hard @@ -16834,7 +16604,7 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.1, pathe@npm:^1.1.2": +"pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 @@ -16960,17 +16730,6 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.2.1": - version: 1.2.1 - resolution: "pkg-types@npm:1.2.1" - dependencies: - confbox: "npm:^0.1.8" - mlly: "npm:^1.7.2" - pathe: "npm:^1.1.2" - checksum: 10c0/4aef765c039e3ec3ca55171bb8ad776cf060d894c45ddf92b9d680b3fdb1817c8d1c428f74ea6aae144493fa1d6a97df6b8caec6dc31e418f1ce1f728d38014e - languageName: node - linkType: hard - "plur@npm:^5.1.0": version: 5.1.0 resolution: "plur@npm:5.1.0" @@ -17071,7 +16830,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.27, postcss@npm:^8.4.35, postcss@npm:^8.4.43, postcss@npm:^8.4.47": +"postcss@npm:^8.4.27, postcss@npm:^8.4.43, postcss@npm:^8.4.47, postcss@npm:^8.4.49": version: 8.4.49 resolution: "postcss@npm:8.4.49" dependencies: @@ -17090,9 +16849,9 @@ __metadata: linkType: hard "preact@npm:^10.12.0, preact@npm:^10.16.0": - version: 10.25.1 - resolution: "preact@npm:10.25.1" - checksum: 10c0/bc9255b20931781ed4b26f9d294ba2ec433dc6df8248d802a82a32b3841eb64cd5a70948a814f3793eb9eae7f95a556ec5573b63c62221534533a26db6a71fcb + version: 10.25.4 + resolution: "preact@npm:10.25.4" + checksum: 10c0/33a009d614d2b47df1c867935fe057c1dfd2bae1aaab41d6e981434b761f75b88e82eac7847ae486b4dbcffc74af814b8dc59ccef17b10625e3effefa2e1ef67 languageName: node linkType: hard @@ -17452,6 +17211,17 @@ __metadata: languageName: node linkType: hard +"query-string@npm:^9.1.1": + version: 9.1.1 + resolution: "query-string@npm:9.1.1" + dependencies: + decode-uri-component: "npm:^0.4.1" + filter-obj: "npm:^5.1.0" + split-on-first: "npm:^3.0.0" + checksum: 10c0/16481f17754f660aec3cae7abb838a70e383dfcf152414d184e0d0f81fae426acf112b4d51bf754f9c256eaf83ba4241241ba907c8d58b6ed9704425e1712e8c + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -17640,18 +17410,18 @@ __metadata: linkType: hard "react-remove-scroll-bar@npm:^2.3.3": - version: 2.3.6 - resolution: "react-remove-scroll-bar@npm:2.3.6" + version: 2.3.8 + resolution: "react-remove-scroll-bar@npm:2.3.8" dependencies: - react-style-singleton: "npm:^2.2.1" + react-style-singleton: "npm:^2.2.2" tslib: "npm:^2.0.0" peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/4e32ee04bf655a8bd3b4aacf6ffc596ae9eb1b9ba27eef83f7002632ee75371f61516ae62250634a9eae4b2c8fc6f6982d9b182de260f6c11841841e6e2e7515 + checksum: 10c0/9a0675c66cbb52c325bdbfaed80987a829c4504cefd8ff2dd3b6b3afc9a1500b8ec57b212e92c1fb654396d07bbe18830a8146fe77677d2a29ce40b5e1f78654 languageName: node linkType: hard @@ -17709,20 +17479,19 @@ __metadata: languageName: node linkType: hard -"react-style-singleton@npm:^2.2.1": - version: 2.2.1 - resolution: "react-style-singleton@npm:2.2.1" +"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2": + version: 2.2.3 + resolution: "react-style-singleton@npm:2.2.3" dependencies: get-nonce: "npm:^1.0.0" - invariant: "npm:^2.2.4" tslib: "npm:^2.0.0" peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/6d66f3bdb65e1ec79089f80314da97c9a005087a04ee034255a5de129a4c0d9fd0bf99fa7bf642781ac2dc745ca687aae3de082bd8afdd0d117bc953241e15ad + checksum: 10c0/841938ff16d16a6b76895f4cb2e1fea957e5fe3b30febbf03a54892dae1c9153f2383e231dea0b3ba41192ad2f2849448fa859caccd288943bce32639e971bee languageName: node linkType: hard @@ -17802,19 +17571,19 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.6": - version: 1.0.8 - resolution: "reflect.getprototypeof@npm:1.0.8" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.9 + resolution: "reflect.getprototypeof@npm:1.0.9" dependencies: call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - dunder-proto: "npm:^1.0.0" - es-abstract: "npm:^1.23.5" + dunder-proto: "npm:^1.0.1" + es-abstract: "npm:^1.23.6" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" + get-intrinsic: "npm:^1.2.6" gopd: "npm:^1.2.0" - which-builtin-type: "npm:^1.2.0" - checksum: 10c0/720479dd7a72a20d66efaca507ed7c7e18403d24ce764f436130464d4a516a12ed8a9a2714dcabc3e1296f9a31f914ba1095e2371619df23d3ac56c4f8c8bae1 + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/db42118a8699fa8b5856e6aa06eac32498a7bbc3c22832729049501733d060662bf16f204c546db87df8bb78b36491ecd6b3b0478c0a27be6c8302cc0770a42e languageName: node linkType: hard @@ -17896,28 +17665,28 @@ __metadata: linkType: hard "resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" + version: 1.22.10 + resolution: "resolve@npm:1.22.10" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 languageName: node linkType: hard "resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 languageName: node linkType: hard @@ -18025,28 +17794,28 @@ __metadata: linkType: hard "rollup@npm:^4.18.0, rollup@npm:^4.20.0": - version: 4.28.1 - resolution: "rollup@npm:4.28.1" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.28.1" - "@rollup/rollup-android-arm64": "npm:4.28.1" - "@rollup/rollup-darwin-arm64": "npm:4.28.1" - "@rollup/rollup-darwin-x64": "npm:4.28.1" - "@rollup/rollup-freebsd-arm64": "npm:4.28.1" - "@rollup/rollup-freebsd-x64": "npm:4.28.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.28.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.28.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.28.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.28.1" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.28.1" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.28.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.28.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.28.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.28.1" - "@rollup/rollup-linux-x64-musl": "npm:4.28.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.28.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.28.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.28.1" + version: 4.29.1 + resolution: "rollup@npm:4.29.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.29.1" + "@rollup/rollup-android-arm64": "npm:4.29.1" + "@rollup/rollup-darwin-arm64": "npm:4.29.1" + "@rollup/rollup-darwin-x64": "npm:4.29.1" + "@rollup/rollup-freebsd-arm64": "npm:4.29.1" + "@rollup/rollup-freebsd-x64": "npm:4.29.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.29.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.29.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.29.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.29.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.29.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.29.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.29.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.29.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.29.1" + "@rollup/rollup-linux-x64-musl": "npm:4.29.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.29.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.29.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.29.1" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -18092,7 +17861,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/2d2d0433b7cb53153a04c7b406f342f31517608dc57510e49177941b9e68c30071674b83a0292ef1d87184e5f7c6d0f2945c8b3c74963074de10c75366fe2c14 + checksum: 10c0/fcd0321df78fdc74b36858e92c4b73ebf5aa8f0b9cf7c446f008e0dc3c5c4ed855d662dc44e5a09c7794bbe91017b4dd7be88b619c239f0494f9f0fbfa67c557 languageName: node linkType: hard @@ -18121,15 +17890,16 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - has-symbols: "npm:^1.0.3" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" isarray: "npm:^2.0.5" - checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 + checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d languageName: node linkType: hard @@ -18147,14 +17917,24 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.2" es-errors: "npm:^1.3.0" - is-regex: "npm:^1.1.4" - checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 languageName: node linkType: hard @@ -18313,15 +18093,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.7" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 languageName: node linkType: hard @@ -18515,6 +18331,13 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^3.0.0": + version: 3.0.0 + resolution: "split-on-first@npm:3.0.0" + checksum: 10c0/a1262eae12b68de235e1a08e011bf5b42c42621985ddf807e6221fb1e2b3304824913ae7019f18436b96b8fab8aef5f1ad80dedd2385317fdc51b521c3882cd0 + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -18566,13 +18389,6 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.7.0": - version: 3.8.0 - resolution: "std-env@npm:3.8.0" - checksum: 10c0/f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 - languageName: node - linkType: hard - "stream-shift@npm:^1.0.2": version: 1.0.3 resolution: "stream-shift@npm:1.0.3" @@ -18620,26 +18436,30 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.0" + es-abstract: "npm:^1.23.5" es-object-atoms: "npm:^1.0.0" - checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" +"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" define-properties: "npm:^1.2.1" es-object-atoms: "npm:^1.0.0" - checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 languageName: node linkType: hard @@ -18813,13 +18633,6 @@ __metadata: languageName: node linkType: hard -"system-architecture@npm:^0.1.0": - version: 0.1.0 - resolution: "system-architecture@npm:0.1.0" - checksum: 10c0/1969974ea5d31a9ac7c38f2657cfe8255b36f9e1d5ba3c58cb84c24fbeedf562778b8511f18a0abe6d70ae90148cfcaf145ecf26e37c0a53a3829076f3238cbb - languageName: node - linkType: hard - "tabbable@npm:^6.0.0, tabbable@npm:^6.2.0": version: 6.2.0 resolution: "tabbable@npm:6.2.0" @@ -18840,9 +18653,9 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:^3.4.1": - version: 3.4.16 - resolution: "tailwindcss@npm:3.4.16" +"tailwindcss@npm:^3.4.17": + version: 3.4.17 + resolution: "tailwindcss@npm:3.4.17" dependencies: "@alloc/quick-lru": "npm:^5.2.0" arg: "npm:^5.0.2" @@ -18869,7 +18682,7 @@ __metadata: bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 10c0/f716ff38e0ea6f25c2b3d811e0aaac07f627193e8527d8ad945d5088d4a188ac1eb1e8ee9aef76d8525e756ffbb8369d717013d3ffc2f49fabaa94cb1e6784c1 + checksum: 10c0/cc42c6e7fdf88a5507a0d7fea37f1b4122bec158977f8c017b2ae6828741f9e6f8cb90282c6bf2bd5951fd1220a53e0a50ca58f5c1c00eb7f5d9f8b80dc4523c languageName: node linkType: hard @@ -19275,46 +19088,46 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.3 - resolution: "typed-array-byte-offset@npm:1.0.3" +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - reflect.getprototypeof: "npm:^1.0.6" - checksum: 10c0/5da29585f96671c0521475226d3227000b3e01d1e99208b66bb05b75c7c8f4d0e9cc2e79920f3bfbc792a00102df1daa2608a2753e3f291b671d5a80245bde5b + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": +"typed-array-length@npm:^1.0.7": version: 1.0.7 resolution: "typed-array-length@npm:1.0.7" dependencies: @@ -19382,7 +19195,7 @@ __metadata: "typescript@patch:typescript@npm%3A5.1.6 - 5.7.x#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.5.2#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": version: 5.7.2 - resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=379a07" + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=74658d" bin: tsc: bin/tsc tsserver: bin/tsserver @@ -19392,7 +19205,7 @@ __metadata: "typescript@patch:typescript@npm%3A~5.6.3#optional!builtin": version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=379a07" + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" bin: tsc: bin/tsc tsserver: bin/tsserver @@ -19401,11 +19214,11 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.35": - version: 1.0.39 - resolution: "ua-parser-js@npm:1.0.39" + version: 1.0.40 + resolution: "ua-parser-js@npm:1.0.40" bin: ua-parser-js: script/cli.js - checksum: 10c0/c6452b0c683000f10975cb0a7e74cb1119ea95d4522ae85f396fa53b0b17884358a24ffdd86a66030c6b2981bdc502109a618c79fdaa217ee9032c9e46fcc78a + checksum: 10c0/2b6ac642c74323957dae142c31f72287f2420c12dced9603d989b96c132b80232779c429b296d7de4012ef8b64e0d8fadc53c639ef06633ce13d785a78b5be6c languageName: node linkType: hard @@ -19434,15 +19247,15 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.0.3" - which-boxed-primitive: "npm:^1.0.2" - checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 languageName: node linkType: hard @@ -19522,33 +19335,36 @@ __metadata: linkType: hard "unstorage@npm:^1.9.0": - version: 1.13.1 - resolution: "unstorage@npm:1.13.1" + version: 1.14.4 + resolution: "unstorage@npm:1.14.4" dependencies: anymatch: "npm:^3.1.3" chokidar: "npm:^3.6.0" - citty: "npm:^0.1.6" destr: "npm:^2.0.3" h3: "npm:^1.13.0" - listhen: "npm:^1.9.0" lru-cache: "npm:^10.4.3" node-fetch-native: "npm:^1.6.4" ofetch: "npm:^1.4.1" ufo: "npm:^1.5.4" peerDependencies: - "@azure/app-configuration": ^1.7.0 - "@azure/cosmos": ^4.1.1 - "@azure/data-tables": ^13.2.2 + "@azure/app-configuration": ^1.8.0 + "@azure/cosmos": ^4.2.0 + "@azure/data-tables": ^13.3.0 "@azure/identity": ^4.5.0 "@azure/keyvault-secrets": ^4.9.0 - "@azure/storage-blob": ^12.25.0 - "@capacitor/preferences": ^6.0.2 + "@azure/storage-blob": ^12.26.0 + "@capacitor/preferences": ^6.0.3 + "@deno/kv": ">=0.8.4" "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 "@planetscale/database": ^1.19.0 "@upstash/redis": ^1.34.3 + "@vercel/blob": ">=0.27.0" "@vercel/kv": ^1.0.1 + aws4fetch: ^1.0.20 + db0: ">=0.2.1" idb-keyval: ^6.2.1 - ioredis: ^5.4.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.1 peerDependenciesMeta: "@azure/app-configuration": optional: true @@ -19564,32 +19380,29 @@ __metadata: optional: true "@capacitor/preferences": optional: true + "@deno/kv": + optional: true "@netlify/blobs": optional: true "@planetscale/database": optional: true "@upstash/redis": optional: true + "@vercel/blob": + optional: true "@vercel/kv": optional: true + aws4fetch: + optional: true + db0: + optional: true idb-keyval: optional: true ioredis: optional: true - checksum: 10c0/809f79b76d8fe0e72579dfee1e17b5fb9faec476d02d5b9ab664b9f6eb8822ddeb14aa1aa6a2bfa8e58cda9db133995d487aaa201882e2d83f703df5c7fc4e73 - languageName: node - linkType: hard - -"untun@npm:^0.1.3": - version: 0.1.3 - resolution: "untun@npm:0.1.3" - dependencies: - citty: "npm:^0.1.5" - consola: "npm:^3.2.3" - pathe: "npm:^1.1.1" - bin: - untun: bin/untun.mjs - checksum: 10c0/2b44a4cc84a5c21994f43b9f55348e5a8d9dd5fd0ad8fb5cd091b6f6b53d506b1cdb90e89cc238d61b46d488f7a89ab0d1a5c735bfc835581c7b22a236381295 + uploadthing: + optional: true + checksum: 10c0/807c9e5f0e063d4b8657d5357f19d6ba6b3a5b8343fbf64aa60e53aa6d8cd7a60b2ebd136348d143d6d8569dab4a7f0b199f79e051c37a3b538e88cfb2851884 languageName: node linkType: hard @@ -19607,13 +19420,6 @@ __metadata: languageName: node linkType: hard -"uqr@npm:^0.1.2": - version: 0.1.2 - resolution: "uqr@npm:0.1.2" - checksum: 10c0/40cd81b4c13f1764d52ec28da2d58e60816e6fae54d4eb75b32fbf3137937f438eff16c766139fb0faec5d248a5314591f5a0dbd694e569d419eed6f3bd80242 - languageName: node - linkType: hard - "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -19624,33 +19430,33 @@ __metadata: linkType: hard "use-callback-ref@npm:^1.3.0": - version: 1.3.2 - resolution: "use-callback-ref@npm:1.3.2" + version: 1.3.3 + resolution: "use-callback-ref@npm:1.3.3" dependencies: tslib: "npm:^2.0.0" peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/d232c37160fe3970c99255da19b5fb5299fb5926a5d6141d928a87feb47732c323d29be2f8137d3b1e5499c70d284cd1d9cfad703cc58179db8be24d7dd8f1f2 + checksum: 10c0/f887488c6e6075cdad4962979da1714b217bcb1ee009a9e57ce9a844bcfc4c3a99e93983dfc2e5af9e0913824d24e730090ff255e902c516dcb58d2d3837e01c languageName: node linkType: hard "use-sidecar@npm:^1.1.2": - version: 1.1.2 - resolution: "use-sidecar@npm:1.1.2" + version: 1.1.3 + resolution: "use-sidecar@npm:1.1.3" dependencies: detect-node-es: "npm:^1.1.0" tslib: "npm:^2.0.0" peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/89f0018fd9aee1fc17c85ac18c4bf8944d460d453d0d0e04ddbc8eaddf3fa591e9c74a1f8a438a1bff368a7a2417fab380bdb3df899d2194c4375b0982736de0 + checksum: 10c0/161599bf921cfaa41c85d2b01c871975ee99260f3e874c2d41c05890d41170297bdcf314bc5185e7a700de2034ac5b888e3efc8e9f35724f4918f53538d717c9 languageName: node linkType: hard @@ -19795,8 +19601,8 @@ __metadata: linkType: hard "viem@npm:^2.1.1": - version: 2.21.54 - resolution: "viem@npm:2.21.54" + version: 2.21.59 + resolution: "viem@npm:2.21.59" dependencies: "@noble/curves": "npm:1.7.0" "@noble/hashes": "npm:1.6.1" @@ -19804,7 +19610,7 @@ __metadata: "@scure/bip39": "npm:1.5.0" abitype: "npm:1.0.7" isows: "npm:1.0.6" - ox: "npm:0.1.2" + ox: "npm:0.4.4" webauthn-p256: "npm:0.0.10" ws: "npm:8.18.0" peerDependencies: @@ -19812,7 +19618,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/d4d77f47de89248a6c2e43dc0729517b1b5cb5afd372f97ae2f5b37170d9df131c92955efcc0776bd6e75980bd19bc38f0daa1026e2059204ad8593b5f383e55 + checksum: 10c0/262517b25852569911396fe289fd26438fbd2cdc07d37dd53d94a053d4e08a2643685f48ba3011403eaf92ad50ee2a3333dc63a84c38f98eb7e24ebb0d1cc007 languageName: node linkType: hard @@ -20000,37 +19806,37 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.1.0 - resolution: "which-boxed-primitive@npm:1.1.0" +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" dependencies: is-bigint: "npm:^1.1.0" - is-boolean-object: "npm:^1.2.0" - is-number-object: "npm:^1.1.0" - is-string: "npm:^1.1.0" - is-symbol: "npm:^1.1.0" - checksum: 10c0/ee4e4bcf0026aeeda1b28d005ddfcf1d8d6025d1cf04b2271f8dbbdd13df9357ba7da657ec2d886520bccf8d93d9535454e44f38f201c5461a2fe7c838b455de + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe languageName: node linkType: hard -"which-builtin-type@npm:^1.2.0": - version: 1.2.0 - resolution: "which-builtin-type@npm:1.2.0" +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.2" function.prototype.name: "npm:^1.1.6" has-tostringtag: "npm:^1.0.2" is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.0.5" + is-date-object: "npm:^1.1.0" is-finalizationregistry: "npm:^1.1.0" is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.1.4" + is-regex: "npm:^1.2.1" is-weakref: "npm:^1.0.2" isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.0.2" + which-boxed-primitive: "npm:^1.1.0" which-collection: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: 10c0/7cd4a8ccfa6a3cb7c2296c716e7266b9f31a66f3e131fe7b185232c16d3ad21442046ec1798c4ec1e19dce7eb99c7751377192e5e734dc07042d14ec0f09b332 + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 languageName: node linkType: hard @@ -20053,16 +19859,17 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2": - version: 1.1.16 - resolution: "which-typed-array@npm:1.1.16" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": + version: 1.1.18 + resolution: "which-typed-array@npm:1.1.18" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" + gopd: "npm:^1.2.0" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/a9075293200db4fbce7c24d52731843542c5a19edfc66e31aa2cbefa788b5caa7ef05008f6e60d2c38d8198add6b92d0ddc2937918c5c308be398b1ebd8721af + checksum: 10c0/0412f4a91880ca1a2a63056187c2e3de6b129b2b5b6c17bc3729f0f7041047ae48fb7424813e51506addb2c97320003ee18b8c57469d2cde37983ef62126143c languageName: node linkType: hard